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