硬汉嵌入式论坛

 找回密码
 立即注册
查看: 234|回复: 7
收起左侧

[有问必答] 我用nrf52832的内部flash存储一些参数,学习硬汉将整个结构体写入

[复制链接]

101

主题

301

回帖

604

积分

金牌会员

123

积分
604
发表于 6 天前 | 显示全部楼层 |阅读模式
我用nrf52832的内部flash存储一些参数,学习硬汉将整个结构体写入内部flash,并读取,但是每次都写入错误,但是我直接写u8数组是没问题的,直接写入结构体不行!


[C] 纯文本查看 复制代码
ret_code_t err_code;
       
    
    
	
       uint32_t* raw_bytes = (uint32_t*)&g_tParam; 
        
       (void) nrf5_flash_end_addr_get();
//	err_code = nrf_fstorage_write(&fstorage_data, 0x40000, &g_tParam, sizeof(g_tParam), NULL);
	
        err_code = nrf_fstorage_write(&fstorage_data, 0x40000, raw_bytes, 64, NULL);

回复

使用道具 举报

0

主题

28

回帖

28

积分

新手上路

积分
28
发表于 5 天前 | 显示全部楼层
为啥直接写 64 而不是使用 sizeof 获取大小呢?是不是由于对其问题导致实际大小不是 64 呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 5 天前 | 显示全部楼层
是类似这个帖子的方式吗

不行的话,就将结构体数据读取出来赋值给数组试试

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法
https://www.armbbs.cn/forum.php? ... 9659&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
发表于 5 天前 | 显示全部楼层
eric2013 发表于 2025-6-4 08:44
是类似这个帖子的方式吗

不行的话,就将结构体数据读取出来赋值给数组试试

我之前实习的时候遇到过这种问题,当时自己的判断是字节对齐的问题,不过加上字节对齐之后还是会有问题,最后就是通过数组实现的,工作之后反而没遇到过这个问题了
回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
发表于 5 天前 | 显示全部楼层
本帖最后由 LinY 于 2025-6-4 10:20 编辑

加上__attribute__ ((__packed__)) 就不用考虑对齐的问题,统一用Config_TypeDef的data去读和赋值,写入用bytes。
如果要考虑大小端,比如modbus寄存器这样的,就再麻烦点

习惯了这么写
[C] 纯文本查看 复制代码

#define CONFIG_SIZE  256
typedef struct __attribute__ ((__packed__)) {
  // 结构体内容
  // ...
  
  //预留
  uint8_t Reserve[128];
} Config_Data_TypeDef;

typedef union {
  Config_Data_TypeDef data;
  uint8_t bytes[sizeof(Config_Data_TypeDef)];
} Config_TypeDef;



回复

使用道具 举报

101

主题

301

回帖

604

积分

金牌会员

123

积分
604
 楼主| 发表于 前天 17:02 | 显示全部楼层
Zhyolo 发表于 2025-6-4 08:43
为啥直接写 64 而不是使用 sizeof 获取大小呢?是不是由于对其问题导致实际大小不是 64 呢?

nrf52832的err_code = nrf_fstorage_write(&fstorage_data, 0x40000, raw_bytes, 64, NULL);这个函数有些特殊,最后调试我把写入值改为48才写入成功,不知道为什么?
回复

使用道具 举报

101

主题

301

回帖

604

积分

金牌会员

123

积分
604
 楼主| 发表于 前天 17:02 | 显示全部楼层
小梁呐 发表于 2025-6-4 09:43
我之前实习的时候遇到过这种问题,当时自己的判断是字节对齐的问题,不过加上字节对齐之后还是会有问题, ...

nrf52832的err_code = nrf_fstorage_write(&fstorage_data, 0x40000, raw_bytes, 64, NULL);这个函数有些特殊,最后调试我把写入值改为48才写入成功,不知道为什么?
回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
发表于 9 小时前 | 显示全部楼层
ssssssss 发表于 2025-6-7 17:02
nrf52832的err_code = nrf_fstorage_write(&fstorage_data, 0x40000, raw_bytes, 64, NULL);这个函数有些 ...

你这样使用强制转换,如果结构体的大小不是4字节的整数倍是有可能出问题的,一般来说使用你注释掉的代码比较合适,直接取结构体的地址,如果出现问题可以考虑对齐规则的问题,考虑使用pack或aligin来对结构体强制对齐或者规定对齐规则后再进行测试,还是有问题的话那就是最朴实的方法了,结构体的参数用数组写进去
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 21:33 , Processed in 0.257738 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表