1、前提:项目中比较大,使用RAM空间大于128K时出现问题;查看手册发现,F407把ARM区域分成了几块;如下图:(最后一步讲解keil加载.sct文件的方式)
共被分为三个区域,SRAM可以直接使用;CCM只有内核能访问,DMA等数据不能访问;
2、错误使用:刚开始使用的时候,直接勾选keil中的内存区,结果发现程序无法运行,如下图:
3、正确使用:使用.sct文件加载内存区域;由于我使用的是FreeRTOS系统,所有优先把系统相关资源都放在CCM区域了,多出来的资源方一些其他的文件(不能方含DMA相关的)。.sct文件源码如下所示:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08004000 0x00100000 { ; load region size_region
ER_IROM1 0x08004000 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 {
;加载FreeRTOS系统相关文件
control_task.o (+RW +ZI)
; event_groups.o (+RW +ZI)
; list.o (+RW +ZI)
; queue.o (+RW +ZI)
; stream_buffer.o
; tasks.o (+RW +ZI)
; timers.o (+RW +ZI)
heap_4.o (+RW +ZI)
port.o (+RW +ZI)
;加载用户相关文件 注意F407的第二存储空间只有64K
mid_share_data.o(+RW +ZI)
mid_param.o(+RW +ZI)
}
}
注意:在RW_IRAM2 0x10000000 0x00010000 上面部分的是keil之前生成的;可以在keil工程下找到原有的.sct文件,然后在这个文件上加RW_IRAM2 0x10000000 0x00010000相关内容;
加载后.map跟内存分配相关的,如下图所示:
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x0801d42c, Size: 0x0000f5e8, Max: 0x00020000, ABSOLUTE, COMPRESSED[0x0000017c])
Execution Region RW_IRAM2 (Exec base: 0x10000000, Load base: 0x0801d5a8, Size: 0x0000cf84, Max: 0x00010000, ABSOLUTE, COMPRESSED[0x0000012c])
4、加载.sct文件方式
选择 魔法棒 -> Linker 如下图配置: