panda1985 发表于 2017-6-5 10:16:50

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()分配内存使用就行了

eric2013 发表于 2017-6-5 10:24:32

感谢楼主分享,加分

paulhe 发表于 2017-7-13 12:48:14

按这个试了下,会出现HardFault,还要做哪些配置吗????

eric2013 发表于 2017-7-13 14:46:03

回 paulhe 的帖子

paulhe:按这个试了下,会出现HardFault,还要做哪些配置吗???? (2017-07-13 12:48) images/back.gif

是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。

paulhe 发表于 2017-7-14 09:17:52

回 eric2013 的帖子

eric2013:是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。 (2017-07-13 14:46) images/back.gif

已经初始化了!

eric2013 发表于 2017-7-14 09:39:06

回 paulhe 的帖子

paulhe:已经初始化了! (2017-07-14 09:17) images/back.gif

用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。

paulhe 发表于 2017-7-14 13:07:40

回 eric2013 的帖子

eric2013:用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。 (2017-07-14 09:39) images/back.gif

是F4系列,我用CCMRAM测试下看行不行!谢谢

paulhe 发表于 2017-7-14 14:27:37

回 eric2013 的帖子

eric2013:用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。 (2017-07-14 09:39) images/back.gif

CCM可以

图图 发表于 2018-5-11 08:59:58

eric2013 发表于 2017-7-13 14:46
是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。

我按照这样的方法,将configTOTAL_HEAP_SIZE设为1M。一直调用pvPortMalloc和vPortFree,发现当申请的内存超过五百多K时,连续调用两三次pvPortMalloc和vPortFree之后,再申请的内存返回指针会指向一个很奇怪的地址,比如0x8这样既不在内存也不在外存的,每次都这样。而当申请内存五百多k以下时则没有问题。硬汉大哥这有什么说法吗?

birkhoff 发表于 2018-6-13 11:23:26

不明白,为什么已经有 configAPPLICATION_ALLOCATED_HEAP 来extern外部的ucHeap了,还要修改OS的头文件?直接在外部定义一下不就可以了吗?

eric2013 发表于 2018-6-13 11:27:39

birkhoff 发表于 2018-6-13 11:23
不明白,为什么已经有 configAPPLICATION_ALLOCATED_HEAP 来extern外部的ucHeap了,还要修改OS的头文件?直 ...
没问题的,我们的例子就是这么写的

锐斌__ 发表于 2018-10-21 22:13:12

你好,我之前有使用STM32F407过外部SRAM作为内存
你需要添加 #define DATA_IN_ExtSRAM 在全局宏定义哪里,
然后在 system_stm32f4xx.c里面的void SystemInit_ExtMemCtl(void)函数初始化FSMC,(官方有提供的寄存器版本的初始化,你也可以注释掉,调用自己的初始化函数)
这样就可以了

锐斌__ 发表于 2018-10-21 22:13:52

这是我在system_stm32f4xx.c的初始化

void SystemInit_ExtMemCtl(void)
{
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////Extern SRAM /////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
#include "fsmc.h"
    FSMC_LCD_Init();
    FSMC_SRAM_Init();
}

王海靖 发表于 2018-12-8 09:16:05

锐斌__ 发表于 2018-10-21 22:13
这是我在system_stm32f4xx.c的初始化

void SystemInit_ExtMemCtl(void)


按照您说的方法,直接HardFault了。如果SRAM的驱动放在main就没我问题

13432890113 发表于 2020-10-21 10:12:05

eric2013 发表于 2017-7-13 14:46
是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。

你好,可以分享下源码参考下吗?这边处理也是出现硬错误

13432890113 发表于 2020-10-21 10:56:36

eric2013 发表于 2018-6-13 11:27
没问题的,我们的例子就是这么写的

这个例子哪里有,V5资料盘没找到
页: [1]
查看完整版本: FreeRTOS使用外部SRAM作为内存管理的方法