代码1:
int a = 5;
这样写,a的地址在RAM中的R段,同时在ROM中的D段放一个初始值。
代码2:
#pragma section my_section
#prgma section
这样写,a的地址变成了ROM中的Dmy_section段并且R段中没有a的空间。
请正确定义带初始值的全局变量的方法是什么?问如何使D⇒R拷贝机制作用在自定义段中的变量上?还是说这种情况只能定义不带初始值的变量放进B段然后再定义一个C段的const然后自己copy?
CPU初始化之后hh1的值肯定不是初始值0x88对吧?那这个初始值0x88是存在哪里的,又是怎么赋给DMy_RAM_1段中的hh1的呢?一般的全局变量是D⇒R拷贝机制,但是hh1在D段中不在R段中。还有其他的类似xxx⇒DMy_RAM_1拷贝机制吗?
我想知道的是CPU是如何处理的。也就是您所说的“编译器自动处理”是生成了什么样的代码来处理的。因为我的实验结果就是没有初始值。
#pragma section My_RAM1unsigned char hh1 = 0x88;#pragma section
void main(void){ hh1 = 0x99; // 此处设断点 while (1);}
上面的代码,断点处通过Watch窗口,可见hh1初始值是0x88。继续运行程序使hh1变为0x99。然后reset CPU重新运行。断点处通过Watch窗口,可见hh1的值是0x99而不是初始值0x88。
参照用户手册 Table 8.1段的属性
https://www2.renesas.cn/document/mat/high-performance-embedded-workshop-rx-family-cc-compiler-package-v101-users-manual-includes-v102?language=en&r=1169511
1. section里面定义, D是有初始化, B是未初始化
Section 定义格式分三部分 [属性] [section_name] [_数据长度]
2程序中定义
#pragma section My_RAM2unsigned char hh2;#pragma section
3. whatch
带有属性D的, 就是存放初始化变量的段, 是自动赋值的, 这个是编译器自动处理的.
在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没有连接脚本我还以为都是自动的呢。