首页 > 其他分享 >OpenOCD 代码学习(5)继续 openocd_thread()

OpenOCD 代码学习(5)继续 openocd_thread()

时间:2024-09-30 11:26:14浏览次数:5  
标签:OpenOCD 命令 target service openocd flash tcl thread init

目录

前言

  • 1)前面几节我们学习了 ① ~ ③ 中的解析命令行参数与解析配置文件,接下来我们来看一下剩余的 ④ ~ ⑥ 部分:server_init() 函数、init 命令和 server_loop() 函数:

1 server_init()

  • 1)server_init() 的执行逻辑如下:

  • 2)总的来说,添加了两个 service 到 struct service *services; 链表中:

    • (1)tcl_service:应该是与 tcl 语法相关的 tcp 连接,暂时未用到
    • (2)telnet_service:创建 telnet 相关的 tcp 连接,主要作用是让我们可以通过 telnet 连接到 OpenOCD 服务端,OpenOCD 支持的所有命令均可以在 telnet 连接后执行,也是我编写芯片烧录驱动的主要测试方式。

2 执行 init 命令

  • 1)OpenOCD 通过 command_run_line(ctx, "init") 执行 init 命令的逻辑如下:

这可能就是所谓的冰山一角吧:看着是一条 init 命令,其实内部执行一系列的初始化操作。

2.1 target init

  • 1)target init 命令的大概执行逻辑如下:

  • 2)init_targets、init_target_events、init_board 三个命令是定义在 src/target/startup.tcl 文件中三个调用过程 proc。可以让用户在初始化过程中的进行功能补充。

  • 3)接下来在 target_init() 函数中,主要有以下内容:

    • (1)根据全局变量 struct target *all_targets; 遍历所有 target,并通过 target->type->init_target() 函数指针进行 target_type 的初始化,最后对 target_type 进行其它属性填充。关于 target_type,上一节中创建 target 时,我们提到:

    • (2)通过 target_register_user_commands() 函数注册 target 相关命令,如 target_request debugmsgs,trace history, reg/poll/halt/resume/reset/mdd[w/h/b]/mwd[w/h/b]/verify_image 等等

    • (3)通过将 handle_target() 函数指针注册给 target_timer_callbacks,获得处理 srst 与 power 事件的能力。

  • 4)关于 target_type->init_target() 的初始化,以 cortexm_target 为例:

    • 百度上说,Semihosting 技术是将目标板的输入/输出请求从应用程序代码传递到远程运行调试器的主机的一种机制。

2.2 adapter_init()

  • 1)adapter 初始化的逻辑如下(右侧还是以 cmsis-dap 为例):

  • 2)首先进行 adapter_driver 的初始化(这里为 cmsis-dap),都是 cmsis-dap 相关的细节,有时间我们再通过 DAPLink 项目深入学习。

  • 3)然后是设置 adapter 的速度。这里首先设置速度,然后会再读取 adapter 的实际速度。

2.3 其它命令

剩余的命令就不再一一分析了,这里仅列出命令的执行函数入口以供有兴趣者研究。

command handler function entry location 概要说明
transport init handle_transport_init() src/transport/transport.c 对命令 'transport select <transport>' 中的 <transport> 进行初始化,包括 swd、jtag 等
dap init handle_dap_init() src/target/arm_dap.c 对 DAP(Debug Access Port)进行初始化。
flash init handle_flash_init_command() src/flash/nor/tcl.c 注册了许多 flash 开头的命令,如检测命令 flash probe、擦除扇区命令 flash erase_check 等
nand init handle_nand_init_command() src/flash/nand/tcl.c 注册了许多 nand 开头的命令,可能是操作 nand 类存储设备的命令
pld init handle_pld_init_command() src/pld/pld.c pld,Programmable Logic Device,不太明白,不敢妄言
tpiu init handle_arm_tpiu_swo_init() src/target/arm_tpiu_swo.c 完全不懂

以上命令不再作解析,因为有些内容我实在搞不明白,这里仅做逻辑记录,待日后有机会再深入了解。

3 server_loop()

  • 1)该函数遍历 service,并以 select 的方式对其内部的 socket 进行轮询。

  • 2)从前面几章我们知道,OpenOCD 中一共有以下几种 service:

