MCU - 链接脚本指定变量、函数的存储地址

文摘   科技   2024-03-10 10:00   广东  





链接脚本ld概述,及程序存储机制





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 --




碎片聚合
求真务实
 最新文章