Green Hills工程能够顺利编译以后,链接文件就开始决定代码和数据到底放到芯片的什么位置。这个环节如果只看“链接成功”,很容易漏掉问题,地址范围写错、段被放进不合适的存储区,程序仍可能生成可执行文件,上板后却停在启动阶段。Green Hills的elxr链接器使用.ld链接指令文件描述内存区域和程序段布局,处理这类问题时,工程里的Program Layout、实际生效的.ld文件和map结果要放在一起看。
一、Green Hills怎么生成链接文件
MULTI在创建Stand-alone工程时,可以由Project Wizard生成基础链接文件。它会结合目标平台和Program Layout准备默认的内存和段布局,后面再按板级资源修改,比从空文件开始写省事一些。
1、让Project Wizard生成基础文件
先从工程向导建立链接布局,目标处理器和运行方式要和当前开发板对应。
①、打开【MULTI Project Manager】并新建【Top Project】。
②、进入【Project Wizard】选择当前使用的【Stand-alone】运行环境。
③、选择对应的【Processor】或【Target Board】。
④、继续进入【Program Layout】设置。
⑤、选择符合当前启动方式的程序布局。
⑥、完成向导后展开【Target Resources】。
⑦、找到工程生成或引用的【.ld】链接指令文件。
2、以默认文件为基础建立自定义版本
①、在工程目录中保留原来的【.ld】文件。
②、复制一份需要修改的【Linker Directives File】。
③、使用文本编辑器打开新的【.ld】文件。
④、在工程链接配置中确认当前使用的【-T】参数。
⑤、让【-T】指向准备修改的链接文件。
⑥、保存工程并重新执行【Build】。
默认文件里通常已经包含运行环境使用的基础段。保留原来的整体结构,只修改当前硬件确实有变化的部分,后面发现异常时也比较容易找到改动位置。
3、填写内存区和段分配
①、在【MEMORY】中填写各存储区的【ORIGIN】和【LENGTH】。
②、按芯片内存图核对Flash、RAM及其他可用区域。
③、进入【SECTIONS】检查【.text】和【.rodata】的放置区域。
④、检查【.data】、【.bss】、【.heap】和【.stack】的分配位置。
⑤、项目存在自定义段时,在【SECTIONS】中补充对应映射。
⑥、保存【.ld】并重新链接工程。
二、Green Hills链接文件配置错误导致程序无法运行如何调整
有些链接错误会直接让构建停止,还有一些配置问题并不会报错,程序却无法正常启动。碰到后一种情况,可以先从map结果找到程序的实际落点,再回到链接文件检查地址和段,排查会更有方向。
1、确认工程到底用了哪份链接文件
工程目录里可能留着几个测试版本,改错文件以后,重新构建自然看不到变化。
①、执行一次【Build】。
②、打开【Build Output】查看实际链接命令。
③、找到链接阶段使用的【-T】参数。
④、核对参数后面的【.ld】文件路径。
⑤、确认它和当前修改的文件一致。
⑥、不一致时修正工程链接配置后重新构建。
2、检查内存起始地址和容量
①、打开当前生效的【.ld】文件。
②、找到【MEMORY】定义。
③、对照芯片手册核对每个区域的【ORIGIN】。
④、检查对应区域的【LENGTH】。
⑤、确认各内存区域没有地址交叉。
⑥、保存修改并重新执行链接。
3、程序能下载但启动后很快异常
①、生成链接阶段的【Map File】。
②、查看入口代码和启动相关段的地址。
③、核对代码段所在的Flash区域。
④、检查向量表或启动段是否落在芯片要求的位置。
⑤、查看【.data】和【.bss】的运行地址。
⑥、确认启动代码使用的内存布局与链接文件一致。
如果启动代码仍按旧地址初始化内存,而链接文件已经把程序段换到了其他区域,下载可能照常完成,真正执行时却会访问错误位置。这时只检查链接文件还不够,启动代码也要一起核对。
4、处理段溢出或地址重叠
遇到section overflow、overlap这类信息时,先看清是哪一个段超出了当前区域,再决定移动段还是重新划分空间。
①、打开本次构建生成的【Map File】。
②、找到报错对应的【Section】。
③、查看该段的起始位置和占用范围。
④、返回【MEMORY】核对所属区域容量。
⑤、在【SECTIONS】中调整该段的放置区域。
⑥、重新链接并再次检查【Map File】。
5、检查RAM数据和堆栈区域
①、在【Map File】中查看【.data】和【.bss】地址。
②、检查【.heap】和【.stack】预留区域。
③、确认这些段都落在实际可用的RAM中。
④、查看各区域之间是否发生覆盖。
⑤、修改【.ld】中的段位置或预留大小。
⑥、重新构建并下载程序。
程序如果在初始化全局变量、进入较深函数调用以后才出现异常,RAM布局就很值得回头检查。工程代码变多以后,原来留出的空间也可能已经不够。
三、Green Hills链接文件调整后怎么验证
链接文件修改完以后,可以用生成文件和板上运行状态再核对一次。这样后面加入新的代码段或者数据区变大时,也有一份已经验证过的布局可作参照。
1、用map文件核对实际落点
先把链接器真正排出来的地址看清楚,不要只依据.ld文件里的预期位置判断。
①、启用链接器的【-map】输出。
②、重新执行【Clean】和【Build】。
③、打开新生成的【Map File】。
④、查看主要【Section】对应的地址范围。
⑤、核对自定义段是否进入预定内存区。
⑥、确认本次结果与【.ld】中的布局一致。
2、保存可以正常运行的布局版本
①、备份当前生效的【.ld】文件。
②、保存对应的【Map File】。
③、记录当前使用的【Program Layout】。
④、保留工程中的链接参数配置。
⑤、按硬件版本整理这些文件。
后面更换芯片型号、重新划分Flash或者加入较大的静态数据时,可以直接拿这份已经跑通的版本进行比较,不必重新猜之前的内存是怎么分配的。
总结
Green Hills链接文件表面上是在安排几个内存地址和程序段,实际却和程序能不能正常启动直接相关。碰到工程已经链接通过、程序下载后却跑不起来的情况,先确认生效的是哪份.ld文件,再拿map结果核对代码、数据和RAM布局,通常更容易找到问题。平时把能够正常运行的链接文件和map结果一起留好,之后修改内存分区时也能多一份可靠的参照,希望这篇整理能给大家处理Green Hills链接配置时带来一些帮助。
