stm32f746zg)
Сама суть задачи и проблемы:
Исходные данные_
Собрал проект в кубе в связке stm32f746 fw_f7_v1.16.0 + lwip(v2. 1.2)+ freertos (v10.2.1)cmsis v1(v1.02) - генератор проекта STM32CubeMX(v 6.1.0)
IDE - Stm32cubeIDE (v 1.5.0)
Работоспособность сгенеренного кода проверяю с помощью пинга.
При отключенном кэше данных все пингуется - делаю вывод что все ок.(кэш инструкций никак не влияет) на работоспособность.
При включении кэша данных плата перестает пинговаться,
При этом фриртос жив(в одной из задач мигаю светодиодом, чтобы убедиться)
Манипуляции с MPU не помогают.
Ну либо их не достаточно.
Где искать проблему?
валидация кэша же. Все часто используемые буфера валидировать и в момент приёма, и в момент передачи надо, по хорошему.
Инвалидировать сам кэш недостаточно? У меня же данные через кэш проходят. А будь данные буфферов по умолчанию не валидны, то не важно, включен кэш или выключен, пинга не происходило бы. Или вы, говоря про валидность, говорите о процессе поступления данных в кэш и там есть доп условия по валидации? У ст по этой теме пока ничего не нашел
пинг это всмысле сетевой пинг? там работает ДМА я так понимаю в драйвере! дма работает с памятью! о кэшэ она ничего не знает! вы либо должны использовать области рамы для сетевого стека(буферов) которые в связке с ДМА, которые через МПУ настраиваются как некешыруемы или как их там называют!
Недавно пришлось перечитать все эрраты и на этот камень, и даже на ядро изза проблем с кешом. В F746 ревизия ядра одна из ранних, и кеши довольно багованные сами по себе, со взаимоисключающими параграфами. Нужно иметь это в виду.
Пинг в смысле сетевой пинг, а именно по icmp по ethernet
вот вам посмотреть нужно есть ли ДМА и все такое в драйвере, или руководство найти упоминание об кэше общая инфа: http://microsin.net/programming/arm/an4839-level-1-cache-stm32f7.html
@neonsun Понял, спасибо! @KoynovStas, звучит логично, те при работе с кэшем данных и дма для буфферов которые по дма кидаются нужно отдельно некэшируемую область выделить?
Вот ничего подобного. Даже с дма данные кэшируются. Их же так или иначе проц обрабатывает. А дма просто скидывает/получает данные по адресам.
смотря что мы делаем. кэшируются данные из РАМЫ. ДМА о кэше ничего не знает! она работает напрямую с РАМой. проц работает через кэшь!. если у вас нет пересечений то хорошо! если есть! нужна синхронизация!.
Сама шина дма-да. Но если данные из кэша до запуска дма в рам не попали(валидация кэша), то и в рам им взяться неоткуда.
у него не работает скорее всего случай. когда из ДМА данные попали в РАМУ. проц обработал их часть из них осталась в Кэше. мы говорим ДМА отдавай назад!. но часть данных в Кэше. ДМА поехала отдавать не валидные данные! вот нужна синхронизации для ДМА на отдачу. и на синхронизацию для проца при обновлении данных от ДМА.. ведь проц может тупо читать кэшированные данные. ему нужно сообщить, что данные в кэше протухли. ДМА нам свежак скачала.
уверен? Где про это почитать?
Не подскажу. Я, когда столкнулся, просто надёргал статей из интернета
Обсуждают сегодня