Jump to content

    
Vlad_G

Отладка в CubeIDE

Recommended Posts

Всем доброго!

STM32F030, хотя какая разница в данном случае.

Есть такой фрагмент:   

    GPIOA->MODER &= ~GPIO_MODER_MODER6;                    //порт A бит 6 - вход
    GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6;                    //висит в воздухе, подтяжка в схеме

//********** Определяем наличие 1 на входе
    if(((GPIOA->IDR) & 0x40) == 0x40)                       
    {
        goto _1; 					// 1                                                                      
    }
    else
    {
        goto _2; 					// 0                                           
    }

Смысл простой, определяем наличие 1 или 0 на входе порта и дальше идем лесом или полем.

Режиме отладки - не зависимо от сигнала на входе порта всегда переходит на goto _2; те выполняется конструкция else. При этом отладчик адекватно показывает наличие 1 или 0 на входе порта.

В данном случае для меня не важно, куда что идет в реальности, важно, что показывает отладчик. Верить или не верить. Если он врет на простых вещах, то как жить в этом мире? Или всё таки я туплю? При всех глюках stm32, что встречаются в тырнете, всегда грешить на stm не хочется.

Share this post


Link to post
Share on other sites
11 минут назад, Vlad_G сказал:

Режиме отладки - не зависимо от сигнала на входе порта всегда переходит на goto _2; те выполняется конструкция else. При этом отладчик адекватно показывает наличие 1 или 0 на входе порта.

Реально отладчик показывает именно "наличие 1 или 0 на входе порта"??? :shok:

У вас уникальный отладчик, с уникальными функциями! :biggrin: Ибо обычные показывают только содержимое регистров периферии.

Цитата

При всех глюках stm32, что встречаются в тырнете, всегда грешить на stm не хочется.

Грешить в любом случае нехорошо. Надо просто заглянуть в ассемблерный листинг данного фрагмента.

 

PS: Хотя конечно осознаю, что "CubeIDE" и "ассемблер" - видимо вещи несовместимые по природе.  :biggrin:

Share this post


Link to post
Share on other sites
12 minutes ago, Vlad_G said:

if(((GPIOA->IDR) & 0x40) == 0x40) 

Понизьте количество скобок, а? Посочувствуйте читающим)

12 minutes ago, Vlad_G said:

Если он врет на простых вещах, то как жить в этом мире?

Не живите. Средств перейти в иной мир сейчас предостаточно. Можете выйти без маски на улицу. Но всё же, не делайте таких громких заявлений. Для начала:

1. Посмотрите, что у вас физически на пине микроконтроллера.

2. Проверьте настройки данного пина (тактирование, направление).

3. Убедитесь, что ваша программа работает правильно.

3 minutes ago, jcxz said:

Надо просто заглянуть в ассемблерный листинг данного фрагмента.

Не пугайте людей))))))))))))

Share this post


Link to post
Share on other sites

Возможно, отладчик уникальный... Да, показывает состояние регистра IDR, ну а это состояние как соотносится с реальностью .... .!. знает. Скобки - это уже варианты, думал, мало ли какие неоднозначности при компиляции.

Поставил: if( 0x40 == 0x40) - переход сделал правильно.

Share this post


Link to post
Share on other sites
8 minutes ago, Vlad_G said:

Да, показывает состояние регистра IDR

Да при чём здесь регистр-то? На ножке что? Посмотрите измерительным прибором. Я так всегда делаю в спорных ситуациях. Дел на 1 минуту, даже меньше, и хотя бы понятно, куда смотреть: в железо или программу.

8 minutes ago, Vlad_G said:

неоднозначности при компиляции

Да, неоднозначности есть) Они называются стандарт) Но можете начать с книжки. Керниган, Ричи "Язык Си". Обязательно третье издание.

Share this post


Link to post
Share on other sites
9 minutes ago, haker_fox said:

Да при чём здесь регистр-то? На ножке что?

В начале я написал, что отладчик показывает адекватно... мне показалось, что этого достаточно. Смотрю осциллографом, ц"ы"фровым. Сейчас подтянул резистором к питанию - 1 всегда висит. 

Share this post


Link to post
Share on other sites
8 minutes ago, Vlad_G said:

мне показалось, что этого достаточно

Я же вас не знаю, и рядом с вами не нахожусь. Откуда же мне знать ваш уровень адекватности, поэтому и задаю уточняющие вопросы. Если IDR читает адекватно, как вы сказали, то условие тоже дожно выполняться. Т.к. отладчик и программа читают регистры одинаково. Тогда:

