feat(vd960DBN): fault_diag — .noinit RAM 现场 + 执行轨迹 marker 定位神秘复位
现象: LUP 帧后复位, RST=0x00000000 (无标志) 且 HardFault 打印缺失
(上次 0x10000000=SFT 确认 HardFault 路径, 这次连打印都没有)
方案: .noinit 段复位不清零, 跨复位留痕
- Link.ld: 新增 .noinit 段 (startup 只清 .bss 不碰)
- fault_diag.h: FaultDiag{magic,mcause,mepc,mtval,marker,boot_cnt} + FAULT_MARKER 轨迹宏
- HardFault_Handler: 纯 RAM 写 mcause/mepc/mtval (官方 __get_MCAUSE/MEPC/MTVAL,
不依赖 UART/printf, 栈坏也能留痕) + 尽力打印
- main 开头 fault_diag_init(): 打印上次现场 + 递增 boot_cnt
- 轨迹 marker: 主循环 LOOP_TOP/UART_SRV/SIM_SPI/POLL_BLE + LUP 链
LUP_FRAME/INGEST/EVT_FEED 入口出口, 复位后看 marker 停在哪一步
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "storage.h"
|
||||
#include "offlog.h"
|
||||
#include "snapshot.h"
|
||||
#include "fault_diag.h"
|
||||
#include "ch32v20x_iwdg.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@@ -121,12 +122,14 @@ static void iot_evt_enqueue(uint8_t type, uint8_t ch, uint32_t value) {
|
||||
/* 沿检测: 每收到一帧有效 0xC0 调用一次 (两条消费路径都要喂) */
|
||||
static void iot_evt_feed(const LUP_SensorReport *sr) {
|
||||
uint8_t i;
|
||||
FAULT_MARKER(MK_EVT_FEED_IN);
|
||||
if (!_evt_prev_valid) { // 首帧: 只建快照 (上电已有车不算进入沿)
|
||||
for (i = 0; i < LUP_COIL_COUNT; i++) {
|
||||
_evt_prev_car[i] = (i < sr->coil_count) ? sr->coils[i].car_state : 0;
|
||||
_evt_prev_loop[i] = (i < sr->coil_count) ? sr->coils[i].loop_state : 0;
|
||||
}
|
||||
_evt_prev_valid = 1;
|
||||
FAULT_MARKER(MK_EVT_FEED_OUT);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < sr->coil_count && i < LUP_COIL_COUNT; i++) {
|
||||
@@ -154,6 +157,7 @@ static void iot_evt_feed(const LUP_SensorReport *sr) {
|
||||
_evt_prev_car[i] = cs->car_state;
|
||||
_evt_prev_loop[i] = cs->loop_state;
|
||||
}
|
||||
FAULT_MARKER(MK_EVT_FEED_OUT);
|
||||
}
|
||||
|
||||
/* 统一帧摄取: 事件沿检测 + 刷新 loop_data 缓存 (单一数据源)
|
||||
@@ -162,10 +166,12 @@ static void iot_evt_feed(const LUP_SensorReport *sr) {
|
||||
帧竞争的概率实测 <2% → loop_data 发布 34s 前的陈旧快照(车走后 iscar
|
||||
仍 true), 且陈旧 diff 锁死 fast_mode 300ms 刷屏。事件与快照必须同源! */
|
||||
static void iot_sensor_ingest(const LUP_SensorReport *sr) {
|
||||
FAULT_MARKER(MK_INGEST_IN);
|
||||
iot_evt_feed(sr); // 事件沿检测
|
||||
memcpy(&_cached_sr, sr, sizeof(LUP_SensorReport)); // 刷新 loop_data 快照
|
||||
_cached_sr_valid = 1;
|
||||
snap_enqueue(sr); /* 快照入队: 中断安全, 主循环 snap_flush 落盘 */
|
||||
FAULT_MARKER(MK_INGEST_OUT);
|
||||
}
|
||||
|
||||
/* lup 传感回调: uart_srv 消费路径的帧从这里喂入 (lup_process_frame 已过校验) */
|
||||
|
||||
Reference in New Issue
Block a user