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

Eieye创作集–6.如何在STM32上使用CCM存储空间?

[复制链接]
wodish 发布时间:2016-4-7 11:05
本帖最后由 wodish 于 2016-4-7 11:08 编辑 4 g* x; \# s( W5 y# L! q& r

5 g& \, Y+ `" R& _% Y. g

Eieye是一款软硬件开源的高速智能摄像头模块,你可以快速的让Eieye学习识别特定目标,并且可以直接和类似Arduino这样的开发板连接,更多内容欢迎访问Eieye社区(88448.eieye.com)或微信公众号(Eieye)。

有一段时间Kira忙着想办法加速Eieye识别速度,但是限制于F4太小的内存和主频,一直解决不掉,知道某一天他翻看官方文档《STM32F4xx参考手册》中有对CCM的描述,看完大喜,像捡到宝似的来和我们讨论; . q" S# l7 O$ b# [6 D2 q
    STM32系列芯片的内部SRAM被分为了几块独立的空间,比如说STM32F4有两块独立的的SRAM块,这两个块都分别连接到了芯片的总线矩阵上;其实还有一块儿叫做“核内联存储单元(Core Coupled Memory)”的SRAM空间存在,这就是CCM,CCM没有连接到总线矩阵上,而是直接连在了内核的D-bus(数据bus)上。


; i, F, M9 N. y' j& B" K+ s2 [+ `" S

7 c6 G) B' Y! u2 ~0 F) c* a

: D+ e: \$ O. T$ V$ z

这个和内核紧紧相连的存储空间只能被内核访问,且该空间和内核直接相连而没有经过总线矩阵,这就可以使内核访问该空间几乎没有任何等待延时;比如说,如果此时芯片上有某个单元正在通过总线矩阵访问主SRAM空间,此时内核依然可以无需等待直接访问CCM空间;所以CCM空间主要是用来存储堆栈和其他重要的操作系统数据的,即使是有DMA在搬移数据,内核依然可以保证连续不断的使用CCM中的数据; . s5 g$ O5 h6 E) Q1 t
    有一点需要注意,CCM也可以很容易的当做普通SRAM使用,这时候你可以将你关键费时间的某些数据操作放到CCM中,这样很有可能会节约你的程序执行时间,但这个前提是你读写SRAM在你的程序中占时间比例比较多,否则效果也不明显; 7 y8 f) u8 H* ?7 @5 Q- |; l) g
    下面给出两种使用CCM的方法:
2 q$ {0 K1 p3 P<1>先在linker script中定义一个section

  1. .ccm : {
    : O* H8 K# X7 s6 }
  2.   . = ALIGN(4);
    , x) a5 h4 M! |' y8 N0 g2 M
  3.   _sccm = .;
    : c9 s) p. ^8 g6 w
  4.   *(.ccm)  i. u6 m- J% g0 d
  5.   . = ALIGN(4);      $ a' \1 c4 E% y' w# g
  6.   _eccm = .;5 H) s# s: f. `7 L' ^" c  R3 A" G
  7. }>CCM
复制代码

* s, C! j8 A  R! l8 ]

然后在CCM区定义你的变量:

  1. const int8_t my_array[13] __attribute__ ((section (".ccm")))= {....};
复制代码

<2>在STM32F4官方库文件stm32f4xx.h中定义了CCM段:

  1. #define CCMDATARAM_BASE  ((uint32_t)0x10000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region  */
复制代码
: I3 g; g$ z3 m  Z7 ~" `8 f

假设我现在将一副8bit位图放入CCM空间的最开始:

  1. #define OPENBW_START_ADDR    CCMDATARAM_BASE //定义位图首地址
    ) O) i6 o5 }* O: j* a
  2. volatile uint8_t openbw[sizeof_column][sizeof_line/compression] __attribute__((at(OPENBW_START_ADDR))); //位图定义
复制代码

# P6 E; |/ G& J8 P1 x

好了,就是这样,CCM就可以玩起来了,看文档竟然找出来了一块64Kbyte的SRAM,这可是将近三分之一的片内RAM,并且还是高速的,真的是捡到宝了,哈哈;所以说看官方文档真的是会有好报的,毕竟一个公司的聪明人都想帮助你用好他们设计的芯片,只要我们踏踏实实学,官方文档中就有挖不尽的宝藏;至少我们的Eieye识别指标又和目标近了一步;
5 H& v( M( \1 n( T& P4 U    不过,使用CCM也有限制,首先这是一块独立的存储空间且只有64Kbyte这么大,如果你想放一个80Kbyte的变量,还是选择放到主SRAM中比较好;其次,CCM在官方文档中专门强调,这个存储区域只能被内核访问,也就是说必须是内核读内核写,所以说你要是想把CMM给DMA controller用的话应该就是不行的了;最后,我想我们也不能迷信于CCM,毕竟内部存储矩阵的带宽肯定也非常大,读写等待占的内核周期数两种方式差距可能并不会非常大,至少我们Eieye的差距不大,我们怀疑是我们读写等待占内核操作时间的比例较小;如果谁发现CCM对速度的效果提升很大的话请多多分享经验,毕竟这个优化还是比较高级的;


! e( H" Q9 l0 E" E; a- c
收藏 评论0 发布时间:2016-4-7 11:05

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版