在Green Hills工程里,用户口头常说的LSL文件,实际对应的一般就是linker file,也就是linker directive file。公开的厂商资料里对GHS的写法很一致,链接阶段通过`-T
一、Green Hills怎么配置LSL文件
先把链接文件的骨架搭对,再去放代码段和数据段,会比后面一边报错一边补地址更稳。ST的GHS教程把链接文件概括得很直接,基础内容通常分成三块,也就是内存定义、常量定义以及代码段和数据段的划分。
1、先定义内存区域
链接文件第一步先写memory definition,用来告诉链接器板上有哪些存储器、起始地址是多少、大小是多少。官方应用资料特别提醒,这一层必须和实际硬件对齐,所以Flash、RAM、专用中断区这些区域的起始地址和容量,最好先按芯片手册核一遍再写。
2、再放常量和段分配
内存区定完以后,再去写常量定义和section分配。ST的说明里把这一层叫partitioning of code and data segments,NXP的GHS示例链接文件里也能看到典型写法,就是先写`MEMORY`,再把中断表、代码段、数据段、堆栈段分别放到对应区域。
3、最后把工程指到正确链接文件
GHS链接器选项里,官方资料给出的标准方式是`-T
二、Green Hills LSL文件地址冲突怎么排查
地址冲突大多数不是“工具突然坏了”,而是链接文件里的区域定义和section放置关系没有对齐。更稳的排查顺序,是先查内存区,再查section,最后用map文件核实谁先占满了空间。NXP资料里也把GHS的map文件输出单独列成了标准链接选项。
1、先查内存区起始地址和大小
如果`MEMORY`里某个区域的start或size写错,后面所有section都会跟着偏。ST文档已经明确说过,memory definition决定了硬件上有哪些存储器、起始地址和容量,所以地址冲突第一步不要先看函数,而要先核region本身是不是写错了。
2、再查是不是两个section被放进了同一块小区域
NXP的GHS示例里把中断表、代码、数据和栈拆到不同memory segment和memory section里,这本身就在说明一件事,section不只是“有地方放就行”,还要按用途拆开。实际排查时,如果你把中断表、启动代码和普通代码都压进一个很小的段里,最容易出现重叠或挤爆。
3、用map文件看真正的占用结果
GHS官方选项里支持`-map=
三、地址冲突总是反复出现时先改哪里
如果你改完一次又一次地撞地址,通常不是单个数值写错,而是链接文件结构本身就太挤。更实用的思路,是先把高风险段拆开,再把容量敏感的段单独留区,不要所有内容都往主RAM或主Flash里硬塞。NXP的示例内存图本身就是按中断区、主代码区、数据区和栈区分开的。
1、先把中断表和启动段单独留区
NXP示例里,中断相关section和普通代码段并不是混放的,而是单独占位并且带有明确对齐要求。实际项目里如果把这类固定地址段和普通`.text`混到一起,最容易在后期加功能时撞地址。
2、再把栈和堆从主数据区里分出来
示例链接文件里对stack和heap也有独立边界符号,这说明它们不是“剩多少给多少”的随意区域。若项目里栈、堆和`.data`、`.bss`全挤在一起,地址冲突往往会在功能增长后集中爆发。
3、最后再考虑改代码体量
如果region、section和map都看清了,仍然超界,那才轮到缩代码、减数据或换内存布局。顺序不要反过来,否则很容易在代码上做了很多删减,结果根因其实还是链接文件分区不合理。这个判断逻辑本身也来自前面两份资料对链接文件职责的定义,也就是它先决定“放哪里”,代码大小才决定“够不够放”。
总结
Green Hills怎么配置LSL文件,核心就是先把`.ld`链接文件里的内存区、常量和section分配写清,再用`-T
