
在带本地存储的以太网温湿度记录仪中,Flash 或 SD 卡容量总是有限的。工程上常见一个被忽视的问题:
当存储区写满后,设备是停止记录、报错停机,还是静默覆盖?覆盖逻辑是否会导致关键数据丢失?
如果策略设计不当,会带来两类严重问题:
因此,环形队列(Ring Buffer)覆盖策略是固件设计的核心逻辑之一。
在固件中,物理 Flash/SD 卡通常被抽象为一个线性地址空间,再逻辑上映射为环形队列:
物理存储(Flash/SD)
|---- 扇区 0 ----|---- 扇区 1 ----| ... |---- 扇区 N-1 ----|
逻辑环形队列:
Head → [数据块0][数据块1] ... [数据块N-1] → Tail为便于覆盖和校验,每条记录通常采用固定长度二进制结构:
[时间戳 4B][温度 2B][湿度 2B][状态码 1B][序列号 2B][CRC 2B] = 13B逻辑:
优点:
缺点:
适用场景:金融、医疗等强合规场景,且有明确的数据导出流程。
逻辑:
优点:
缺点:
适用场景:已基本被工业级设计淘汰,仅见于早期低成本方案。
逻辑:
优点:
缺点:
适用场景:工业监控、机房动环、边缘节点等绝大多数场景。
成熟的以太网温湿度记录仪固件,不会“裸奔”式覆盖,而是叠加多层保护机制。
0xAA55) Flash 写入过程中若掉电,可能导致数据损坏。工业固件通常采用:
为避免刚发生的告警数据被立即覆盖,固件通常实现时间窗口保护:
固件维护两个阈值:
阈值 | 触发条件 | 典型动作 |
|---|---|---|
低水位(70%) | 已用空间 ≥70% | 平台产生“存储将满”预警 |
高水位(90%) | 已用空间 ≥90% | 平台产生“存储即将覆盖”告警 |
100% | 队列满,开始覆盖 | 平台产生“数据覆盖”事件,标记覆盖起始时间 |
价值:运维人员可在数据被覆盖前介入(导出、备份)。
每条记录包含 2 字节序列号(0–65535,溢出回绕):
仅靠设备本地逻辑不够,平台侧需具备覆盖感知能力:
寄存器地址 | 名称 | 说明 |
|---|---|---|
40010 | 存储总容量(条) | 如 100000 |
40011 | 已存储条数 | 0–100000 |
40012 | Head 时间戳 | 最旧数据时间 |
40013 | Tail 时间戳 | 最新数据时间 |
40014 | 覆盖标志 | 0=未覆盖,1=已发生覆盖 |
40015 | 最后覆盖时间 | 最近一次覆盖发生的时间 |
40016 | 序列号当前值 | 用于检测跳变 |
设备补传历史数据时,在协议头中增加标志位:
[数据标志:1B]
bit0: 0=实时数据, 1=历史补传
bit1: 0=正常, 1=来自覆盖区平台据此区分数据来源,避免将补传数据误判为实时异常。
在采购以太网温湿度记录仪时,建议通过以下方式验证固件覆盖策略:
// 环形队列初始化
void ringbuf_init() {
head = 0;
tail = 0;
for (int i = 0; i < N; i++) {
block[i].sentinel = SENTINEL_FREE;
}
}
// 写入一条记录
int ringbuf_write(record_t *rec) {
// 1. 检查 tail 指向块是否可覆盖
if (block[tail].sentinel == SENTINEL_INUSE) {
// 队列满,触发覆盖
head = (head + 1) % N; // Head 前移
set_overwrite_flag(); // 置位覆盖标志
log_event("Overwrite at %d", tail);
}
// 2. 写入数据(原子操作)
block[tail].sentinel = SENTINEL_WRITING;
memcpy(&block[tail].data, rec, sizeof(record_t));
block[tail].crc = calc_crc(rec);
block[tail].sentinel = SENTINEL_INUSE;
// 3. 更新 tail
tail = (tail + 1) % N;
// 4. 更新水位状态
update_water_mark();
return SUCCESS;
}
// 启动时自检
void ringbuf_self_check() {
for (int i = 0; i < N; i++) {
if (block[i].sentinel == SENTINEL_WRITING) {
// 发现未完成的写入,标记为损坏
block[i].sentinel = SENTINEL_CORRUPT;
}
}
}一句话选型原则:
无人值守选环形覆盖,强合规场景选停止写入;无论哪种策略,必须“水位告警 + 覆盖标记 + 平台联动”三件套齐全。
本文基于工业级以太网温湿度记录仪固件逆向分析与工程实测整理,适用于带本地存储的物联网终端、环境监测设备的固件逻辑评估与选型参考。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。