JTAG 和 SWD 在嵌入式开发中可以说是随处可见,他们通常被用来配合 J-Link 、ULINK、ST-LINK 等仿真器在线调试嵌入式程序。此外,还有飞思卡尔芯片中的 Background debug mode(BDM) 接口,Atmel 芯片中的 debugWIRE ;Nexus 5001 论坛制定的全球嵌入式处理器调试接口标准 IEEE-ISTO 5001。
JTAG 这个名字是由该标准的制定者 —— 联合测试行动小组(Joint Test Action Group)的名字缩写而来。其相关标准于 1990 年标准化为 IEEE Std. 1149.1-1990(该标准的全称是 Test Access Port and Boundary-Scan Architecture(测试访问端口和边界扫描架构))。

JTAG 是来自主要制造商的工程师团队的一个花哨的名字,他们坐在一起,提出了我们现在称为 JTAG 的标准。
JTAG 制定之初是采用边界扫描技术的一种测试印刷电路板或集成电路内子模块上的互连(电线)的方法。 边界扫描被广泛用作观察集成电路引脚状态、测量电压或分析集成电路内部子模块的调试方法。在电路板上的很多芯片可以将他们的 JTAG 引脚通过 Daisy Chain 的方式连接在一起。

边界扫描(Boundary-Scan)技术的基本思想是在靠近芯片的输入/输出引脚上增加一个移位寄存器单元,也就是边界扫描寄存器(Boundary-Scan Register)。当芯片处于调试状态时,边界扫描寄存器可以将芯片和外围的输入/输出隔离开来。通过边界扫描寄存器单元,可以实现对芯片输入/输出信号的观察和控制。

现在,越来越多的器件采用 BGA(球栅阵列)封装。电路板上的每个 BGA 器件都对可以使用传统钉床或飞针机完成的测试施加了严格的限制。JTAG 则在球栅阵列(BGA)芯片的生产测试中提供了简单的方法,因此,边界扫描也被认为是 JTAG 的代名词。

JTAG 成立的主要目的是为了帮助电子设备的生产和测试,而不是实际上为软件调试制定标准!但随着时间的推移,芯片制造商发现 JTAG 集成到芯片内部就可以辅助芯片软件调试!如今,JTAG 被用作访问集成电路子模块的主要手段,使其成为调试嵌入式系统的基本机制。

详细的调试协议(定义如何通过 JTAG 接口读取边界扫描寄存器)由架构厂商定义,例如 ARM 在 《ARM® Debug Interface v5》规范中给出了详细介绍 DP;RISC-V 则在 《RISC-V Debug Specification》中有详细的描述 DMI。

JTAG 允许器件编程器硬件将数据传输到内部非易失性器件存储器(例如 CPLD,闪存),目前,所有 FPGA 和 CPLD 包括我们常用的 SoC、MCU 都使用 JTAG 来提供对其编程功能的访问。

注意,固件烧录可以根据存储介质分为 RAM 烧录和 ROM 烧录。其中,RAM 烧录可以直接写,而 ROM 烧录则需要特定的烧写算法(通常做法是(例如,Keil),先将烧写算法写入到 RAM,然后运行 RAM 中的程序,调试器与 RAM 中的程序通信,实现烧录)。

最初的 JTAG 标准 IEEE 1149.1 定义了 5 个引脚,这 5 个引脚统称为 Test Access Port(TAP)。JTAG 本身无固定电压,由目标板和目标芯片的 IO 供电电压决定,必须保证 JTAG 信号线与连接的芯片电压相同。
IEEE-1149.7 标准定义的 compact JTAG(cJTAG)则减少了引脚数,只定义了 2 个引脚,可以采用星形拓扑结构连接:
以上仅仅是信号线,除此之外还可能有一些其他引脚
JTAG 标准并没有定义 TAP 各引脚的布局方式,我们常见的调试器接口都有 20 个引脚(其源自于 ARM 给出的接口定义,详见后文),多出来的引脚都是一些电源、地等,布局基本就是如下图所示:

