Доброе время суток всем.
Начал изучать STM32 и столкнулся с такой проблемой.
Установил точку останова(стр 72), но программа останавливается не в той точке а совсем в другом месте (стр 84).
Если удалить if в строке 70 то работает все как надо.
В чем может быть проблема?
Прошу сильно не пинать.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Предположение первое: вычисления между строках ничего не меняют, и оптимизатор их удалил. Варианты: удалить оптимизацию компилятора или объявить используемые переменные как volatile.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
[uquote="RUNA",url="/forum/viewtopic.php?p=4704510#p4704510"]Начал изучать STM32[/uquote]Прям как Гагарин - 12-го апреля!
[uquote="RUNA",url="/forum/viewtopic.php?p=4704525#p4704525"]Оптимизация 0.[/uquote]Тогда - какое-то нарушение связывания между скомпилированным загружаемым образом и исходными файлами.
Т.е. - вы изменили исходники, но не перекомпилили образ. Обычно компилятор перед стартом отладки, определяет если исходники были изменены после последней компиляции и предлагает их пересобрать. Но иногда он по какой-то причине может не обнаруживать это. И тогда наблюдается то, что у вас.
Совет - полная пересборка проекта. С нуля. Лучше - с предварительным удалением всех предыдущих результатов компиляции. Ну или хотя-бы - через соответствующий пункт в меню компилятора.
А ещё полезно иметь рядом окно с "disassembling", там сразу видно что чему соответствует.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю. /!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
[uquote="Муркиз",url="/forum/viewtopic.php?p=4704628#p4704628"]Сообщение об ошибке при останове не появляется ?[/uquote]
Нет. Просто останавливается не в том месте.
Добавлено after 2 minutes:
[uquote="HardWareMan",url="/forum/viewtopic.php?p=4704607#p4704607"]А ещё полезно иметь рядом окно с "disassembling", там сразу видно что чему соответствует.[/uquote]
Открыто. Но, я в нем не чего не понимаю. Отличается от ассемблера в avr.
Добавлено after 2 minutes 12 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4704654#p4704654"]Правильно настрой оптимизацию для отладки. https://cloud.mail.ru/public/GjPf/jncyBG7WL[/uquote]
Написал выше. Оптимизация нет.
Добавлено after 2 minutes 43 seconds:
Если убрать точку останова то программа не входит в функцию if а возвращается на начало while.
Добавлено after 3 minutes 8 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4704518#p4704518"]как volatile.[/uquote]
Сделал. Теперь стал проверять if, но потом вываливается в начало не зависимо от результата сравнения.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Если путь меняется после изменения условий, то вероятно проверка становится бессмысленной (т.е. результат с ней и без нее: одинаков).
Попробуйте оптимизировать свои проверки, например: с листом бумаги и карандашом.
В общем (из AVR-щиков) до сих пор не понимаю, почему есть выражения типа: 1<<0; 0b11<<0; 0b000<<0 ...
Что-то вроде "диалекта AVR" . Не могу к этому привыкнуть и всё тут (+ транслейт).
Проще рассчитать и установить окончательное значение.
[uquote="tonyk",url="/forum/viewtopic.php?p=4704666#p4704666"][
А должна быть для отладки[/uquote]
Попробую.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
[uquote="veso74",url="/forum/viewtopic.php?p=4704668#p4704668"]В общем (из AVR-щиков) до сих пор не понимаю, почему есть выражения типа: 1<<0; 0b11<<0; 0b000<<0 ...[/uquote]
Я то же из avr-щиков. Это просто, сдвиг в лево по маске с определенного бита.
Добавлено after 51 second:
[uquote="veso74",url="/forum/viewtopic.php?p=4704676#p4704676"]Если код не скрыт и не секретен ( ), можете ли поделиться здесь всем архивом?[/uquote]
Вечером.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
[uquote="RUNA",url="/forum/viewtopic.php?p=4704675#p4704675"][uquote="tonyk",url="/forum/viewtopic.php?p=4704666#p4704666"][
А должна быть для отладки[/uquote]
Попробую.[/uquote]
Ага, картинка выше.
[uquote="veso74",url="/forum/viewtopic.php?p=4704678#p4704678"]Сдвиг в лево по маске понятно и нормально, Сдвиг с 0 - нет.[/uquote]
Сброс битов.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Проблему решил. Все дело в компиляторе. Он удалял эту функцию. Пришлось вместо MODIFY_REG(ControlKey,ControlKey,0b11<<0);
сделать SET_BIT(ControlKey,1<<0); А в другой функции вместо снятия бита установка бита, и тогда все заработало как надо.
veso74 вы просили прогу во вложении
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
всегда равна 1. Проверка всегда переходит отсюда на строку 84. GPIO_IDR_IDR12 вероятно не изменяется.
(Регистр входных данных GPIO используется для чтения состояния ввода-вывода определенного контакта GPIO или порта GPIO. Здесь можем только читать этот регистр, но не записывать в него).
Спойлер
Не знаю логику создания устройства. Пересмотрите логику.
Последний раз редактировалось veso74 Вт апр 15, 2025 08:34:17, всего редактировалось 1 раз.
Логика простая. При нажатии кнопки происходит вычитание Skvagnoct1 по таймеру до мин значения. Когда достигло мин значения устанавливается бит 1, что бы не заходить в эту функцию. При отпускании кнопки переходим по else и по таймеру прибавляем Skvagnoct1 до макс значения и происходит сброс всех контрольных битов.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.