gpt4 book ai didi

c++ - 将结构写入闪存

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:32 25 4
gpt4 key购买 nike

我在使用微 Controller (nrf58122 SoC 内的 cortex-M0)将结构写入闪存时遇到问题。我对 c/c++ 了解不够,无法确定这是内存管理问题还是对编程缺乏基本了解。

我有一个带有结构成员的类:

struct settings_t
{
uint16_t n;
uint8_t b;
bool e;
} settings;

在我的一个类方法中,我需要将这个结构的内容写入微 Controller 中的闪存(没有可用的 EEPROM)。为了做到这一点,我调用了预先编写的函数——我知道我需要在写入之前删除页面。如果我尝试以下操作:

settings = {
constants::n,
constants::b,
constants::e
};

其中值 n、b、e 的类型正确,我遵循此定义:

flashPageErase(PAGE_FROM_ADDRESS(constants::settingsPageAddr));
flashWriteBlock(s, &settings, sizeof(settings));

当 flashWriteBlock 函数执行时,我收到一个运行时错误(程序执行暂停,没有错误代码)。但是,如果我先复制结构:

settings_t cpy = settings;
flashPageErase(PAGE_FROM_ADDRESS(constants::settingsPageAddr));
flashWriteBlock(s, &cpy, sizeof(settings));

然后它就起作用了。任何人都可以对此有所了解吗?我可以根据需要提供更多详细信息。

最佳答案

文档可能没有这么说,但是实现表明源和目标都必须是 32 位对齐的:

int flashWriteBlock( void *dst, const void *src, int cb )
{
uint32_t *d = dst;
const uint32_t *s = src;

/* The rest of the function snipped*/
}

失败是由于 settings 变量是 16 位对齐的。它必须被强制为 32 位对齐。这是如何完成的取决于编译器。以下示例适用于 gcc:

struct settings_t
{
uint16_t n;
uint8_t b;
bool e;
} __attribute__ ((aligned (4))) settings;

关于c++ - 将结构写入闪存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27739409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com