Как можно отловить случайную багу в embadded проекте?

Добрый день! Проект в Keil, контроллер stm32f4, использую в качестве OS: freertos, пишу на С++/С.
Уже третью неделю борюсь с багой -- что-то в бизнес логике ломает память. Это выражается "случайным" появлением значения 0xFF (1 байта) в области кольцевого буфера на приём от UART (на данный момент зафиксировал такое поведение только в этой области). Сначала думал, что это DMA как то случайно ломает память, и протестировал просто работу приёма в кольцевой буфер. В результате кольцевой буфер работает точно, и сам по себе механизм приёма данных через DMA никак не "ломает" память. Но, как только включаю задачу с бизнес логикой, в случайные моменты времени в кольцевом буфере UARTa на приём, в случайном индексе появляется байт 0xff. Т.е. точно ломает память буфера бизнес логика. Она написана на c++, и кода там довольно много. Но к чему хоть придраться, непонятно.
Я пробовал отыскать ошибку множеством подходов, но каждый раз, когда появлялась зацепка, я терпел фиаско и начинал сначала.
Если есть вопросы по дополнительной информации, задавайте, я отвечу. На данный момент я понятия не имею как можно отловить эту багу. Рад новым предложениям:)
  • Вопрос задан
  • 529 просмотров
Решения вопроса 1
@pixik Автор вопроса
Спасибо за рекомендации,
нашёл багу!
В кольцевом буфере считал указатель на голову без volatile. Написал так и все заработало как нужно:
volatile uint32_t head = REC_BUFF_SZ - this->huart.hdmarx->Instance->NDTR;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mirn
1. Возможно это блокировки шины памяти.
Они бывают если что-то занимает озу или флешь надолго или уарт очень быстрый, 500кБод и выше.
Классика жанра - прошивка параметров в флеш или самого флеша. Или работа другого канала ДМА на макс скорости.
2. Возможно ошибки приёма уарта, советую глянуть осцилографом стабильность уровней напряжения и временную стабильность фронтов.
3. Баг в коде и порча ОЗУ - советую поменять раскладку памяти, если использовать LD файлы то это прощее, в других более закоренелых системах типа кейла непонятно как. Но метод такой - если перенести буфер уарта на другое место в ОЗУ и всё исправилось то это оно и есть. Можно размер стека изменить, поиграться с размером прочих буферов, массивов и тд.
4. Попытаться покускам поотключать бизнес код.
5. Не использовать RTOS - да фантастика, но очень часто причина в нём. Он не идеален, да даже если он был бы идеален, можно накосячить с его использованием.
6. Неправильно настроенная прочая аппаратура - поотключать левое.
7. Подумать когда возникла ошибка и об обстоятельстве её возникновения, нередко бывает например когда ошибка в ячейке c смещением 0х13 и тут вспоминаешь что была добавлена стркутура и третий байт массива в этой структуре как раз с смещением 0х13 после вызова уарта меняется ... опа!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы