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

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