Eieye是一款软硬件开源的高速智能摄像头模块,你可以快速的让Eieye学习识别特定目标,并且可以直接和类似Arduino这样的开发板连接,更多内容欢迎访问Eieye社区(88448.eieye.com)或微信公众号(Eieye)。
有一段时间Kira忙着想办法加速Eieye识别速度,但是限制于F4太小的内存和主频,一直解决不掉,知道某一天他翻看官方文档《STM32F4xx参考手册》中有对CCM的描述,看完大喜,像捡到宝似的来和我们讨论;
STM32系列芯片的内部SRAM被分为了几块独立的空间,比如说STM32F4有两块独立的的SRAM块,这两个块都分别连接到了芯片的总线矩阵上;其实还有一块儿叫做“核内联存储单元(Core Coupled Memory)”的SRAM空间存在,这就是CCM,CCM没有连接到总线矩阵上,而是直接连在了内核的D-bus(数据bus)上。
这个和内核紧紧相连的存储空间只能被内核访问,且该空间和内核直接相连而没有经过总线矩阵,这就可以使内核访问该空间几乎没有任何等待延时;比如说,如果此时芯片上有某个单元正在通过总线矩阵访问主SRAM空间,此时内核依然可以无需等待直接访问CCM空间;所以CCM空间主要是用来存储堆栈和其他重要的操作系统数据的,即使是有DMA在搬移数据,内核依然可以保证连续不断的使用CCM中的数据;
有一点需要注意,CCM也可以很容易的当做普通SRAM使用,这时候你可以将你关键费时间的某些数据操作放到CCM中,这样很有可能会节约你的程序执行时间,但这个前提是你读写SRAM在你的程序中占时间比例比较多,否则效果也不明显;
下面给出两种使用CCM的方法:
<1>先在linker script中定义一个section .ccm : {
. = ALIGN(4);
_sccm = .;
*(.ccm)
. = ALIGN(4);
_eccm = .;
}>CCM
然后在CCM区定义你的变量:
const int8_t my_array[13] __attribute__ ((section (".ccm")))= {....};
<2>在STM32F4官方库文件stm32f4xx.h中定义了CCM段:
#define CCMDATARAM_BASE ((uint32_t)0x10000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */
|