【问题标题】:Define Location of constant variable in flash定义常量变量在闪存中的位置
【发布时间】:2015-09-08 07:16:23
【问题描述】:

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

到目前为止,我已经定义了类似的东西

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

现在如果数据大于部分,它会抱怨,所以我想它比以前更好,我仍然想听听另一种方法或为什么第一种方法不起作用,谢谢

【问题讨论】:

  • 观察几点: 1. 版本信息数据真的应该可执行吗?我建议您删除 x 标志。 2.长度真的应该吗?
  • constant 是什么?
  • 你说得对,我应该明确删除 x 标志。尊重长度,现在它调整到常量变量的长度,我想定义一些不同于0的长度但是当常量变量大于长度时,我没有收到警告并且数据结束被放置在那里无论如何移动初始化代码,所以我发现定义长度没有用
  • 我的意思是const 我会改正的,谢谢

标签: c gcc embedded ld


【解决方案1】:

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

_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}

【讨论】:

  • 效果很好,(对我来说)避免写两次 rom 起始地址:_versioninfo_start_address = ORIGIN(rom)
  • 好的,然后检查是否已回答以关闭问题。
  • @LuisF 因为您将versioninfo 定义为0 长度并与rom 部分重叠。
猜你喜欢
  • 2010-12-07
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多