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

使用STM32F4的CCM内存  

[复制链接]
风之力-395256 发布时间:2016-1-8 00:50
STM32电机培训online,大佬带你玩电机
: p2 Q3 e) I% W% ^
) Z9 e# j: I% h' H) n% N

2 y. R) X) Q3 j7 n& {% A, m3 C
3 h7 H/ S6 ]" W/ k1 i
我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。
, n- M& Z% F7 T& g/ {% y3 t; s( D, m& T5 h, C  S' `& o
捕获.JPG - O. ]. k, B* U3 Z4 S: A! f. [" X

4 \2 h& z9 d4 ]* F3 @. }3 M2 ^$ W首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。
+ P/ u% Q& c4 ]6 d0 _- X
. k& E; b' [0 m8 R2 D/ I 捕获2.JPG , W, R' G8 ~8 l/ r. G2 \# t

& Y  t3 S) i8 G1 O# V& U( {6 r我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。8 f8 b6 M, O# n9 b: ~

8 P' o6 F8 |) S3 C 捕获3.JPG ! B) P; i& [9 W; \
: u0 k( h9 S! T" m8 h+ O2 v3 y! O
这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。% m- A1 b2 j; X. |

' Z6 j% @6 B( A% f于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
9 v: B# D; i/ |  N; q6 @  G
  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码
* v+ y  D! f9 W% L3 u
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:- n, o$ o* U2 w! W+ D
  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)
    7 r  H* a/ c5 H9 f

  2. % N! s+ e5 D; N! V
  3.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object: K6 p" Y. v& @9 ~+ |. @6 h1 N0 {

  4. ( T: k5 y% q% C) L, w
  5.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o
    1 A1 w/ X  M6 H2 @8 U$ b
复制代码

/ i+ W; B( f; H0 N& x/ w太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。; ^! z& N6 s1 i8 _& E) T/ h0 p
, }0 T1 y* E5 Y8 b8 V
那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
5 w% {6 q7 `0 t1 g
  1. /* Allocate the memory for the heap. */( c+ P9 D( K" }/ q8 r+ q% x# D# E
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 ); a3 |3 P6 ^5 V2 F: v
  3.         /* The application writer has already defined the array used for the RTOS
    4 k4 q+ m- B, C
  4.         heap - probably so it can be placed in a special segment or address. */3 Q, |$ k- j" }5 D. X$ B
  5.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    9 r8 S4 s4 B2 X( p) Y8 ^( F2 M
  6. #else
    , c. a; I; A2 w; T
  7.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    5 Z+ l; C& a4 H5 p" a2 g2 s
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。) Z3 q: S$ Z  `6 _1 ~
: c2 ]' V3 [$ k; ?% e
修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。
  I" q! G6 l' Y2 \) T1 w1 K' S- _" _
捕获4.JPG / |2 B- J7 O6 Q  w
7 O/ ]" x. f# p/ o7 g, z
然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:
+ |8 y( Q! ]% u
) G* J! ^5 i3 J, m2 h: A 捕获5.JPG * ]; w* l2 p* B  {
: }1 x, x2 w1 o: z% w' H
由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:5 o/ G4 \1 |. U0 d  b' i, [

! h4 y9 ?, \+ Q# X2 M. @' H 捕获6.JPG + s: t3 s* c1 d- P) i) o9 h" E

" Z- X" _3 N3 s& {然后在链接器中选择我们自己的文件:8 Y  G, b: S: X( i$ \( l# l2 z
1 {9 V  T1 B& P+ H
捕获7.JPG 9 F2 T3 u) }, |5 g% k1 O( J5 [

8 U, E. t0 ~  s8 n现在,映像文件变成了这样:4 R5 ~/ o3 L9 Z; s+ w: }% p* X

" P% E( V( m" u5 d7 O# r& | 捕获8.JPG ' f5 A" V, b% m4 Z* S7 f  l& _
2 T0 o- S  d6 G( a
是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。
6 t3 j: O, R; j& P( E  S
2 g+ l9 n% B( P/ v$ O
! R) A$ |/ ]4 h9 l( R) x5 I9 R3 n+ g
收藏 26 评论19 发布时间:2016-1-8 00:50

举报

19个回答
yangwang90 回答时间:2020-11-3 10:18:08
通过查看最新的STM32G4系列芯片,发现CCM现在挂靠在5条主控总线上,不再是直接D-Bus总线上。既然也在总线矩阵内,那么也需要仲裁,请问STM32G4这种CCM怎么提升访问速度呢?还请各位执教,谢谢!% ^% ~% v$ {4 r) N4 u4 w( [
Untitled picture.png
yangwang90 回答时间:2020-11-3 10:12:19
Kar98_K 发表于 2020-6-3 11:14
  W; e  @6 B; O' l* ICCM只有D总线连内核,那是不是就不能把代码放到CCM里了?
8 B4 q- X3 `- ~$ |$ y+ R; F
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 编辑 . z# A! I( v, [9 t+ F% F

( i' b, Q/ n: c有屎以来,很有粪量的一篇文章。绝对点赞。。。。
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 手机版