【问题标题】:How to define const variable on RAM?如何在 RAM 上定义 const 变量?
【发布时间】:2015-11-06 13:58:10
【问题描述】:

我正在使用 MPC5644A 飞思卡尔 EVB 板。

我需要找到一种在 ram 中定义 const 变量的方法。所以在 LCF 文件中,我将这些变量指向了 mpc5644 的 RAM 位置。但在运行时,我按预期服用了 IVOR1。

有一个主要规则。我无法更改 const 变量的类型或名称。但我需要在 RAM 中使用这些变量,并确定区域,如“calibration_ram”

任何帮助都可以很好。

我的 C 源如下:

#pragma push /* Save the current state */
#pragma section sconst_type ".__cal_DataArea"

volatile const real32_T freq2rpm;
volatile const real32_T high_voltage;
#pragma pop

...

我的 LCF 文件:

MEMORY
{

calibration_ram :      org = 0x40040000,   len = 0x00010000

...


SECTIONS
{

    .__bam_bootarea LOAD (ADDR(resetvector)): {} > resetvector
    .__cal_DataArea LOAD (ADDR(calibration_ram)): {} > calibration_ram

...

【问题讨论】:

  • 我不太明白你的问题。您想要在 RAM 中使用const 吗?编译它。你想要它在一个特定的位置?你似乎已经完成了(或者正在你的路上。链接器描述符文件是非常特定于工具链的,所以我无法判断你是否对你正在使用的任何未命名的工具集做正确的事情)。如果你想要一些不同的东西,请说明你想要完成什么。
  • 您使用的是 Codewarrior 编译器,对吗?事实上,这个问题在基于闪存的微控制器上没有任何意义。如果你想要一个常数,把它放在闪存中。如果你想要一个非常数,但它在 RAM 中,句号。
  • 无论如何,我离链接器脚本向导还很远,但试试这个:#pragma section sconst_type ".__cal_DataArea" ".__cal_DataArea" __declspec(section ".calibration_ram") 。据我所知,LCF 文件看起来还不错。
  • 位置由链接器而不是编译器确定,因此源代码中的链接器指令不是标准语言语法的一部分,而是特定于工具链的。因此,您需要指定您在问题和标签中使用的工具链,因此必须猜测。至关重要的是,如果您使用的 #pragma 指令未被编译器识别,它们将被忽略,可能不会发出警告。
  • @Lundin:在 ARM Cortex-M3/4 Flash 等速度更快的 MCU 上,通常会添加大量等待状态。如果您同时预取指令,则更多。所以对于速度关键的代码,它可能真的会成为一个问题。

标签: c embedded microcontroller powerpc


【解决方案1】:

当我尝试使用下面的行时,它就解决了。我可以在 RAM 上定义 const 变量

#pragma explicit_zero_data on
#pragma push
#pragma section sconst_type const_type   ".__cal_DataArea" ".__cal_DataArea"
...
..

谢谢大家。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2021-12-16
    • 2019-02-07
    相关资源
    最近更新 更多