我面临以下问题。我正在对 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,这没有什么区别。
据我了解,我的代码在指定的代码段中放置了一个未初始化的变量。如何将已初始化的变量放在给定地址?
您错过了强制编译器保留此变量的“used”属性。
顺便说一句,在一些帖子中我看到,如果没有使用该部分的代码(在您的情况下,某些代码使用 test 变量),仅仅避免链接丢弃该部分是不够的。
我个人用GCC for ARM 10.3.1版本测试过,没有必要。
因此,在您的示例中,它将定义如下:
uint16_t __attribute__((section(".wifi_defaults")), used) test= 0x00D0;