Andes SAG应用实例
?请参考图表7A的写法,这表示我们要将hello.o的只读区,包含程序代码(.text section)及只读数据段(.rodata section)放在LMA及VMA在0x10000的地址上。
![](../img/eep/emb/emb-47971qp05paz0eta.jpg)
图表7A 指定自定义section到特定地址
在整个project 中如果将每个.o档都列出来,那么整个SAG文档将变得难以阅读,而且在给后期维护带来麻烦,这种解法不好。如果使用者只需要排除几个.o檔,对于熟悉GNU linker的读者会想到“EXCLUDE_FILE”这一语法,让使用者可以很方便地在Linker中实现这一需求。Andes SAG也与时俱进地引入这一语法。图表7B正是这样一个例子,它将uart.o中所有的section 都放到一个特定地址去运行,而其它的保持不变。
![](../img/eep/emb/emb-479723td40vxjboz.jpg)
图表7B 支持“EXCULDE_FILE”
4、如何避免LMA或VMA的偏差
在前三个例子中,都是举例去说明如何实现将程序的某一部分的LMA或者VMA固定在某一个特定地址上,这是对链接这一动作的基本要求。嵌入式软件工程师需要知道,当某一section的LMA与VMA不相等时,那么在程序初始化时需要将这一section从LMA的地址拷贝到VMA的地址。初始化做拷贝时,这些section的LMA和VMA都是在链接脚本中赋值的,代码中只是去做引用。
Andes SAG同样可以给变量赋值LMA和VMA,但如何赋值呢,是不是一个一个紧凑地排列下来?答案很显然是不。很多工程师都知道,数据存放有Alignment的要求,比如4 Byte 的Word其存放的首地址需要是4 Byte Align;程序呢,因为优化的需要,比如在Andes 编译器在-Os等级下,函数的首地址同样强制4 Byte Align。既然有对齐的要求,就必然有gap存在,当然这里举出的对齐因素只是让读者了解到链接器对某一section的LMA或VMA的数值确定不只是单纯累加,Andes SAG能自动处理好大部分对齐状况。但在一些较复杂的例子中,需要给Andes SAG更多指示,让它工作正确。
首先,我们来看图表7所举出的例子,这一行“LOADADDR NEXT __uart_lmastart”,有一个关键字“NEXT”。它的作用就是让SAG知道,这个变量的取值是下一个Section的开始,而不是上一个Section的结束。为了让读者更明白所表示的含义,我们首先来看依照图表7的SAG编译出的elf(adx)档header信息,如图表8:
![](../img/eep/emb/emb-47973yxgsfw5bbmx.jpg)
图表8 adx header
可以看到.text_*uart.o 的LMA应该是0x1c60, 上一个section(.bss)的LMA结束地址应为:0x1c48+0x10=0x1c58,所以为了清晰地让SAG知道__uart_lmastart代表.text_*uart.o的LMA开始而不是.bss的LMA结束,我们应该用NEXT去修饰它。
然后,我们再来看图表9的例子,这个例子中,使用“LMA_FORCE_ALIGN”的原因是因为可能某一个section的size 只有2 Byte(不是4 Byte的整数倍),但下一个section的VMA 起始地址需要4 Byte Align,这时就会出现冲突,为解决冲突,Andes SAG引入这一关键字“LMA_FORCE_ALIGN”,强制让LMA与VMA用同一个值去做Align。
![](../img/eep/emb/emb-47974b2dr3vha2m1.jpg)
图表9 “LMA_FORCE_ALIGN”example
我们用图表9的SAG 例子去编译对应的project,可以看到图表10中section .sbss_b的LMA已经被从0x1d42调整到0x1d44。
![](../img/eep/emb/emb-47975jbyezbe0003.jpg)
图表10 “LMA_FORCE_ALIGN”的效果
5、结语
Andes提供通俗易用的SAG工具帮助工程师替代了复杂的链接脚本,可以大大提高在Andes core平台上的软件开发效率。本文从实际例子出发,介绍了Andes SAG 工具如何快速解决工程实际问题,说明了Andes SAG强大而且容易上手。然而工具的功能越强大,也就需要工程师多加深入了解功能设计的缘由,这也正是最后一个例子展现出来的道理,即是透彻了解就可以熟能生巧。希望广大读者能熟练掌握Andes SAG这样一把利器,在软件开发中发挥四两拨千斤的作用。
参考文档:
1: BSP321 programming guide link generator
2: The GNU Linker Manual
- 在晶心平台运行具 OSC 的 FreeRTOS(01-08)
- EDM安全访问机制应用方案(02-12)
- 8051 与 AndesCoreTM 的软件差异与移植(07-29)
- Andes 的分散聚合(SAG)机制(09-22)