C语言-将float数据存到flash中

项目场景:

在灵动MCU平台基于逐飞科技开源的RTT库,将一个float类型的数据变量保存到flash中;

问题描述:

写和读flash数据的函数接口变量类型是uint32类型,如何将float的变量存储进去再取出来还是float类型?


解决方案:

1、定义一个共用体(union)

union{               //不再定义新的变量的话共用体的名字可以省略
	uint32 u32;
	float floa;
} K,B;

K.floa = 0.831;     // 这句话要放在函数里   K.floa就是一个float类型的变量
B.floa = 0.344;     // 这句话要放在函数里   B.floa就是一个float类型的变量
//K.uint32就是一个uint32类型的变量

是利用共用体共享同一个内存,通过共用体的不同类型的名字来联系到数据。不过使用起来可能不太方便,移植也不太方便。

2、利用指针+强制转换

float K = 0.831,B = 0.344;
uint32 flash_data[4] = {1,9600,0,0};
//基础知识:&-取地址   *-取数据
flash_data[2] = *(uint32*)&K;//把K的地址取出来强制转化为uint32的指针地址,然后再取uint32指针里的数据
flash_data[3] = *(uint32*)&B;
flash_page_program(FLASH_SECTION_31,FLASH_PAGE_3,flash_data,4); //写入flash的数据
flash_page_read(FLASH_SECTION_31,FLASH_PAGE_3,flash_data,4); //读取保存在flash的数据
K = *(float*)&flash_data[2];//同上;
B = *(float*)&flash_data[2];

来骗,来偷袭编译器。将变量的地址取出来,强制转化为其他类型的指针然后再指向数据。
其原理是指针变量所占的字节是一定的,而声明不同类型的作用是规定指针在内存中每次移动的字节数。通过声明指针类型来告诉指针每次多移动多少个字节来确定变量的值。更多详情请学习参考文章[1]。

总结:

这是我今天遇到的问题,自己敲了一遍。
记之。

串口传输问题

将float类型的数据通过串口传输,可以用上述的方案1也可用也可用上述的方案2。
使用方案2,要注意ARM内存对齐的问题;参考文章:https://blog.csdn.net/l_w_zeng/article/details/72879160
使用方案1,要注意共用体外部声明的问题:
定义共用体,外部声明在 .h文件

//.h文件
union data{          //定义共用体类型
	uint8 u32[4];
	float floa;
};
extern union data a;//外部声明
//.c文件
union data a;//定义共用体变量

注:关于内存的问题:
float类型所占4字节,包括符号位(1位,第31位),指数位(8位,-126-128,22-30位),尾数位(23位,0-22位);

float a;
/取地址取的是首地址,例:a在内存里的的位置为0x20000018-0x20000022;则指针指向的是0x20000018这个地址;
//小端存储式:大多在X86中
uart1_RX_buffer[3] = *((uint8*)(&a));
uart1_RX_buffer[2] = *((uint8*)(&a)+1);
uart1_RX_buffer[1] = *((uint8*)(&a)+2);
uart1_RX_buffer[0] = *((uint8*)(&a)+3);
uart_putbuff(UART_1,uart1_RX_buffer,4);
//大端存储式:
uart_putbuff(UART_1,(uint8*)(&a),4);

在这里插入图片描述

参考文章:
https://blog.csdn.net/ssdsafsdsd/article/details/8093911

https://blog.csdn.net/weixin_33790053/article/details/85977491?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control
[1].https://www.cnblogs.com/al-fajr/p/11615404.html

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值