реклама на сайте
подробности

 
 
> STM32CubeMX 4.21.0 генерит шмурдяк, FreeRTOS не запускается с LwIP
Dimka78
сообщение Jul 27 2017, 11:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 18-07-15
Пользователь №: 87 617



Добрый день.

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

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

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

Также столкнулись с отсутствием поддержки драйверами периферии функций инвалидации и очистки data-кэша. Будьте осторожны.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
Genadi Zawidowsk...
сообщение Jul 27 2017, 12:03
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Так они вроде кэш и не включают нигде?
Go to the top of the page
 
+Quote Post
Dimka78
сообщение Jul 27 2017, 12:41
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 18-07-15
Пользователь №: 87 617



Верно. Из коробки - нет, однако нашли appnote который показывает как это делать. Да и уже делали на ATSAME70Q21 - там было лучше с поддержкой кэша в драйверах, те опыт положительный был.
Как оказалось, драйвер Ethernet без функций Invalidate/Clean - пришлось дописывать.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 27 2017, 13:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Dimka78 @ Jul 27 2017, 15:41) *
Как оказалось, драйвер Ethernet без функций Invalidate/Clean - пришлось дописывать.

У меня всегда было впечатление, что их "драйвер" лишь для примера. "Никаких гарантий, не используйте в аппаратах жизнеобеспечения, мы не виноваты" и так далее. Если нужно что-то боевое, то делать самому.
Go to the top of the page
 
+Quote Post
Dimka78
сообщение Jul 27 2017, 14:15
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 18-07-15
Пользователь №: 87 617



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

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

Сообщение отредактировал Dimka78 - Jul 27 2017, 14:17
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 27 2017, 14:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dimka78 @ Jul 27 2017, 14:56) *
Также столкнулись с отсутствием поддержки драйверами периферии функций инвалидации и очистки data-кэша. Будьте осторожны.

какой именно кеш? И зачем его очищать (особенно драйверу периферии)??
Или имеются в виду инструкции барьеров: DMB/DSB/...?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 27 2017, 14:49
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Какой-какой... Это ж бубль гум STM32F7. Там процессор быстрый-быстрый, но с кешем. Скоро все будем осваивать эти новые грабли.
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 27 2017, 14:54
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



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

Там еще есть MPU через который можно кэширование в той части памяти где расположены буферы просто отключить, ну или в DTCM можно положить (она не кэшируется) - это уже смотря какие у Вас требования. Зачастую это более эффективный вариант, чем "дергать" кэш.
Go to the top of the page
 
+Quote Post
Dimka78
сообщение Jul 28 2017, 14:41
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 18-07-15
Пользователь №: 87 617



Цитата(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, то мороки много (так показалось).
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 28 2017, 16:58
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
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 - Jul 28 2017, 17:00
Go to the top of the page
 
+Quote Post
Dimka78
сообщение Jul 29 2017, 15:13
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 18-07-15
Пользователь №: 87 617



Цитата(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 - но занимает много времени.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016