调试

本节介绍与调试 ArduPilot 源代码相关的主题。

有一系列视频介绍了 ArduPilot 代码的一些调试技术:

调试输出

有三种方法可以轻松获取代码的调试输出,即所谓的 "printf 调试"。

机载日志信息

AP_Logger 单例可用于将信息写入板载日志:

美联社::记录仪().写入信息F(u-blox %d HW: %s SW: %s";,
                                   .实例+1,
                                   版本.hwVersion,
                                   版本.swVersion);

使用 Log_Write 可以创建更复杂的信息(包含不同类型的多个字段):

美联社::记录仪().("CTRL";, "TimeUS,RMSRollP,RMSRollD,RMSPitchP,RMSPitchD,RMSYaw";, "Qfffff";,
                                       AP_HAL::微64(),
                                       (双人)safe_sqrt(控制监视器.rms_roll_P),
                                       (双人)safe_sqrt(控制监视器.rms_roll_D),
                                       (双人)safe_sqrt(控制监视器.rms_pitch_P),
                                       (双人)safe_sqrt(控制监视器.rms_pitch_D),
                                       (双人)safe_sqrt(控制监视器.rms_yaw));

该方法的定义参见 AP_Logger.h。一般来说,它是一个 4 个字符的名称,后面是一个以逗号分隔的列名列表,后面是每个列的格式规范列表,后面是数据。类似的定义允许添加乘数和单位信息。

printf(...) 和朋友们

大家最喜欢的调试工具。

该命令的可用性和输出位置取决于运行的硬件。

在 SITL 中,您可以在运行 ArduPilot 二进制程序的 xterm 窗口中看到 stderr 和 stdout 输出,或者在 Windows 系统中,在创建的日志文件中看到这些输出。

在 Linux 系统中,该输出将显示在 ArduPilot 的控制 TTY 上,因此无论您在哪个终端启动 ArduPilot,都将显示在该终端上。

ChibiOS 上没有 stderr 和 stdout 文件句柄,因此无法使用 fprintf。不过,printf(...) 的输出会发送到指定的串行设备(参见 hwdef.dat 中的 "STDOUT_SERIAL")或控制台(第一个定义的 SERIAL 设备)。

hal.console->printf(...);

该输出将显示在控制台上。对于基于 ChibiOS 的电路板,这是第一个定义的 SERIAL 设备。

捕捉内存超限

在为 SITL 构建代码之前,您可以使用 "waf configure "命令中的--enable-malloc-guard 选项对构建进行配置,在代码中的内存区域周围设置保护区域,以捕捉超限。

GPIO Assert 调试

可以使用 GPIO 引脚从 ChibiOS 输出调试断言(即使用 -enable-asserts 构建时出现的调试错误)。为此,您需要将 hwdef.dat 中的 "FAULT "设置为您要使用的 GPIO 引脚,然后将逻辑分析仪连接到该引脚。您还需要对逻辑分析仪进行配置,以解释串行数据流并打印可读信息,但大多数现代逻辑分析仪都能自动完成这项工作。

您还可以使用 fault_printf(),利用该引脚定义输出一般调试信息。其工作方式与 printf() 完全相同,但输出到 GPIO 引脚。这两种方法对于无法使用通用 IO 的调试情况都非常有用。