【发布时间】: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