您的位置 首页 应用

怎么正确的运用STM32F4中的CCM内存

如何正确的使用STM32F4中的CCM内存-首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。

咱们知道STM32F4傍边有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因而除了内核之外谁都不能拜访,那么咱们怎样将其运用起来呢?

怎样正确的运用STM32F4中的CCM内存

首要,咱们能够运用Keil的设置选项,将IRAM2打勾,让编译器挑选什么时候运用这个内存。明显,咱们还能够将这两个地址修正一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。

怎样正确的运用STM32F4中的CCM内存

咱们来看看成果,在MAP文件中,标明的确运用了这段内存,可是因为咱们运用的内存较少, 还没有用到CCM。

怎样正确的运用STM32F4中的CCM内存

这种主动分配的方法有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能拜访,这就意味着,一旦编译器将数据分配到CCM中,而一起运用了DMA拜访,明显会出问题。

所以咱们就想到了自己分配这段内存,__attribute__((at(address)))这个句子便是专门干这事的,然后咱们能够这么做:

int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};

仿制代码

再次编译今后,发现的确如咱们所愿,咱们将一段数据放在在了CCM内存中:

ExecuTIon Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)

Base AddrSizeTypeAttrIdxE SecTIon NameObject

0x100000000x00000028DataRW7.ARM.__AT_0x10000000main.o

仿制代码

太好了,那么咱们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要运用的内存悉数移到CCM中,使其成为专有内存,明显会进步FreeRTOS的运转速度。

那么怎样放?首要咱们想到了heap4.c这个文件傍边有这么一段:

#if( configAPPLICATION_ALLOCATED_HEAP == 1 )

extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

#else

staTIc uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

#endif

仿制代码

这是FreeRTOS中堆内存的分配,咱们能够参加__attribute__将其放进CCM中,这样做没有问题,可是去修正FreeRTOS的源代码明显不是明智之举。事到如今,咱们只能自己界说链接器的储存器映射了。

修正Keil的Linker选项,咱们把Use Memory Layout from Targer Dialog的钩去掉。

然后在Objects的目录中找到一个后缀为sct的文件,翻开之后如图所示:

因为咱们只需要将RTOS的数据放入CCM中,所以咱们能够这样修正,CCM_IRAM的姓名是我自己取的,你能够改成任何你喜爱的,比方什么LOVEYOU之类的:

然后在链接器中挑选咱们自己的文件:

现在,映像文件变成了这样:

是不是很简单呢?体系仓库仍然在主内存中,而FreeRTOS的堆内存现已移到了CCM中,因为互不影响,这儿我分配了50K的空间专门给FreeRTOS运用。咱们乃至还能够装备MPU将这段内存装备为特权级,防止一般使命修正等等,怎样运用,那便是你的事了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/346437.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部