独立看门狗和碰撞转储

在 ArduPilot 4.0 及更高版本的固件中,(飞行)控制器 cpu 的内部独立看门狗已启用。可以通过设置 BRD_OPTIONS = 0。如果外设或代码完成预定软件线程的时间过长或 "挂起 "cpu,cpu 将被重置,并重新启动 cpu。如果飞行器处于飞行或运动状态,这可能会也可能不会挽救飞行器。

警告

如果出现 "硬故障"(非法指令、越界内存访问等),而不是延迟及时完成线程,在复位之前,代码会尝试在闪存中写入名为 crash_dump.bin 的文件,捕获 CPU 状态和寄存器,以便日后进行分析(更多详情,请参阅下文)。硬故障 "极为严重,应向 ArduPilot 报告。在原因解决之前,飞行器可能无法安全飞行。

确定发生了看门狗复位

一种方法是查看数据闪存日志。如果对日志进行过滤,只显示 "MSG "信息,就会发现其中一些包含 "看门狗 "字样。这清楚地表明,前一个日志或飞行以看门狗重置结束。

../_images/watchdog.png

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 论坛纪和声 职位:

./_images/crash_dump.png

除 crash_dump.bin 文件外,还应在文件后包含前面的数据闪存日志或导致崩溃转储的固件的 git 哈希值。

../_images/git-hash.png