-
- Чудес не бывает. Если память однопортовая - то два обращения в нее
одновременно невозможны. AVR естественно будет притормаживать.
STM32 притормаживает, если процессор обращается в один блок с DMA.
Потому и делают несколько раздельных блоков ОЗУ. - LightElf(14.02.2021 17:43)
- Тут может быть арбитраж по циклам доступа к шине ОЗУ. Процессор-же не постоянно туда лазит. У него должны быть машинные цыклы без доступа в память вообще. Даже с конвейером. - mse homjak(14.02.2021 19:25)
- Во! Теперь мне стало понятнее, зачем они там так много накуролесили
с блоками памяти непонятного назначения :). Я-то плюнула и всё в
один блок загнала - в самый большой по объему, а кеширование ОЗУ
отключила, видимо от этого и тормоза. - Kceния(14.02.2021 18:00)
- А не проще при чтении из периферии SCB_InvalidateDCache_by_Addr,
при записи - SCB_CleanDCache_by_Addr. И блоки памяти выравнивать по
странице кеша. И тормоза меньше будут. - Andreas(14.02.2021 18:25)
- Это полный барьер памяти типа SC, его бездумное использование
вызовет просадку производительности. Корректное решение - выделить
через MPU отдельный некешируемый регион под буферы DMA. - evgeniy1294(17.02.2021 10:46)
- Не всегда это удобно, да еще потом эти буфера могут еще по
программе гулять и обрабатываться. А просадки я не заметил, выводил
на пины в контрольных точках и значимых изменений длительностей не
заметил. - Andreas(17.02.2021 11:12)
- При работе с GUI и сетью будет заметно - evgeniy1294(17.02.2021 11:15)
- SCB_InvalidateDCache_by_Addr на 16кб заняло 10мкс на 480МГц,
сначала показалось меньше. Но я читаю СД карту, а там задержки по
150..300мкс до начала чтения блока. И деваться мне некуда, оська с
только динамическим распределением памяти и чтобы использовать
заданный регион, надо ОЧЕНЬ много переписывать и некрасиво логику
работы менять. - Andreas(17.02.2021 11:45)
- Понятно, что нужно изходить из особенностей окружения, и переписывать уж точно ничего не надо. Работет - не трогай. - evgeniy1294(17.02.2021 11:49)
- С другой стороны, пишут что при двойной буферизации изображения с инвалидацией работает быстрее - evgeniy1294(17.02.2021 11:23, ссылка, ссылка)
- SCB_InvalidateDCache_by_Addr на 16кб заняло 10мкс на 480МГц,
сначала показалось меньше. Но я читаю СД карту, а там задержки по
150..300мкс до начала чтения блока. И деваться мне некуда, оська с
только динамическим распределением памяти и чтобы использовать
заданный регион, надо ОЧЕНЬ много переписывать и некрасиво логику
работы менять. - Andreas(17.02.2021 11:45)
- При работе с GUI и сетью будет заметно - evgeniy1294(17.02.2021 11:15)
- Не всегда это удобно, да еще потом эти буфера могут еще по
программе гулять и обрабатываться. А просадки я не заметил, выводил
на пины в контрольных точках и значимых изменений длительностей не
заметил. - Andreas(17.02.2021 11:12)
- Я таких и команд не знаю :), на CubeMX пока тренируюсь. - Kceния(14.02.2021 18:46)
- Хоть не на кошках ) Это из стандартного CMSIS core_cm7.h - Andreas(14.02.2021 18:56, ссылка)
- Вот не надо Ксении такое давать. Результатом будет перманентно сброшенный кэш и куча тем "ваш stm32 тормозит". - evgeniy1294(17.02.2021 10:53)
- Хоть не на кошках ) Это из стандартного CMSIS core_cm7.h - Andreas(14.02.2021 18:56, ссылка)
- Это полный барьер памяти типа SC, его бездумное использование
вызовет просадку производительности. Корректное решение - выделить
через MPU отдельный некешируемый регион под буферы DMA. - evgeniy1294(17.02.2021 10:46)
- всем спасибо, чето сам не догадался - действительно два куска SRAM1
SRAM2 на двух сосках висят отдельно - AXI коммутатор может запросы
развести. исправить, дописать и закомитить в sdk, теперь я осознано
куски sram буду использовать. позитифчик. - klen(14.02.2021 18:23)
- В F427 и выше - три куска (SRAM1, SRAM2, SRAM3). И CCM еще. Все, к чему не требуется обращаться по DMA - лучше класть в CCM (если конечно лезет). SRAM2 на 16КБ удобен для буферов Ethernet. Большой SRAM1 - для всякой прочей фигни. У меня там либо буфер экрана лежит, либо буфер видимокамеры. - LightElf(14.02.2021 18:32)
- А не проще при чтении из периферии SCB_InvalidateDCache_by_Addr,
при записи - SCB_CleanDCache_by_Addr. И блоки памяти выравнивать по
странице кеша. И тормоза меньше будут. - Andreas(14.02.2021 18:25)
- Чудес не бывает. Если память однопортовая - то два обращения в нее
одновременно невозможны. AVR естественно будет притормаживать.
STM32 притормаживает, если процессор обращается в один блок с DMA.
Потому и делают несколько раздельных блоков ОЗУ. - LightElf(14.02.2021 17:43)