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

使用STM32F4的CCM内存  

[复制链接]
风之力-395256 发布时间:2016-1-8 00:50
STM32电机培训online,大佬带你玩电机
- V" r* }; N  ?' I7 K
9 Q* c) B. g) F4 P( @
7 }+ N" m6 d3 F' b) R1 g

- z* h7 o+ x; x$ N9 ^6 {
3 i+ D! h6 g6 D* U
我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。
# {5 T2 q; i- _7 I6 t7 D
- I' V' z2 B' L2 a3 }. F 捕获.JPG
9 [9 [# s7 E0 [& {# u6 {; w
0 [9 Z, E3 g; I1 \/ E首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。( T# A' ]& _5 o  ~' L4 @' P
! g- z+ {* s! x6 ~! O& I
捕获2.JPG
3 ^7 c8 ?" U& h
$ i9 Z; m  Z  Y5 \. w8 z我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。
+ z3 _3 p7 w$ p! }( y! p) I' Z; q+ t4 _* s2 Y+ ]: Q" B
捕获3.JPG 6 j9 P9 [/ A' f* _

, M1 {0 Z/ N) M) E4 }这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。; R9 t( C5 Y) g8 R" E. _7 l

: V( M& T4 \/ @8 K$ M于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
+ a2 {& U# N8 r& n' J
  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码

# J3 V7 v& O& G2 z再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:
  N: z% `9 Z# h
  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)
    * X- N7 ^2 S7 W. k9 h1 w

  2. : w9 v% }# \: [' m+ A( ?
  3.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object+ |' A* ^7 X" N2 E0 |4 O

  4. , n: f4 L8 m! I3 `$ S
  5.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o2 S& j* s4 y6 m  G# O  H% g+ w4 F
复制代码
9 a/ @; N" D* d" I2 `
太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。7 o0 {! W' j! k

2 H. t% }1 x6 Z1 ~$ n. G# e那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
# {7 I# z. ?' B- j
  1. /* Allocate the memory for the heap. */- ?; b: T3 @$ [$ f1 h
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )8 |# D; X# S7 B% [
  3.         /* The application writer has already defined the array used for the RTOS
    1 I1 k5 ^1 y1 }, t
  4.         heap - probably so it can be placed in a special segment or address. */
    ' q# n# ~7 D$ F" L5 k
  5.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];( y0 V* h- o$ W' M4 |4 n
  6. #else: ^5 _1 |4 P0 D* E/ K/ F1 V6 x
  7.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    0 F" o0 H$ q* N3 m
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。
7 s, @. \$ [% S: @7 {0 O+ k% F  X0 S! B9 N9 y
修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。
+ F" ^; N! z9 ^! p6 _+ e( t. ~) W7 I# W4 ^# K) r! {  F+ v1 m* M$ b
捕获4.JPG
) I3 H% }7 x6 t; T

- Z# b* g- z1 }" k" M3 b5 C然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:( S: z6 I# \, g* E# l

* E8 F8 I( G- _4 d1 w! c 捕获5.JPG
; Y' Z) C4 k# ]1 ~, J# e; d3 R0 f  e9 t- `  l5 T8 C
由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:
, @8 `3 e1 F2 B7 w9 n: V5 |$ Z2 R* a' o5 }+ j: L" J- ~
捕获6.JPG ) T$ v; H+ K/ ^& C' m

! ^; n( p9 q7 S' v6 H8 u  D* C然后在链接器中选择我们自己的文件:* O% k9 i) G6 H3 {
3 |0 O, {' m" S/ b
捕获7.JPG - @8 L$ R( w  r: l

- t, B. Z' b4 |9 x0 _0 L现在,映像文件变成了这样:
* b5 P& \+ P, ?* ]* Y' V; w9 R0 \* o! u* K: h( q! I
捕获8.JPG 0 _6 ]" e3 Q0 D& x' }

* m" f9 q; @* p& h) r是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。5 k- W* b, \7 d  i/ N: N, n; a

# R- U8 @# f3 t5 C
% [6 L3 P$ W) B2 K, [0 c+ M  [2 b
收藏 26 评论19 发布时间:2016-1-8 00:50

举报

19个回答
yangwang90 回答时间:2020-11-3 10:18:08
通过查看最新的STM32G4系列芯片,发现CCM现在挂靠在5条主控总线上,不再是直接D-Bus总线上。既然也在总线矩阵内,那么也需要仲裁,请问STM32G4这种CCM怎么提升访问速度呢?还请各位执教,谢谢!+ |9 J9 m3 I2 h  a
Untitled picture.png
yangwang90 回答时间:2020-11-3 10:12:19
Kar98_K 发表于 2020-6-3 11:14
9 |1 K7 [7 T+ x8 YCCM只有D总线连内核,那是不是就不能把代码放到CCM里了?
6 L, e7 F$ o; I& q) ~  T
CCM本质上还是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 编辑
) H4 V) p8 `1 s$ s& Y. X: g( G
) L9 j9 S  P( d5 b3 E  g有屎以来,很有粪量的一篇文章。绝对点赞。。。。
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 手机版