请问在使用CCRX编译器时如何在自定义段中定义带初始值的全局变量?

代码1:

int a = 5;

这样写,a的地址在RAM中的R段,同时在ROM中的D段放一个初始值。

代码2:

#pragma section my_section

int a = 5;

#prgma section

这样写,a的地址变成了ROM中的Dmy_section段并且R段中没有a的空间。

请正确定义带初始值的全局变量的方法是什么?问如何使D⇒R拷贝机制作用在自定义段中的变量上?
还是说这种情况只能定义不带初始值的变量放进B段然后再定义一个C段的const然后自己copy?

Parents Reply Children
  • 黄色部分代码是把DMy_RAM1拷贝到RMy_RAM1中。起作用的前提是hh1变量本身被放在RMy_RAM1中,hh1的初始在被放在DMy_RAM1。

    我现在的情况是hh1被放在了DMy_RAM1,而RMy_RAM1根本不存在。即使在链接参数里指定RMy_RAM1,也不会生成RMy_RAM1,因为里面没东西。

    W0561100:Cannot find "RMy_RAM1" specified in option "start"

    我用的编译器是CCRX 3.03.00,IDE是

    Renesas e² studio

    Version: 2022-01 (22.1.0)
    Build Id: R20220106-1410

     

  • 编译器自动处理, 把初值放在ROM里, 在程序启动后, 从ROM赋值到RAM,所以有了上面黄色的部分, 你从头开始看一下本贴. 

    编译没有出现你说说的warning, 如果如果有困难, 请留下邮箱. 

    下面是map文件, 编译器自动生成一个DMy_RAM_1段, 

    可以通过memory看到这个地址上的初值数据

  • 谢谢。

    问题解决了。必须要在链接时指定参数-rom=DMy_RAM1_1=RMy_RAM1_1。编译时变量被预备放在D区,链接器根据参数把D区的变量重定位进R区。

    我以前用的别的芯片是手写连接脚本,自己写data区和romdata区重定位。RX没有连接脚本我还以为都是自动的呢。