名称 端口 简述
gdb service 3333 用于 gdb 调试
telnet service 4444 执行擦除、烧录、读取等命令
jtag vpi 5555 没用到过,不了解
tcl service 6666 猜测是用来执行 tcl 文件中命令的
jsp service 7777 没用到过,不了解
rtt service xxxx Real Time Transfer,类比 SEGGER 的 RTT,通过 rtt start [message] 指定

通过 telnet ip:port 连接到 OpenOCD 后,根据连接的端口,由对应的 Service 进行命令处理。我们已经了解通过 4444 端口的烧录等命令处理。
下一次,我们将了解通过 RTT service 来打印 DAPLINK 日志的方式。

标签:OpenOCD,命令,target,service,openocd,flash,tcl,thread,init
From: https://www.cnblogs.com/luyaocf/p/18432511

相关文章

  • OpenOCD 代码学习(4)其它配置命令
    目录前言1swj_newdap2dapcreate3targetcreate4<target_name>configure5flashbank总结前言1)上一节我们学习了adapter与transport命令,这一节我们接着学习配置文件中的其它命令。本文主要是对配置文件中用到的命令(如下图)进行解析,以在命令行运行如下命令的结果为准:......
  • 2024.9.26 ThreadLocal
    在使用ThreadLocal的情况下,并发量很高时不会产生冲突,原因如下:1.线程隔离:ThreadLocal为每个线程提供独立的存储空间。每个线程都可以安全地设置和获取其自己的变量值,而不会影响其他线程。即使在高并发环境下,线程间的数据是隔离的。2.并发安全:ThreadLocal本身是线程安......
  • MySQL variables:thread_handling
    在使用MySQL数据库时,我们经常会遇到多个客户端同时访问数据库的情况。为了处理并发请求,MySQL提供了thread_handling参数,用于控制线程的管理方式thread_handling参数的作用thread_handling参数用于控制MySQL如何处理客户端的连接请求。它可以影响数据库的性能、吞吐量以......
  • 进程和线程的区别;线程的多种创建方式;Thread 类及常见方法;线程的状态
    文章目录进程和线程的区别线程的创建方式继承Thread,重写run(创建单独的类/匿名内部类)实现Runnable,重写run(创建单独的类/匿名内部类)实现Callable,重写call(创建单独的类/匿名内部类)使用lambda表达式ThreadFactory线程工厂线程池Thread类及常见方法Thread的常见属性启动一......
  • Thread , ThreadLocal , ThreadLocalMap , Entry 之间的关系?
    Thread,ThreadLocal,ThreadLocalMap,Entry之间的关系?首先ThradLocal是线程的本地副本,怎么理解这句话呢?一个Thread都有一个它自己的ThreadLocalMap。ThreadLocalMap不是HashMap的结构,而是一个Entry数组,里面存放了一个一个的Entry。而Entry中存放的就是key和value,这个......
  • 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLo
    文章目录【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1.基本API介绍2.简单用法3.应用场景4.Threadlocal与Synchronized区别5.内存溢出和内存泄漏5.2内存溢出(MemoryOverflow)5.2内存泄漏(Mem......
  • Multi-threading - Token Bucket Emulation in C
    Multi-threading-TokenBucketEmulationinCYouwillemulate/simulateatrafficshaperthattransmits/servicespacketscontrolledbyatokenbucketfilterdepictedbelowusingmulti-threadingwithinasingleprocess.Ifyouarenotamiliarwithpthrea......
  • JavaEE——多线程Thread 类及常见方法
    目录 一、Thread(Stringname)二、是否后台线程isDeamon()三、是否存活isAlive()四、run()方法和start()方法的区别五、中断线程法一:法二:六、线程等待join()七、线程休眠sleep()一、Thread(Stringname)定义:这个东西是给线程(thread对象)起一个名字。起一个......
  • C# 线程(Thread)
    一、基本概念1、进程首先打开任务管理器,查看当前运行的进程:从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可......
  • 《深入解析 Java 中的 ThreadLocal》
    ThreadLocal1.概述ThreadLocal被称为线程局部变量,用于在线程中保存数据。由于在ThreadLocal中保存的数据仅属于当前线程,所以该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal用于在同一个线程间,在不同的类和方法之间共享数据的的场景,也可以......