连接脚本 xxxxxx.ld
这个描述文件叫做链接文件,如linux下的.ld文件,Keil中的分散加载文件(.sct文件)。
成功修改STM32启动程序(自定义的分散加载模式)
话说启动代码,没什么神秘的,往简单里说不外乎3个功能部分
1,做个AREA放置向量表,异常/中断跳转的地址表。
2,初始化SP的值,初始化内核的状态(比如工作在用户模式或超级模式,STM启动默认在高权限模式)
3,如果使用的是简单的分散加载,IMAGE(映像文件)也就由1个RO,1个RW,1个ZI组成,并且RO的load region和execution region相同,那么只需要COPY RW区到RAM,然后再RW区后面创建ZI区,只部分可以用汇编代码自己实现。当然库里的__main函数就包含这些功能,但是如果不用__main,那就要自己写这部分了。
何为简单的分散加载?
MDK的HELP文档里有很详细的说明。
首先编译器设置要改
要是勾了,编译器要报错,问你启动库函数找不到。
勾了就是使用默认的分散加载描述文本,.SCT文件是不让改的,所以想改就不要勾。
STM32F4的sct文件理解
我现在的板子是STM32F429,外接了SDRAM,NandFlash,我想用sct文件的主要原因是要用到了nandflash,想把yaffs移植上去,但yaffs里面有大量的malloc,STM32F429的片内sram不足以完成这些malloc,故想到把堆放到SDRAM里面去,因此我的sct文件如下:
LR_IROM1 0x08000000 0x00100000 { ; load region size_region 加载域,起始地址是0x08000000,大小是0x00100000
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address 执行地址,就是链接地址
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
}
ARM_LIB_HEAP 0xC0000000 0x80000 { ; 指定堆栈地址
RW_HEAP 0xC0000000 0x80000 {
.ANY (HEAP)
}
}