我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。

<ignore_js_op>

首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。

<ignore_js_op>

我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。

<ignore_js_op>

这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。

于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:

  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};

复制代码

再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:

  1. Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)
  2. Base Addr    Size         Type   Attr      Idx    E Section Name        Object
  3. 0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o

复制代码

太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。

那么怎么放?首先我们想到了heap4.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 */

复制代码

这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。

修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。

<ignore_js_op>

然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:

<ignore_js_op>

由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:

<ignore_js_op>

然后在链接器中选择我们自己的文件:

<ignore_js_op>

现在,映像文件变成了这样:

<ignore_js_op>

是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。

原文出处

最新文章

  1. Nginx 安装以及反向代理配置(windows)
  2. C++小结
  3. Hadoop 权威指南学习1 (主要框架)
  4. [日常训练]常州集训day7
  5. [Android Pro] StarUML 版本破解
  6. 【SSO单点系列】(2):CAS4.0 登录页的个性化定制
  7. 近期code review几处小问题集锦
  8. 6.Inout双向端口信号处理方法
  9. CC2530之Flash映射
  10. 【C++专题】static_cast, dynamic_cast, const_cast探讨
  11. codeforces #310 div1 D
  12. .net 破解的几个常用工具
  13. jquery选择器及效率问题
  14. svg 文字
  15. 初识HTML5
  16. doc 窗口操作图
  17. 免费的ERP真的那么可怕?请少一些偏见!
  18. Cow Exhibition 变种背包
  19. MySQL之多表操作
  20. jquery: 获取当前天加减一天

热门文章

  1. openstack-KVM管理工具
  2. Bridge (br0) Network on Linux
  3. EntityFrameworkCore中的实体状态
  4. Lumen与laravel的区别
  5. Auzre系列1.1.1 —— 安装用于 IntelliJ 的 Azure 工具包
  6. 【转帖】介绍 .NET Standard
  7. 428.x的n次幂
  8. CLOUD添加自定义基础数据
  9. longquan
  10. Entity Framework 6 自定义连接字符串ConnectionString连接MySQL