我们知道stm32f4当中有个ccm内存,如图所示,这个内存是挂在d总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?
首先,我们可以使用keil的设置选项,将iram2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将iram1改为0x10000000,这样,编译器就会优先分配ccm内存。
我们来看看结果,在map文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到ccm。
这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到ccm中,而同时使用了dma访问,显然会出问题。
于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了ccm内存中:
execution region rw_iram2 (base: 0x10000000, size: 0x00000028, max: 0x00010000, absolute)
base addrsizetypeattridxe section nameobject
0x100000000x00000028datarw7.arm.__at_0x10000000main.o
复制代码
太好了,那么我们能不能将freertos的数据放进ccm中呢?将freertos要使用的内存全部移到ccm中,使其成为专有内存,显然会提高freertos的运行速度。
那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
#if( configapplication_allocated_heap == 1 )
extern uint8_t ucheap[ configtotal_heap_size ];
#else
static uint8_t ucheap[ configtotal_heap_size ];
#endif
复制代码
这是freertos中堆内存的分配,我们可以加入__attribute__将其放进ccm中,这样做没有问题,但是去修改freertos的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。
修改keil的linker选项,我们把use memory layout from targer dialog的钩去掉。
然后在objects的目录中找到一个后缀为sct的文件,打开之后如图所示:
由于我们只需要将rtos的数据放入ccm中,于是我们可以这样修改,ccm_iram的名字是我自己取的,你可以改成任何你喜欢的,比如什么loveyou之类的:
然后在链接器中选择我们自己的文件:
现在,映像文件变成了这样:
是不是很简单呢?系统堆栈仍然在主内存中,而freertos的堆内存已经移到了ccm中,由于互不影响,这里我分配了50k的空间专门给freertos使用。我们甚至还可以配置mpu将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。
学习FPGA新IP核的正确打开方式
单控开关和双控开关的区别在哪?
新Xbox Series X背面设计曝光,将拥有两块大型的蜂窝状散热区
新唐科技ISD15C00主板介绍
最高18.3元/片,Cat.1模组价格跌破想象!
如何使用STM32F4中的CCM内存
STI将于2026年在釜山建立功率半导体材料工厂
STM32F105系列单片机对USB设备电路的设计
BITWAVE高清无线监控系统加强校园安全
不在美国禁售三星产品?苹果说不
PITAKA公司MagEZ Juice免充电模块化无线充方案推出
使用直线电机模组的的日常维护与保养
5G运营商想说爱你不容易_5G大战中处境分析
中国人工智能医疗产业发展存在的问题及对策
生物识别中是怎样加入了AI技术的
台积电张忠谋表示:每周工时超过50小时,以促进员工生活平衡
亨通携5G应用以及5G新技术新产品精彩亮相本届PT展
关于MLCC市场的常见问题解答
中国水利工程首次成功实现了3D现场打印
巴黎车展令人瞩目的新能源车型大盘点,看看有你喜欢的吗?