1. 链接脚本ld
1.1 MDK指定存储地址
定义一个常量,其起始地址为0x8001000:
const uint8_t gTest[] __attribute__((at(0x8001000))) = "12345678";
定义一个函数,其起始地址为0x8002000:
__attribute__((section(".ARM.__at_0x8002000"))) void test(uint32_t tick)
{
while(tick--);
}
定义到SRAM需要配置分散加载文件,稍微麻烦,这里不演示。
1.2 GCC指定存储地址
1.2.1 片区的演示划分
为了演示链接脚本的灵活性,这里给FLASH划分5个片区,RAM划分2块:
1.2.2 指定变量放在指定RAM片区
在SECTIONS段命令中,把两个变量放在RAM1中:
观察map文件:
1.2.3 指定函数放在指定的RAM片区
(注意:开启代码优化,只调用一次的子函数会被优化干掉!)
把函数【ry_delay_us】放在RAM1中:
观察map文件,该函数:
起始地址是【0x2001 0078】,刚好续上【testInputQ31】的结束地址
LMA的确是【APP3】的地址
上电后,在启动文件中,手动从【_ilm_lma】加载代码到【_ilm】:
1.2.4 指定函数、.c文件放到指定的FLASH
可以看到:
【one_wire.c】文件中的3个函数,都定义在【AAP1】中
【HAL_Init】函数定义在【APP2】中
-- END --