 zhou yang和Claude Opus 5.5
|
1f6862ac38
|
固件 0.1.1-c5:硬重启后自动开机、MQTT 发布死锁、欠压放宽到 −250 mV
- 硬重启等到 PG 后长按电源键 5 s(新状态 hr-boot):电池端上电的小米8
停在关机态,原来的 power_cycle 等于关机。ACT_KEY_MS_ON 2000 → 5000
(实测 2 s 松手即掉电)。NO_PG 时不按。
- 修死锁:执行器持 s_mtx 等 esp-mqtt 的 api_lock,esp-mqtt 任务持 api_lock
分发 DISCONNECTED 时等 s_mtx。热点一断 USB/WiFi 全失联、按键可能松不开。
执行器现在只往 s_outbox 拷贝,由 t_link 交给 esp-mqtt。
- SR-5 欠压一侧 −100 → −250 mV(T_SAFETY_UNDER_MV),过压仍 +100 mV:
带屏开机峰值 2.1 A 时实测 −115 mV 被误关。需求 SR-5 / SW-2 / SW-5 / 验收表同步。
板 B 上板:power_cycle → hr-boot → 手机开机,最低 3778 mV / 2.12 A 不再跳闸。
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
2026-09-28 01:13:58 +08:00 |
|
 zhou yang和Claude Opus 5.5
|
b8ad69681f
|
固件:R2 迁移 R-0 ~ R-6(底板 + 5 片同构刀片)
2026-09-16 完成、当时未提交,这里补提交(原样,不含 09-27 上板的修改)。
- 器件层 / 拓扑层整体从 R1 换到 R2:TCA9548A 分通道、五路同址 INA226 0x40 + 输入侧 0x43、
刀片 PCA9555(VBUS_EN 挪到 P0.4)、CH224A 只读驱动、风扇闭环 t_thermal
- 新增 i2cbus(mux 原子事务)、slot(刀片 I/O 门面)、host/qtest.sh
- 74HC595 链退役(代码与测试保留)
- 判据阈值与时间常量未动;19 个 ctest 全绿,idf.py build 通过
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
2026-09-27 10:26:24 +08:00 |
|
 zhou yang和Claude Opus 5
|
273c53347e
|
A10:安全巡检的判据(SR-5 / SW-8)
判据全在 t_safety_step() 里、**放锁之后**、直接写引脚(§10.3 原话:不经任何
队列或抽象层):
SR-5 |实测 − 该路设定值| > 100 mV **连着两圈** → 先断 VBUS 再关 eFuse
SW-8 I < −50 mA,或 VBUS 期间电压被顶高 > +100 mV → **一圈就断 VBUS**
七条实现约定(详见需求文档 §10.2):
· 「持续 20 ms」数的是圈,不是墙钟毫秒;
· 反灌不设确认窗口,与过压那 20 ms 的不对称是有意的 —— 误断 VBUS 只丢一次
USB 数据,漏判会把能量泵回 12V 母线连累另外四台(设计文档 §15.2);
· 判据只在「该路该有电 + 这一圈的值新鲜 + 过了 60 ms 缓启动窗口」时武装
(对应 §10.10 的「盲跑 → 保持供电,禁用该路判据」);
· 比的是该路 DAC 设定值的影子,不是 3900 这个常数(SW-4 要单路微调);
· SR-5 关路关干净(不留「只靠 USB 供着电」的窗口),SW-8 只断 VBUS 不碰 eFuse;
· 断电之前先 t_actuator_abort(),断 VBUS 时只打断 EDL(只有它写 VBUS_EN);
· 动作在前、记录在后,事件走回调出去,A11 在那儿接环形缓冲。
判据一条 I²C 事务都不发(设定值、两根 EN、正在跑的序列全部走影子),
§10.3 那 7.8 % 的预算不变。顺带新增两处影子:rail_efuse_is_on()/rail_vbus_is_on()
与 rail_setpoint_mv(),都**只在写成功时更新**,两个方向都倒向安全的那一侧。
29 个用例;25 条注错逐个跑过,24 条变红。第一版把「持续 20 ms」按墙钟算,
测试一半红一半绿 —— 巡检的采样时刻带亚毫秒残差(一圈占 1.56 ms 总线,
而睡到下一拍按整毫秒算),相邻两次判据的时刻是 21/19 ms 交替,19 ms 那一半
要拖到第三圈 = 40 ms,超验收且间歇性。改成数圈之后一次不飘,
并留了一条跑 20 轮、两种相位都踩得到的回归拦网。
Co-Authored-By: Claude Opus 5 <[email protected]>
|
2026-09-07 08:41:53 +08:00 |
|
 zhou yang和Claude Opus 5
|
ec31891429
|
A8:任务骨架与调度(5 个任务、两把锁)
需求 §10.3 落地。四件事:
1. 五任务表(tasks.c):周期与优先级写在一张 const 表里,开机自检查的是
相对顺序(safety 唯一最高、log 唯一最低、thermal 与 actuator 同级),
外加「巡检周期必须长于 INA226 一帧转换 8.8 ms」。不过就 abort。
2. 节拍器(sched.c):记下一次该醒的绝对时刻,回绕安全(int32_t 差判先后)。
过载时跳过错过的整周期、保住相位,不补跑。
3. 两把锁(hal_lock):I²C 与 74HC595,禁止嵌套持有 —— 这块板上两者没有交集,
「拿着 A 去拿 B」永远是写错了。ESP 侧用 mutex 取优先级继承。
4. t_safety 的一个周期:拿锁 → 6 片 INA226 的 V+I + PCA9555 两端口 → 放锁。
不死等锁(5 ms 超时就跳过这圈),一片读失败不中断整圈、保留上一圈的值。
I²C 占用由 HAL 按线上真实字节数记账(两个目标同一份代码),静态预算与实测
必须相等:一次寄存器读 48 位,一圈 13 次事务 = 1560 µs / 20 ms = 7.8 %,
与 §10.3 手算的「约 1.5 ms / 约 8 %」相符(本节的 46 位没数 STOP 和重复 START)。
sim 侧配套两样:假 I²C 事务真的把虚拟时钟花掉(否则时序测试是空话),
以及可强制的加锁纪律检查(配一条反向测试,防止检查本身失灵)。
11 条 ctest(161 例)全绿,idf.py build 通过;16 个注错实验全部变红。
Co-Authored-By: Claude Opus 5 <[email protected]>
|
2026-09-07 07:35:39 +08:00 |
|