事件从 evlog_put*() 进一个 256 条的 RAM 环(临界区里两条指令,**不阻塞、 不碰 flash**),由最低优先级的 t_log 攒够 16 条或最老那条等满 1 s 时批量写进 新的 `evlog` 分区(17 扇区 × 4 KB = **4335 条**)。A10 的事件出口原样接上, 判据那一层一个字没动。 八条实现约定(详见需求文档 §10.7): · 落盘不用 NVS 也不用 SPIFFS,是一块裸 data 分区 —— NVS 的页式 GC 会把 「写一条事件」变成一次不可预测的搬移。HAL 因此多出第六样 hal_store; · 17 个扇区不是 16:每扇区要拿一个 16 B 的槽当扇区头,4 KB 只装 255 条, 16 扇区 = 4080,差 16 条不到 §10.7 要求的 4096; · 序号 = flash 里的位置(epoch × 255 + 槽号),不是自增计数器 —— 重启接着数 不用存计数器;代价是没落盘的事件还没有序号,A12 读之前要先 flush; · 入队走关中断的临界区,**不是第三把锁**:入队方是最高优先级的 t_safety, 停在一把 t_log 持着的锁上等于让最低优先级的任务决定巡检节拍; · 丢事件可以,悄悄丢不行 —— 缓冲满了盖最旧的,但补一条 LOG_EV_LOST 记着丢了几条; · 每条记录带 CRC-8(见下),写失败就放弃该扇区剩余部分,被放弃的那段在序号 空间里是个洞,读回时给一条空记录占位(跳过的话上位机游标会卡住); · 每次上电记一条 LOG_EV_BOOT:时间戳上电从 0 计,没有它两次上电的记录会穿插。 事件类型的数字是 flash 格式的一部分,只许往末尾加;safety_ev_t → log_ev_t 是显式 switch 不是加偏移。§10.7 里还没人产生的六类号已占住(A12/A15/A16 去填)。 27 个用例;23 条注错逐个跑过,21 条变红。第一版校验和用异或,漏掉的正是最常见 的那条:payload 全 0 的记录被掉电切在第 8 个字节上时,后 8 个字节留在 0xFF, 而 8 个 0xFF 的异或恰好是 0 —— 半条的校验和与整条一模一样,扫描把半条当成 一条真事件。换成 CRC-8 之后拦住。另外两个只在这里才踩得到的坑:「掉电重启」 不能用 sim_hal_reset()(那是换新板子,flash 一起擦,测试永远绿),为此加了 sim_hal_reboot();「读到洞就跳过」这个错被测试里 static 数组的零初始化掩盖过 一次,缓冲要先填成非零。 Co-Authored-By: Claude Opus 5 <[email protected]>
1.2 KiB
1.2 KiB
| 1 | # PhoneRail 的分区表。默认的 partitions_singleapp.csv 里没有给事件日志留地方, | |||||
|---|---|---|---|---|---|---|
| 2 | # 而 §10.7 要求「记录路径不依赖上位机在线」—— 那就得有一块自己的 flash。 | |||||
| 3 | # | |||||
| 4 | # evlog:**裸的 data 分区**,不是 nvs、也不是 spiffs(理由见 hal_store_esp.c 开头)。 | |||||
| 5 | # 大小 0x11000 = 17 个扇区。为什么是 17 而不是 §10.7 里写的「4096 条 ≈ 64 KB」: | |||||
| 6 | # 每个扇区要拿一个 16 B 的槽当扇区头(epoch),于是一扇区只装得下 255 条, | |||||
| 7 | # 16 扇区 = 4080 条,**差 16 条不够 4096**。17 扇区 = 4335 条, | |||||
| 8 | # `test_capacity_meets_the_requirement()` 卡的就是这个 ≥4096。 | |||||
| 9 | # 8 MB flash 上多这 4 KB 没有任何代价。 | |||||
| 10 | # | |||||
| 11 | # ⚠️ 改了这里要跟着改 `sim_hal.h` 的 SIM_STORE_SECTORS —— 两边不一致时 | |||||
| 12 | # 宿主机测试仍然全绿,板子上却是另一个容量。测试里有一条断言把它们钉在一起。 | |||||
| 13 | # | |||||
| 14 | # Name | Type | SubType | Offset | Size | Flags |
| 15 | nvs | data | nvs | 0x9000 | 0x6000 | |
| 16 | phy_init | data | phy | 0xf000 | 0x1000 | |
| 17 | factory | app | factory | 0x10000 | 0x100000 | |
| 18 | evlog | data | undefined | 0x110000 | 0x11000 |