OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5667|回复: 15

请教各位高手,怎样将多个不同类型的数据存到flash上,是一个一个的存,还是将数据存到数组再存

[复制链接]

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
发表于 2017-7-10 08:13:47 | 显示全部楼层 |阅读模式
5金钱
         比如现在我有u8,u16,u32的数据若干个,现在想把他们存到存到flash上,应该怎么存?
     我想到的办法是:
                     1:一个一个的存,但是这样需要给每个变量赋一个地址,读取的时候也得返回来查看每个变量存储的地                            址 ,感觉这样比较麻烦 ,数据多了就分配不过来了;
                     2:定义一个数组,将所有变量的数据存到数组,然后再一次性写入flash,那么这个数组该定义成什么样                           的数据类型来适应u8,u16, u32的数据;


                    3:将这些数据定义成结构体,然后一次性存入flash,但是
                              void STMFLASH_Write(u32 WriteAddr,u16  *pBuffer,u16 NumToWrite);        
                              void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead);  
                              这两个函数是否可以写入读出结构体,尤其结构体里有不同的数据类型会不会数据丢失;


                                             求大神帮忙解答一下,谢谢啦



                              

最佳答案

查看完整内容[请看2#楼]

放到结构体上,读取/写入是将结构体强制转换为函数buff形参的类型,如:定义一个机构体 struct_obj,STMFLASH_Read(0,(u16)&struct_obj,sizeof(struct_obj)/2)。但是一般情况下我们自己编写输入的buff形参是u8/char型(8位),方便单个字节操作。 另外:注意结构体内存对齐规则,不要浪费部分内存和存储空间了,强制转换为1字节对齐!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-7-10 08:13:48 | 显示全部楼层
全然向你 发表于 2017-7-10 09:22
放到结构体的话,u8和u32的数据需要怎么处理啊,求教

放到结构体上,读取/写入是将结构体强制转换为函数buff形参的类型,如:定义一个机构体 struct_obj,STMFLASH_Read(0,(u16)&struct_obj,sizeof(struct_obj)/2)。但是一般情况下我们自己编写输入的buff形参是u8/char型(8位),方便单个字节操作。 另外:注意结构体内存对齐规则,不要浪费部分内存和存储空间了,强制转换为1字节对齐!
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11994
金钱
11994
注册时间
2015-11-5
在线时间
2094 小时
发表于 2017-7-10 08:19:21 | 显示全部楼层
放到结构体再存
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
发表于 2017-7-10 08:23:57 | 显示全部楼层
存入flash每次存的是一个半字(16位),u8 u32都要转换一下
回复

使用道具 举报

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
 楼主| 发表于 2017-7-10 09:22:45 | 显示全部楼层

放到结构体的话,u8和u32的数据需要怎么处理啊,求教
回复

使用道具 举报

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
 楼主| 发表于 2017-7-10 12:38:43 | 显示全部楼层
Acuity 发表于 2017-7-10 09:40
放到结构体上,读取/写入是将结构体强制转换为函数buff形参的类型,如:定义一个机构体 struct_obj,STMF ...

谢谢你的回答,非常详细,现在还有两个问题,
1如果将buffer结构体强制转换成u16类型会不会数据丢失?
2  如果buffer转换成u16类型,那么是不是应该两个子节对齐
3如果不对齐的话,除了空间丢失会不会跑飞什么的?😂😂
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-7-10 14:40:23 | 显示全部楼层
全然向你 发表于 2017-7-10 12:38
谢谢你的回答,非常详细,现在还有两个问题,
1如果将buffer结构体强制转换成u16类型会不会数据丢失?
...

1、不会丢失;
2、结构体保证单个字节对齐就可以了;
3、这个要自己测试下就知道了。
另外:一般自己的函数形参buff是u8/char(1字节),将结构体强制转换为char读写是不会有问题的,从内存存储空间上分析肯定是可行的。
           如ee_24clxx_readbytes(0,(char*)struct_obj,sizeof(struct_obj));
              ee_24clxx_writebytes(0,(char*)struct_obj,sizeof(struct_obj));
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-7-10 14:50:31 | 显示全部楼层
Acuity 发表于 2017-7-10 14:40
1、不会丢失;
2、结构体保证单个字节对齐就可以了;
3、这个要自己测试下就知道了。

正确结构体取址应该这样,5楼的强制转换应该为(u16*)&struct_obj;参考这个:struct_obj为结构体变量:
ee_24clxx_readbytes(0,(char*)&struct_obj,sizeof(struct_obj));
ee_24clxx_writebytes(0,(char*)&struct_obj,sizeof(struct_obj));
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-10 15:05:12 | 显示全部楼层
Acuity 发表于 2017-7-10 14:40
1、不会丢失;
2、结构体保证单个字节对齐就可以了;
3、这个要自己测试下就知道了。

如果函数改成 void STMFLASH_Write(u32 WriteAddr,u8  *pBuffer,u16 NumToWrite); 可以单字节对齐,如果函数形式是 void STMFLASH_Write(u32 WriteAddr,u16  *pBuffer,u16 NumToWrite); 结构体内应该保证双字节对齐吧?
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-7-10 18:16:17 | 显示全部楼层
Owen 发表于 2017-7-10 15:05
如果函数改成 void STMFLASH_Write(u32 WriteAddr,u8  *pBuffer,u16 NumToWrite); 可以单字节对齐,如果 ...

都可以,保持单字节对齐可以节省空间。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-7-10 18:16:55 | 显示全部楼层
Owen 发表于 2017-7-10 15:05
如果函数改成 void STMFLASH_Write(u32 WriteAddr,u8  *pBuffer,u16 NumToWrite); 可以单字节对齐,如果 ...

建议先去理解和掌握结构体内存对齐原则。
回复

使用道具 举报

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
 楼主| 发表于 2017-7-10 19:10:02 | 显示全部楼层
谢谢啦,回答的很详细!!!以后多多向你请教!!😊
回复

使用道具 举报

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
 楼主| 发表于 2017-7-10 19:11:45 | 显示全部楼层
Acuity 发表于 2017-7-10 08:13
放到结构体上,读取/写入是将结构体强制转换为函数buff形参的类型,如:定义一个机构体 struct_obj,STMF ...

谢谢了,回答详细,以后多多向你请教
回复

使用道具 举报

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
 楼主| 发表于 2017-7-10 19:12:45 | 显示全部楼层
rindy 发表于 2017-7-10 08:23
存入flash每次存的是一个半字(16位),u8 u32都要转换一下

谢谢回答,
回复

使用道具 举报

15

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2016-2-24
在线时间
155 小时
 楼主| 发表于 2017-7-10 19:13:13 | 显示全部楼层
rindy 发表于 2017-7-10 08:23
存入flash每次存的是一个半字(16位),u8 u32都要转换一下

谢谢,回答
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-10 19:38:34 | 显示全部楼层
Acuity 发表于 2017-7-10 18:16
都可以,保持单字节对齐可以节省空间。

如果结构体单字节对齐,占奇数的字节,比如3Byte,用u16读不就超出界限了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-18 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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