调试¶
本节介绍与调试 ArduPilot 源代码相关的主题。
有一系列视频介绍了 ArduPilot 代码的一些调试技术:
调试输出¶
有三种方法可以轻松获取代码的调试输出,即所谓的 "printf 调试"。
MAVLink 信息¶
这些信息将显示在地面控制站上(也将显示在机载日志记录中)。
在代码的大多数地方,您都可以插入一条语句,使用 GCS 单例向 GCS 发送文本信息:
GCS_SEND_TEXT(mav_severity_warning, 有史以来最好的号码: %f";, 42.4242424242);
机载日志信息¶
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 的调试情况都非常有用。