STM32电机培训online,大佬带你玩电机 7 }+ N" m6 d3 F' b) R1 g 3 i+ D! h6 g6 D* U 我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。 首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。( T# A' ]& _5 o ~' L4 @' P ! g- z+ {* s! x6 ~! O& I 我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。 + t4 _* s2 Y+ ]: Q" B 这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。; R9 t( C5 Y) g8 R" E. _7 l 于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:
太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。7 o0 {! W' j! k 那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
0 O+ k% F X0 S! B9 N9 y 修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。 7 I# W4 ^# K) r! { F+ v1 m* M$ b 然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:( S: z6 I# \, g* E# l # e; d3 R0 f e9 t- ` l5 T8 C 由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的: $ Z2 R* a' o5 }+ j: L" J- ~ 然后在链接器中选择我们自己的文件:* O% k9 i) G6 H3 { 3 |0 O, {' m" S/ b 现在,映像文件变成了这样: 9 R0 \* o! u* K: h( q! I 是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。5 k- W* b, \7 d i/ N: N, n; a % [6 L3 P$ W) B2 K, [0 c+ M [2 b |
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
有屎以来,很有粪量的一篇文章。绝对点赞。。。。