我正在用STM32构建一个系统,该系统使用需要校准的设备(数据可以存储在一个32位寄存器中)。由于我仍在构建和更新代码,因此我理想情况下希望该区域保持在同一个位置,这样每次我构建和启动时就不必重新校准。显然,鉴于其校准数据,MCU 不会初始化该区域中的值。
现在我刚刚在闪存区域内选择了一个遥远的地址,并希望编译器不会覆盖它。它工作得很好,但感觉有一种正确的方法可以从编译器端阻塞内存。
非常直接的过程。首先,在链接器(.ld)文件中建立一个内存区域:
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 24K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K
CALIBRATION (rx) : ORIGIN = 0x0801FFE0, LENGTH = 8 /* new 8 byte section */
}
然后在各部分的几行下面,我添加了:
.calibration (NOLOAD) :
{
. = ALIGN(4);
KEEP(*(.calibration))
. = ALIGN(4);
} >CALIBRATION
关键部分是NOLOAD,它确保里面的值在启动时不被初始化。
然后在主文件中,只需要添加读写的指针和地址即可:
volatile uint32_t *calibration_value = (uint32_t *)0x0801FFE0; // create pointer at address
InitialCalib = *calibration_value; // use deferenced pointer to access data