如何使ARM GCC链接器将版本号放在内存段末尾的固定地址上?

问题描述 投票:0回答:1

我正在为基于Cortex-M4的系统开发固件更新代码,我的固件需要一种方法来获取单独链接的引导加载程序的版本号,以便我确定是否必须对其进行更新。我继承的makefile当前将构建日期/时间放在代码的末尾,但是如果添加或删除代码,它就会移动。

我试图通过定义一个名为.version的新内存段并修改加载程序脚本以将其放置在现有段调用.binfo之前的快闪存储器末尾附近,并包括一个包含版本号和头文件的头文件来完成此操作。将其放在main.c中该部分的属性。我开始时使用的加载程序脚本如下所示(多余的部分被“ ...”代替)。

MEMORY
{
  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 16K
  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 192K

...

    . = ALIGN(4);
    _end = . ;

    _binfo_start = 16K - 4 * 4;
    .binfo _binfo_start : {
      KEEP(*(.binfo)) ;
    } > rom
}

我将其更改为:

MEMORY
  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 16K
  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 192K

...

    . = ALIGN(4);
    _end = . ;

    _version_start = 16K - 4 * 4 - 2;    /* new, intended to reserve 2 bytes for .version before .binfo */
    .version _version_start : {
      KEEP(*(._version)) ;
    } > rom                              /* end new */

    _binfo_start = 16K - 4 * 4;
    .binfo _binfo_start : {
      KEEP(*(.binfo)) ;
    } > rom
}

我理解.binfo之后的“> rom”来限制.binfo完全位于rom内,所以我在main.c中省略了bootloaderVersion.h,看起来像这样:

#ifndef BLVERSION_H
#define BLVERSION_H

#define BLVERSIONMAJOR 0x00
#define BLVERSIONMINOR 0x01
#define BLVERSION (BLVERSIONMAJOR << 8 | BLVERSIONMINOR)

 __attribute__((section(".version"))) __attribute__((__used__)) const uint16_t blVersion = BLVERSION;

#endif

它生成了,但是在0x3FF0(binfo所在的位置)之前,.bin文件中没有任何内容。当我用Segger Ozone查看装载机时,我看到其中包含bootloaderVersion.h,但未占用内存。

我在做什么错?

顺便说一下,binfo的填写如下:

__attribute__((section(".binfo"))) __attribute__((__used__)) const UF2_BInfo binfo = {
#if USE_MSC_HANDOVER
    .handoverMSC = handover,
#endif
#if USE_HID_HANDOVER
    .handoverHID = hidHandoverLoop,
#endif
    .info_uf2 = infoUf2File,
};
gcc linker bootloader
1个回答
0
投票

发现问题;这是一个复制/粘贴错误;

© www.soinside.com 2019 - 2024. All rights reserved.