Проект относительно простой - stm8F042F6 + дисплей Nokia 1202 + nRF24l01+. Питание батарейное.
В какой-то момент, стали происходить абсолютно необъяснимые вещи. В первом же цикле задержки, с использованием SysTick, отладка выпадает (переходит) на неиспользуемый диапазон адресов (не знаю, как правильно описать), причем в прерывание SysTick_Handler даже не входит.
Пишу в Segger. CMSIS. Тактирование от HSI. На ногах PF0, PF1 висит управление дисплеем (ножек не хватало). Пока песец в гости не зашел, с дисплеем разобрался, рисовал без проблем.
Стал грешить на камень. Поменял на новый. Те-же грабли.
Поменял на stm32f030F4 (заголовки и скипт линковщика поменял), то-же самое.
Поставил кварц, перекинув сигнал CS дисплея на другой порт, сброс дисплея вообще убрал. Изменил на запуск от HSE. то-же самое.
Стал грешить на Segger. Обновил версию. То-же самое. Поставил свежий stm32cubeIDE. Перетащил проект туда. Похожая картина, также виснет.
Уже весь мозг сломал Если убираю задержку, работает нормально, картинку рисует.
Стек (переполнен)? Роспись памяти (запись по неинициализированному/"неправильному" указателю)?
Да вряд-ли, у меня вложенных вызовов мало, виснет в самом начале. Segger вроде не сильно косячит при линковке, были проекты значительно сложнее, непонятных косяков вообще не вылезало. В листинге дизассемблера нет вообще вызовов в эту область памяти, у меня в ОЗУ нет исполняемого кода.
Сейчас притянул BOOT0 через 4.7К к земле, вроде выпадения прекратились. Не совсем понятна причина, ведь BOOT0 считывается при запуске только, а я отладчиком весь инит проходил, или я не прав? Верну назад HSIи сопли на плате приберу, посмотрим. Если опять вылезет эта-же проблема, напишу.
Была у меня подобная проблема. Только на массу полностью boot0 подтянул. Когда отладчик подключается он сбрасывает контроллер и начинает грузится абы где. Потому как наводка плавающая.
В первом же цикле задержки, с использованием SysTick, отладка выпадает (переходит) на неиспользуемый диапазон адресов (не знаю, как правильно описать), причем в прерывание SysTick_Handler даже не входит.
1. Переполнение стека. 2. Кривая работа с указателями. 3. Выход за пределы индексов массивов. 4. Ещё 100500 причин...
Заголовок сообщения: Re: stm32f0 - абсолютно непонятное поведение и зависание...
Добавлено: Чт апр 10, 2025 13:10:10
Опытный кот
Зарегистрирован: Вс мар 23, 2025 14:56:55 Сообщений: 700
Рейтинг сообщения:2
Secondtick беззнаковая, не имеет инициализации, зато первая операция же с ней - постдекремент. По крайней мере, иное не видно из "предоставленного кода". Чему станет равна 16-битная переменная, если вначале она оказалась 0 или мусором заполнена, а потом от неё отняли 1?
А, не, протупил, условие всё равно выполнится и там её сбросит. Но всё равно, странно неинициализировать переменные. Особенно если рядом другие инициализируются.
Однажды Линус Торвальдс шёл по пляжу... Спойлер..., думал о том, что мы все живём в матрице, и грустно смотрел под ноги. В песке он заметил бутылку, подозрительно похожую на коньяк, и возрадовался. Но при ближайшем рассмотрении бутылка оказалась непрозрачной, с сургучной печатью, на которой проступал религиозный символ страны, с которой сложные отношения.
Линус конечно же применил брутфорс и открыл бутылку, из которой немедленно вылез джинн.
— Значит так, у тебя есть три желания, — сообщил джинн. — Но нельзя желать, чтобы кто-то умер, нельзя желать, чтобы кто-то влюбился в тебя, и нельзя желать больше желаний.
— А меньше желаний желать можно? — уточнил Линус, продолжая думать про матрицу.
Джин озадачился, почесал в затылке и решил, что можно.
— Тогда я хочу чтобы количество моих желаний уменьшилось на три.
— Зачем? — поинтересовался джинн.
— Потому что я думаю, что ваши джинновые серверы записывают количество желаний в целочисленные переменные и не хранят информацию об отрицательных значениях, так что когда количество моих желаний уменьшится на три, оно станет равно нулю, после чего тебе нужно вычесть ещё единицу за то желание, которое только что исполнилось, переменная переполнится и количество моих желаний станет равно максимальному возможному значению.
— Слушай, я из 900-х годов до нашей эры, я не понимаю, — покачал головой джинн. — Меня как царь Соломон запечатал сюда, я выпал из новостной ленты совершенно.
— Ты просто сделай так, как я говорю, — посоветовал Линус.
Джинн вырвал жменьку волос из бороды, пошептал, поводил руками в воздухе, и ничего не произошло. Тогда он достал из широких шаровар записной свиток из папируса.
— У тебя теперь три желания, — прокомментировал он, сверившись с папирусом.
— O shit, — удивился Линус.
— Но вообще довольно здорово, — попытался ободрить его джинн. — Я никогда раньше не видел, чтобы человек загадал желание, и у него осталось столько же желаний. Даже если бесполезное. Хороший фокус для вечеринок.
В листинге дизассемблера нет вообще вызовов в эту область памяти, у меня в ОЗУ нет исполняемого кода.
Для этого не нужен код в ОЗУ. Достаточно просто немного промахнуться при записи по указателю или индексу массива. И записать мусор в стек. А потом выйти из функции по этому мусору. То же самое - при переполнении стека.
Secondtick беззнаковая, не имеет инициализации, зато первая операция же с ней - постдекремент. По крайней мере, иное не видно из "предоставленного кода". Чему станет равна 16-битная переменная, если вначале она оказалась 0 или мусором заполнена, а потом от неё отняли 1?
С Secondtick не видно криминала. Глобальные и статические переменные в си, не имеющие явного инициализатора, по дефолту неявно инитятся 0. Так что первая же операция if будет: "if (0 <= 1)" - истина. Всё корректно тут. Единственный вариант чтобы Secondtick оказалась непроинициализирована 0 - это если секция её содержащая, будет в скрипте компоновщика помечена как "no init". Но это надо специально постараться так сделать. Случайно не получится.
Код дивно коряв, но явного криминала в приведённом кусочке не вижу. Он где-то вне его.
Код дивно коряв, но явного криминала в приведённом кусочке не вижу. Он где-то вне его.
Уфф... Тут блин такие великие спецы собрались, что мне сразу неуютно стало. К коду прицепились, хотя проблема явно не с ним. Больше мыслей не было? Или главное - докопаться? Может покажете пример "дивно ровного" кода, а мы обсудим?
Короче, тему можно закрывать, BOOT0 висел в воздухе и на нем, в отличии от NRST внутренней подтяжки нет. Притянул к нулю, проблемы прекратились.
Проверка земли/питания/других "специфичных" ног (кварц/ресет/бут) - это первое, что делаю еще до изучения как ведет себя программа... Поэтому как бы считал, что это давно проверено
В какой-то момент, стали происходить абсолютно необъяснимые вещи.
как бы указывает на код. обычно так и бывает - ошибка есть, но не сильно то и проявляется. Когда код изменяется - "плывут" смещения и ошибка проявляется более явно и с "очень странным поведением".
Или раньше BOOT0 был подключен земле, а потом ты его отпаял? Почему до какого-то момента неподключенный BOOT0 ни на что не влиял?
Да лажанулся, каюсь , не развел. Он и ресет болтался в воздухе. Проблема вылезла после напайки nrf24l01, видимо не особо тщательно отмыл от "безотмывочного" флюса Kettler TT.
В первом же цикле задержки, с использованием SysTick, отладка выпадает (переходит) на неиспользуемый диапазон адресов
А значит - причину вы не нашли. Отладчик сам выставляет стартовый адрес, и ему состояние BOOT0 совершенно фиолетово. Хотя лучше, на всякий случай, ставить его в состояние запрещающее старт кода из флешь.
Насчёт "докопаться": Удалённо, с форума, никто не видит - в чём вы там рукожопите. И видим мы только ту инфу, которую предоставляет вопрошающий. Вы предоставили маленький кусочек кода. Про то, что что-то там у вас болтается в воздухе - вы ничего не писали. И естественно никто не станет тут предполагать такие очевидные, само собой разумеющиеся вещи, как установка корректных уровней на всех ногах. С таким же успехом мы могли бы предположить, что у вас и ноги питания чипа "болтаются в воздухе". А запитка идёт паразитными токами через сигнальные ноги. От того и глюки.
PS: А собственно да - ноги питания МК у вас случайно в воздухе не болтаются? А то - кто вас знает, что вы там в схеме нарукожопили.... Схему вы ведь тоже на показали. Только какие-то скриншоты, непонятно как относящиеся к теме.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения