charkin 0 26 марта, 2017 Опубликовано 26 марта, 2017 (изменено) · Жалоба Всем привет. Есть проблема - периодически МК падает в HardFault во время обмена по UART. Процессор - STM32F405. Формат общения - Запрос-Ответ - чужое устройство посылает команды по UART, которые МК должен обработать и отправить ответ. Скорость обмена 115200, 8N1. Работало стабильно, но до того момента, пока обмен не стал более интенсивным. Подцепил логический анализатор на шину и увидел, что в момент, когда МК отправляет данные, устройство тоже что-то пытается отправить - после чего логика работы МК рушится и он падает в HardFault. На скриншоте записанный обмен - верхняя линии это команды от устройства, нижняя - ответы МК, соответственно. В момент, когда МК отправляет ответ устройству, тот по непонятной причине сам отправляет какой-то мусор (судя по содержимому) в МК, в результате последний сходит с ума и шлет какой-то адовый по своему размеру буфер (при этом в отладчике видно, что длина данных при отправке была указана верно), после чего падает. Почему такое происходит и как бороться? P.S. Падение в HardFault может произойти и через 5-10 минут, а может и через 1,5 часа. Изменено 22 ноября, 2022 пользователем haker_fox Уточнил название темы, добавил теги, переместил в нужный раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
minimumlaw 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Почему такое происходит и как бороться? Тяжела работа телепата... С хорошей долей вероятности ищите проблему в коде. Скорее всего в обработчике UART'а или около того. Аппаратная заморочка практически 100% исключена. А уж что у Вас там написано - это Вам виднее. Перекрытие буферов, не отключение приемного канала (если реально жесткий полудуплекс), перезаписывание структур - причин масса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Режим обмена - ну да, фактически полудуплекс. В буфере, который я отправляю в ответ, есть заголовок, в нем длина данных - значение там верное. Почему принимающая сторона начинает отправку данных, не дожидаясь конца пакета - вопрос интересный, но мне больше интересно, как обойти эту проблему, ведь именно после этой внеплановой посылки мой проц сходит с ума и отправляет гораздо больше данных, чем должен. То есть пришедшие от устройства данные что-то портят в настройках УАРТа - выглядит это так. Попробовал на время обработки полученных данных и отправки ответа отключать приемную линию - в регистре CR1 обнулил бит RE - не помогло, все равно упало.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Режим обмена - ну да, фактически полудуплекс. В буфере, который я отправляю в ответ, есть заголовок, в нем длина данных - значение там верное. Почему принимающая сторона начинает отправку данных, не дожидаясь конца пакета - вопрос интересный, но мне больше интересно, как обойти эту проблему, Проблема в Вашем кривом коде. Та сторона тут не при чём, как сигналы и осциллограф - тут лишние. Вам уже сказали - ищите проблему у себя. Что бы ни отправляла удалённая сторона, пускай совершенный бред - принимающее ПО не должно от этого виснуть или вылетать в исключение. Если так происходит - это ПО кривое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Проблема в Вашем кривом коде. Та сторона тут не при чём, как сигналы и осциллограф - тут лишние. Вам уже сказали - ищите проблему у себя. Что бы ни отправляла удалённая сторона, пускай совершенный бред - принимающее ПО не должно от этого виснуть или вылетать в исключение. Если так происходит - это ПО кривое. Так я и не спорю с этим - понятно, что проблема в моем коде. Сигналы анализатором решил посмотреть для понимания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться