微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Andes SAG应用实例

Andes SAG应用实例

时间:12-04 来源:电子产品世界 点击:

在嵌入式开发中,系统软件设计特别是各种存储器的规划是必不可少的一个环节,它也直接体现在链接脚本的撰写上。 因链接脚本的语法相对复杂和篇幅较大,前期撰写和后期维护对工程师来讲难度都很大, 但对使用AndesCore做开发的工程师来讲,Andes SAG是一大福音,它提供简单直观的描述语言替代了复杂的链接脚本。我们收到的反馈也证明,越来越多的工程师开始采用Andes SAG替代linker,之前我们有一篇技术文章对SAG的语法格式做了介绍并说明如何使用,本文将展示四个实际工程开发的例子,以帮助广大开发者更好的熟悉和理解Andes SAG,同时可以作为开发时的参考。

1.将函数和变量指定到特定地址

第一个例子是如何将函数和变量的地址指定到一个特定的地址,例子中的地址指运行地址——VMA。有这样要求的原因有很多,诸如SOC的运行地址空间不连续,或者需要高效使用某一块效率很高的存储器等情况。解法分为两步:一,在SAG文件中添加自定义的section,将此section的VMA设定到指定地址;二,在C语言中,将需要改变的函数和变量用特定的语法放在自定义的section。

图表1是在SAG中自定义section 的例子。第1行关键词USER_SECTIONS表示后面接的这几个sections都是由使用者自定义的sections。

  

  

  图表1. Samp1.sag文件

图表1中,第4行至8行表示从0x0开始的区域是只读区,包含程序代码(.text section)及只读数据段(.rodata section)。第9行,MYRAM0部分表示.mysection0的VMA从0x00014000开始。以此类推,MYRAM1和MYRAM2部分各自表示mysection1和.mysection2的VMA起始位置。第21行的RAM1里放的是.data及.bss sections,执行时期会从0x00010000开始,源代码中须做到将data 的LMA地址copy至 VMA位置,可以使用 __data_lmastart 与 __data_start 来寻址。

指定函数放在自定义section里,在源代码的对应处要使用__attribute__((section(".mysection0")))语法,完整写法请参考图表2a。图表2b是另外一种写法。

  

  图表2a. 指定函数放在自定义section

  

  图表2b. 指定函数放在自定义section的另一种写法

指定全局变量gdata1放在自定义section .mysection1里,在源代码的对应处要使用__attribute__((section(".mysection1")))语法,完整语法请参考图表3。

  

  图表3. 指定变量放在自定义section

将函数和变量这样指定后,编译后的adx(elf)文档可以清晰看到对应Section的LMA与VMA如图表4.

  

  图表4. ELF Header

2.实现IVB在运行时切换

有一个客户需要系统在开机与正常运行时能有不同的ISR,即是同一个中断的服务函数在开机和正常运行时会不一样。对于这个问题的解法有很多,我们今天介绍是其中一种解决方法:设置一个新的Vector Table,新的Vector Table会跳到新的ISR;通过SAG将新的Vector Table指定到一个特定地址上;当程序开机完成,需要正常运行时,只需要去修改IVBASE (ir3)这个寄存器。

所以完成这个例子的重点是如何在汇编代码中建一个新的vector table 并指定到自定义的section中。表5是实例的写法:

  

  

  图表5 指定Vector table到自定义section

图表5重点是是第一行,.section 是用来定义非标准的section,.nds32_aa 即为非标准section的名称,”a”表示allocable, “x”表示executable. 因为Andes的标准vector table一般会放在.nds32_init section,所以新的vector table 放.nds32_aa里,名称不一样能区别就好。接下来是让新的自定义section .nds32_aa 运行在特定地址上,如图表6所示。

  

  

  图表6 指定自定义section到特定地址

这样新的vector table的首地址会被固定到0x10000的位置,当程序开机完成,只需要将IVBASE设定到这个地址,那么当有中断进来,就会跳到新的Vector Table中。

3.指定一个或几个C档的所有section到指定地址

上两个例子有共同点是通过编程将某一段程序放到自定义section,区别在于一个是指定C语言函数和变量到自定义section,一个指定汇编函数到指定的section,都需要改动源代码。然而对于一些应用场景,比如不提供源代码只有编译好的.o或者.a 文件,如果想将.o档里的section指定到特定地址运行,这个时候该如何做呢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top