IDF Monitor¶
IDF Monitor 工具是在 IDF 中调用 “make monitor” 目标时运行的 Python 程序。
它主要是一个串行终端程序,用于收发该端口的串行数据,IDF Monitor 同时兼具 IDF 的其他特性。
IDF Monitor 操作快捷键¶
Ctrl-]
退出 monitor;Ctrl-T Ctrl-H
展示帮助页面和其他快捷键;除了
Ctrl-]
和Ctrl-T
,其他快捷键信号会通过串口发送到目标设备。
自动解码地址¶
当 esp-idf 以 “0x4 _______” 形式打印一个十六进制的代码地址时,IDF Monitor 将使用 addr2line 来查找源代码的位置和函数名称。
当某个 esp-idf 应用程序发生 crash 和 panic 事件之后,将产生如下的寄存器转储和回溯:
Guru Meditation Error of type StoreProhibited occurred on core 0. Exception was unhandled.
Register dump:
PC : 0x400f360d PS : 0x00060330 A0 : 0x800dbf56 A1 : 0x3ffb7e00
A2 : 0x3ffb136c A3 : 0x00000005 A4 : 0x00000000 A5 : 0x00000000
A6 : 0x00000000 A7 : 0x00000080 A8 : 0x00000000 A9 : 0x3ffb7dd0
A10 : 0x00000003 A11 : 0x00060f23 A12 : 0x00060f20 A13 : 0x3ffba6d0
A14 : 0x00000047 A15 : 0x0000000f SAR : 0x00000019 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0x00000000
Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90
IDF Monitor 为转储补充如下信息:
Guru Meditation Error of type StoreProhibited occurred on core 0. Exception was unhandled.
Register dump:
PC : 0x400f360d PS : 0x00060330 A0 : 0x800dbf56 A1 : 0x3ffb7e00
0x400f360d: do_something_to_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:57
(inlined by) inner_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:52
A2 : 0x3ffb136c A3 : 0x00000005 A4 : 0x00000000 A5 : 0x00000000
A6 : 0x00000000 A7 : 0x00000080 A8 : 0x00000000 A9 : 0x3ffb7dd0
A10 : 0x00000003 A11 : 0x00060f23 A12 : 0x00060f20 A13 : 0x3ffba6d0
A14 : 0x00000047 A15 : 0x0000000f SAR : 0x00000019 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0x00000000
Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90
0x400f360d: do_something_to_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:57
(inlined by) inner_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:52
0x400dbf56: still_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:47
0x400dbf5e: dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:42
0x400dbf82: app_main at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:33
0x400d071d: main_task at /home/gus/esp/32/idf/components/esp32/./cpu_start.c:254
在后台,IDF Monitor 运行以下命令解码各个地址:
xtensa-esp32-elf-addr2line -pfiaC -e build/PROJECT.elf ADDRESS
配置 GDBStub 供 GDB 调试¶
默认情况下,如果 esp-idf 应用程序 crash, panic 处理函数打印上述的寄存器和堆栈转储,然后重启。
您可以选择配置 panic 处理函数,使其运行串行的 “gdb stub”。该程序可以与 gdb 调试器通信,提供内存,变量,栈帧读取的功能。虽然这不像 JTAG 调试那样通用,但您不需要使用特殊硬件。
要启用 gdbstub,运行 make menuconfig
并将 CONFIG_ESP32_PANIC 选项设置为 Invoke GDBStub
。
如果启用此选项并且 IDF Monitor 发现 gdbstub 已加载,它将自动暂停串口监控并使用正确的参数运行 GDB。GDB 退出后,电路板将通过 RTS 串行线路复位(如果已连接)。
IDF Monitor 在后台运行的命令是:
xtensa-esp32-elf-gdb -ex "set serial baud BAUD" -ex "target remote PORT" -ex interrupt build/PROJECT.elf
快速编译与烧录¶
使用快捷键 Ctrl-T Ctrl-A
暂停 IDF Monitor,并运行 make flash
目标,然后 IDF Monitor 就会恢复正常。任何更改的源文件将在烧录之前重新编译。
使用快捷键 Ctrl-T Ctrl-A
暂停 IDF Monitor,并运行 make app-flash
目标,然后 IDF Monitor 就会恢复正常。这与 make flash
类似,但只有主应用程序被编译和重新烧录。
快速重置¶
键盘快捷键 Ctrl-T Ctrl-R
将通过 RTS 线(如果已连接)重置开发板。
暂停应用程序¶
通过快捷键 Ctrl-T Ctrl-P
重启进入 bootloader,开发板将不运行任何程序。等待其他设备启动时可以使用此操作。使用快捷键 Ctrl-T Ctrl-R
重新启动应用程序。
输出显示开关¶
暂停屏幕上的输出,以查看之前日志,可以使用快捷键 Ctrl-T Ctrl-Y
切换显示(当显示关闭时丢弃所有的串行数据)。这样您可以停下来查看日志,不必关闭显示器就可以快速恢复打印。