硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7683|回复: 16
收起左侧

[FreeRTOS] FreeRTOS使用外部SRAM作为内存管理的方法

[复制链接]

8

主题

25

回帖

49

积分

初级会员

积分
49
发表于 2017-6-5 10:16:50 | 显示全部楼层 |阅读模式
内存管理使用Heap_4   

在Heap_4.c文件中  将
  1. /* Allocate the memory for the heap. */
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
  3.     /* The application writer has already defined the array used for the RTOS
  4.     heap - probably so it can be placed in a special segment or address. */
  5.     extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
  6. #else
  7.     static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
改为:
  1. /* Allocate the memory for the heap. */
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
  3.     /* The application writer has already defined the array used for the RTOS
  4.     heap - probably so it can be placed in a special segment or address. */
  5.     //extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
  6.      __align(8) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]  __attribute__((at(0X68000000)));
  7. #else
  8.     //static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
  9.      __align(8) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]  __attribute__((at(0X68000000)));
  10. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
  1. __align(8) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]  __attribute__((at(0X68000000)))   的意思表示将这个数组定义在0X68000000这个内存位置  其实这个位置就是SRAM的地址  并按照1字节对齐  
复制代码
configTOTAL_HEAP_SIZE  这个可以根据需要更改   我改成了1024*1024  就是外部的SRAM全部使用heap_4管理    以后直接使用pvPortMalloc()分配内存使用就行了

评分

参与人数 1 +5 收起 理由
eric2013 + 5

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-6-5 10:24:32 | 显示全部楼层
感谢楼主分享,加分[s:151]
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2017-7-13 12:48:14 | 显示全部楼层
按这个试了下,会出现HardFault,还要做哪些配置吗????
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-7-13 14:46:03 | 显示全部楼层

回 paulhe 的帖子

paulhe:按这个试了下,会出现HardFault,还要做哪些配置吗???? (2017-07-13 12:48) 
是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2017-7-14 09:17:52 | 显示全部楼层

回 eric2013 的帖子

eric2013:是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。 (2017-07-13 14:46) 
已经初始化了!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-7-14 09:39:06 | 显示全部楼层

回 paulhe 的帖子

paulhe:已经初始化了! (2017-07-14 09:17) 
用的是否是F4系列,如果是的话,可以先修改成使用CCM RAM空间,测试下,如果这个也不行,说明是你修改的问题,如果可以,就是你的外部SRAM性能不行。优化下FSMC的速度。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2017-7-14 13:07:40 | 显示全部楼层

回 eric2013 的帖子

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

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2017-7-14 14:27:37 | 显示全部楼层

回 eric2013 的帖子

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

使用道具 举报

2

主题

11

回帖

48

积分

新手上路

积分
48
发表于 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以下时则没有问题。硬汉大哥这有什么说法吗?
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2018-6-13 11:23:26 | 显示全部楼层
不明白,为什么已经有 configAPPLICATION_ALLOCATED_HEAP 来extern外部的ucHeap了,还要修改OS的头文件?直接在外部定义一下不就可以了吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2018-6-13 11:27:39 | 显示全部楼层
birkhoff 发表于 2018-6-13 11:23
不明白,为什么已经有 configAPPLICATION_ALLOCATED_HEAP 来extern外部的ucHeap了,还要修改OS的头文件?直 ...

没问题的,我们的例子就是这么写的
QQ截图20180613112653.png
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-10-21 22:13:12 | 显示全部楼层
你好,我之前有使用STM32F407过外部SRAM作为内存
你需要添加 #define DATA_IN_ExtSRAM 在全局宏定义哪里,
然后在 system_stm32f4xx.c里面的void SystemInit_ExtMemCtl(void)函数初始化FSMC,(官方有提供的寄存器版本的初始化,你也可以注释掉,调用自己的初始化函数)
这样就可以了
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-10-21 22:13:52 | 显示全部楼层
这是我在system_stm32f4xx.c的初始化

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

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-12-8 09:16:05 | 显示全部楼层
锐斌__ 发表于 2018-10-21 22:13
这是我在system_stm32f4xx.c的初始化

void SystemInit_ExtMemCtl(void)

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

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
发表于 2020-10-21 10:12:05 | 显示全部楼层
eric2013 发表于 2017-7-13 14:46
是不是外部sram忘初始化了,FreeRTOS启动前,优先初始化。

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

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
发表于 2020-10-21 10:56:36 | 显示全部楼层
eric2013 发表于 2018-6-13 11:27
没问题的,我们的例子就是这么写的

这个例子哪里有,V5资料盘没找到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 15:02 , Processed in 0.281692 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表