STM32 之五 Core Coupled Memory(CCM)内存
写在前面
- 今天在搞STM32F4时,用到了一部分特殊内存——CCM。搜了搜网上没多少介绍,索性自己查手册。
- 某些芯片没有CCM
基本架构
废话少说,先看看这块内存特殊在哪里。官方的基本架构说明如下:
The main system consists of 32-bit multilayer AHB bus matrix that interconnects:
- Eight masters:
– Cortex® -M4 with FPU core I-bus, D-bus and S-bus
– DMA1 memory bus
– DMA2 memory bus
– DMA2 peripheral bus
– Ethernet DMA bus
– USB OTG HS DMA bus - Seven slaves:
– Internal Flash memory ICode bus
– Internal Flash memory DCode bus
– Main internal SRAM1 (112 KB)
– Auxiliary internal SRAM2 (16 KB)
– AHB1 peripherals including AHB to APB bridges and APB peripherals
– AHB2 peripherals
– FSMC
The bus matrix provides access from a master to a slave, enabling concurrent access and efficient operation even when several high-speed peripherals work simultaneously. The 64-Kbyte CCM (core coupled memory) data RAM is not part of the bus matrix and can be accessed only through the CPU. This architecture is shown in
其架构和之前的STM32F1x区别还是挺大的。由上可知,CCM共64KB,是直接挂在D-bus上的,除了CPU(即Cortex-M核)之外,谁都无法访问。此外,由于CCM不属于BusMatrix的一部分,所有也就不能被其他组件访问,例如DMA控制器。
对于CCM,CPU能以最大的系统时钟和最小的等待时间从CCM中读取数据或者代码。官方文档说明了使用CCM的一些优势:比如将频繁读取的数据放到CCM,将中断函数放到CCM,这都能加快程序的执行速度。
如何使用
使用方式一
知道了这块特殊内存,那么我们怎么来使用他呢?常用Keil的人应该知道,在其配置中,有如下选项:
在默认情况下,其中的IRAM2我们不选中,现在我们就可以选中该部分。这样,Keil在生产代码时,就会自动将变量分配到该部分RAM中了。具体的可以打开,Keil生成的.map
文件看看。
Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00005ce4, Max: 0x00010000, ABSOLUTE)Base Addr Size Type Attr Idx E Section Name Object0x10000000 0x00005ce4 Zero RW 16003 .bss ram2.oExecution Region RW_IRAM1 (Base: 0x20000000, Size: 0x0001b360, Max: 0x00020000, ABSOLUTE, COMPRESSED[0x000000c8])Base Addr Size Type Attr Idx E Section Name Object0x20000000 0x00000001 Data RW 264 .data pbuf.o0x20000001 0x00000001 Data RW 909 .data api_msg.o
注意:
- 如果仅仅定义几个变量,可能Keil不会将其放到该RAM中。
- 我在用的时候,没有选中RAM2,Keil仍然把部分内存放到了RAM2中,不知为啥!
但是,这样就有一个问题:由于其只能被内核访问,一旦Keil将例如DMA用的内存放到了该部分RAM中,那么DMA将不能工作! 那么怎么使用更合适呢?
使用方式二
如前所说,直接让编译器自动分配貌似不太合适,所以我们可以自己指定分配的内存。这其中也有两种方式。
第一种依靠分散加载文件(.sct)
,更强大,直接定义一个文件(例如,名字为 RAM2.c),将所有要放得变量均放到该文件中,然后如下修改分散加载文件。
LR_IROM1 0x0800C000 0x00100000 { ; load region size_regionER_IROM1 0x0800C000 0x00100000 { ; load address = execution address*.o (RESET, +First) ; 中断向量表*(InRoot$$Sections).ANY (+RO) }RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (+RW +ZI)}; 指定使用CCMRW_IRAM2 0x10000000 0x00010000 {RAM2.O (RAM2,+RW +ZI)}
}
还有一种方式就是直接使用编译器指令:__attribute__
+at
。在定义变量时,如下即可:
UINT32 EventNum __attribute__((at(0x10000000))) = 0;
当然,这种方式也可以稍微变化一下,使用__attribute__
+section
。给变量指定一个节区名字,然后在分散加载文件中指定节区位置。
如上处理编译后,可查看map文件对应部分内存中变量的分配了。
关于系统
我这搞这部分的时候,正好用了FreeRTOS。于是就像既然这部分只能给内核访问,为了内存的合理利用,能不能直接将这部分内存给系统,剩下的给不就是想怎么用就怎么用了么?而且分给FreeRTOS 64KB的内存正好符合我的设计需要!
了解了上面的分散加载文件后,要将FreeRTOS放到RMA2中就非常简单了,根据使用的FreeRTOS的文件,只需要如下的分散加载文件即可。
RW_IRAM2 0x10000000 0x00010000 {port.o (+RW +ZI)queue.o (+RW +ZI)tasks.o (+RW +ZI)heap_4.o (+RW +ZI); 其他的用到的FreeRTOS的.o文件
}
这样就又有一个问题,如果使用动态申请的内存,则内存还是在RAM2中,如果传递给DMA时,则会出错!
注意:
1. FreeRTOS中部分文件只有代码,没有数据(RW和ZI),例如:list.c,这样就不能放到上面的分散加载文件中
注意事项
- 需要了解ARM的分散加载文件。
- 需要了解个别的编译器指令
参考文档
- STM32F407 Reference manual
STM32 之五 Core Coupled Memory(CCM)内存相关推荐
- STM32 CCM内存使用
使用 CCM 内存 一些STM32 CPU包括两组存储器:标准SRAM和另一组存储器(又名CCM),它们可能比标准SRAM更快,通常更小. 为此,有几种可能性,具体取决于程序所需的内存量.在所有情况下 ...
- STM32F4中的CCM内存说明与使用
我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢? 首先,我们可以使用Keil的设置选项,将IRAM2 ...
- Windows Mobile使用Shared Memory(共享内存)进行IPC(进程间通信)的开发
背景 在Unix-like系统进行IPC(Inter-process communication)通信,Shared memory是效率最高的,我称之为IPC的王中王. 简介 本文讲述在Windows ...
- Advanced Memory Allocation 内存分配进阶
Advanced Memory Allocation 内存分配进阶 URL: http://blog.csdn.net/amwihihc/article/details/7481656 May 01, ...
- Objective -C Memory Management 内存管理 第一部分
Objective -C Memory Management 内存管理 第一部分 Memory management is part of a more general problem in pr ...
- MFCButton Memory leak(内存泄露问题)
MFCButton Memory leak(内存泄露问题) http://m.blog.csdn.net/blog/haoekin/8851219 1.无法显示右边箭头的问题 无论怎么折腾都没显示不出 ...
- TC297 Memory Maps 内存映射
TC297的框图 3.Memory Maps 内存映射 TC29x CPU相关内存如下: PMU0(程序存储器单元)特点如下: -8M 程序闪存 -Data Flash Memory -User Co ...
- Detected memory leaks!内存泄漏,溢出,内存越界问题分析
应用程序发生 Detected memory leaks!内存泄漏 一直程序员面对的是一个很痛苦的问题,要查出泄漏的地方有时候需要大半天甚至更长时间.这里讲讲我的一些查找内存泄漏以及避免内存泄漏的一些 ...
- disk cache(磁盘缓存) 和 memory cache(内存缓存)的区别
disk cache(磁盘缓存) 和 memory cache(内存缓存)的区别 同: 都属于强缓存,现在浏览器缓存存储图像和网页等(主要在磁盘上),而你的操作系统缓存文件可能大部分在内存缓存中. 使 ...
最新文章
- 深度学习平台你知道多少?
- i基准指令集 mips_mips addiu
- 第一篇:数据仓库概述
- 优化案例 | CASE WHEN进行SQL改写优化
- 每天一道LeetCode-----对序列进行排序,要求nums[0] nums[1] nums[2] nums[3] ....
- CodeForces - 1420D Rescue Nibel!(组合数学+离散化)
- Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址
- 虚拟搭建局域网模拟器_巧用虚拟局域网,快速搭建私有云,一步就能搞定
- C/C++ 文件的后缀名
- Azure Site Recovery之启用复制
- 【C++】异常简述(三):补充之如何看待C++异常
- IOS多线程处理 三种多线程的实例
- .axf文件_「嵌入式笔记」hex文件、bin文件、axf文件的区别?
- 图像质量评价数据库与常见评价算法总结
- 富军:史玉柱鲜为人知的网络营销震撼策略!
- ionic4--下拉刷新(refresher)
- 【信息系统项目管理师】第十七章 项目管理高级知识
- android客户端动态折线图
- 经常玩电脑正确的坐姿_使用电脑的正确坐姿 你坐对了吗?
- Git commit 换行符问题
热门文章
- CommonJS,AMD,CMD,ES6,require 和 import 详解
- checkbox反复调用attr('checked', true/false)只有第一次生效
- 揭秘各国总统们钟爱的手机
- swift3.0截取View生成图片 图片截取成新图片
- adnroid开发环境的搭建
- 各种好用的代码生成器(C#)
- DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(笔记)
- deque双向队列的使用
- 一次OutOfMemoryError: GC overhead limit exceeded
- SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiResourceItemWriter)(二)