介绍两点:
其一是CCM (core coupled memory)是在CPU核里的,速度更快,所以可以把最常用的,最频繁用的程序段放到这里面;
其二是,如何高效地使用scatter file配置使用CCM;
第一点:一般介绍
关于如何使用CCM RAM, ST官方文件中已经说得很清楚了,这里就不再重复了,
参考(点击下载):
AN4296 Use STM32F3/STM32G4 CCM SRAM with IAR? EWARM, Keil? MDK-ARM and GNU-based toolchains
这里要注意的是,CCM直接连接到了D-BUS上面,下面两张图,一张来自AN4296,一张来自stm32f4xx系列的DATASHEET。使用时要注意的是,CCM只和DBUS直接相连,没有和外设相连,所以不能用作DMA之类的操作。
?
第二点:MDK中利用SCATTER 文件配置使用CCM_RAM
因为我的工程比较大,所以先试试MDK。GNU或者IAR还没有时间。
官方的说明中,对于小规模的程序文件是没有问题的,但是,如果你的程序文件比较多,一个个函数地定义和设置,是不现实的。用整个文件夹或文件的形式,在属性中如下这样的设置是无效的(我也不知道为什么无效,没研究过KEIL MDK),
我采用的办法是直接修改SCATTER 文件,系统默认的SCATTER文件长这个样子,
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (+RW +ZI)
}
}
在配置之前,你先编译一次,通过查看MAP文件中的memory分析,确定哪些文件是要进RAM的,省得自己去分析。
然后,以我自己的某次配置为例,为了把指定的文件配置到RW_IRAM2(对应STM32F4XX,这个地方就是CCM_RAM),我自己改成了下面的样子,这里不再使用".ANY",而是逐个指定要链接的文件,当然前提是你知道哪些文件是要进RAM的,不要把应该写到FLASH中的文件弄进来了(不清楚弄进来有什么后果,还没来得及测试,有兴趣的可以自己玩一下)。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
queue_buffer.o (+RW +ZI)
fifo_buffer.o (+RW +ZI)
main.o (+RW +ZI)
controller.o (+RW +ZI)
usbd_conf.o (+RW +ZI)
tim.o (+RW +ZI)
usb_device.o (+RW +ZI)
usbd_desc.o (+RW +ZI)
etharp.o (+RW +ZI)
rand.o (+RW +ZI)
lwip.o (+RW +ZI)
can.o (+RW +ZI)
stm32f4xx_hal_flash.o (+RW +ZI)
dhcp.o (+RW +ZI)
ip.o (+RW +ZI)
tcp_in.o (+RW +ZI)
ip4_addr.o (+RW +ZI)
}
}
最后看一下你的MAP文件,当然生成MAP时要注意,选择那些你关心的选项就够了,不要全选,不然找半天找不到,例如我只关心MEMORY分配,就只选了MEMORYA,如下,
?