请问在使用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
  • 我想知道的是CPU是如何处理的。也就是您所说的“编译器自动处理”是生成了什么样的代码来处理的。因为我的实验结果就是没有初始值。

    #pragma section My_RAM1
    unsigned char hh1 = 0x88;
    #pragma section

    void main(void)
    {
      hh1 = 0x99; // 此处设断点
      while (1);
    }

    上面的代码,断点处通过Watch窗口,可见hh1初始值是0x88。继续运行程序使hh1变为0x99。然后reset CPU重新运行。断点处通过Watch窗口,可见hh1的值是0x99而不是初始值0x88。

  • 在dbsct.c文件中添加黄色部分代码

    在编译器选项里面添加黄色部分

  • 黄色部分代码是把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没有连接脚本我还以为都是自动的呢。