当前位置: 首页 > article >正文

别再只存字节了!用C语言共用体(Union)在EEPROM里优雅存储浮点数和结构体(STM32实战)

嵌入式数据存储进阶用共用体实现EEPROM中的浮点数与结构体存储在嵌入式开发中数据存储是每个工程师都无法回避的挑战。当我们需要将设备校准参数、运行日志或用户配置等非字节型数据保存到EEPROM时传统的逐字节读写方法往往显得笨拙且容易出错。本文将带你探索一种更优雅的解决方案——利用C语言共用体(Union)实现任意数据类型的安全转换与存储。1. 为什么需要共用体嵌入式系统中EEPROM如常见的AT24C02是最常用的非易失性存储器之一。它通过I2C接口与主控芯片通信但有一个重要限制EEPROM只能按字节进行读写。这就带来了一个根本性问题——如何存储浮点数、整型、结构体等复杂数据类型传统方法需要手动拆分数据为字节序列float temperature 25.5; uint8_t bytes[4]; memcpy(bytes, temperature, sizeof(float)); // 写入EEPROM for(int i0; i4; i) { eeprom_write(addri, bytes[i]); HAL_Delay(10); }这种方法虽然可行但存在几个明显缺陷代码冗余每种数据类型都需要单独编写转换逻辑可读性差业务逻辑被底层字节操作淹没维护困难修改数据结构时需要同步更新所有相关代码共用体(Union)提供了一种更优雅的解决方案。它允许不同的数据类型共享同一块内存空间从根本上简化了数据类型转换的过程。2. 共用体的工作原理与定义共用体是C语言中一种特殊的数据结构其语法与结构体(struct)相似但所有成员共享同一内存空间。这意味着对任一成员的修改都会影响其他成员的值。定义通用存储共用体的典型方式typedef union { float f; int32_t i; uint8_t bytes[4]; } DataConverter;这个共用体只有4字节大小假设float和int32_t都是4字节但可以通过不同成员访问同一内存区域f成员用于直接存储浮点数i成员用于存储32位整型bytes数组用于按字节访问内存布局示意字节偏移0123float fint32_t ibytes[4]01233. 工程实践构建通用EEPROM存储模块基于共用体我们可以构建一个通用的EEPROM存储模块支持各种数据类型的读写。下面以STM32 HAL库为例展示完整实现。3.1 基础数据类型读写首先定义通用转换共用体typedef union { uint8_t u8; int8_t i8; uint16_t u16; int16_t i16; uint32_t u32; int32_t i32; float f32; uint8_t bytes[4]; } EEPROM_Data;然后实现通用写入函数void EEPROM_Write(uint16_t addr, void *data, uint8_t size) { EEPROM_Data converter; memcpy(converter.bytes, data, size); for(uint8_t i0; isize; i) { HAL_I2C_Mem_Write(hi2c1, EEPROM_ADDR, addri, I2C_MEMADD_SIZE_8BIT, converter.bytes[i], 1, 100); HAL_Delay(5); // AT24C02需要5ms写入周期 } }对应的读取函数void EEPROM_Read(uint16_t addr, void *data, uint8_t size) { EEPROM_Data converter; for(uint8_t i0; isize; i) { HAL_I2C_Mem_Read(hi2c1, EEPROM_ADDR, addri, I2C_MEMADD_SIZE_8BIT, converter.bytes[i], 1, 100); } memcpy(data, converter.bytes, size); }3.2 结构体存储方案对于复杂结构体共用体同样适用。假设我们需要存储设备配置typedef struct { float calib_factor; uint16_t serial_num; uint8_t device_type; char name[16]; } DeviceConfig; typedef union { DeviceConfig config; uint8_t bytes[sizeof(DeviceConfig)]; } ConfigConverter;存储和读取整个结构体// 写入配置 DeviceConfig my_config {...}; ConfigConverter converter; converter.config my_config; EEPROM_Write(CONFIG_ADDR, converter.bytes, sizeof(DeviceConfig)); // 读取配置 EEPROM_Read(CONFIG_ADDR, converter.bytes, sizeof(DeviceConfig)); DeviceConfig loaded_config converter.config;3.3 数据校验与版本控制在实际工程中还需要考虑数据完整性和版本兼容性。常用的方法是添加校验和或CRCtypedef struct { uint32_t crc; uint8_t version; DeviceConfig config; } ConfigWithMeta; uint32_t calculate_crc(void *data, size_t len) { // 实现CRC32计算 }4. 高级技巧与性能优化4.1 分页写入策略EEPROM通常有页写入限制AT24C02为8字节/页。跨页写入需要特殊处理void EEPROM_PageWrite(uint16_t addr, uint8_t *data, uint8_t len) { uint8_t remaining len; uint8_t *ptr data; while(remaining 0) { uint8_t page_offset addr % EEPROM_PAGE_SIZE; uint8_t write_len MIN(EEPROM_PAGE_SIZE - page_offset, remaining); HAL_I2C_Mem_Write(hi2c1, EEPROM_ADDR, addr, I2C_MEMADD_SIZE_8BIT, ptr, write_len, 100); HAL_Delay(5); ptr write_len; addr write_len; remaining - write_len; } }4.2 内存布局管理对于大型项目建议定义清晰的EEPROM内存映射typedef enum { EEPROM_CONFIG 0x00, // 配置区 EEPROM_CALIB 0x40, // 校准数据 EEPROM_LOGS 0x80, // 日志区 // ... } EEPROM_Areas;4.3 性能优化技巧批量读取尽可能使用多字节读取减少I2C通信开销缓存机制对频繁访问的数据在RAM中缓存延迟写入非关键数据可以累积后批量写入5. 实际应用案例温度记录系统假设我们需要实现一个温度记录系统每10分钟记录一次温度保存最近24小时数据144条记录。数据结构定义typedef struct { float temperature; uint32_t timestamp; } TempRecord; typedef union { TempRecord record; uint8_t bytes[sizeof(TempRecord)]; } RecordConverter;环形缓冲区实现#define MAX_RECORDS 144 void save_temp_record(uint16_t index, TempRecord *record) { RecordConverter converter; converter.record *record; uint16_t addr EEPROM_LOGS index * sizeof(TempRecord); EEPROM_Write(addr, converter.bytes, sizeof(TempRecord)); } void load_temp_record(uint16_t index, TempRecord *record) { RecordConverter converter; uint16_t addr EEPROM_LOGS index * sizeof(TempRecord); EEPROM_Read(addr, converter.bytes, sizeof(TempRecord)); *record converter.record; }共用体技术不仅简化了代码还提高了可维护性。当需要新增存储字段时只需修改结构体定义无需改动底层存储逻辑。

