【问题标题】:What is the most general approach to place a structure into the flash (microcontrollers)将结构放入闪存(微控制器)的最通用方法是什么
【发布时间】:2016-09-16 04:59:52
【问题描述】:

我正在开发一个使用 GCC for ARM V-4.8.3 工具链的嵌入式 C 项目。 我有一组在整个程序的生命周期中只读的查找结构。由于我的 RAM 用完了(并且有很多未使用的 Flash),因此最好将它们推入 Flash,这不会影响程序的功能。问题是如何。

一种方法是使用 GCC 提供的variable __attribute__ ((section ("TEXT")))。在这种情况下,我的代码依赖于编译器。例如,如果我想通过 Microchip 编译器使用我的代码,我需要编辑代码以移植到新环境。

我想到的另一种方法是使用链接器脚本。该结构仅在代码中声明。

在我看来,第二种方法更便携。虽然仍然需要调整链接描述文件,但对我来说它更好。是否有更通用的方法可以使代码更易于移植到将变量放入闪存的上下文中?

将它们限定为常量,意味着它们将被放入rodata 部分。不在他们“所属”的文本部分。

【问题讨论】:

  • 链接器脚本也是不可移植的,并且会根据所使用的链接器而改变。

标签: c linker embedded


【解决方案1】:

如果它们最终在闪存中 在哪里 无关紧要,只需将结构声明为 static const 就足够了,并且 100% 可移植。

__attribute__ 和其他非标准的东西只有在你需要在特定地址分配东西时才需要。

【讨论】:

  • const 就足够了,不需要static
  • @berendi 不,因为局部作用域变量可以声明为const 并在运行时初始化,在这种情况下它们最终会在 RAM 中。 const 静态存储持续时间变量将始终以闪存结束。
  • 是的,我发现那些限定为const 的标识符被放入.rodata 部分,该部分本身位于.text.text 部分位于 MCU 的闪存区域中。所以你@Lundin 一定是对的。我不知道rodatatext 之内。我只是不明白为什么部分标识符用前面的点(.)写成这样.text.bss.data等。
  • @Hairi .rodata.text 是不同的部分。 .rodata 包含常量,.text 包含代码。默认情况下它们如何在您的特定系统上链接是另一回事。但是,您的常量是否以.rodata.text 结尾通常并不重要,无论哪种情况,它都是非易失性闪存。
  • 我认为在这种情况下链接描述文件很重要。如果配置是这样的:.rodata :{ bla bla bla} > Flash 那么.rodata 应该在名为 flash 的内存区域内。 Flash 是脚本MEMORY 布局中的字段之一,flash 代表 MCU 内存的非易失性部分。
【解决方案2】:

您必须查看您的特定编译器/链接器以确定如何将其放入闪存中。
有时const 会起作用,有时它仍会将其放入 RAM。
static const 是可移植的,但不能保证将其放入闪存中。

那是因为 Ansi-C 对闪存或 RAM 一无所知。

甚至有一些系统,您必须使用编译指示将其放入闪存中。

#pragma define_section myFlash_table ".calibTable.text" RW
#pragma section myFlash_table begin
...
#pragma section myFlash_table end

可移植版本应该使用 const,但您必须记住它不是防弹的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多