首页 > 其他分享 >OpenOCD 代码学习(4)其它配置命令

OpenOCD 代码学习(4)其它配置命令

时间:2024-09-28 21:02:31浏览次数:5  
标签:OpenOCD 其它 target swj 代码 flash 命令 air001 dap

目录

前言

  • 1)上一节我们学习了 adapter 与 transport 命令,这一节我们接着学习配置文件中的其它命令。本文主要是对配置文件中用到的命令(如下图)进行解析,以在命令行运行如下命令的结果为准:

    openocd -d3 -f board/airm2m_air001.cfg
    -d3 也作 --debug-level=3。即指定输出日志级别。
    -f  也作 --file。这里指定开发板为合宙 air001 芯片。
    
  • 2)这一节主要是学习 air001.cfg 文件的内容。这里简单提一下加载的两个文件:swj-dp.tcl 和 mem_helper.tcl。

    • swj-dp.tcl 文件首先执行了 transport select 命令(这个已经在 cmsis-dap.cfg 中执行过,所以无影响)。然后定义了 swj_memdap 调用过程。
    • mem_helper.tcl 文件则定义了操作 memory 的多个调用过程:
      • mrw/mrh/mrb 分别是 memory read word/halfword/byte,读取 memory。
      • mmw 则是 memory modify word,修改 memory。
  • 3)参考链接:

1 swj_newdap

  • 1)完整的 swj_newdap 命令如下:
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
# 替换掉变量后为:
swj_newdap air001     cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x2ba01477
  • 2)其中使用的 swj_newdap 命令是一个定义在 /tcl/target/swj-dp.tcl 文件中的 proc 可调用过程,其实现为:

    # /tcl/target/swj-dp.tcl
    proc swj_newdap {chip tag args} {
     if [using_jtag] {
         eval jtag newtap $chip $tag $args
     } elseif [using_swd] {
         eval swd newdap $chip $tag $args
     } else {
         echo "Error: transport '[ transport select ]' not supported by swj_newdap"
         shutdown
     }
    }
    
    # /src/target/startup.tcl
    proc using_jtag {} {
    	set _TRANSPORT [ transport select ]
    	expr { [ string first "jtag" $_TRANSPORT ] != -1 }
    }
    
    • (1)transport select 命令当未指定传输方式时,OpenOCD 会在自动选择一种传输方式的同时,并通过 Jim_SetResultString() 函数会将当前选择的传输方式作为结果返回。
  • 3)创建名为 air001.cpu 的 Tap 过程如下(尽管该命令名叫 swj_newdap,实际上却是创建的 Tap):

    • 最终的结果是创建了 struct jtag_tap 对象,并追加到名为 __jtag_all_taps 的 Tap 链表中。

2 dap create

  • 1)真正的创建 dap 过程如下:

  • 2)dap create 命令:

    • 首先通过 dap_name 指定待创建的 dap 名称;
    • 其次通过 -chain-position tap_name 选项将上一小节中创建的 Tap 赋值给该 dap。
    • 然后验证 dap 的合法性
    • 最后会将 dap 的子命令复制给新创建的 dap(这里为 air001.dap) 一份,因此你既可以使用如 dap info 的命令,也可以使用 air001.dap info 命令。
  • 3)最终的结果是创建 struct arm_dap_object 对象,并追加到名为 all_dap 的 dap 链表中。

3 target create

  • 1)创建 target。
    target create <name> <target_type> [<target_options> ...]
    
    • (1)target_type:可取 arm7tdmi、cortex_m、arm11、esp32、stm8、riscv 等
    • (2)target_options 可取:这些选项也可以后续通过 <target_name> configure 命令设置
      -type                   -endian    
      -event                  -coreid    
      -work-area-virt         -chain-position   
      -work-area-phys         -dbgbase      
      -work-area-size         -rtos         
      -work-area-backup       -defer-examine    
      -gdb-port               -gdb-max-connections                
      
  • 2)执行逻辑:
    • 通过给定的 target_type 找到对应的 target 类型,这里为 cortexm_target

    • 通过 target_configure() 函数处理该命令指定的选项

    • 注册 target_type 的内置命令

    • 重写并注册 air001.cpu 命令

4 <target_name> configure

  • 1)创建完名为 air001.cpu 的 target 后,还需要进行配置:

    target_name configure [options]
    
    • (1)target_name:一般可以通过 target create 命令创建
    • (2)options:
      -type             :一般指 MCU 架构,如 arm7tdmi、arm9tdmi、cortexm、 riscv 等
      -event            
      -work-area-virt   
      -work-area-phys   :工作空间的物理起始地址
      -work-area-size   :工作空间的大小
      -work-area-backup :工作空间是否备份 
      -endian           :大小端
      -coreid           
      -chain-position   
      -dbgbase          
      -rtos             
      -defer-examine    
      -gdb-port         
      -gdb-max-connections
      
  • 2)target 配置逻辑:

    • 这里有一个疑问,如果使用 -chain-position 选项指定 air001.dap,则启动时报错;可如果使用要求的 -dap 选项,target_configure() 函数又不支持该选项。