相关文章:

别再只存字节了!用C语言共用体(Union)在EEPROM里优雅存储浮点数和结构体(STM32实战)

嵌入式数据存储进阶:用共用体实现EEPROM中的浮点数与结构体存储 在嵌入式开发中,数据存储是每个工程师都无法回避的挑战。当我们需要将设备校准参数、运行日志或用户配置等非字节型数据保存到EEPROM时,传统的逐字节读写方法往往显得笨拙且容易…...

Mi-Create:零基础打造小米手表个性表盘的终极可视化神器

Mi-Create:零基础打造小米手表个性表盘的终极可视化神器 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 你是否厌倦了小米手表上那些千篇一律的官方…...

如何免费使用AI图像放大神器Upscayl?一文掌握所有技巧

如何免费使用AI图像放大神器Upscayl?一文掌握所有技巧 【免费下载链接】upscayl 🆙 Upscayl - #1 Free and Open Source AI Image Upscaler for Linux, MacOS and Windows. 项目地址: https://gitcode.com/GitHub_Trending/up/upscayl 想要将模糊…...

一文读懂现代城市照明:从亮化到数字化的行业升级指南

当前照明行业早已脱离单纯"亮起来"的初级阶段,正在向场景化、数字化、低碳化方向快速迭代,很多客户在选择照明服务商时往往对行业标准、技术趋势了解不足,导致项目效果与预期存在差距。行业升级的核心方向:从单一照明到…...

10分钟掌握Dism++:Windows系统优化终极完整指南

10分钟掌握Dism:Windows系统优化终极完整指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 还在为Windows系统越来越慢而烦恼吗?磁盘空…...

2026年便利店成交金额究竟要达到多少,才能摆脱亏损困境?

在便利店行业竞争日益激烈的当下,众多便利店品牌都在为实现盈利而努力。美喜福作为便利店行业的一员,在这一背景下有着独特的发展路径和潜力。那么,2026年便利店成交金额究竟要达到多少才能摆脱亏损困境呢?让我们结合美喜福的实际…...

终极指南:3步让苹果触控板在Windows上获得原生级体验

终极指南:3步让苹果触控板在Windows上获得原生级体验 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad …...

零碳园区绿电直供技术的挑战与解决方案

