3

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

例如:const uint8 var_test = 1;

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

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

4

4 回答 4

1

通常 const 不足以作为允许变量进入 ROM 的限定符(您总是可以将其丢弃)。通常你需要用编译器特定的东西来标记变量以表明你想要什么,或者可能是一个编译器标志来表明你的意图。我相信 IAR 编译器使用 @ 符号来允许您指定变量的位置。我会检查它的手册:-)

于 2013-02-08T10:05:24.020 回答
1

像其他答案一样,您的 const 变量可能没有放入 ROM 部分。

您需要告诉编译器/链接器将其放置在何处。

使用 IAR 工具链可能类似于

#pragma SET_CONST_PAGE(ConstArea)

const int myVariable1=42;
const int myVariable2=4711;

#pragma SET_DEFAULT_CONST_PAGE

但是您的调试器没有显示正确的值是另一个问题,变量可能已被优化。
要确定会发生什么,请查看映射文件并(使用调试器)在程序集级别查看已完成的操作。

于 2013-02-08T10:48:59.933 回答
0

通常,非静态const变量不是“足够恒定”以进入 ROM。如果您使用这些变量检查一个函数,您可能会看到该函数的前导码有代码来初始化本地堆栈上的变量。

当然,启动代码不能解决这个问题,因为它(根据定义)不能将值写入 ROM。

于 2013-02-08T09:53:57.327 回答
0

语言不要求 const 对象位于 ROM 中,而只是在初始化后是只读的,并且出于某些目标的性能原因,例如编译器可能会故意避免这样做。

IAR RL78 C/C++ 编译器参考指南指出:

“声明为 const 并位于远内存中的静态和全局对象在 ROM 中分配。声明为 const 的 saddr 对象在 RAM 中分配,并在启动时由运行时系统初始化。声明为 const 的近对象根据选项--near_const_location 分配。

在 C++ 中,需要运行时初始化的对象不能放在 ROM 中。”

请参阅手册中的#pragma location指令或@运算符,它们允许放置在绝对地址或命名内存段内。

于 2013-02-08T23:35:23.197 回答