STM32电机培训online,大佬带你玩电机6 [/ V' A& A: T2 X. ?+ ~ 0 F/ [6 t( j! p* b3 N, x& O ' W8 a4 Z3 i6 V2 ?2 `& h9 P 我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。 ' I0 X4 G8 J, z8 w8 A 首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。. ]) x3 {6 r( ]7 P+ U & `) Z( ]; Y. B% b$ w 我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。 3 T. m$ @5 |9 @/ G! N 0 u) b* G: C0 A7 T 这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。 于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:0 |. `7 k7 J7 U* D, `/ N0 u5 o# ~
太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。 6 B8 |+ D* M; q9 ]% Z# @ 那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
* @; A3 t0 E) m F2 _ 修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。 7 D: x" y- X8 N; O& r0 K, V 然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示: ) G' `2 s9 W+ S' p" }1 l' j* u 由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:% F6 ?/ s7 V. ^2 ], p4 q + M2 S3 J: g9 o1 I+ o% | 然后在链接器中选择我们自己的文件: 4 _& _: m" L* H% ~$ l( z6 Q 现在,映像文件变成了这样: 8 K4 ?0 y; l0 B* a 是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。" j6 N2 b8 E- \4 i" X' o # ^/ j5 Y" ~; c! V |
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)
基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)
基于STM32F407的FreeRTOS环境搭建经验分享(1)
CCM本质上还是RAM,所以不能放Code
( q) a. m( p/ S% [, w
有屎以来,很有粪量的一篇文章。绝对点赞。。。。