TAP Controller 负责解释 TCK 和 TMS 信号,控制 JTAG 接口的行为。数据输入管脚(TDI)用于将数据加载到物理管脚与 IC 内核之间的边界单元,以及将数据加载到指令寄存器或其中一个数据寄存器中。数据输出引脚(TDO)用于从边界单元读取数据,或从指令或数据寄存器读取数据。

TAP Controller 的主体是一个拥有 16 个状态的有限状态机(FSM,Finite State Machine),其状态跳变过程由 TMS 信号控制,该信号由 TCK 驱动。TAP 控制器只能在 TCK 的上升沿改变状态,FSM 接下来跳转到哪个状态(next state),由 TMS 的电平以及 FSM 当前的状态(current state)决定。

状态机只有两条“路径”,代表两种不同的模式:指令模式和数据模式。
IEEE 1149.1 标准定义了一组必须可用的指令,以使设备被认为是兼容的。这些指令是(有关每种状态的更多详细信息,请参阅 IEEE 1149.1 标准 JTAG 文档):
capture dr JTAG 状态进行采样,新值通过 shift dr 状态移入 BSR;然后使用 update dr 状态将这些值应用到设备的引脚。其他常用说明包括:
SWD(Serial Wire Debug)是由 ARM 公司设计的用于编程和调试 Cortex 系列微控制器的协议。由于 SWD 专门用于编程和调试,因此,它具有许多其他地方通常无法提供的特殊功能,例如通过 IO 线向计算机发送调试信息。
与将 TAP 链接在一起的 JTAG 相反,SWD 使用称为 DAP(Debug Access Port,调试访问端口)的总线。在这个 DAP 上,有一个主站(DP,Debug Port,调试端口)和一个或多个从站(AP,Access Port,接入端口),类似于 JTAG TAP。DP 使用包含 AP 地址的数据包与 AP 通信。

调试端口是主机和 DAP 之间的接口。它还处理主机接口。有三种不同的调试端口可用于访问 DAP:
可以根据需要将多个 AP 添加到 DAP。ARM 提供了两个 AP 的规格:
SWD 就只是用来调试(跟踪)的,因此它相对于 JTAG 简单不少,详细的调试协议在 《ARM® Debug Interface v5》的 The Serial Wire Debug Port (SW-DP) 这个章节有介绍。

固件烧录的实现方式与 JTAG 中说的一样,就是协议走的 SWD 协议,这里就不再赘述了!
SWD 协议定义了 2 个引脚,在体系结构方面支持星型拓扑。SWD 本身无固定电压,由目标板和目标芯片的 IO 供电电压决定,必须保证 JTAG 信号线与连接的芯片电压相同。:
SWD 实际上只是针对 ARM 处理器的 JTAG 的一个修改/实现,ARM 在其系统和接口设计参考文档中给出了常用的接口布局,成为了事实上的标准。通常它复用 JTAG 的 TMS 和 TCK 信号分别传输 SWDIO 和 SWDCLK 信号,从而允许用户使用 JTAG 或 SWD。

除了调试信号,ARM 的 SWD 接口还指定了一个专用的引脚,允许目标 CPU 通过 UART 或 Manchester 协议在专用引脚上输出特定的数据,这个引脚被称为 SWO。并非所有支持 SWD 的 ARM 架构都支持 SWO。
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation
我有一个字符串变量,它只能包含6个不同的值。我想检查它是否包含前4个值之一或2个第二值之一。有没有比这更优雅的方式:ifstring.eql?'val1'||string.eql?'val2'||string.eql?'val3'||string.eql?'val4'...elsifstring.eql?'val5'||string.eql?'val6'...end可能类似于ifstringisin['val1','val2','val3','val4']? 最佳答案 您可以使用include?:if['val1','val2','
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
我一直在为使用acts_as_list的模型实现一些不错的交互界面,这些界面可以对我的mRails应用程序中的列表进行排序。我有一个排序函数,在每次拖放之后使用sortable_elementscript.aculo.us函数调用并设置每条记录的位置。这是在拖放完成后处理排序的Controller操作示例:defsortparams[:documents].each_with_indexdo|id,index|Document.update_all(['position=?',index+1],['id=?',id])endend现在我正在尝试对嵌套集模型(acts_as_nested
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,