Странная проблема повреждения памяти, FreeRTOS, STM32F777II - PullRequest
0 голосов
/ 28 сентября 2018

В настоящее время я занимаюсь разработкой встроенного программного обеспечения, в котором используется FreeRTOS, работающий на микроконтроллере STM32F777II.С точки зрения ресурсов, у меня есть около 10 задач (общая сумма стека будет меньше 40 КБ) с тем же приоритетом, около 4 очередей по 1 КБ каждая, 4 двоичных семафора.Я знаю, что это будет неполный вопрос без публикации фактического кода, но у меня действительно нет какой-либо конкретной части в моей прошивке, которую, я думаю, стоит поделиться, связанной с моей проблемой.В моем коде есть тонна бизнес-логики, которой я не могу полностью поделиться.

У меня есть структура, которая состоит из нескольких массивов char и int определенной длины.Каждая из четырех задач использует эти структуры.Каждая структура занимает около 15 Кбайт пространства и определяется в глобальном пространстве среды FreeRTOS, а не локальной для задачи.Структуры размещаются только статически, а не динамически во время выполнения.И так как я инициализирую несколько членов структуры при объявлении, они переходят в раздел .data, только если я не ошибаюсь.До сих пор в моем коде не было абсолютно никаких проблем, и он работал на 100% без каких-либо проблем.Теперь у меня недавно было требование, чтобы мне нужно было добавить ту же структуру еще к двум задачам.Итак, я добавил этот 15-килобайтный стук в одну из моих задач, в основном просто выделил и инициализировал и не выполнял никакой обработки ни в одной из задач.Не наблюдается никаких проблем, ничего, нет повреждения данных, ничего.Теперь, когда я выделил еще одну структурную переменную только того же типа, я наблюдаю искажение данных во многих других местах моего проекта.Некоторые очереди перестали работать правильно и показывали данные мусора при чтении.Некоторые из других буферов также показали повреждение данных.Я действительно не уверен, почему только еще одна переменная выделения этой структуры вызывает много повреждения данных в других местах в моем проекте.Если я уберу это выделение, все вернется на круги своя.Мой MCU имеет 512 КБ ОЗУ и, согласно функции анализатора сборки среды IDE, он показал использование ОЗУ ниже 40%, так что вызывает эту проблему, какие-либо предложения попробовать?Может быть из-за перекрытия разделов .data или .bss или чего-то еще?Во время этого я не наблюдал переполнения стека или серьезных сбоев в системе.

1 Ответ

0 голосов
/ 29 сентября 2018

Для быстрого разрешения:

Я случайно отключил D-кэш , закомментировав функцию:

SCB_EnableDCache();

иВуаля, все начало работать правильно, как и должно без каких-либо случаев повреждения данных.

Для долгосрочного и правильного разрешения:

Похоже, есть некоторые скрытые проблемы с моим кодированием.Мне нужно рассмотреть использование памяти, а также области памяти с различными свойствами.Посмотрите на шины, просмотрите любое использование DMA и настройки памяти MPU.Кроме того, проверьте правильность использования директив энергозависимой памяти, поточно-ориентированной работы и проблем кэш-когерентности .Кроме того, используйте ограждение памяти и очистку кэша в зависимости от ситуации.

Подробнее: Кэш 1-го уровня для серий STM32F7 и STM32H7

...