我正在开发基于瑞萨RL78控制器的汽车软件堆栈。直接进入问题,声明为const(ROM变量)的变量不会使用定义的值进行初始化。
Ex:const uint8 var_test = 1;
另一方面,全局静态变量正在初始化。
这是启动代码的问题吗?请建议...
答案 0 :(得分:1)
通常,const不足以允许变量进入ROM(您可以随时将其丢弃)。通常,您需要使用特定于编译器的内容标记变量以指示您想要的内容,或者可能需要编译器标志来指示您的意图。我相信IAR编译器使用@符号来指定变量的位置。我查看其手册: - )
答案 1 :(得分:1)
与其他答案一样,可能你的const变量没有放入ROM部分。
您需要告诉编译器/链接器将它放在何处。
使用IAR工具链可能类似于
#pragma SET_CONST_PAGE(ConstArea)
const int myVariable1=42;
const int myVariable2=4711;
#pragma SET_DEFAULT_CONST_PAGE
但是你的调试器没有显示正确的值是另一个问题,变量可能是优化的 为了确定会发生什么,请查看映射文件并在汇编级别查看(使用调试器)完成的操作。
答案 2 :(得分:0)
非静态const
变量通常不足以“进入ROM”。如果使用这些变量检查函数,您可能会看到函数的前导码有代码来初始化本地堆栈上的变量。
当然,启动代码无法修复此问题,因为它(根据定义)无法将值写入ROM。
答案 3 :(得分:0)
语言不要求Const对象位于ROM中,而只是在初始化后才是只读的,并且出于某些目标的性能原因,例如编译器可能会极其避免这样做。
IAR RL78 C/C++ Compiler Reference Guide州:
“声明为const且位于远存储器中的静态和全局对象被分配 只读存储器。 const声明的saddr对象在RAM中分配并由运行时初始化 系统启动时。根据选项分配在对象附近声明的const --near_const_location。
在C ++中,需要运行时初始化的对象不能放在ROM中。“
请参阅手册中的#pragma location
指令或@
运算符,这些指令允许放置在绝对地址或指定的内存段中。