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

使用STM32F4的CCM内存  

[复制链接]
风之力-395256 发布时间:2016-1-8 00:50
STM32电机培训online,大佬带你玩电机, b1 |2 m- O2 X- e" K+ e
+ {' k. O( O0 s

0 o' \: i* i# k4 \: z- E( {
5 @3 R) @' ^: Q( \, X

4 ~  E9 c  t) [' X5 g8 r$ p我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。
$ n5 C5 @0 x* \5 S1 y( v) J* ^
; G; C& v  @! x* q4 a3 [ 捕获.JPG
8 O- G/ h) C  ]( z, P5 H$ @* e
- ]8 R& t: N! w; b( T8 r) h首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。
' d6 {% o. ~' v, v4 \. \9 s
( i& G' o& T6 d 捕获2.JPG   |8 r8 n# x" q' T

4 `7 L7 c" ]) z: w我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。
; J8 Q. h' r4 `& k+ c! H. e4 w( c' |  g$ ]* k. H6 J
捕获3.JPG / h8 X1 B% y4 n& G
; c" @; |9 W/ N$ s+ o1 Y
这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。. _) r/ d% I: c

/ `$ L+ w3 e1 O/ j! n" T于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:9 s+ R. P: w8 w1 k6 D0 X
  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码
+ o: @! N. {$ X+ {% I+ Y
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:
" M$ g2 e; x- W0 ?% D
  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)& i4 K2 D' a0 ~  S1 G

  2. : Y+ l2 q4 _: @& S6 v3 K
  3.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object+ y3 k' A9 }9 A& f' f$ ?
  4. # a% y0 V/ h* G3 @/ z2 G$ o7 t
  5.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o: U# E% C" S) d8 r
复制代码

' d1 P8 ?/ ]% `0 k太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。
+ s: A# q3 T$ R$ x+ d, u* n
! u/ q# Z4 x, p那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:1 x/ w5 @: P1 `& r7 Z' M! j1 Y
  1. /* Allocate the memory for the heap. */
    # V/ b, o: n  a+ d0 {  L$ l* S
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
    & ~( z$ j0 i7 H0 G! Y7 C# O% @! q; t0 M
  3.         /* The application writer has already defined the array used for the RTOS+ Y/ \8 Z: G4 b' O9 J
  4.         heap - probably so it can be placed in a special segment or address. */
    - w! N2 L$ g4 Y  s) K# P
  5.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    ' i, r1 M! m+ ^: a, y4 ~) u
  6. #else
    5 Z3 Y) d* @, G* y! A0 W0 W
  7.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];4 j3 ~) g0 V0 F: ?, P$ b5 v
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。7 ?3 z! O' O  R  C0 y/ I# g1 _

) F+ l. J2 l" Z4 ]  ?) X- s) B修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。, W' o, t% N) c9 q# K
' r% b1 @# n4 M0 t8 [
捕获4.JPG
4 e% J; L; W2 T- V9 w
+ n3 p3 Z- Q# X; V, j( }
然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:
# p- _6 U1 N8 h4 U- j3 G! n( i) n: K  J, O7 L! f3 Z* Y" |
捕获5.JPG
9 s+ l( N2 W+ x& C# u6 `3 {# m3 M$ W9 u( A% A
由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:
2 b5 Z7 R; }$ ]2 g! j0 Z; \! n) z: U
捕获6.JPG - k9 ^; Y  r, r4 ^( L
9 |& i4 t! m  h7 H# X' y
然后在链接器中选择我们自己的文件:
# i; B* ?7 k# {6 Y/ c0 i# \0 [3 B( G" u2 X
捕获7.JPG $ i4 O- g1 e% u/ @6 c; G
% e$ h, Z8 S, m% J% h2 X$ R1 P) u
现在,映像文件变成了这样:/ l; p  z" [: d& U" k: [+ N

0 `) U& j$ X. V) T 捕获8.JPG
% g0 ?5 I# [8 G' z+ S  f- Y' u" r+ B" L( x0 x9 v
是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。. a, ?6 X7 ~1 \
) T  O& ?8 G8 v6 D7 i3 M7 m+ S
" u, k: l$ L' {* s$ ^0 ]
收藏 26 评论19 发布时间:2016-1-8 00:50

举报

19个回答
yangwang90 回答时间:2020-11-3 10:18:08
通过查看最新的STM32G4系列芯片,发现CCM现在挂靠在5条主控总线上,不再是直接D-Bus总线上。既然也在总线矩阵内,那么也需要仲裁,请问STM32G4这种CCM怎么提升访问速度呢?还请各位执教,谢谢!$ i* {& Q* x$ \3 _
Untitled picture.png
yangwang90 回答时间:2020-11-3 10:12:19
Kar98_K 发表于 2020-6-3 11:144 G6 a7 e* S! n2 o( Q
CCM只有D总线连内核,那是不是就不能把代码放到CCM里了?

% `) D9 l6 L$ e5 x8 C# F" u- J6 s. 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 编辑   f2 X  ^8 f! K3 Q1 }% J: ^
+ G7 P9 d  z7 M% \" E6 V
有屎以来,很有粪量的一篇文章。绝对点赞。。。。
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版