MounRiver中变量定位问题

由于从F转到V,keil变为MounRiver,用gcc编译器。原先keil中的定位语句无法使用了。

1、keil在地址0x08005400位置定位一个变量用于存放程序版本号:

#define FW_APPVERSION_BASE    0x08005400

const uint16_t FW_wAppVersion __attribute__((at(FW_APPVERSION_BASE))) = VERSION_APP;


改成MounRiver不能这么写了,按照gcc方法改为:

const uint16_t FW_wAppVersion __attribute__((section (".myBufSection"))) = VERSION_APP;

然后在连接文件.ld的section段中增加下面红色部分,这样做对吗?好像跑起来程序有问题:

SECTIONS

{

.init :

{

_sinit = .;

. = ALIGN(4);

KEEP(*(SORT_NONE(.init)))

. = ALIGN(4);

_einit = .;

} >FLASH AT>FLASH


/* placing my named section at given address: */

  .myBufBlock 0x00005400 :

  {

    KEEP(*(.myBufSection)) /* keep my variable even if not referenced */

  } >FLASH AT>FLASH


image.png

你好,可按照上图定义,代码如下:

.flag :
   {
  
   . = ORIGIN(FLASH) + 0x800;
  
KEEP(*(SORT_NONE(.myBufSection)))
  
  }>FLASH AT>FLASH


测试如下:

定义了一个dat_test变量,放在0x800位置。

image.png

image.png


增加了后链接出错了,不知如何处理。

make -j4 all 

d:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/bin/ld.exe:.ld:1: syntax error

collect2.exe: error: ld returned 1 exit status

E(OFN4YVLPSH)FPKI62VW7M.png


icon_rar.giftest.zip

附件是我的测试例程,你参考一下。


谢谢,搞定了,是我傻了,拷贝的时候等号=前面的一个·点忘记拷贝了。


另外有个问题:

我程序有2个常量(uint32_t)在Flash中绝对定位,且两个地址相距比较远,大概有12K左右。用这种方法做的绝对定位,中间12K链接程序直接给你全空了,没有放代码进去,等于这12K白白浪费掉了,剩下空间又不够。KEIL MDK就不会有这情况,C中用at指令绝对定位后,常量与代码可以混合在一起。


所以两个地址都建议靠前且相距不远,减少浪费。



有没有什么好的方法,能像KEIL中那样的绝对定位常量与代码混合的。再去改绝对地址定位上位机配套工具全部都得更新。



image.png

可通过上述方式以相关.c文件填充,例如我使用debug.c来填充,效果如下图:

image.png

在我定义的0x0800到0x1600之间存放了debug.c中的相关函数。


只有登录才能回复,可以选择微信账号登录