5 flash bank

  • 1)flash bank 一般用来声明芯片的 bank。

    flash bank <name> <driver> <base> <size> <chip_width> <bus_width> <target>
    
    参数:
    - name:bank name,一般可以自定义为 “芯片.flash”
    - driver:driver name,声明在 /src/flash/nor/drivers.c 文件中的,struct flash_driver 类型的芯片驱动。用户需要实现其中的读、写、擦除、探测等方法。
    - base:base address,芯片 flash 的起始地址
    - size:size bytes,芯片 flash 的大小。如果可以从芯片的某个寄存器中读取,建议在 flash_driver 中实现,则这里默认写 0 即可;否则需要填写芯片的准确大小,单位为:字节。
    - chip\_width:默认为 0
    - bus\_width:默认为 0
    - target:通过 target create 命令创建的目标名称
    
  • 2)flash bank 执行逻辑:

    • 根据给定的 target 名称找到通过 target create 命令创建的 target

    • 根据给定的 flash_driver 名称找到用户编写的 flash 驱动,并注册该驱动中的相关命令

    • 创建 flash_bank 对象,并为其 name、target、driver 等属性赋值

    • 调用 flash_driver 的 flash_bank_command() 函数指针

    • 最后将该 flash_bank 对象添加到全局 flash_banks 链表中

总结

  • 1)至此,我们基本掌握了配置文件中的相关命令,其实主要是创建了几个对象:
    对象类型 对象名称 联系
    struct adapter_driver cmsis-dap
    st-link
    jlink
    ulink
    struct transport swd/jtag
    dapdirect_swd/dapdirect_jtag
    hla_swd/hla_jtag
    swim
    adapter_driver->transports
    struct jtag_tap air001.cpu ——
    struct arm_dap_object air001.dap dap->dap.tap = air001.cpu
    struct target air001.cpu target->tap = air001.cpu(-dap 选项,存疑)

标签:OpenOCD,其它,target,swj,代码,flash,命令,air001,dap
From: https://www.cnblogs.com/luyaocode/p/18432500

相关文章

  • idea快速生成的代码
    importjava.util.Objects;publicclassStudent{privateStringsid;privateStringname;privateintage;privateStringaddress;publicStudent(Stringsid){this.sid=sid;}publicStudent(Stringsid,Stringn......
  • Python中的单元测试:提高代码质量和可靠性
    在软件开发过程中,确保代码的质量和可靠性是非常重要的。单元测试是一种有效的手段,它通过验证代码的各个部分是否按预期工作,帮助开发者发现和修复潜在的问题。Python提供了unittest模块,这是一个内置的单元测试框架,可以帮助你轻松地编写和运行单元测试。本文将详细介绍如......
  • 2024.9.28 代码源模拟赛
    省流:\(45+20+5+0=70\)简称:唐诗在此膜拜\(klz\)\(Heldivis\)\(Sorato\)\(czl\)\(Ech0\_7\)yxanslihe_qwq大佬T1先看的T1,想了一个拓排(其实是看错题了),然后过了第一个样例,然后咋调都过不去,就去码暴力了。过了大概10min发现看错题了,然后一会就想出来个\(O(n^2)\)......
  • 代码源 2024 CSP-S 模拟赛 Day 6
    赛时开T1,发现立即有了\(O(n^2)\)的思路,能有\(45\)分,但是先不急,看看后面的题。T2、T3、T4似乎都可以写个暴力。又想了想,T1还需要求出个LCA,所以复杂度是\(O(n^2\logn)\)的,开写。很快写完,调不过,边界很不好处理。直到\(1.5\)h才调出来\(O(n^2\logn)\)。上个厕所......
  • 国家代码
    代码语言名称en_US英语ar_AE阿拉伯语zh_CN简体中文zh_TW繁体中文cs_CZ捷克语da_DK丹麦语nl_NL荷兰语fr_FR法语de_DE德语in_ID印尼语it_IT意大利语ja_JP日语ko_KR韩语ms_MY马来语no_NO挪威语pl_PL波兰语......
  • Deepseek AI 与插件Continue代码智能助手
       Deepseek的代码AI能力智能助手在代码生成与补全、代码修复与优化、智能问答。似乎是替代CursorAI的方案,以下介绍是VSCODE中安装插件Continue准备工作DeepseekAPIaccessKey申请配置config.json配置如下{"completionOptions":{"BaseCompletionOptions":{"tempe......
  • 轻松上手MyBatis反向工程:从零到一的自动化代码生成
    前言反向工程概念:反向工程是从已有的具体实现(如数据库表结构)中推导出高层次的信息(如Java代码)的过程。在MyBatis中,它特指根据数据库表结构自动生成Java实体类、Mapper接口和XML映射文件。原理:MyBatis反向工程通过读取数据库表结构的元数据(如表名、字段名、字段类型等),然后利......
  • 写文章和写代码
    写文章和代码本是不相干的东西,代码更注重逻辑,能跑就行。写文章比写代码复杂,光把问题说清楚讲明白是不行的,要考虑多种因素,有时还要有一定的高度,如果一篇文章写完后需要经过多人审核,那么,不来回搞七八遍你是甭想过了。 小学时候我喜欢语文,但是到了高中忽然看不懂了,文章读......
  • Dijkstra算法详解【附算法代码与运行结果】
    算法背景Dijkstra算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。这种算法由荷兰计算机科学家艾兹格·戴克斯特拉(EdsgerW.Dijkstra)在1956年提出。它适用于有向图和无向图,并且图中的边权重必须是非负数。基本原理如下图所示,找到一条从v1(节点1)到v6(......
  • 代码随想录算法训练营第三天 | 熟悉链表
    链表的存储方式数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。链表的定义template<typenameT>......