一、难点问题 二次系统+储能推高初投 篇幅有限仅展示了部分 根据650号文 ,绿电直连项目必须配置继电保护、安全稳定控制装置和通信设备等二次系统 ,以确保项目的安全性和稳定性。这些强制性配置显著增加了项目的初始投资成本。 专线造价与全周…...

3步掌握SacreBLEU:让机器翻译评估变得简单可靠

3步掌握SacreBLEU:让机器翻译评估变得简单可靠 【免费下载链接】sacrebleu Reference BLEU implementation that auto-downloads test sets and reports a version string to facilitate cross-lab comparisons 项目地址: https://gitcode.com/gh_mirrors/sa/sacr…...

模型量化对 Agent 推理速度与质量的影响

模型量化对 Agent 推理速度与质量的影响 引言 在人工智能领域快速发展的今天,大型语言模型(LLM)和基于这些模型构建的智能体(Agent)系统正变得越来越普及。然而,这些模型的规模和复杂性也带来了显著的计算挑战。模型量化作为一种优化技术,通过…...

2026 酒店无人直播服务商推荐:警惕一次性收费陷阱,用心服务才是核心

"一次购买,无任何后续费用!"—— 这样的宣传语让不少酒店经营者心动不已,以为找到了低成本获客的捷径。然而,现实往往事与愿违:软件使用不到1个月,算力耗尽无法开播;直播间频繁卡顿、…...

三分钟带你读懂C++中的排序方式

在 C 中&#xff0c;有多种方式可以用于排序&#xff0c;每种方法都有其适用场景。以下是几种常见的排序方式&#xff1a;1. 使用标准库中的 sort 函数C STL&#xff08;标准模板库&#xff09;提供了 <algorithm> 头文件中的 sort 函数&#xff0c;这是最常用的排序方法…...

GEO建站系统选型避坑指南:如何识别真正有效的服务商

AI搜索渗透率的持续攀升&#xff0c;正在改变企业官网的战略地位。过去&#xff0c;官网是展示门面&#xff1b;现在&#xff0c;官网内容是否能被DeepSeek、豆包、通义千问等大模型理解和引用&#xff0c;直接影响企业在潜在客户第一次提问时能否出现在答案里。这种变化催生了…...

法律检索效率暴跌83%?Perplexity法律文献搜索的3大隐藏功能,律所内部培训刚流出

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;法律检索效率暴跌83%&#xff1f;Perplexity法律文献搜索的3大隐藏功能&#xff0c;律所内部培训刚流出 当某红圈所合伙人发现团队平均单案法律检索耗时从2.1小时飙升至11.4小时&#xff0c;真相竟是——传统关…...

华尔街量化团队内部文档流出(Perplexity财经数据查询SOP v2.3):含12类高频Query模板+错误码速查表

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity财经数据查询概述 Perplexity 是一款基于大语言模型的智能搜索与知识发现工具&#xff0c;其在财经领域展现出独特优势&#xff1a;它能实时整合权威信源&#xff08;如 SEC、Bloomberg、Reuters、…...

万物智联城市:TurMass™ Mesh 打造稳定可靠的物联底座

随着数字中国建设深入推进&#xff0c;智慧城市已从概念落地为城市治理与民生服务的现实场景。从市政设施智能运维、公共安全全域感知&#xff0c;到环境监测精准布控、便民服务高效触达&#xff0c;城市运行的每一环都离不开稳定、高效、低成本的物联网连接支撑。然而&#xf…...

开发小记-开发中的小随笔

1. josn字符串转换 JSON.stringify(data) 直接这样转&#xff0c;会是一整行的字符串。 JSON.stringify(data, null, 2); 这样转就会转成格式化的换行的标准json字符串&#xff0c;方便展示diff 2. 毫秒时间戳转换 需要将字符串‘2025-04-01’转换为整型时间戳&#xff0c;…...

NoFences:如何用免费开源方案革命性管理你的Windows桌面分区

NoFences&#xff1a;如何用免费开源方案革命性管理你的Windows桌面分区 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了在杂乱无章的Windows桌面上寻找文件&…...

【Perplexity医生信息搜索实战指南】:3大隐藏技巧让临床决策效率提升70%

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity医生信息搜索实战指南概述 Perplexity 是一款基于大语言模型的智能搜索工具&#xff0c;其核心优势在于支持自然语言提问、实时联网检索与引用溯源。在医疗健康领域&#xff0c;尤其面向医生资质核查…...

