Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Всем доброго! 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 не хочется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 11 минут назад, Vlad_G сказал: Режиме отладки - не зависимо от сигнала на входе порта всегда переходит на goto _2; те выполняется конструкция else. При этом отладчик адекватно показывает наличие 1 или 0 на входе порта. Реально отладчик показывает именно "наличие 1 или 0 на входе порта"??? У вас уникальный отладчик, с уникальными функциями! Ибо обычные показывают только содержимое регистров периферии. Цитата При всех глюках stm32, что встречаются в тырнете, всегда грешить на stm не хочется. Грешить в любом случае нехорошо. Надо просто заглянуть в ассемблерный листинг данного фрагмента. PS: Хотя конечно осознаю, что "CubeIDE" и "ассемблер" - видимо вещи несовместимые по природе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 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: Надо просто заглянуть в ассемблерный листинг данного фрагмента. Не пугайте людей)))))))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Возможно, отладчик уникальный... Да, показывает состояние регистра IDR, ну а это состояние как соотносится с реальностью .... .!. знает. Скобки - это уже варианты, думал, мало ли какие неоднозначности при компиляции. Поставил: if( 0x40 == 0x40) - переход сделал правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 8 minutes ago, Vlad_G said: Да, показывает состояние регистра IDR Да при чём здесь регистр-то? На ножке что? Посмотрите измерительным прибором. Я так всегда делаю в спорных ситуациях. Дел на 1 минуту, даже меньше, и хотя бы понятно, куда смотреть: в железо или программу. 8 minutes ago, Vlad_G said: неоднозначности при компиляции Да, неоднозначности есть) Они называются стандарт) Но можете начать с книжки. Керниган, Ричи "Язык Си". Обязательно третье издание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 9 minutes ago, haker_fox said: Да при чём здесь регистр-то? На ножке что? В начале я написал, что отладчик показывает адекватно... мне показалось, что этого достаточно. Смотрю осциллографом, ц"ы"фровым. Сейчас подтянул резистором к питанию - 1 всегда висит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 8 minutes ago, Vlad_G said: мне показалось, что этого достаточно Я же вас не знаю, и рядом с вами не нахожусь. Откуда же мне знать ваш уровень адекватности, поэтому и задаю уточняющие вопросы. Если IDR читает адекватно, как вы сказали, то условие тоже дожно выполняться. Т.к. отладчик и программа читают регистры одинаково. Тогда: 1. Номер ножки в студию. 2. Ассемблерный листине с условным оператором +- десяток строк в студию. 3. Уровень оптимизации компилятора тоже в студию. 4. Что находится по меткам goto_1 и goto_2. В вашем случае мог просто сработать оптимизатор. Выбросить условие из программы, если метки ссылаются на один и тот же фрагмент кода. Или на одинаковые фрагменты кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Ножка - РА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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 2 minutes ago, Vlad_G said: Листинг: Больше строк: от условного оператора выше и ниже по десять строк. Хотя и тут видно, что со считанным значением ничего не делается. Исходника тоже больше дайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Вся подпрограмма: 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; нет. Я полагал, что если оптимизации нет, то компилятор должен (как бы должен) компилировать все подряд. Какое ему дело до того, что метки идут в одно и тоже место. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 (изменено) · Жалоба Раскидал метки: 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. Сейчас пока отлаживаю другие части не стал усложнять. В отладчик полез за другим надом, но наткнулся на эту фигню. Изменено 29 октября, 2020 пользователем Vlad_G Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tolyaha 1 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Так у Вас _1: _2: это одно и то же как компилятору быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 8 minutes ago, Vlad_G said: movs r2, #1 Вот это в упор не понимаю при маске 0x40. Но условный переход после раскидывания меток всё-таки появился. 9 minutes ago, Vlad_G said: movs r3, #144 ; 0x90 И что за адрес такой не понимаю. А как GPIOA у вас описан? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tolyaha 1 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба тактирование порта включено правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 10 minutes ago, Vlad_G said: ldr r3, [r3, #16] Вот здесь r3 совпадает с тем, что отладчик читает в IDR? 1 minute ago, Tolyaha said: тактирование порта включено правильно? Всё это я автора просил проверить вот тут 1 hour ago, haker_fox said: Для начала: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться