图片展示
  • DAP LINK
  • AG32 MCU
  • HIZYUAN
  • AMD/XILINX-2
  • AMD

AG32 MCU的分散加载

作者:HIZYUAN 浏览: 发表时间:2024-09-18 17:44:47

AG32 下的分散加载


分散加载:

在实际应用中,有时候需要强制把一段数据或一段代码固定到指定的一个地址。这个时候,就不能使用默认的编译配置,需要自己来配置连接属性。

AG32 中可以通过修改ld 配置,达成这样的目的。

 

分散加载在gcc下的限制:

不能插入到代码段,只能放到正常编译的 bin 后边(参后详述)。 

在默认情况下,AG32编译时使用的连接配置文件是 AgRV2K_FLASH.ld,位于:AgRV_pio\packages\framework-agrv_sdk\misc\devices 下。

打开该文件会看到,关联了另外两个文件:

 

 

其中,在 AgRV2K_mem.ld 中是多个自定义的标签:

 

 

而在 mem.ld 的定义中,则是对 section 的使用和分配:

 

 



以上的三个文件,总结: 

  1. AgRV2K_FLASH.ld:关联到工程的,一般不要改动; 
  2. AgRV2K_mem.ld:自定义标签的定义,如果要新增标签,需要改动; 
  3. mem.ld:设置编译地址分配的地方,需要改动。

   这里相当于三个文件加在一起,组成一个完整的 scat 文件。

 

这里的语法都是标准的 gcc ld 语法,可自行网上搜索更全的使用方法。如有不清楚的地方,也可以联系海振远科技获取更多技术资料与技术支持。

下边只是个简单的举例供参考。 

 

举例:把某个数组和某个函数指定编译到 flash 的某个位置。

比如,指定数组 guSetting 到 152K 的地方(地址为:0x80026000)

指定函数 testFuncToPos() 紧跟在数组后边。 

 

需要做:

1.  在 AgRV2K_FLASH.ld 中定义一个新标签:

FLASH_E 和 FLASH_E_SIZE 

分别为起始地址 0x80026000 和 4K 大小; 

同时定义 FLASH_EXT 段,后续会来使用;

如下图:

 

 

    这里的 flash 位置使用时***放到 code 的结尾处。

    并且要考虑 fpga 部分的 flash 使用空间。

    (如果不对 fgpa 的位置指定,fpga 会默认占用 flash 的*** 100K) 

 


2.  在 mem.ld 中,根据上边定义的标签,定义 section,如:

.flash : ALIGN(4) 

{

*(.testSectionData);

*(.testSectionCode); 

} > FLASH_EXT 

如下图:

 

这里定义出来的 section:testSectionData 和 testSectionCode。这两个 section 名称,就是在代码中使用的关联 section。 

 


3.  在代码中,对数组和函数进行 section 指定,方法如:

__used uint8_t guSetting[16] __section(".testSectionData") = 

__used __section(".testSectionCode") void testFuncToPos(void)

如下图:

 

并且在项目中调用函数 testFuncToPos。 

 


4.  编译后,可以从工程的 \.pio\build\release\ 路径下查看 .readelf 文件。

(如果是 dev 方式编译,路径是:\.pio\build\dev\)

 

打开该文件后,可以看到 guSetting 和 testFuncToPos 正是在我们所期望的位置上:

 

注意:这里对 flash 空间规划时,需要增加 fpga(cpld) 对空间的使用考虑。

 

附:

    关于芯片 flash 大小: 

    不管所选型号的 flash 是多大,请注意*** 100K 是留给 fpga 使用的。 

    如果使用的芯片是 256K 的 flash 空间,那么就是 156K 程序 + 100K fpga,用户程序不能超过156K。如果超过 156K 编译是可以通过的,但烧录后会冲掉 ve 配置部分。 

    ve 配置被冲掉后,程序运行会表现出各种异常(连系统时钟初始化都跑不过)。 

     

    如果程序使用的空间较大,fpga 又刚好比较小,可以调整这个界限的值。调整方法如下:

    board_logic.compress = true //(可选)对 fpga 部分进行压缩,更省空间 

    board_upload.logic_address = 0x80034000 // 根据实际情况调整该边界值 

     

    flash 的大小是在 agrv2k_103.json 中定义的。 

    flash 起始地址是 0x80000000,ram 是 0x20000000。 

 

另:

分散加载中,如果连 AgRV2K_FLASH.ld 都想自己指定,则需要修改 platformio.ini 中的配置项: 

board_build.ldscript = AgRV2K_FLASH.ld 

 



分散加载在 gcc 下的限制:

在 arm 中,可以通过 _attribute_ ( at(***地址) )的方式,把某个数组或某个函数强制编译到某个地址,并且不影响其他代码的编译。编译后整个 bin 空间看上去是连续的。 

这是 arm 编译器支持的一个特性。 

但 gcc 不支持这样的指定。 

gcc 使用 ld 指定的地址,不能在正常编译的 code 的区域内。这个地址只能放在没有用到的 flash 部分。 

也就是说,新指定的位置,必须在正常的编译区域的后边。 


实际操作时,代码些许的改动都会影响到 bin 的大小,所以这个指定的位置,往往会跟正常 bin 之间预留一些空间。所以,自定义 ld 文件的方式 bin 文件会增大 一些。 

从 bin 的角度看,code 和指定区域,两段中间空出来的区域,会被填充成 00。***终 bin 增大的部分,就是这部分填充成 0 的 size 大小。 


如果对 bin 的大小比较敏感,那就要缩小这段 0 的区域。可以在***终出包时,看下其他代码编译后的大小,然后把这段指定地址放的尽量近。 

如果对 bin 的大小不太敏感,那就随意指定到没用到的 flash 区域即可。

 


暂无链接

电话:0755-2780 9180   E-mail: tech@hizyuan.com
地址:中国广东省深圳市宝安区新安街道广兴源互联网智慧科技园D栋508
Copyright 版权所有  海振远科技 All rights reserved  

在线客服
联系方式
热线电话
0755-27809180
E-mail地址
tech@hizyuan.com
二维码
二维码
微信在线客服-(添加请备注:海振远产品咨询)
在线客服
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功!
添加微信好友,详细了解产品
我知道了
粤ICP备19051499号-1