你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32F4的CCM内存  

[复制链接]
风之力-395256 发布时间:2016-1-8 00:50
STM32电机培训online,大佬带你玩电机) D+ e' \9 k0 y; H6 A4 u/ `' M

' R0 b7 Y' y) L9 q; p$ Q* B3 {
2 H* A1 R! c' X6 b& e' p0 h
  F# S, |/ J  f" s  q6 o8 E

; E  I, z' e, l- s$ O* a我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。6 p0 [5 I1 L$ q3 V+ i- F  K8 N
- P3 N8 ^2 H8 S; Q% |: R6 [
捕获.JPG
) I8 l8 {3 B; c8 M9 ?- P! \9 K; q* N6 |- V% F" q' A( X
首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。2 s+ Q: e3 R+ a7 I4 L+ U

- g+ I: m3 w& C0 V3 G) P 捕获2.JPG * T+ G, T+ y- s+ |

9 b" q3 L  k; H) c% d( f2 \) j我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。
% V$ m: c+ C& I: L- a+ \( ~, t1 [/ r1 y) J) D  ?; |
捕获3.JPG + h" [7 J. G8 {1 Q% e
/ W' Z' |! v3 m9 x
这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。# ]+ O6 Q5 S2 a8 l2 v( k

* Q- Z6 l" v- Z' @于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:$ |6 U. R. Q# ^0 S2 Y& F
  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码
) j) [" m) @5 F, @! y& \, u
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:3 h. |# w8 m0 n% n( g
  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)
    - g. S8 X  |( {) r
  2. & f0 \5 `& Q5 {* j6 `' n# Y' p
  3.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object. b- c5 k0 a6 w6 ^
  4. * R( m  g) y1 f9 o# \; `6 [6 f2 j, ?
  5.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o
    5 B3 Y4 Q5 F  Q! C/ R$ t
复制代码

5 M( i- r% w- P5 i+ C; z' C* w太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。  z- x+ j" K6 B0 e# _4 z

3 O6 o. ?3 H( P那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:$ C7 I3 n) A3 H3 f" s2 A
  1. /* Allocate the memory for the heap. */" D7 Y+ Q) ~, j
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )2 h8 @0 b( J$ Z, t
  3.         /* The application writer has already defined the array used for the RTOS
    : M4 W" i0 f2 }/ u  u+ p
  4.         heap - probably so it can be placed in a special segment or address. */
    * e2 A; A7 F" N# e
  5.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    1 @7 A" P" R: n( J' W  w
  6. #else' a, F+ H7 }" ]; h# j
  7.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];# ]2 r+ {9 H: U# E4 m1 o- ?
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。
% Q8 w) q* _' F4 {" k
! D3 A1 k! m9 q% J修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。
' g3 e0 H8 S1 p; a2 x! e: S5 o/ x" c* k6 Q5 M' F
捕获4.JPG
  t$ `, b& M  Q4 L" W4 w$ `5 F) [  m
5 ^# Q9 Y( e1 i3 E7 R+ l" `# G
然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:# c' I* |! Z4 u# {* V# ^
4 h- X  T7 M" W# r8 f
捕获5.JPG
  I* M7 ?4 \3 y& h3 D; o1 Y7 d% E# j8 R5 z- J( S
由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:
3 _7 y3 \% V, X! V, K2 B/ Z1 {
9 |/ Y8 T  A( J 捕获6.JPG   W- U( D0 z! @" l) T# [

' b: a2 z$ e- j9 x8 I- M1 Y然后在链接器中选择我们自己的文件:
7 i& W/ I: ~6 h/ q, `4 n% t8 [/ @+ f1 Y/ ?+ \$ c
捕获7.JPG
) D; R+ N5 M2 z, `( q/ Y% X% \, p3 E
现在,映像文件变成了这样:  Y8 d$ _9 o2 d

2 l3 b% x+ p7 J 捕获8.JPG . Z, H& i. U8 u' j$ l$ w, B+ w7 h
) y# ]. h4 P) ?: @
是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。# i1 U6 E) _- N8 [$ M" ~
/ ^/ Q6 c4 F/ \

3 z2 `2 v9 o* {* }% M
赞 收藏 26 评论19 发布时间:2016-1-8 00:50

举报

19个回答
yangwang90 回答时间:2020-11-3 10:18:08
通过查看最新的STM32G4系列芯片,发现CCM现在挂靠在5条主控总线上,不再是直接D-Bus总线上。既然也在总线矩阵内,那么也需要仲裁,请问STM32G4这种CCM怎么提升访问速度呢?还请各位执教,谢谢!
5 o# C7 _! _# K& X- ~& T) q6 B/ o- v, T
Untitled picture.png
yangwang90 回答时间:2020-11-3 10:12:19
Kar98_K 发表于 2020-6-3 11:147 A8 u: h6 M' A0 P$ U
CCM只有D总线连内核,那是不是就不能把代码放到CCM里了?

8 P9 l" i, E, T/ s5 g* cCCM本质上还是RAM,所以不能放Code
watershade 回答时间:2016-1-8 09:02:56
这绝对是新知呀。之前还不知道CCM内存。那么内核用它一般做什么用?
zhangdaijin 回答时间:2016-1-8 06:09:16
党国特派员 回答时间:2016-1-8 09:36:11
本帖最后由 党国特派员 于 2016-1-8 09:41 编辑 1 z+ d7 h+ K- G9 T: ?
9 V9 m+ B* E: G& l5 N) ~* ]
有屎以来,很有粪量的一篇文章。绝对点赞。。。。
2602082487 回答时间:2016-1-8 10:52:59
好贴,给楼主100个赞,收藏了
风雨酒 回答时间:2016-7-28 11:44:00
厉害厉害
zhangxu56726 回答时间:2016-7-28 13:42:39
谢谢分享,顶顶顶顶顶顶顶顶顶顶顶顶
tjwdlx 回答时间:2016-8-4 23:21:03
学习了~mark~~~
kqh1120 回答时间:2016-11-11 11:54:37
学习了。。。
无帝老三 回答时间:2017-4-7 19:32:35
楼神,修改加载文件后,是不是可以不用勾选IRAM2了?
莫问1990 回答时间:2018-6-9 17:16:53
直接在heap4.c里用动态内存分配也可以吧
tianqi911 回答时间:2019-6-12 13:02:19
搞了半天,注册一个号。就是为了感谢楼主。赞一个。
赛孔明 回答时间:2020-2-8 12:59:05
点赞
andey 回答时间:2020-2-8 13:33:23
提示: 作者被禁止或删除 内容自动屏蔽
wdliming-222461 回答时间:2020-2-27 10:58:15
谢谢分享收藏
12下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版