Потребление SRAM для cortex-M3 и cortex-M7

Я перехожу с M3 на M7. M3 использует STM32F103VE и имеет 64 КБ SRAM. M7 - это STM32F746ZG, у него 240 КБ SRAM. Я переместил большую часть кода M3 в M7. Дополнительный LWIP используется для функции Ethernet в M7. Но я обнаружил, что памяти кучи не хватало, и ее увеличили, как показано ниже.

#define configTOTAL_HEAP_SIZE ( ( size_t ) (42 * 1024 ) )

При использовании M3 использовался следующий размер кучи.

#define configTOTAL_HEAP_SIZE ( ( size_t ) (15 * 1024 ) )

Если я использую размер кучи M3, возникает проблема, потому что памяти кучи недостаточно. И если я установлю размер кучи на 45 * 1024, функция Ethernet не будет работать и не увеличивает память кучи. Я знаю, что увеличение кучи уменьшает стек. Однако, хотя он увеличил кучу примерно в три раза по сравнению с M3, ему все еще не так много возможностей для использования функций MALLOC.

Несмотря на то, что у M7 примерно в четыре раза больше памяти, чем у M3, я не понимаю, почему так много памяти. Если у кого-то был подобный опыт, дайте, пожалуйста, дельный совет. Я использую FreeRTOS, LWIP и HAL для STM32. Я хочу в достаточной мере использовать функцию Malloc.


person Hans    schedule 25.06.2019    source источник


Ответы (2)


Вы можете (и должны!) Сконфигурировать LWIP так, чтобы он использовал диспетчер внутренней памяти, а не malloc. См. http://www.nongnu.org/lwip/2_1_x/mem_8c.html например.

person SirNobbyNobbs    schedule 25.06.2019

  1. Не используйте malloc. Вместо этого используйте функции malloc freeRTOS. Если вы используете malloc, он использует стандартную кучу, определенную в скрипте компоновщика, которая обычно имеет длину около 0x200 байт.

  2. Потребление памяти одинаково в любом в обоих семействах. Проблема только в вашем коде

  3. Перенос между семьями сложнее, чем просто изменение определений. Вы также должны изменить скрипт компоновщика, изменить включенные заголовки cmsis и, скорее всего, вашу программу.

person 0___________    schedule 25.06.2019
comment
Я использую heap_4.c в freeRTOS и вызываю pvPortMalloc () для функции malloc. Я сделал функцию MALLOC следующим образом. #define MALLOC (x) pvPortMalloc (x) Итак, коды M3 и M7 используют один и тот же метод. Но я не менял скрипт компоновщика, потому что я что-то изменил в скрипте компоновщика, но эффекта нет. Однако если я внесу поправки в FreeRTOSConfig.h, то смогу изменить размер кучи. - person Hans; 26.06.2019
comment
@hans, вам нужно узнать об этом больше. Программирование Rtos требует достаточно глубоких знаний языка, оборудования и инструментария. - person 0___________; 26.06.2019