文章目录
概述
-
1)OpenOCD 与调试器、MCU 的关系:
-

-
(1)OpenOCD 运行在 PC 机上,用户可以通过 GDB 调试、Telnet 连接 Socket 以及 CMD 命令行的方式执行命令
-
(2)OpenOCD 将命令发送到 MCU 端需要双方约定协议。目前常用的协议为 SWD 和 JTAG,实现这些协议的工具有 DAPLink、ST-Link、JLink 等
-
(3)在 MCU 端内置了 DAP(Debug Access Port)模块,它接收到命令,通过 AHB 总线控制 CPU 内核。(因此,通过 DAP 我们可以访问挂载在 AHB 总线上所有外设,尤其是 FLASH 外设,它是实现芯片烧录程序的关键。)
-
-
2)在 《Windows 下编译 OpenOCD》一节,我们已经可以通过 JetBrains CLion 打开 OpenOCD 源码(也可以使用 VSCode 打开)。一般程序都是从 main() 函数开始,那么让我们打开 /openocd/src 目录,从 main.c 文件开始:
1 main()
-

-
从 main() 函数到 openocd_main() 函数,最后再到 setup_command_handler() 函数,OpenOCD 进行命令注册操作。
-
那么接下来,我们重点看一下 setup_command_handler() 函数。
2 setup_command_handler()
-
1)setup_command_handler() 函数主要进行了以下两个操作,我们一个一个来看:
- command_init()
- (*command_registrants[i])(cmd_ctx)
-
2)对于 command_init() 函数,我们略去 Jim 框架的代码,可以看到以下内容:
register_commands(context, NULL, command_builtin_handlers); if (Jim_Eval_Named(interp, startup_tcl, "embedded:startup.tcl", 1) == JIM_ERR) {- 第一行代码注册一些 OpenOCD 的内置命令,如 ocd_find、capture、sleep 等等
- 第二行则是解析了 startup.tcl 文件。
这里要注意,.tcl 文件里有一些调用过程,当你无法在源码中找到某些命令的实现时,可以搜索一下 .tcl 文件。如 CLion 通过 program 命令烧录,而该命令实际上是一个定义在 src/flash/startup.tcl 中的一个 proc,并在其内部转换成 flash write_image erase 组合命令来进行烧录。
-
3)对于 (*command_registrants[i])(cmd_ctx) 函数调用,我们结合上下文来看:


最低0.47元/天 解锁文章
1732

被折叠的 条评论
为什么被折叠?



