TT Lab
开始
学习 学习路径 课程

冰箱坚称自己有255°C

读取失败覆盖了最后一个正常样本

在 TT Lab 中继续学习

一句话总结

驱动不是返回正常温度的函数,而是一道边界,还要规定失败时什么不能改变。

为什么需要它

传输函数失败了,缓冲区的第一个字节却变了。旧值与新值混在一起,就会得到看似合理但从未存在过的温度。只检查错误码,与不向用户公开失败结果,是两回事。应当在工作缓冲区里完成转换和验证,在成功路径的最后才更新样本。

这次实验会用真实的 C 编译器运行你的驱动,但不会给 I2C 线加电压。硬件抽象层 HAL 以一组函数指针的形式提供。ctx 指向模型的状态,transfer、now_ms、recover 使用这个状态。学员不修改模型的内部,只通过这个公开接口通信。

工作原理

地址以 0x48–0x4b 的 7 位值传递。为了附加 R/W 位而再向左移一位,在这个 HAL 约定中是错误的。移植真实的驱动库时,也要先查阅文档,确认参数是 7 位地址还是传输用的地址字节。

一次 transfer 调用同时传入对指针 0x00 的一字节写入和两字节读取。真实总线上的重复 START、最后一次读取的 NACK、STOP 由 HAL 负责。本课程的检查器验证组合调用的地址、长度、指针和期限,不测量电气波形。传感器数据手册与 HAL API 约定是两份不同的文档。

错误策略也要明确规定。SENSOR_NACK 是传输失败状态,与控制器在最后一个读取字节上发送的正常 NACK 信号不是同一个含义。SENSOR_SHORT 表示没有获得所需的全部字节。这两种状态和格式错误都不重试。只有 SENSOR_BUS 会先执行一次 recover,再重新读取一次。重试也失败,就直接结束。对所有错误都无限重试的实现,既无法纠正错误的地址,又会拖住调用方。

模型的 recover 会初始化卡住的状态。不能声称它替代了把 SCL 切换九次或给电源断电再上电的动作。真实设备的恢复必须结合总线配置和器件规格另行设计。这里把模型做成恢复必须真正改变实际状态、下一次传输才会成功,以此区分只调用函数名而无视结果的错误。

把温度与时间戳绑在一起追踪失败

假设进入函数时,公开样本是 micro_c=25000000, observed_ms=100。新的一次传输只写入第一个字节 0x1a,并返回 SENSOR_SHORT。如果把公开样本的内存用作接收缓冲区,在确认错误之前,旧值就可能被损坏。应当用函数内的两字节工作缓冲区接收,转换后的整数也放在局部变量里。失败路径只返回错误,不碰公开样本。只有在成功路径上,才会转移新的温度和完成确认时间。

调用情形 返回状态 调用后公开温度 调用后公开时间
以先前的正常值开始 不适用 25000000 100
只收到一个字节的读取 SENSOR_SHORT 25000000 100
下一次读取以 26°C 正常完成 SENSOR_OK 26000000 新的完成确认时间

只保留温度、却把时间改成当前时间的实现也是错的,因为界面上会把旧的测量显示得像最新样本。反过来,失败一次后就永远返回旧值的实现也是错的。保留只适用于失败的那次调用,下一次正常调用要同时更新两个字段。只有按实际调用顺序测试这张表,才能区分“保留”与“永久缓存”。

这里所说的一起更新,是指一次函数调用的成功与失败约定。并不意味着两个字段的赋值在其他线程看来是原子的。本模型不运行并发读取方。在真实的 RTOS 或多线程程序中,必须为读取样本的一方也制定加锁、消息传递等一致性规则。不要以为只创建了局部缓冲区,就写成数据竞争已经解决。

恢复记录要像 전송 BUS → 복구 OK → 재전송 OK(韩文,意为“传输 BUS → 恢复 OK → 重传 OK”)这样,按顺序记下各个状态。如果只写最后的结果是 SENSOR_OK,就无法区分没有恢复而碰巧通过的实现。如果是 전송 BUS → 복구 NACK(韩文,意为“传输 BUS → 恢复 NACK”),则应当返回恢复错误并结束,此后不应再有传输调用。在 전송 BUS → 복구 OK → 재전송 BUS(韩文,意为“传输 BUS → 恢复 OK → 重传 BUS”)中,也不会启动第二次恢复。能说清每个箭头为什么被允许或禁止,才算实现了有限重试策略。

在现场相遇的样子

在 2026-09-10 确认的 Orion Sleep 官方嵌入式工程师招聘公告中,同时出现了 C/C++、硬件接口、受限资源下的调试和测试体系。本课程练习其中的驱动约定与复现测试。不能把一份海外资深岗位的公告推广为国内整体的招聘需求,也不能仅凭本课程替代 RTOS、板卡 bring-up 的经验。公告当前是否仍在接受申请,也需要另行确认。

在实际作品集中,请同时留下正常案例和故障注入案例。部分读取之前保存的温度和时间,在出错之后是否保持一致,恢复次数是否确实只有一次,这些才是可观察的依据。如果没有这些证据,只写“稳定的驱动”,就无从知道到底确认了什么。

接下来要确认什么

紧接着的测验会确认地址、错误、恢复之间的差异,之后阅读时间预算理论。在最后一个模块的累积实验中,先在第 4–6 步接通正常传输,再加入样本保留和有限恢复。起初只处理正常路径,所以每个中间版本都还不是产品级驱动。请在保留之前实现的同时,加入当前步骤的约定。