定义常量变量在闪存中的位置

Define Location of constant variable in flash

我有一个嵌入式应用程序,它也有一个引导加载程序,我的目标是能够在应用程序中获取引导加载程序的版本和其他信息,所有信息都是不变的,因此我想到将它们放在引导加载程序代码部分的开头,因此应用程序可以轻松读取始终位于同一地址的数据。

到目前为止我已经定义了类似

的东西
const char bootloader_info[4] = {0x01,0x02,0x03,0x04};

并在链接描述文件中定义

__bootloader_info = 0xD000  /*Where exactly should this line be placed?*/

但是变量结束放在数据部分...

我现在所做的是在链接描述文件中定义一个新部分并将其放在初始化代码之前,虽然它可以工作但我认为这不是正确的方法

const char __attribute__((section (".versioninfo"))) bootloader_info[4] = {0x01,0x02,0x03,0x04};

.

versioninfo (rx) : ORIGIN = 0xD000, LENGTH = 0x0000
rom (rx)         : ORIGIN = 0xD000, LENGTH = 0x27B0
-------
.text :
{
  . = ALIGN(2);
  KEEP(*(.versioninfo)) /*info gets added at the beginning of .text*/
  KEEP(*(.init .init.*))
  KEEP...

使用 gcc 工具链实现此目的的正确方法应该是什么?为什么第一种方法不起作用?

编辑

我没有定义一个部分,实际上我不知道那是什么。要定义一个部分,它是这样的:

.versioninfo   :
{
  KEEP(*(.versioninfo))
}  > versioninfo

现在如果数据大于section它会报错,所以我想它比以前好多了,我仍然想听听另一个方法或者为什么第一种方法不起作用,谢谢

您必须按如下方式定义您的部分:

_versioninfo_start_address = 0x0000D000;

.versioninfo _versioninfo_start_address :
{
  KEEP(*(.versioninfo)) ;
} > // place here the region where to this section has to be stored

然后你可以定义你的变量:

const char __attribute__((section (".versioninfo"))) bootloader_info[4] = {0x01,0x02,0x03,0x04}