【2026最新版Linux安装Mysql】CentOS 7 安装 MySQL 8.4.9 完整流程(RPM 手动安装+避坑+面试)

前言&#xff1a;本文记录在 CentOS 7 / RHEL 7 上&#xff0c;通过官网 RPM Bundle tar 包手动安装 MySQL 8.4.9&#xff08;LTS&#xff09; 的完整可复现流程。适合需要在老版本 CentOS 上部署 MySQL、为 Python/AI 后端或 Java 项目准备数据库环境的读者。读完可按步骤完成…...

Perplexity财经数据查询失效的4个致命信号,第3个95%用户仍在踩坑——附权威校验脚本(Python版)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity财经数据查询失效的4个致命信号&#xff0c;第3个95%用户仍在踩坑——附权威校验脚本&#xff08;Python版&#xff09; 信号一&#xff1a;HTTP状态码非200但响应体含“success”: true Perplexit…...

PNetLab-vs-EVE-NG安全性分析

1 PNetLab vs EVE-NG社区版&#xff1a;从一次CVE看"免费fork"的安全代价 1.1 痛点引入 2025年11月&#xff0c;CVE-2025-63749被公开披露——PNetLab 5.3.11存在命令注入漏洞&#xff0c;攻击者通过qemu_options参数注入$(/bin/bash -c reverse_shell)&#xff0c;…...

毕业设计 深度学习多目标跟踪 实时检测

文章目录 0 前言2 目标跟踪效果3 目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 今天学长向大家分享一个毕业设计项目 为了大家能够顺利以及最少的精力通过毕设&…...

TP-LINK AX300 网卡驱动

TP-LINK AX300无线网卡的驱动一直不更新&#xff0c;只好自己动手 适配&#xff1a;TL-XDN6000H 免驱版 操作系统&#xff1a;Ubuntu 24.04.4 LTS 内核版本&#xff1a;6.17.0-29-generic #29~24.04.1-Ubuntu https://download.csdn.net/download/zzzhy/92882718...

6 个 AI Agent Skill 实战推荐:每天省出 2 小时的自动化方案

引言Agent 能帮我们做的事越来越多 -- 写文案、做封面、盯数据、找选题。但很多人装上 Agent 之后发现&#xff0c;它除了聊天和写几段文案&#xff0c;好像什么也干不了。问题不在 Agent。就像刚买回来的手机&#xff0c;没装 App 之前就是块砖。Agent 出厂自带的能力有限&…...

避开CASA模型NPP估算的那些坑:我的IDL代码调试与参数优化心得

避开CASA模型NPP估算的那些坑&#xff1a;我的IDL代码调试与参数优化心得 第一次用CASA模型估算NPP时&#xff0c;我对着屏幕上的异常结果发呆了半小时——明明按照教程一步步操作&#xff0c;为什么输出的NPP值会出现大面积负值&#xff1f;后来才发现&#xff0c;温度胁迫因子…...

RAG夺命10连问,你能抗住第几问?

前言最近金三银四&#xff0c;很多小伙伴在准备大厂面试&#xff0c;几乎每个人都被问到了同一个技术点——RAG&#xff08;检索增强生成&#xff09;。从阿里到字节&#xff0c;从腾讯到美团&#xff0c;RAG已经成为大模型应用方向必考的“压轴题”。但是&#xff0c;很多求职…...

高并发下是先写数据库,还是先写缓存?

前言 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 我很负责的告诉你&#xff0c;该问题无论在面试&#xff0c;还是工作中遇到的概率…...

G101EVT05.1友达液晶屏10.1寸LCD工业电阻触摸液晶屏幕

G101EVT05.1 G101EVT05.1是友达AUO的一款10.1英寸工业触摸液晶屏模组。公开资料显示&#xff0c;这款屏采用1280800分辨率、16:10比例、400cd/m典型亮度、LVDS接口、WLED背光、投射式电容触摸屏PCAP&#xff0c;整体更偏向工业平板、HMI、人机界面、医疗终端、嵌入式控制设备&a…...

开启AI端侧能源新纪元 豪鹏科技亮相CIBF 2026

导读&#xff1a;豪鹏科技锚定“AI端侧电池固态电池”双轮驱动核心路径&#xff0c;完成从传统电池制造商到AI端侧能源引领者的跨越式转型&#xff0c;以硬核技术与前瞻布局&#xff0c;领航端侧能源产业迈向高质量发展新征程。以下为文章正文&#xff1a;图片来源于电池百人会…...