1. Номер ножки в студию.

2. Ассемблерный листине с условным оператором +- десяток строк в студию.

3. Уровень оптимизации компилятора тоже в студию.

4. Что находится по меткам goto_1 и goto_2.

В вашем случае мог просто сработать оптимизатор. Выбросить условие из программы, если метки ссылаются на один и тот же фрагмент кода. Или на одинаковые фрагменты кода.

Share this post


Link to post
Share on other sites

Ножка - РА6

Листинг:

if(( (GPIOA->IDR) & 0x40) == 0x40)                        //
08000644:   movs    r3, #144        ; 0x90
08000646:   lsls    r3, r3, #23
08000648:   ldr     r3, [r3, #16]
 26               goto _2;                                            //
0800064a:   nop     ; (mov r8, r8)

Share this post


Link to post
Share on other sites
2 minutes ago, Vlad_G said:

Листинг:

Больше строк: от условного оператора выше и ниже по десять строк. Хотя и тут видно, что со считанным значением ничего не делается. Исходника тоже больше дайте.

Share this post


Link to post
Share on other sites

Вся подпрограмма:

    GPIOA->MODER &= ~GPIO_MODER_MODER6;						//порт A бит 6 - вход
	GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6;						//висит в воздухе, подтяжка в схеме

	GPIOA->MODER |= GPIO_MODER_MODER5_0;					//порт A бит 5 - выход
	GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5;						//порт A бит 5 пушпул
	GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR5_1;				//высокая скорость порта

	GPIOA->BSRR = GPIO_BSRR_BS_5;							//РА5 = 1

//********** Определяем наличие несущей
	if(GPIOA->IDR & 0x40 == 0x40)						    //определяем наличие несущей

	{
		goto _1;											//несущая есть
	}
	else
	{
		goto _2;											//несущей нет
	}
_2:	;
_1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
	EXTI->IMR |= 0x40; 										//Прерывание от 6-й линии EXTI6

	EXTI->RTSR |= 0x40; 									//прерывание по фронту
	EXTI->FTSR |= 0x40; 									//прерывание по спаду

	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий

Оптимизация выключена - NONE (-O0)

Листинг:

push    {r7, lr}
080005e6:   add     r7, sp, #0
  9       	GPIOA->MODER &= ~GPIO_MODER_MODER6;						//порт A бит 6 - вход
080005e8:   movs    r3, #144        ; 0x90
080005ea:   lsls    r3, r3, #23
080005ec:   ldr     r2, [r3, #0]
080005ee:   movs    r3, #144        ; 0x90
080005f0:   lsls    r3, r3, #23
080005f2:   ldr     r1, [pc, #156]  ; (0x8000690 <GpioInitDali+172>)
080005f4:   ands    r2, r1
080005f6:   str     r2, [r3, #0]
 10       	GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6;						//висит в воздухе, подтяжка в схеме
080005f8:   movs    r3, #144        ; 0x90
080005fa:   lsls    r3, r3, #23
080005fc:   ldr     r2, [r3, #12]
080005fe:   movs    r3, #144        ; 0x90
08000600:   lsls    r3, r3, #23
08000602:   ldr     r1, [pc, #140]  ; (0x8000690 <GpioInitDali+172>)
08000604:   ands    r2, r1
08000606:   str     r2, [r3, #12]
 12       	GPIOA->MODER |= GPIO_MODER_MODER5_0;					//порт A бит 5 - выход
08000608:   movs    r3, #144        ; 0x90
0800060a:   lsls    r3, r3, #23
0800060c:   ldr     r2, [r3, #0]
0800060e:   movs    r3, #144        ; 0x90
08000610:   lsls    r3, r3, #23
08000612:   movs    r1, #128        ; 0x80
08000614:   lsls    r1, r1, #3
08000616:   orrs    r2, r1
08000618:   str     r2, [r3, #0]
 13       	GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5;						//порт A бит 5 пушпул
0800061a:   movs    r3, #144        ; 0x90
0800061c:   lsls    r3, r3, #23
0800061e:   ldr     r2, [r3, #4]
08000620:   movs    r3, #144        ; 0x90
08000622:   lsls    r3, r3, #23
08000624:   movs    r1, #32
08000626:   bics    r2, r1
08000628:   str     r2, [r3, #4]
 14       	GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR5_1;				//высокая скорость порта
0800062a:   movs    r3, #144        ; 0x90
0800062c:   lsls    r3, r3, #23
0800062e:   ldr     r2, [r3, #8]
08000630:   movs    r3, #144        ; 0x90
08000632:   lsls    r3, r3, #23
08000634:   movs    r1, #128        ; 0x80
08000636:   lsls    r1, r1, #4
08000638:   orrs    r2, r1
0800063a:   str     r2, [r3, #8]
 16       	GPIOA->BSRR = GPIO_BSRR_BS_5;							//РА5 = 1
0800063c:   movs    r3, #144        ; 0x90
0800063e:   lsls    r3, r3, #23
08000640:   movs    r2, #32
08000642:   str     r2, [r3, #24]
 19       	if(GPIOA->IDR & 0x40 == 0x40)						//определяем наличие несущей
08000644:   movs    r3, #144        ; 0x90
08000646:   lsls    r3, r3, #23
08000648:   ldr     r3, [r3, #16]
 26       		goto _2;											//несущей нет
0800064a:   nop     ; (mov r8, r8)
 29       _1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
0800064c:   ldr     r3, [pc, #68]   ; (0x8000694 <GpioInitDali+176>)
0800064e:   ldr     r2, [r3, #12]
08000650:   ldr     r3, [pc, #64]   ; (0x8000694 <GpioInitDali+176>)
08000652:   ldr     r1, [pc, #68]   ; (0x8000698 <GpioInitDali+180>)
08000654:   ands    r2, r1
08000656:   str     r2, [r3, #12]
 30       	EXTI->IMR |= 0x40; 										//Прерывание от 6-й линии EXTI6
08000658:   ldr     r3, [pc, #64]   ; (0x800069c <GpioInitDali+184>)
0800065a:   ldr     r2, [r3, #0]
0800065c:   ldr     r3, [pc, #60]   ; (0x800069c <GpioInitDali+184>)
0800065e:   movs    r1, #64 ; 0x40
08000660:   orrs    r2, r1
08000662:   str     r2, [r3, #0]
 32       	EXTI->RTSR |= 0x40; 									//прерывание по фронту
08000664:   ldr     r3, [pc, #52]   ; (0x800069c <GpioInitDali+184>)
08000666:   ldr     r2, [r3, #8]
08000668:   ldr     r3, [pc, #48]   ; (0x800069c <GpioInitDali+184>)
0800066a:   movs    r1, #64 ; 0x40
0800066c:   orrs    r2, r1
0800066e:   str     r2, [r3, #8]
 33       	EXTI->FTSR |= 0x40; 									//прерывание по спаду
08000670:   ldr     r3, [pc, #40]   ; (0x800069c <GpioInitDali+184>)
08000672:   ldr     r2, [r3, #12]
08000674:   ldr     r3, [pc, #36]   ; (0x800069c <GpioInitDali+184>)
08000676:   movs    r1, #64 ; 0x40
08000678:   orrs    r2, r1
0800067a:   str     r2, [r3, #12]
 35       	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
0800067c:   movs    r0, #7
0800067e:   bl      0x80004d4 <__NVIC_EnableIRQ>
 36       	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий
08000682:   movs    r1, #1
08000684:   movs    r0, #7
08000686:   bl      0x8000508 <__NVIC_SetPriority>
 37       }
0800068a:   nop     ; (mov r8, r8)
0800068c:   mov     sp, r7
0800068e:   pop     {r7, pc}
08000690:   ldmia   r7, {r0, r1, r2, r3, r4, r5, r6, r7}
08000692:   vaddl.u<illegal width 64>       q8, d15, d0
08000696:   ands    r1, r0
08000698:   bl      0x810069a
0800069c:   lsls    r0, r0, #16
0800069e:   ands    r1, r0

Вижу, что  в листе есть только goto _2; а goto _1; нет.

Я полагал, что если оптимизации нет, то компилятор должен (как бы должен) компилировать все подряд.

Какое ему дело до того, что метки идут в одно и тоже место.

Share this post


Link to post
Share on other sites

Раскидал метки:

if(GPIOA->IDR & 0x40 == 0x40)								//определяем наличие несущей
	{
		goto _1;											//несущая есть
	}
	else
	{
		goto _2;											//несущей нет
	}

_1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
	EXTI->IMR |= 0x40; 										//Прерывание от 6-й линии EXTI6

	EXTI->RTSR |= 0x40; 									//прерывание по фронту
_2:	EXTI->FTSR |= 0x40; 									//прерывание по спаду

	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий

Лист:

if(GPIOA->IDR & 0x40 == 0x40)											//определяем наличие несущей
08000644:   movs    r3, #144        ; 0x90
08000646:   lsls    r3, r3, #23
08000648:   ldr     r3, [r3, #16]
0800064a:   movs    r2, #1
0800064c:   ands    r3, r2
0800064e:   beq.n   0x8000678 <GpioInitDali+148>
 21       		goto _1;												//несущая есть
08000650:   nop     ; (mov r8, r8)
 28       _1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
08000652:   ldr     r3, [pc, #76]   ; (0x80006a0 <GpioInitDali+188>)
08000654:   ldr     r2, [r3, #12]
08000656:   ldr     r3, [pc, #72]   ; (0x80006a0 <GpioInitDali+188>)
08000658:   ldr     r1, [pc, #72]   ; (0x80006a4 <GpioInitDali+192>)
0800065a:   ands    r2, r1
0800065c:   str     r2, [r3, #12]
 29       	EXTI->IMR |= 0x40; 											//Прерывание от 6-й линии EXTI6
0800065e:   ldr     r3, [pc, #72]   ; (0x80006a8 <GpioInitDali+196>)
08000660:   ldr     r2, [r3, #0]
08000662:   ldr     r3, [pc, #68]   ; (0x80006a8 <GpioInitDali+196>)
08000664:   movs    r1, #64 ; 0x40
08000666:   orrs    r2, r1
08000668:   str     r2, [r3, #0]
 31       	EXTI->RTSR |= 0x40; 									//прерывание по фронту
0800066a:   ldr     r3, [pc, #60]   ; (0x80006a8 <GpioInitDali+196>)
0800066c:   ldr     r2, [r3, #8]
0800066e:   ldr     r3, [pc, #56]   ; (0x80006a8 <GpioInitDali+196>)
08000670:   movs    r1, #64 ; 0x40
08000672:   orrs    r2, r1
08000674:   str     r2, [r3, #8]
08000676:   b.n     0x800067a <GpioInitDali+150>
 25       		goto _2;											//несущей нет
08000678:   nop     ; (mov r8, r8)
 32       _2:	EXTI->FTSR |= 0x40; 									//прерывание по спаду
0800067a:   ldr     r3, [pc, #44]   ; (0x80006a8 <GpioInitDali+196>)
0800067c:   ldr     r2, [r3, #12]
0800067e:   ldr     r3, [pc, #40]   ; (0x80006a8 <GpioInitDali+196>)
08000680:   movs    r1, #64 ; 0x40
08000682:   orrs    r2, r1
08000684:   str     r2, [r3, #12]
 34       	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
08000686:   movs    r0, #7
08000688:   bl      0x80004d4 <__NVIC_EnableIRQ>
 35       	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий
0800068c:   movs    r1, #1
0800068e:   movs    r0, #7
08000690:   bl      0x8000508 <__NVIC_SetPriority>
 36       }
08000694:   nop     ; (mov r8, r8)
08000696:   mov     sp, r7
08000698:   pop     {r7, pc}
0800069a:   nop     ; (mov r8, r8)
0800069c:   ldmia   r7, {r0, r1, r2, r3, r4, r5, r6, r7}
0800069e:   vaddl.u<illegal width 64>       q8, d15, d0
080006a2:   ands    r1, r0
080006a4:   bl      0x81006a6
080006a8:   lsls    r0, r0, #16
080006aa:   ands    r1, r0

Теперь есть и goto _1 и goto _2, но все равно переходит на goto _2, хотя на РА6 висит единица и по замыслу должен быть переход на goto _1.

Программа работает, естественно в изначальном варианте. Заглушки сделал на будущее, потом буду делать варианты в зависимости от наличия 1 на РА6. Сейчас пока отлаживаю другие части не стал усложнять. В отладчик полез за другим надом, но наткнулся на эту фигню. 

Edited by Vlad_G

Share this post


Link to post
Share on other sites
8 minutes ago, Vlad_G said:

movs r2, #1

Вот это в упор не понимаю при маске 0x40. Но условный переход после раскидывания меток всё-таки появился.

9 minutes ago, Vlad_G said:

movs r3, #144 ; 0x90

И что за адрес такой не понимаю.

А как GPIOA  у вас описан?

Share this post


Link to post
Share on other sites
10 minutes ago, Vlad_G said:

ldr r3, [r3, #16]

Вот здесь r3 совпадает с тем, что отладчик читает в IDR?

1 minute ago, Tolyaha said:

тактирование порта включено правильно?

Всё это я автора просил проверить вот тут

1 hour ago, haker_fox said:

Для начала:

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.