ROM变量未获得定义的值

时间:2013-02-08 09:48:13

标签: c embedded

我正在开发基于瑞萨RL78控制器的汽车软件堆栈。直接进入问题,声明为const(ROM变量)的变量不会使用定义的值进行初始化。

Ex:const uint8 var_test = 1;

另一方面,全局静态变量正在初始化。

这是启动代码的问题吗?请建议...

4 个答案:

答案 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指令或@运算符,这些指令允许放置在绝对地址或指定的内存段中。