我面临以下问题。我正在对 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,这没有什么区别。
据我了解,我的代码在指定的代码段中放置了一个未初始化的变量。如何将初始化的变量放在给定的地址处?