独立看门狗和碰撞转储¶
在 ArduPilot 4.0 及更高版本的固件中,(飞行)控制器 cpu 的内部独立看门狗已启用。可以通过设置 BRD_OPTIONS = 0。如果外设或代码完成预定软件线程的时间过长或 "挂起 "cpu,cpu 将被重置,并重新启动 cpu。如果飞行器处于飞行或运动状态,这可能会也可能不会挽救飞行器。
警告
如果出现 "硬故障"(非法指令、越界内存访问等),而不是延迟及时完成线程,在复位之前,代码会尝试在闪存中写入名为 crash_dump.bin 的文件,捕获 CPU 状态和寄存器,以便日后进行分析(更多详情,请参阅下文)。硬故障 "极为严重,应向 ArduPilot 报告。在原因解决之前,飞行器可能无法安全飞行。
确定发生了看门狗复位¶
一种方法是查看数据闪存日志。如果对日志进行过滤,只显示 "MSG "信息,就会发现其中一些包含 "看门狗 "字样。这清楚地表明,前一个日志或飞行以看门狗重置结束。
WDOG 日志信息也应出现,其中包含以下列,这对开发人员调查看门狗原因可能有用
任务:调度任务编号或
如果主循环刚刚接收到下一个 IMU 样本,则为 -1
-2 如果快速循环已启动
-3 如果主循环正在等待下一个 IMU 采样
IErr:内部错误掩码
IErrCnt : 内部错误计数
MavMsg : 最后处理的 MAVLink 信息 ID
MavCmd : MAVLink COMMAND_LONG 或 COMMAND_LONG_INT 报文的命令字段,来自最后处理的报文
SemLine:如果程序正在等待信号,则为源代码行号;如果没有等待,则为 0
FL:故障行,发生故障的源代码行号。注意这并不指定文件名,但仍然有用
FT:故障类型(见 AP_HAL_ChibiOS/system.cpp 中的 FaultType 枚举)
1 = 重置
2 = 不可屏蔽中断(又称 NMI)
3 = 硬故障(最常见)
4 = 内存管理故障
5 = 总线故障
6 = 使用故障
FA:故障地址(内存中)。例如,在尝试使用空地址读取字节时,该地址为 0。
FP : 线程优先级(请参阅 APM_MONITOR_PRIORITY 中以 APM_MONITOR_PRIORITY 开头的优先级列表)。 AP_HAL_ChibiOS/Scheduler.h)
ICSR:中断控制和状态寄存器(参见 ST 数据表中的 "ICSR 位分配)
撞击卸载¶
当发生 "硬故障 "时,将尝试向"@SYS "闪存区写入一个名为 "crash_dump.bin "的文件,其中包含所需的系统状态信息,以便日后进行诊断。可以使用 Misssion Planner 或其他 GCS 下载该文件,并通过以下方式转发给 ArduPilot 论坛 或 纪和声 职位:
除 crash_dump.bin 文件外,还应在文件后包含前面的数据闪存日志或导致崩溃转储的固件的 git 哈希值。