OpenOCD 代码学习(1)注册命令

概述

  • 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) 函数调用,我们结合上下文来看:

<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值