CN113111001B - 一种嵌入式终端远程软件调试方法 - Google Patents
一种嵌入式终端远程软件调试方法 Download PDFInfo
- Publication number
- CN113111001B CN113111001B CN202110472347.6A CN202110472347A CN113111001B CN 113111001 B CN113111001 B CN 113111001B CN 202110472347 A CN202110472347 A CN 202110472347A CN 113111001 B CN113111001 B CN 113111001B
- Authority
- CN
- China
- Prior art keywords
- debugging
- program
- instruction
- breakpoint
- address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 33
- 230000006870 function Effects 0.000 claims abstract description 76
- 238000004891 communication Methods 0.000 claims abstract description 49
- 238000012544 monitoring process Methods 0.000 claims abstract description 45
- 230000005856 abnormality Effects 0.000 claims description 10
- 238000011112 process operation Methods 0.000 claims description 9
- 230000008569 process Effects 0.000 claims description 8
- 230000001960 triggered effect Effects 0.000 claims description 8
- 238000004458 analytical method Methods 0.000 claims description 4
- 238000003825 pressing Methods 0.000 claims description 4
- 238000000605 extraction Methods 0.000 abstract description 4
- 238000011160 research Methods 0.000 abstract description 3
- 238000003860 storage Methods 0.000 description 7
- 230000002159 abnormal effect Effects 0.000 description 6
- 238000013461 design Methods 0.000 description 6
- 238000012545 processing Methods 0.000 description 5
- 230000005540 biological transmission Effects 0.000 description 4
- 238000007429 general method Methods 0.000 description 4
- 230000008901 benefit Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 3
- 238000011161 development Methods 0.000 description 3
- 238000009826 distribution Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000000977 initiatory effect Effects 0.000 description 3
- 238000007667 floating Methods 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000011990 functional testing Methods 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 239000000725 suspension Substances 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3648—Software debugging using additional hardware
- G06F11/3656—Software debugging using additional hardware using a specific debug interface
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3664—Environments for testing or debugging software
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种嵌入式终端远程软件调试方法,本发明基于CoreSight调试框架和动态命令体系为减少额外硬件依赖和存储空间占用提供可能。同样以串行通信作为前导研究来降低复杂通信模组带来的前期探索难度,也方便了后续的通信模组共性抽取。CoreSight调试框架内的FPB单元为断点的设置和响应提供了基础,借助调试监控异常可以完成针对断点的调试信息提取和输出,并以动态命令为整体功能的载体,完成了诸如调试模式的启动和退出、断点的设置与取消和程序运行状态控制等丰富的调试功能。最后抽取出通信模组的公共要素,给出通信模组自适应的软件调试一般方法。
Description
技术领域
本发明涉及软件开发与调试技术领域,具体涉及一种嵌入式终端远程软件调试方法。
背景技术
传统的嵌入式终端开发极少会在最终部署地进行,尤其是在地理环境恶劣的条件下,开发者往往难以真正模拟最终部署地的全部条件,嵌入式终端的软件开发也就不可避免的会产生对应的疏漏。此时如果单单借助远程程序更新技术来进行多次终端软件的更新,软件问题仍然难以定位,且频繁的更新软件也会带来数据传输的负载压力,由此产生了远程软件调试的需求。
发明内容
本发明的目的是通过以下技术方案实现的。
本发明通过分析嵌入式终端远程在线开发场景下传统调试方式的局限,引入CoreSight调试框架和动态命令体系,来实现针对嵌入式终端软件的远程在线调试并减少额外硬件依赖和存储空间占用。以串行通信这一通信方式为例,详细给出该模式下软件调试的具体实现,并由此抽取出通信模组的公共要素,给出通信模组自适应软件调试的一般方法和功能测试。
具体的,本发明提供了一种嵌入式终端远程软件调试方法,包括:
通过BIOS工程内的动态命令体系实现软件调试程序的动态加载,并在动态命令内给出调试必要函数的具体实现;
借助闪存地址重载及断点单元完成断点的相关设置,并在负责捕获断点的调试监控异常内完成相应调试信息的输出;
通过全速运行、逐语句运行、逐过程运行和暂停模式进行远程软件调试。
进一步地,所述调试必要函数包括调试监控异常中断处理函数。
进一步地,进一步包括启动调试模式的流程,包括:
发送动态命令和调试模式启动指令;
修改User程序中断向量表;
启动User程序。
进一步地,进一步包括调试信息的返回和调试模式的退出。
进一步地,所述借助闪存地址重载及断点单元完成断点的相关设置,包括:
FPB控制寄存器解析;
FPB指令地址比较寄存器解析;
断点的设置;
断点的取消。
进一步地,所述全速运行包括:
在终端程序处于停止运行状态时,在上位机通过全速运行指令使得程序恢复运行状态,直至遇到下一个断点或暂停指令;
终端程序在接收到全速运行指令后,修改寄存器使能调试监控异常,并启用单步执行;随后判断当前程序的停止运行是由断点触发还是由暂停运行指令触发,若由断点触发则禁用对应的指令地址比较寄存器,并对当前调试器的状态进行标记;
重新恢复运行状态,执行单个指令,然后重新进入调试监控异常处理程序,并结合当前调试器的状态,禁用单步执行,若先前由断点停止程序运行则将对应的指令地址比较寄存器恢复使能,直至遇到下一个断点或暂停指令。
进一步地,所述逐语句运行包括:
在当前程序暂停运行时,上位机下达逐语句运行命令,终端接收到后使能调试监控异常并使能单步运行,若当前程序停止位置为断点,禁用当前断点,随后程序继续运行一个指令后,再次进入调试监控异常,禁用单步运行,若之前有禁用的断点则恢复断点,并在当前程序停止位置设置断点,使得程序停止运行并发送对应的寄存器信息至上位机,便于上位机结合具体地址定位当前程序所对应的代码位置。
进一步地,所述逐过程运行包括:
上位机下达逐过程运行命令,终端接收到后判断当前程序停止运行处的指令是否为函数调用指令,若是则使能调试监控异常并使能单步执行;在程序运行一个指令后,即进入要调用的函数内部后,再次进入调试监控异常,借助硬件压栈的R14寄存器,在函数返回地址设置断点,随后禁用单步执行,全速运行程序直至命中设置的函数返回地址断点,命中后发送相应的寄存器信息至终端。
进一步地,所述暂停模式包括:
终端在接收到暂停指令后,启用单步执行,随后程序继续运行一个指令后,再次进入调试监控异常后,禁用单步执行,并根据当前触发调试监控异常的程序地址来设置指令地址比较器,即在当前位置设置断点使得程序停止运行。
进一步地,进一步包括:
向通信模组发送动态命令数据,并由User程序写入;
向通信模组发送程序跳转的系统指令,User程序接收指令,跳转至BIOS;
BIOS启动过程中默认调用动态命令函数;动态命令内首先修改程序运行状态,完成BIOS的驻留;其次完成通信模组的初始化和中断使能;并设置BIOS程序中断向量表内对应于通信模组的中断服务例程地址为动态命令函数;最后告知上位机,相关初始化步骤已执行完毕,可以开始程序更新;
上位机开始向通信模组发送启动调试模式相关指令,开始正式调试;退出调试模式后,恢复所有程序的中断向量表并复位,开始程序的正常执行。
本发明的优点在于:
针对嵌入式终端软件的远程调试技术,本发明基于CoreSight调试框架和动态命令体系为减少额外硬件依赖和存储空间占用提供可能。同样以串行通信作为前导研究来降低复杂通信模组带来的前期探索难度,也方便了后续的通信模组共性抽取。CoreSight调试框架内的FPB单元为断点的设置和响应提供了基础,借助调试监控异常可以完成针对断点的调试信息提取和输出,并以动态命令为整体功能的载体,完成了诸如调试模式的启动和退出、断点的设置与取消和程序运行状态控制等丰富的调试功能。最后抽取出通信模组的公共要素,给出通信模组自适应的软件调试一般方法。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
附图1示出了根据本发明实施方式的全速运行状态设置流程图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施方式。虽然附图中显示了本公开的示例性实施方式,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
为了减少对额外硬件的依赖,本发明选取了CoreSight调试框架,该框架下调试监控异常的调试模式,可以结合闪存地址重载及断点单元(FPB单元)仅在目标终端的中断服务例程中完成大部分的软件调试操作,无需额外的仿真器等硬件需求,只需为调试信息的上行与下发选取一定的通信方式即可。
此外实现软件调试的功能代码往往比较庞大,为了避免软件调试功能代码的长期驻留而带来的空间浪费,动态命令体系的引入也必不可少,由此多通信方式的支持需求也在动态命令的支撑下得到满足。
串口调试的设计和实现
同样的,为了使得软件调试的实现方法更易于提取出通信模组的公共要素,也为了最终提出的远程软件调试方法更加具有通用性,本发明选取串行通信这一通信方式,以串口调试作为前导研究,探讨具体的设计与实现方式。
嵌入式的开发场景中,最大的限制往往来源于终端设备本身的性能,其中存储空间这一资源显得尤为珍贵。而软件调试这样的功能往往在一个版本的程序稳定后就不再需要,临时的功能不应该永久的占据存储空间,因此势必要利用动态命令来进行软件调试功能的临时添加。此外软件调试的核心是断点的设置、响应和处理,ARM提出的CoreSight基础架构已给出了较好的解决方案。两者的结合使得基于通信模组的软件调试成为可能。以下在针对动态命令的应用方式作补充说明后,给出基本设计思路。
1动态命令的应用和常量的特殊处理
在本发明提出的终端软件GEC框架中,软件调试程序在框架层次上应划分至BIOS工程,且软件调试的对象主要是User程序,同时考虑到软件调试程序的空间大小等因素,需要借助动态命令机制来实现软件调试程序的动态加载,来节省BIOS工程的存储空间占用。此外,动态命令技术也为软件调试程序的更新升级提供了便利,使得软件调试程序可以随着用户通信模组的改变来变更调试信息的传输方式。
由于软件调试程序的功能相对庞大,且针对不同通信方式的更新换代可能比较频繁,如果此时动态命令仍然过分依赖于原有工程的功能,可能会导致软件调试程序版本升级困难。考虑到这些因素,在借助动态命令编写软件调试程序时,除了需要采用动态构件库将复杂函数固化至构件函数代码区方便调用,还需放开特殊常量的使用限制,将动态命令内的常量链接至动态命令区存储空间,具体方式是在链接文件内将动态命令的.text和.rodata段限定在动态命令区内。
2基本设计思路
GEC下串口调试的基本设计思路如下:
(1)借助BIOS工程内的动态命令体系实现软件调试程序的动态加载,并在动态命令内给出调试监控异常中断处理函数等调试必要函数的具体实现。
(2)借助FPB单元完成断点的相关设置,并在负责捕获断点的调试监控异常内完成相应调试信息的输出。
(3)分析全速运行、逐语句运行、逐过程运行和暂停模式的具体含义,完善FPB和调试监控异常的设计。
接下来以ARM Cortex-M4系列处理器为例给出串口调试的实现,主要从调试模式的启动和退出、断点的设置和取消以及程序的运行和暂停这几部分来阐述。
3调试模式的启动和退出
以下将给出调试模式的详细启动流程,并针对诸如预留RAM空间和调试信息的处理等方面,给出进入调试模式的必要准备工作及其详细说明。
1.启动调试模式的流程
为了进行软件调试,首先要让程序处于一个停止运行等待调试指令的状态,常规的处理方法是使得目标程序停止运行于主函数入口,对应于GEC框架则是停止于User程序的主函数入口处。接下来叙述详细的调试模式启动流程。
(1)发送动态命令和调试模式启动指令。首先要向目标终端发送动态命令功能包。由于串口调试功能庞大,本发明将在串口调试的不同功能中分别叙述对应的动态命令内容,以便于理解。在动态命令发送并安装完毕后,解析User程序编译后的lst文件并提取相关信息,发送包含User程序主函数入口地址的调试模式启动指令,并进行软复位使得程序得以回到BIOS程序运行。
(2)修改User程序中断向量表。在BIOS程序内调用动态命令函数,针对User程序中断向量表,修改12号调试监控异常向量,使之指向动态命令内编写的调试监控异常服务例程,修改1号复位向量,使之指向动态命令内新编写的复位函数,借助空闲的8号向量,用于存储要设置断点的地址,借助空闲的7号向量,用于存储原本的用户程序的复位向量。这么做主要是为了干预User的启动流程,并设置调试监控异常的中断服务例程地址。
这里还要说明一下原本1号复位向量指向的复位函数的主要功能:原本的复位函数的第一个32位指令是对主堆栈指针进行赋值(一般是可用RAM的最大值),随后是进行bss段的数据清零、data段的数据拷贝、系统时钟的初始化、禁用看门狗、库函数的初始化和启动主函数等操作。
(3)User程序的启动。BIOS将引导User程序启动,执行复位向量指向的函数,但由于User程序的中断向量表已被修改,原本的复位向量指向了动态命令内新编写的复位函数。新复位函数对主堆栈指针进行了不同的赋值,在原本的可用RAM空间最大地址的基础上缩小了256字节,用于保存关键的调试信息。并且进行了初始化调试的相关操作,主要有:清除所有断点寄存器、使能FPB、使能调试监控异常、解析和修改预设断点处的地址(即User程序主函数入口地址)并设置断点。
随后创建了一个新的函数指针,这个函数指针的指向在原本的复位函数入口地址的基础上向后偏移了4个字节,旨在跳过原本的主堆栈指针赋值。最后调用这个函数指针完成剩余的用户程序初始化及后续程序运行的引导。在用户程序运行至断点设置处(即User程序主函数入口地址)时会触发硬件中断进入调试监控异常,将必要调试信息的寄存器压栈存储入预留的256个字节的空间内,并统一回发至上位机。此时程序暂停运行,等待上位机的下一步指令。
2.预留RAM空间的使用
由前文的描述可知,在进入调试模式后,会将用户程序的主堆栈指针的赋值进行调整,在原本的RAM空间最大值的基础上下调256字节。也就是说在调试模式下,用户程序可使用的RAM空间的大小减少了256字节,这256字节主要用于一些必要调试信息的存储。预留RAM空间的使用分配,如表4-1所示。
表4-1 预留RAM空间的使用分配
3.调试信息的返回
其中,返回至PC的调试信息主要来源于MCU内的不同寄存器,这些寄存器一部分是栈帧,另一部分在调试监控异常内手动压栈获得。其中栈帧是指在异常入口处被压入栈空间的数据块,对于Cortex-M3或不具有浮点单元的Cortex-M4处理器,栈帧都是8个字大小,对于具有浮点单元的Cortex-M4,栈帧则可能是8或26个字。这里以8个字的栈帧大小为例具体阐述芯片进入调试监控异常中断处理程序后,RAM中的寄存器分布情况。
在用户程序运行到设置断点处触发硬件中断后,会进入调试监控异常中断服务例程,在执行具体的程序功能前,会进行硬件压栈,将R0、R1、R2、R3、R12、R14、R15(PC)、PSR这八个寄存器(即栈帧)由硬件自动压入栈空间。为了丰富调试信息,还需将额外的一些寄存器信息返回至PC机,因此在调试监控异常内,依次将硬件压栈前的栈顶、三个中断屏蔽寄存器、R4~R11、预留的机器码和帧号(初始均为零)压入栈空间,并将最终的sp存储于用户程序RAM空间让出的256个字节的最后一个,即表4-1中的registsp。随后调用C函数,取出断点处的具体机器码,主要借助硬件压栈的R15寄存器,因为R15寄存器存储着进入中断前的程序地址,因此以R15寄存器的值为地址取内容即可得到具体的机器码。进入调试监控异常后主要的栈空间分布如表4-2所示。
表4-2 进入调试监控异常后的栈空间分布
随后通过registsp提供的起始地址作为返回数据帧的起始地址,返回数据帧的结构体类型如表4-3所示,与表4-2从低地址开始一一对应。
表4-3 结构体RegistS1的组成
4.调试模式的退出
调试模式的退出步骤相对简单,上位机选择退出调试模式后,会向终端的串口发送退出调试模式指令,终端收到后进入动态命令给出应答,并清除所有断点,禁用调试并重启。
在进入用户程序执行动态命令内的复位函数时,复位函数会对当前的调试状态进行判断,在发现调试被禁用后,会将用户程序的中断向量表复原至初始状态,随后正常执行用户程序原本的复位向量。至此,调试模式已完全退出,用户程序的栈顶赋值恢复至RAM空间的最大值,开始正常执行。
4断点的设置和取消
断点是调试器的重要组成部分,它用于通知调试器在特定的位置将程序暂停。
1.FPB控制寄存器解析
这里主要借助FPB提供的断点功能来完成。断点功能所依赖的寄存器主要有FPB控制寄存器和FPB指令地址比较寄存器。其中FPB控制寄存器(FPB->CTRL)主要用于使能FPB单元,其具体结构如表4-4所示。
表4-4 FPB->CTRL寄存器结构
因此使用断点功能的先决条件是将FPB->CTRL的低两位置一,这一操作在启动调试时被实施。
2.FPB指令地址比较寄存器解析
由于受硬件比较器的数量限制,Cortex-M3和Cortex-M4中至多有六个可以产生指令地址断点的比较器(FPB->COMP[0]~FPB->COMP[5])。且基于通信模组的软件调试本质上是借助调试监控异常来完成的,因此为了便于阐述,本发明所介绍的调试程序不支持在关闭总中断时和其他中断服务例程内设置断点。
在合法的程序处设置断点时,上位机首先解析对应语句的指令地址,并将要设置的断点地址信息发送至终端,终端收到后进行地址解析,随后进行对指令地址比较寄存器的赋值。指令地址比较寄存器的结构如表4-5所示。
表4-5 FPB-COMP[n]寄存器结构
由指令地址比较寄存器的结构可以发现,断点并不是在任意地址均可以设置,而是只能够在半字地址处设置,即从最小地址开始每两字节可设置断点。这是因为在指令地址比较寄存器中记录的地址使用32位地址的第2至28位表示,最大可表示29位的地址空间,这满足Cortex-M3和Cortex-M4中的最大地址范围,且所有表示的地址均为4的倍数,即所有整字地址。再结合指令地址比较寄存器的高两位来表示在当前整字地址低半字、高半字或低半字和高半字设置断点,即可得知支持设置断点的地址为从起始地址开始的所有半字地址。因此,由于指令比较寄存器最多有六个,所以至多可以在六个全字地址附近设置断点,极端情况下每个指令地址比较寄存器都在全字地址的上下半字均设置断点则最多可以设置十二个断点。
3.断点的设置流程
在终端接收到上位机发来的要设置断点的地址时,会先判断该位置是否已经存在断点,若存在则反馈相应信息至上位机;若不存在则判断当前已有的断点中是否存在上下半字即为目标地址的,如果有则修改对应指令地址比较寄存器的高两位均为1,使之在当前整字地址的上下半字都设置断点;若不存在符合条件的断点则判断指令地址比较寄存器是否有空闲,若无空闲,则向上位机反馈在清除一些已有断点之前无法再设置更多断点;若有空闲,则根据预设地址设置指令地址比较寄存器,最低位置一使能,根据地址本身处于高半字还是低半字设置高两位寄存器,并将2至28位拷贝至寄存器对应位置。
4.断点的取消方法
断点的取消步骤较为简便,对于在全字地址的上下半字都设置了断点的指令地址比较寄存器,只需将对应半字处设置的断点删除即可,具体方法是:若要取消的断点为高半字地址,则将对应的指令地址比较寄存器的高两位设置为“低半字设置端点”;若要取消的断点为低半字地址,则将对应的指令地址比较寄存器的高两位设置为“高半字设置端点”。而对于那些未设置上下半字断点的指令地址比较寄存器,只需将最低位的使能位清0即可。
5程序的运行和暂停
调试器中的程序运行指令一般分为全速运行、逐语句运行、逐过程运行和暂停运行。全速运行和暂停运行的概念比较简单,这里针对逐语句运行和逐过程运行的差别给出说明:若当前程序停止的位置存在函数调用,在逐语句运行的模式下,下一次程序运行会进入该函数内部,而在逐过程运行模式下,下一次程序运行会跳过该函数的内部执行。
1.全速运行
在终端程序处于停止运行状态时,可以在上位机通过全速运行指令使得程序恢复运行状态,直至遇到下一个断点或暂停指令。
终端程序在接收到全速运行指令后,会修改CoreDebug->DEMCR寄存器使能调试监控异常,并启用单步执行。随后判断当前程序的停止运行是由断点触发还是由暂停运行指令触发,若由断点触发则还需禁用对应的指令地址比较寄存器。并对当前调试器的状态进行特殊标记。CoreDebug->DEMCR寄存器的结构如表4-6所示。
表4-6 CoreDebug->DEMCR寄存器结构
此后程序重新恢复运行状态,但由于启动了单步执行,程序仅会执行单个指令,然后重新进入调试监控异常处理程序,并结合当前调试器的状态,禁用单步执行,若先前由断点停止程序运行则还需将对应的指令地址比较寄存器恢复使能。至此程序开始真正的全速运行直至遇到下一个断点或暂停指令,流程如图1所示。
2.逐语句运行
逐语句运行模式主要借助的是调试监控异常模式下的单步执行,具体流程如下:在当前程序暂停运行时,上位机下达逐语句运行命令,终端接收到后会使能调试监控异常并使能单步运行,若当前程序停止位置为断点,还要禁用当前断点,随后程序继续运行一个指令后,再次进入调试监控异常,禁用单步运行,若之前有禁用的断点则恢复断点,并在当前程序停止位置设置断点,使得程序停止运行并发送对应的寄存器信息至上位机,便于上位机结合具体地址定位当前程序所对应的代码位置。
其中在最后设置断点的步骤中可能会出现断点数目溢出的情况,也就是指在设置此断点前所有指令地址比较寄存器已全部在使用的状态,这时无法添加新的指令地址比较寄存器。但由于在逐语句运行的模式下,程序的下一个停止点必然是当前的位置,也就是说,目前已有的指令地址比较寄存器中的断点都不会被触发,因此当前地址断点的设置会借助原本的0号指令地址比较寄存器,而将原本0号指令地址比较寄存器中的内容存储于调试器预留RAM空间中的BPRegist变量,并在恢复全速运行时恢复0号指令地址比较寄存器中的内容。
3.逐过程运行
不存在函数调用的情况下,逐语句运行和逐过程运行并无差异,因此这里只讨论存在当前程序停止位置为函数调用的情况:上位机下达逐过程运行命令,终端接收到后会判断当前程序停止运行处的指令是否为函数调用指令,若是则使能调试监控异常并使能单步执行。在程序运行一个指令后,即进入要调用的函数内部后,再次进入调试监控异常,借助硬件压栈的R14寄存器,在函数返回地址设置断点,随后禁用单步执行,全速运行程序直至命中方才设置的函数返回地址断点,命中后发送相应的寄存器信息至终端。在函数返回地址设置断点时对于断点数目溢出的处理方式与逐语句运行模式下一致。
4.暂停运行
在程序全速运行的过程中,如果有立即暂停程序运行的需求,可以通过调试器下达暂停程序运行的指令。终端在接收到暂停指令后,会立即启用单步执行,随后程序继续运行一个指令后,再次进入调试监控异常后,禁用单步执行,并根据当前触发调试监控异常的程序地址来设置指令地址比较器,即在当前位置设置断点使得程序停止运行。这里断点数目溢出的处理方式与逐语句运行模式下一致。
通信模组自适应的软件调试一般方法
软件调试的功能可以在极大程度上帮助开发者进行软件问题的追溯和定位,前文已经基于BIOS框架并结合最基础的串行通信给出了软件调试的具体实现,但串行通信始终受传输距离的限制,为进一步实现终端程序的远程软件调试,并适配纷繁复杂的通信模组,接下来给出通信模组自适应的软件调试一般方法。
由前文的叙述可知,通信模组在软件调试这一功能中并无过多体现,而更多是作为接收上位机调试指令和回发对应调试信息的渠道。因此在上位机程序和终端程序中,在面临不同通信模组间的移植时,对于调试期间内的信息传输,只需将对应信息的收发接口改为对应通信模组的收发函数即可。
此外还需考虑的是软件调试的程序入口,终端的软件调试程序本质上仍然是动态命令的子程序,在通信模组接收到一帧数据之后,仍然先要经过动态命令对数据的解析来进入相应的软件调试分支。因此对不同的通信模组建立软件调试功能的先决条件仍然是将当前通信模组接入动态命令体系,随后动态命令与上位机只需要协定一个适配于动态命令内调试功能的数据帧结构,即可进行相互通信。
至此可以发现,由“串口调试”引入“通信模组自适应的软件调试一般方法”的探索步骤,主要流程如下:
(1)向通信模组发送动态命令数据,并由User程序写入。
(2)向通信模组发送程序跳转的系统指令。User程序接收指令,跳转至BIOS。
(3)BIOS启动过程中默认调用动态命令函数。在动态命令内首先修改程序运行状态,完成BIOS的驻留;其次完成通信模组的初始化和中断使能;并设置BIOS程序中断向量表内对应于通信模组的中断服务例程地址为动态命令函数;最后告知上位机,相关初始化步骤已执行完毕,可以开始程序更新。
(4)上位机开始向通信模组发送启动调试模式等相关指令,开始正式调试。退出调试模式后,恢复所有程序的中断向量表并复位,开始程序的正常执行。
动态命令内主要决策算法如下。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (6)
1.一种嵌入式终端远程软件调试方法,其特征在于,包括:
通过BIOS工程内的动态命令体系实现软件调试程序的动态加载,并在动态命令内给出调试必要函数的具体实现;
借助闪存地址重载及断点单元完成断点的相关设置,并在负责捕获断点的调试监控异常内完成相应调试信息的输出;
通过全速运行、逐语句运行、逐过程运行和暂停模式进行远程软件调试;
所述全速运行包括:在终端程序处于停止运行状态时,在上位机通过全速运行指令使得程序恢复运行状态,直至遇到下一个断点或暂停指令;终端程序在接收到全速运行指令后,修改寄存器使能调试监控异常,并启用单步执行;随后判断当前程序的停止运行是由断点触发还是由暂停运行指令触发,若由断点触发则禁用对应的指令地址比较寄存器,并对当前调试器的状态进行标记;重新恢复运行状态,执行单个指令,然后重新进入调试监控异常处理程序,并结合当前调试器的状态,禁用单步执行,若先前由断点停止程序运行则将对应的指令地址比较寄存器恢复使能,直至遇到下一个断点或暂停指令;
所述逐语句运行包括:在当前程序暂停运行时,上位机下达逐语句运行命令,终端接收到后使能调试监控异常并使能单步运行,若当前程序停止位置为断点,禁用当前断点,随后程序继续运行一个指令后,再次进入调试监控异常,禁用单步运行,若之前有禁用的断点则恢复断点,并在当前程序停止位置设置断点,使得程序停止运行并发送对应的寄存器信息至上位机,便于上位机结合具体地址定位当前程序所对应的代码位置;
所述逐过程运行包括:上位机下达逐过程运行命令,终端接收到后判断当前程序停止运行处的指令是否为函数调用指令,若是则使能调试监控异常并使能单步执行;在程序运行一个指令后,即进入要调用的函数内部后,再次进入调试监控异常,借助硬件压栈的R14寄存器,在函数返回地址设置断点,随后禁用单步执行,全速运行程序直至命中设置的函数返回地址断点,命中后发送相应的寄存器信息至终端;
所述暂停模式包括:终端在接收到暂停指令后,启用单步执行,随后程序继续运行一个指令后,再次进入调试监控异常后,禁用单步执行,并根据当前触发调试监控异常的程序地址来设置指令地址比较器,即在当前位置设置断点使得程序停止运行。
2.根据权利要求1所述一种嵌入式终端远程软件调试方法,其特征在于,
所述调试必要函数包括调试监控异常中断处理函数。
3.根据权利要求1所述一种嵌入式终端远程软件调试方法,其特征在于,进一步包括启动调试模式的流程,包括:
发送动态命令和调试模式启动指令;
修改User程序中断向量表;
启动User程序。
4.根据权利要求1所述一种嵌入式终端远程软件调试方法,其特征在于,进一步包括调试信息的返回和调试模式的退出。
5.根据权利要求1所述一种嵌入式终端远程软件调试方法,其特征在于,
所述借助闪存地址重载及断点单元完成断点的相关设置,包括:
FPB控制寄存器解析;
FPB指令地址比较寄存器解析;
断点的设置;
断点的取消。
6.根据权利要求1所述一种嵌入式终端远程软件调试方法,其特征在于,进一步包括:
向通信模组发送动态命令数据,并由User程序写入;
向通信模组发送程序跳转的系统指令,User程序接收指令,跳转至BIOS;
BIOS启动过程中默认调用动态命令函数;动态命令内首先修改程序运行状态,完成BIOS的驻留;其次完成通信模组的初始化和中断使能;并设置BIOS程序中断向量表内对应于通信模组的中断服务例程地址为动态命令函数;最后告知上位机,相关初始化步骤已执行完毕,可以开始程序更新;
上位机开始向通信模组发送启动调试模式相关指令,开始正式调试;退出调试模式后,恢复所有程序的中断向量表并复位,开始程序的正常执行。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110472347.6A CN113111001B (zh) | 2021-04-29 | 2021-04-29 | 一种嵌入式终端远程软件调试方法 |
PCT/CN2021/122777 WO2022227410A1 (zh) | 2021-04-29 | 2021-10-09 | 一种嵌入式终端远程软件调试方法 |
US17/761,585 US12124355B2 (en) | 2021-04-29 | 2021-10-09 | Remote software debugging method for embedded terminals |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110472347.6A CN113111001B (zh) | 2021-04-29 | 2021-04-29 | 一种嵌入式终端远程软件调试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113111001A CN113111001A (zh) | 2021-07-13 |
CN113111001B true CN113111001B (zh) | 2023-10-24 |
Family
ID=76720395
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110472347.6A Active CN113111001B (zh) | 2021-04-29 | 2021-04-29 | 一种嵌入式终端远程软件调试方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN113111001B (zh) |
WO (1) | WO2022227410A1 (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113111001B (zh) * | 2021-04-29 | 2023-10-24 | 苏州大学 | 一种嵌入式终端远程软件调试方法 |
CN113568349B (zh) * | 2021-07-27 | 2023-05-02 | 深圳市轱辘车联数据技术有限公司 | 数据处理方法、装置、终端设备及可读存储介质 |
CN114238098B (zh) * | 2021-12-09 | 2024-09-17 | 上海创景信息科技股份有限公司 | 基于数据断点的嵌入式软件堆栈使用情况动态分析方法和系统 |
CN116383091B (zh) * | 2023-05-29 | 2023-08-29 | 珠海妙存科技有限公司 | eMMC验证平台的启动方法、启动装置及存储介质 |
CN117170987B (zh) * | 2023-11-03 | 2024-03-08 | 睿思芯科(深圳)技术有限公司 | 嵌入式实时操作系统的监视方法、系统及相关设备 |
CN117609097A (zh) * | 2023-12-22 | 2024-02-27 | 深圳市宇泰科技有限公司 | 一种基于嵌入式应用软件的云平台远程调试方法及系统 |
CN117453495B (zh) * | 2023-12-26 | 2024-03-26 | 睿思芯科(成都)科技有限公司 | 支持在线纠错和调试的芯片、设计方法及相关设备 |
CN117472790B (zh) * | 2023-12-28 | 2024-03-15 | 南京翼辉信息技术有限公司 | 一种嵌入式操作系统的远程调试实现方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6205560B1 (en) * | 1996-02-27 | 2001-03-20 | Via-Cyrix, Inc. | Debug system allowing programmable selection of alternate debug mechanisms such as debug handler, SMI, or JTAG |
CN101183330A (zh) * | 2007-12-13 | 2008-05-21 | 东信和平智能卡股份有限公司 | 嵌入式系统的在线调试系统及其调试方法 |
CN103235755A (zh) * | 2013-04-16 | 2013-08-07 | 合肥联宝信息技术有限公司 | 一种bios远程网络调试方法 |
CN105867949A (zh) * | 2016-04-29 | 2016-08-17 | 中国人民解放军国防科学技术大学 | 一种面向多结点服务器的bios在线刷新方法 |
CN110018965A (zh) * | 2019-04-12 | 2019-07-16 | 广东虹勤通讯技术有限公司 | 一种bios单步调试控制方法、装置及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113111001B (zh) * | 2021-04-29 | 2023-10-24 | 苏州大学 | 一种嵌入式终端远程软件调试方法 |
-
2021
- 2021-04-29 CN CN202110472347.6A patent/CN113111001B/zh active Active
- 2021-10-09 WO PCT/CN2021/122777 patent/WO2022227410A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6205560B1 (en) * | 1996-02-27 | 2001-03-20 | Via-Cyrix, Inc. | Debug system allowing programmable selection of alternate debug mechanisms such as debug handler, SMI, or JTAG |
CN101183330A (zh) * | 2007-12-13 | 2008-05-21 | 东信和平智能卡股份有限公司 | 嵌入式系统的在线调试系统及其调试方法 |
CN103235755A (zh) * | 2013-04-16 | 2013-08-07 | 合肥联宝信息技术有限公司 | 一种bios远程网络调试方法 |
CN105867949A (zh) * | 2016-04-29 | 2016-08-17 | 中国人民解放军国防科学技术大学 | 一种面向多结点服务器的bios在线刷新方法 |
CN110018965A (zh) * | 2019-04-12 | 2019-07-16 | 广东虹勤通讯技术有限公司 | 一种bios单步调试控制方法、装置及系统 |
Non-Patent Citations (1)
Title |
---|
嵌入式远程调试器保护模式下调试功能的实现;姚放吾 等;计算机技术与发展(第04期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
WO2022227410A1 (zh) | 2022-11-03 |
CN113111001A (zh) | 2021-07-13 |
US20240045788A1 (en) | 2024-02-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113111001B (zh) | 一种嵌入式终端远程软件调试方法 | |
CN109726135B (zh) | 一种多核调试方法、装置及计算机可读存储介质 | |
US5621886A (en) | Method and apparatus for providing efficient software debugging | |
US5740413A (en) | Method and apparatus for providing address breakpoints, branch breakpoints, and single stepping | |
US8136097B2 (en) | Thread debugging device, thread debugging method and information storage medium | |
US6694457B2 (en) | System and method for monitoring execution of privileged instructions | |
US7950001B2 (en) | Method and apparatus for instrumentation in a multiprocessing environment | |
US8745596B2 (en) | Program debugging with dynamically inserted instrumentation | |
US20120011491A1 (en) | Efficient recording and replaying of the execution path of a computer program | |
US20050268195A1 (en) | Apparatus and method for improving emulation speed of high-level languages in on-chip emulation systems | |
JPH09325901A (ja) | デバッギングを実施する方法 | |
US20080301408A1 (en) | System comprising a plurality of processors and method of operating the same | |
US5680584A (en) | Simulator system for code execution and debugging within a multi-architecture environment | |
KR20080028827A (ko) | 마이크로프로세서에서 복수의 인스트럭션 스트림/복수의데이터 스트림 확장을 인에이블링하는 방법, 시스템 및기계-판독 가능한 기록 매체 | |
WO2006132807A2 (en) | Microprocessor instruction that allows system routine calls and returns from all contexts | |
US6330691B1 (en) | Use of dynamic translation to provide breakpoints in non-writeable object code | |
US20110126175A1 (en) | Debugging method and debugging device using hardware breakpoints | |
CN107526622B (zh) | Linux的快速异常处理方法及装置 | |
CN110045992B (zh) | 一种适用于多核板卡的通用系统及方法 | |
Chiba et al. | Using HotSwap for implementing dynamic AOP systems | |
US5150474A (en) | Method for transferring arguments between object programs by switching address modes according to mode identifying flag | |
US12124355B2 (en) | Remote software debugging method for embedded terminals | |
Lawall et al. | Tarantula: Killing driver bugs before they hatch | |
Cormack | The rump kernel: A tool for driver development and a toolkit for applications | |
US20080133838A1 (en) | Data processing device |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |