【问题标题】:ROM variable not getting the defined valueROM 变量未获得定义的值
【发布时间】:2013-02-08 09:48:12
【问题描述】:

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

例如:const uint8 var_test = 1;

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

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

【问题讨论】:

  • 你用的是什么编译器?
  • 您如何确定变量未正确初始化?你能做一个最小的重现测试用例吗?
  • @joe,我正在使用 IAR 编译器
  • @KerrekSB 我正在通过提供的监视窗口检查,我​​没有为它制作任何特定的测试用例。
  • 考虑使用 IAR 特定的关键字 __flash。在我使用的 IAR 版本中,const 被放入 RAM 段并在启动时初始化,即使您认为它是 ROM。你有一个low_level_init() 函数吗?它返回 1 吗?

标签: c embedded


【解决方案1】:

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

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

使用 IAR 工具链可能类似于

#pragma SET_CONST_PAGE(ConstArea)

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

#pragma SET_DEFAULT_CONST_PAGE

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

【讨论】:

  • 但它应该显示变量的放置位置(哪些部分/地址)
  • 是的,我不知道为什么它没有显示进入 ROM 段的数据.. 可能是优化问题..但必须仔细查看...... ROM 段数据是放置为 NEAR_CONST 并且该区域被赋予大约 280 个字节......但是一个显式的 ROM 变量没有像分配它的位置那样显示......但最迟我检查了 ROM 变量值是否被定义为给定的值但是无法访问它的地址..
【解决方案2】:

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

【讨论】:

  • 但是据说编译器文档中声明为 const 的变量应该进入 ROM。是的,正如你所说,我们可以在以后随时丢弃,但这里没有修改。
  • 所以你确信它在正确的位置,在你期望它的 ROM 中,但只是初始化失败了?
【解决方案3】:

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

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

【讨论】:

  • 所以你说内存空间快用完了ROM?
  • 不,他说你的 const 变量没有链接到 ROM 部分,可能它们仍然驻留在 RAM 中
【解决方案4】:

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

IAR RL78 C/C++ Compiler Reference Guide 声明:

"声明为 const 并位于远内存中的静态和全局对象分配在 只读存储器。 const 声明的 saddr 对象在 RAM 中分配并由运行时初始化 系统启动时。 const 声明的 near 对象是根据选项分配的 --near_const_location。

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

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

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2012-02-27
    • 2015-12-20
    • 1970-01-01
    • 2011-06-11
    • 2021-02-08
    相关资源
    最近更新 更多