FreeRTOS使用外部SRAM作为内存管理的方法
内存管理使用Heap_4在Heap_4.c文件中将
/* Allocate the memory for the heap. */
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
/* The application writer has already defined the array used for the RTOS
heap - probably so it can be placed in a special segment or address. */
extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif /* configAPPLICATION_ALLOCATED_HEAP */
改为:
/* Allocate the memory for the heap. */
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
/* The application writer has already defined the array used for the RTOS
heap - probably so it can be placed in a special segment or address. */
//extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
__align(8) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]__attribute__((at(0X68000000)));
#else
//static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
__align(8) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]__attribute__((at(0X68000000)));
#endif /* configAPPLICATION_ALLOCATED_HEAP */
__align(8) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]__attribute__((at(0X68000000))) 的意思表示将这个数组定义在0X68000000这个内存位置其实这个位置就是SRAM的地址并按照1字节对齐
configTOTAL_HEAP_SIZE这个可以根据需要更改 我改成了1024*1024就是外部的SRAM全部使用heap_4管理 以后直接使用pvPortMalloc()分配内存使用就行了 感谢楼主分享,加分 按这个试了下,会出现HardFault,还要做哪些配置吗????
回 paulhe 的帖子
paulhe:按这个试了下,会出现HardFault,还要做哪些配置吗???? (2017-07-13 12:48) images/back.gif是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。
回 eric2013 的帖子
eric2013:是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。 (2017-07-13 14:46) images/back.gif已经初始化了!
回 paulhe 的帖子
paulhe:已经初始化了! (2017-07-14 09:17) images/back.gif用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。
回 eric2013 的帖子
eric2013:用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。 (2017-07-14 09:39) images/back.gif是F4系列,我用CCMRAM测试下看行不行!谢谢
回 eric2013 的帖子
eric2013:用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。 (2017-07-14 09:39) images/back.gifCCM可以 eric2013 发表于 2017-7-13 14:46
是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。
我按照这样的方法,将configTOTAL_HEAP_SIZE设为1M。一直调用pvPortMalloc和vPortFree,发现当申请的内存超过五百多K时,连续调用两三次pvPortMalloc和vPortFree之后,再申请的内存返回指针会指向一个很奇怪的地址,比如0x8这样既不在内存也不在外存的,每次都这样。而当申请内存五百多k以下时则没有问题。硬汉大哥这有什么说法吗? 不明白,为什么已经有 configAPPLICATION_ALLOCATED_HEAP 来extern外部的ucHeap了,还要修改OS的头文件?直接在外部定义一下不就可以了吗? birkhoff 发表于 2018-6-13 11:23
不明白,为什么已经有 configAPPLICATION_ALLOCATED_HEAP 来extern外部的ucHeap了,还要修改OS的头文件?直 ...
没问题的,我们的例子就是这么写的
你好,我之前有使用STM32F407过外部SRAM作为内存
你需要添加 #define DATA_IN_ExtSRAM 在全局宏定义哪里,
然后在 system_stm32f4xx.c里面的void SystemInit_ExtMemCtl(void)函数初始化FSMC,(官方有提供的寄存器版本的初始化,你也可以注释掉,调用自己的初始化函数)
这样就可以了 这是我在system_stm32f4xx.c的初始化
void SystemInit_ExtMemCtl(void)
{
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////Extern SRAM /////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
#include "fsmc.h"
FSMC_LCD_Init();
FSMC_SRAM_Init();
} 锐斌__ 发表于 2018-10-21 22:13
这是我在system_stm32f4xx.c的初始化
void SystemInit_ExtMemCtl(void)
按照您说的方法,直接HardFault了。如果SRAM的驱动放在main就没我问题 eric2013 发表于 2017-7-13 14:46
是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。
你好,可以分享下源码参考下吗?这边处理也是出现硬错误 eric2013 发表于 2018-6-13 11:27
没问题的,我们的例子就是这么写的
这个例子哪里有,V5资料盘没找到
页:
[1]