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

使用STM32F4的CCM内存  

[复制链接]
风之力-395256 发布时间:2016-1-8 00:50
STM32电机培训online,大佬带你玩电机6 [/ V' A& A: T2 X. ?+ ~

3 k" d+ i3 L5 @. `. l' ]/ f
0 F/ [6 t( j! p* b3 N, x& O

! t, @1 |( I& a
' W8 a4 Z3 i6 V2 ?2 `& h9 P
我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。
+ m+ {$ H  j% V" [- W$ _' I0 X4 G8 J, z8 w8 A
捕获.JPG 3 b) O% P5 j9 y) X6 }: W

7 K# Q; S/ Y$ A: i' w首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。. ]) x3 {6 r( ]7 P+ U

: X, G* t* r0 M2 g6 G# V 捕获2.JPG 3 p3 R: x8 Z' ^$ j# Q# J
& `) Z( ]; Y. B% b$ w
我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。
/ Q3 a/ B0 X0 H3 T. m$ @5 |9 @/ G! N
捕获3.JPG 2 A* {* e1 l) R
0 u) b* G: C0 A7 T
这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。
* ]$ X  G% `. M/ N& ^4 W2 n/ _
2 F' j% i4 m" q* z7 a3 \于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
+ f; d0 e8 b  O. s$ Z1 J$ F
  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码
# h# ?  z( x, @) W! v, |, F
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:0 |. `7 k7 J7 U* D, `/ N0 u5 o# ~
  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)5 ~% }" v% F1 F+ b' m
  2. + d) y& M- \1 X
  3.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object
    . D. q7 d6 U5 T* g$ @9 E0 R% {

  4. 4 B2 S9 U& d0 T- E; [/ P
  5.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o' ^5 l+ f1 I: `* N
复制代码
3 G- o7 g0 ?; _& V8 Z3 L2 [
太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。
# G  S1 H* _: y5 w$ d9 b6 J6 B8 |+ D* M; q9 ]% Z# @
那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
6 O! M+ S2 ~# i( ^$ a
  1. /* Allocate the memory for the heap. */" t  P  C+ o. d/ ^
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
    ) r% P+ o& @0 z" |7 e% E- Z
  3.         /* The application writer has already defined the array used for the RTOS/ f  e; U3 M& F
  4.         heap - probably so it can be placed in a special segment or address. */) e/ R% n- M- \6 D+ r
  5.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    3 o5 c/ c/ C$ W7 \3 f
  6. #else
    0 m2 T$ Q6 j" u7 W2 C
  7.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];. L/ R: v0 L$ @0 n& Q
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。4 @% e+ W/ Z  Z1 |9 J% d" Y
* @; A3 t0 E) m  F2 _
修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。
1 K) [5 e- W: u
7 e7 A7 A/ u) N% k: D 捕获4.JPG 9 T* {6 s. ?0 W
7 D: x" y- X8 N; O& r0 K, V
然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:
- E/ {. c9 V" g8 T/ k+ q; v' T' X
$ o! v' D6 f8 [& { 捕获5.JPG
% ?% i4 B' L, y0 L8 i4 U) G' `2 s9 W+ S' p" }1 l' j* u
由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:% F6 ?/ s7 V. ^2 ], p4 q

$ W7 s# w0 g5 Y# P, z( E% B 捕获6.JPG
7 B; i: {& J4 T+ [  N+ M2 S3 J: g9 o1 I+ o% |
然后在链接器中选择我们自己的文件:
. c( J  C' K5 n, m4 _& _: m" L* H% ~$ l( z6 Q
捕获7.JPG 1 N0 s6 H- F- `( O. e9 s+ Q

( m5 p: y9 T! `3 q# O5 Y& n现在,映像文件变成了这样:
# [: k4 b2 E  x8 b
7 q( b. l8 Z/ G 捕获8.JPG
. m) s: H) o+ l3 L$ W, y8 K4 ?0 y; l0 B* a
是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。" j6 N2 b8 E- \4 i" X' o
# ^/ j5 Y" ~; c! V

+ U% U+ h; P5 R
收藏 26 评论19 发布时间:2016-1-8 00:50

举报

19个回答
yangwang90 回答时间:2020-11-3 10:18:08
通过查看最新的STM32G4系列芯片,发现CCM现在挂靠在5条主控总线上,不再是直接D-Bus总线上。既然也在总线矩阵内,那么也需要仲裁,请问STM32G4这种CCM怎么提升访问速度呢?还请各位执教,谢谢!
) [+ J' D; ]' Y0 M3 j3 K4 n
Untitled picture.png
yangwang90 回答时间:2020-11-3 10:12:19
Kar98_K 发表于 2020-6-3 11:143 J# x# `  ^, n- G: N
CCM只有D总线连内核,那是不是就不能把代码放到CCM里了?

0 f  y' d( s- u4 l$ O3 n" zCCM本质上还是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 编辑 / U8 z4 j& {5 A8 Y
( q) a. m( p/ S% [, w
有屎以来,很有粪量的一篇文章。绝对点赞。。。。
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版