本帖最后由 shao15232 于 2018-5-7 15:14 编辑
之前在原子的论坛上面发了帖子,希望得到大神的指点,关于内存管理部分的使用情况。今天就自己的实验说一下个人心得,有错误之处欢迎指正拍砖,谢谢!
关于STM32F103ZET6内存的使用,当我们使用EMWIN的时候,才会发现IRAM的内存在跑GUI_Demo的时候很吃力,大部分情况下就跑不起来了,就出现下面的样子:
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_cfg_app.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
..\OBJ\STemWin_UCOSIII.axf: Error: L6406E: No space in execution regions with .ANY selector matching gui_alloc.o(.bss).
........
这些是内存不足的提示。
这个时候我用的还是原子的MALLOC内存分配来做的.
关于内存分配这里顺便提一下,原子教程里面的内存分配我用的时候感觉就是,我们的单片机在跑完code后,SRAM剩下空闲的部分才能被管理,系统跑起来占用的部分是没法管理的,只能自动分配。
然后我就把MALLOC的文件去掉,直接使用系统自带的外扩SRAM,还不知道怎么附图,只能在最底下一起放上来。
使用的时候先设置一下system_stm32f10x.c文件中第122行,设置 #define DATA_IN_ExtSRAM 1
启用系统自带的外部SRAM宏
修改完这里之后还要修改一下startup文件: 修改启动文件中的中的第39行,把__initial_sp 修改成 __initial_sp EQU 0x20000000 + Stack_Size。
startup文件修改
然后修改Options for Target RAM1 Start:0x68000000 Size: 0x100000 (1M)
这个时候外部SRAM已经配置好了,注意这里不用去写什么FSMC和Init外部SRAM,因为上面启用外部SRAM宏的时候已经启用了外部SRAM。
最后个人感觉:
当你需要使用的 USER_SRAM > 64KB的时候,内部SRAM会报错,内存不足,需要启用外部SRAM,这个时候去查一下.map档案。结论是内部SRAM的使用率为0。 USER_SRAM会全部加载到外部SRAM使用。附图也在下面,大家自行参考一下。写的不好,望指正。
|