将结构放入闪存(微控制器)的最通用方法是什么
What is the most general approach to place a structure into the flash (microcontrollers)
我正在使用 GCC for ARM V-4.8.3 工具链开发一个嵌入式 C 项目。
我有一个查找结构数组,在整个程序的生命周期中都是只读的。由于我 运行 内存不足(并且有大量未使用的闪存),最好将它们推入闪存,这不会影响程序的功能。问题是如何。
一种方法是使用 GCC 提供的 variable __attribute__ ((section ("TEXT")))
。在这种情况下,我的代码依赖于编译器。例如,如果我想通过 Microchip 编译器使用我的代码,我需要编辑代码以移植到新环境。
我想到的另一种方法是使用链接描述文件。该结构仅在代码中声明。
在我看来,第二种方法更便于携带。虽然仍然需要调整链接描述文件,但对我来说更好。是否有更通用的方法可以使代码更易于移植到将变量放入闪存的上下文中?
将它们限定为常量,意味着它们将被放入 rodata
部分。不进入他们 "belong".
的文本部分
如果 在闪存中的位置并不重要,只需将结构声明为 static const
就足够了,并且 100% 可移植。
__attribute__
和其他非标准的东西只有当你需要在特定地址分配东西时才需要。
您必须查看具体的 compiler/linker 以确定如何将其放入 flash。
有时 const
会起作用,有时它仍会将其放入 RAM。
static const
可移植,但不能保证放入flash。
那是因为 Ansi-C 对闪存或 RAM 一无所知。
甚至有些系统,你必须使用pragmas才能放入flash。
#pragma define_section myFlash_table ".calibTable.text" RW
#pragma section myFlash_table begin
...
#pragma section myFlash_table end
便携式版本应该使用 const,但您必须记住它不是防弹的。
我正在使用 GCC for ARM V-4.8.3 工具链开发一个嵌入式 C 项目。 我有一个查找结构数组,在整个程序的生命周期中都是只读的。由于我 运行 内存不足(并且有大量未使用的闪存),最好将它们推入闪存,这不会影响程序的功能。问题是如何。
一种方法是使用 GCC 提供的 variable __attribute__ ((section ("TEXT")))
。在这种情况下,我的代码依赖于编译器。例如,如果我想通过 Microchip 编译器使用我的代码,我需要编辑代码以移植到新环境。
我想到的另一种方法是使用链接描述文件。该结构仅在代码中声明。
在我看来,第二种方法更便于携带。虽然仍然需要调整链接描述文件,但对我来说更好。是否有更通用的方法可以使代码更易于移植到将变量放入闪存的上下文中?
将它们限定为常量,意味着它们将被放入 rodata
部分。不进入他们 "belong".
如果 在闪存中的位置并不重要,只需将结构声明为 static const
就足够了,并且 100% 可移植。
__attribute__
和其他非标准的东西只有当你需要在特定地址分配东西时才需要。
您必须查看具体的 compiler/linker 以确定如何将其放入 flash。
有时 const
会起作用,有时它仍会将其放入 RAM。
static const
可移植,但不能保证放入flash。
那是因为 Ansi-C 对闪存或 RAM 一无所知。
甚至有些系统,你必须使用pragmas才能放入flash。
#pragma define_section myFlash_table ".calibTable.text" RW
#pragma section myFlash_table begin
...
#pragma section myFlash_table end
便携式版本应该使用 const,但您必须记住它不是防弹的。