Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32CubeMX 4.21.0 генерит шмурдяк
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dimka78
Добрый день.

Наша комманда столкнулась проблемой и решила поделиться - мало ли кому может пригодиться.
STM32CubeMX 4.21.0 версия генерит код, который при запуске впадает в ASSERT изза кривых приоритетов прерывания.
Видимо STMicro пропустила Unit testы.

Наша платформа: STM32F7 + FreeRTOS + LwIP.
STM32CubeF7 версии 1.7.0

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

Также столкнулись с отсутствием поддержки драйверами периферии функций инвалидации и очистки data-кэша. Будьте осторожны.
Genadi Zawidowski
Так они вроде кэш и не включают нигде?
Dimka78
Верно. Из коробки - нет, однако нашли appnote который показывает как это делать. Да и уже делали на ATSAME70Q21 - там было лучше с поддержкой кэша в драйверах, те опыт положительный был.
Как оказалось, драйвер Ethernet без функций Invalidate/Clean - пришлось дописывать.
scifi
Цитата(Dimka78 @ Jul 27 2017, 15:41) *
Как оказалось, драйвер Ethernet без функций Invalidate/Clean - пришлось дописывать.

У меня всегда было впечатление, что их "драйвер" лишь для примера. "Никаких гарантий, не используйте в аппаратах жизнеобеспечения, мы не виноваты" и так далее. Если нужно что-то боевое, то делать самому.
Dimka78
Это да. И самое страшное, что у большинства так (Атмел,НХП,СТМ, ...).
Хотя надо отдать должное НХП S32K микроконтроллер имеет BSP, прошедший SRL1 тесты. Мы уже глянули внутрь, а там ба... даже аккуратный Doxygen есть.

Второй момент, в РФ полно клиентов, ( wink.gif грамотных) которые конечно же скажут при оценке вами задачи, мол "что там делать. всё ж готово от STMicro, бери CubeMX и всё". А по факту окажется гораздо сложнее оценки.
jcxz
Цитата(Dimka78 @ Jul 27 2017, 14:56) *
Также столкнулись с отсутствием поддержки драйверами периферии функций инвалидации и очистки data-кэша. Будьте осторожны.

какой именно кеш? И зачем его очищать (особенно драйверу периферии)??
Или имеются в виду инструкции барьеров: DMB/DSB/...?
scifi
Цитата(jcxz @ Jul 27 2017, 17:30) *
какой именно кеш? И зачем его очищать (особенно драйверу периферии)??

Какой-какой... Это ж бубль гум STM32F7. Там процессор быстрый-быстрый, но с кешем. Скоро все будем осваивать эти новые грабли.
Шаманъ
Цитата(scifi @ Jul 27 2017, 17:49) *
Какой-какой... Это ж бубль гум STM32F7. Там процессор быстрый-быстрый, но с кешем. Скоро все будем осваивать эти новые грабли.

Там еще есть MPU через который можно кэширование в той части памяти где расположены буферы просто отключить, ну или в DTCM можно положить (она не кэшируется) - это уже смотря какие у Вас требования. Зачастую это более эффективный вариант, чем "дергать" кэш.
Dimka78
Цитата(jcxz @ Jul 27 2017, 16:30) *
какой именно кеш? И зачем его очищать (особенно драйверу периферии)??
Или имеются в виду инструкции барьеров: DMB/DSB/...?

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

Цитата(Шаманъ @ Jul 27 2017, 16:54) *
Там еще есть MPU через который можно кэширование в той части памяти где расположены буферы просто отключить, ну или в DTCM можно положить (она не кэшируется) - это уже смотря какие у Вас требования. Зачастую это более эффективный вариант, чем "дергать" кэш.

А DTCM вариант. Только если рассматривать их appnote, то мороки много (так показалось).
Genadi Zawidowski
Цитата
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 (в зависимости от обстоятельсв).
Dimka78
Цитата(Genadi Zawidowski @ Jul 28 2017, 18:58) *
Вообще-то правильно делать ПЕРЕД отдачей буфера для обмена по 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 - но занимает много времени.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.