Перейти к содержанию
    

STM32CubeMX 4.21.0 генерит шмурдяк

Добрый день.

 

Наша комманда столкнулась проблемой и решила поделиться - мало ли кому может пригодиться.

STM32CubeMX 4.21.0 версия генерит код, который при запуске впадает в ASSERT изза кривых приоритетов прерывания.

Видимо STMicro пропустила Unit testы.

 

Наша платформа: STM32F7 + FreeRTOS + LwIP.

STM32CubeF7 версии 1.7.0

 

Вышла 4.22.0 - не пробовали пока.

 

Также столкнулись с отсутствием поддержки драйверами периферии функций инвалидации и очистки data-кэша. Будьте осторожны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верно. Из коробки - нет, однако нашли appnote который показывает как это делать. Да и уже делали на ATSAME70Q21 - там было лучше с поддержкой кэша в драйверах, те опыт положительный был.

Как оказалось, драйвер Ethernet без функций Invalidate/Clean - пришлось дописывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как оказалось, драйвер Ethernet без функций Invalidate/Clean - пришлось дописывать.

У меня всегда было впечатление, что их "драйвер" лишь для примера. "Никаких гарантий, не используйте в аппаратах жизнеобеспечения, мы не виноваты" и так далее. Если нужно что-то боевое, то делать самому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это да. И самое страшное, что у большинства так (Атмел,НХП,СТМ, ...).

Хотя надо отдать должное НХП S32K микроконтроллер имеет BSP, прошедший SRL1 тесты. Мы уже глянули внутрь, а там ба... даже аккуратный Doxygen есть.

 

Второй момент, в РФ полно клиентов, ( ;) грамотных) которые конечно же скажут при оценке вами задачи, мол "что там делать. всё ж готово от STMicro, бери CubeMX и всё". А по факту окажется гораздо сложнее оценки.

Изменено пользователем Dimka78

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Также столкнулись с отсутствием поддержки драйверами периферии функций инвалидации и очистки data-кэша. Будьте осторожны.

какой именно кеш? И зачем его очищать (особенно драйверу периферии)??

Или имеются в виду инструкции барьеров: DMB/DSB/...?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какой именно кеш? И зачем его очищать (особенно драйверу периферии)??

Какой-какой... Это ж бубль гум STM32F7. Там процессор быстрый-быстрый, но с кешем. Скоро все будем осваивать эти новые грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой-какой... Это ж бубль гум STM32F7. Там процессор быстрый-быстрый, но с кешем. Скоро все будем осваивать эти новые грабли.

Там еще есть MPU через который можно кэширование в той части памяти где расположены буферы просто отключить, ну или в DTCM можно положить (она не кэшируется) - это уже смотря какие у Вас требования. Зачастую это более эффективный вариант, чем "дергать" кэш.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какой именно кеш? И зачем его очищать (особенно драйверу периферии)??

Или имеются в виду инструкции барьеров: DMB/DSB/...?

Для работы в драйвером Ethernet, у которого свой DMA. Он положит в память новый пакет, пока SCB_InvalidateDCache_by_Addr не сделаешь - ничего не получишь.

Инструкции:

SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr

 

Там еще есть MPU через который можно кэширование в той части памяти где расположены буферы просто отключить, ну или в DTCM можно положить (она не кэшируется) - это уже смотря какие у Вас требования. Зачастую это более эффективный вариант, чем "дергать" кэш.

А DTCM вариант. Только если рассматривать их appnote, то мороки много (так показалось).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr

Вообще-то правильно делать ПЕРЕД отдачей буфера для обмена по DMA.

ПРи чтении по DMA из периферии:

Если точно буфер выровнен по размеру cache row, то можно SCB_InvalidateDCache_by_Addr. Если еще чьи-то данные могут зависнуть в кэше - то SCB_CleanDCache_by_Addr

 

При записи из памяти в периферию: SCB_CleanDCache_by_Addr/SCB_CleanInvalidateDCache_by_Addr (в зависимости от обстоятельсв).

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то правильно делать ПЕРЕД отдачей буфера для обмена по DMA.

ПРи чтении по DMA из периферии:

Если точно буфер выровнен по размеру cache row, то можно SCB_InvalidateDCache_by_Addr. Если еще чьи-то данные могут зависнуть в кэше - то SCB_CleanDCache_by_Addr

 

При записи из памяти в периферию: SCB_CleanDCache_by_Addr/SCB_CleanInvalidateDCache_by_Addr (в зависимости от обстоятельсв).

Спасибо. Замечание очень важное.

Да, Ethernet буфера у меня выровнены по размеру cache row.

Есть ещё SCB_CleanInvalidateDCache и SCB_CleanDCache - но занимает много времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...