[应用相关] 如何使用STM32F4中的CCM内存

[复制链接]
657|5
 楼主| 火星国务卿 发表于 2020-10-12 18:16 | 显示全部楼层 |阅读模式

        我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?

        o4YBAF34hsGAciCbAAE1hbwCXEg843.jpg

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

        pIYBAF34hvaAfWlIAAEI8mbVOZs602.jpg

        我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。

        pIYBAF34hviAIOCEAADYbXYV_TQ463.jpg

        这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到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的钩去掉。

        pIYBAF34hvqAKi14AADDngO3iHI091.jpg

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

        pIYBAF34hvqAe8xhAACJwh09pW4806.jpg

        由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:

        pIYBAF34hvqAPLq8AAC7nN35vWo161.jpg

        然后在链接器中选择我们自己的文件:

        pIYBAF34hvuAL5-zAADLrKl6Fb8755.jpg

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

        pIYBAF34hvyANd0YAAFPWXy4p3Y437.jpg
        是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。
labasi 发表于 2020-11-11 16:56 | 显示全部楼层
ccm内存主要用来做什么呀
paotangsan 发表于 2020-11-11 16:58 | 显示全部楼层
没有关注过这部分内存呀
renzheshengui 发表于 2020-11-11 16:59 | 显示全部楼层
它涉及到哪方面的操作呢
wakayi 发表于 2020-11-11 17:00 | 显示全部楼层
这样看起来确实很简单
wowu 发表于 2020-11-11 17:01 | 显示全部楼层
长知识了  非常感谢楼主的详细介绍啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

683

主题

1544

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部