Arm GCC 链接器:如何将数据放在(rw)非易失性存储器中的绝对地址

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

我面临以下问题。我正在对 ARM cortex M4 微控制器进行编程,我希望它具有 IP 地址、网络掩码、网关等的默认值。该默认值应该可以通过串行通信进行更改,并且更改应该是持久的。 例如:IP 地址和网络掩码的默认值为: 192.168.1.20 255.255.255.0 用户将地址和网络掩码更改为 192.168.2.10 255.255.255.0 现在,断开设备电源并重新连接电源后,“默认”值应为用户输入的 (192.168.2.10/255.255.255.0)

为了解决这个问题,我考虑使用我的uC的所谓工作闪存。这是一个非易失性存储器,可以使用特殊命令写入。 我想要实现的是在程序代码中定义默认值(作为当前的变量,或者如果可能的话稍后定义),这些默认值由链接器拾取,并且其值被放入非易失性存储器(工作闪存) )位于地址 0x200C000。

现在我的链接器文件如下所示:

MEMORY
{
    rom  (rx)  : ORIGIN = 0x00000000, LENGTH = 0x100000 /* 1MB */
    ram  (rwx) : ORIGIN = 0x1FFF0000, LENGTH = 0x10000 /* 64K  */
    ram1 (rwx) : ORIGIN = 0x20038000, LENGTH = 0x10000  /* 64K  */
    wofl (rwx) : ORIGIN = 0x200C0000, LENGTH = 0x8000   /* 32K  */
}

...

.wifi_defaults :
{
    KEEP(*(.wifi_defaults*));
} > wofl

...

以及源代码中的变量声明(仅用于测试):

uint16_t __attribute__((section(".wifi_defaults"))) test= 0x00D0;

.map 文件向我展示:

.wifi_defaults  0x200c0000        0x2
 *(.wifi_defaults*)
 .wifi_defaults
                0x200c0000        0x2 ..\obj\HSFirmware.o
                0x200c0000                test

但是当访问变量时,我没有得到正确的值,只是在开始搞乱链接器之前就返回了初始的 0xFFFF。

我还尝试在变量声明前面使用 CONST,这没有什么区别。

据我了解,我的代码在指定的代码段中放置了一个未初始化的变量。如何将已初始化的变量放在给定地址?

c gcc arm ld flash-memory
1个回答
0
投票

您错过了强制编译器保留此变量的“used”属性。

顺便说一句,在一些帖子中我看到,如果没有使用该部分的代码(在您的情况下,某些代码使用 test 变量),仅仅避免链接丢弃该部分是不够的。

我个人用GCC for ARM 10.3.1版本测试过,没有必要。

因此,在您的示例中,它将定义如下:

uint16_t __attribute__((section(".wifi_defaults")), used) test= 0x00D0;
© www.soinside.com 2019 - 2024. All rights reserved.