一种嵌入式系统交叉调试方法和装置与流程

文档序号:12786231阅读:245来源:国知局
一种嵌入式系统交叉调试方法和装置与流程

本发明涉及一种调试方法和装置,特别是一种高效的嵌入式系统交叉调试方法和装置。



背景技术:

嵌入式系统交叉调试方法一般分为两种,一种是基于JTAG的片上调试方法,一种是基于调试代理的远程调试方法。

请参阅图1,其为基于JTAG的片上调试方法的连接框图。JTAG是一种国际标准芯片测试协议,目前大多数CPU体系都支持JTAG。基于JTAG的片上调试方法最突出的代表就是JLink调试器,其定义了一个软件调试层面的RDI接口标准,然后JLink调试器将调试环境软件(IAR、KEIL等)发出的RDI接口转化为JTAG命令,对芯片进行调试。该方法多适用于嵌入式系统底层驱动调试、裸系统调试和单应用调试。

请参阅图2,其为基于调试代理的远程调试方法的连接框图。基于调试代理的远程调试方法是在目标机上运行一个调试代理程序,与宿主机的调试器进行通信交互,一起配合完成调试的任务。该方法主要使用软件陷入来模拟断点以接管CPU来完成调试,GDB远程调试是主要代表。一般地,基于调试代理的远程调试方法有两种方式。一种是gdbserver,其能在目标机的系统上独立运行,用于调试有操作系统的应用程序;另一种是stub,其和嵌入式系统程序一起链接运行,一般用于调试系统程序。其中,Gdbserver比较容易,但需要操作系统支持;stub调试比较难,需要针对具体的芯片体系进行移植。两者的工作原理是相似的,GDB调试基于串口协议或者TCP/IP协议。由于调试代理、串口驱动或者TCP/IP驱动需要占用大量的内存空间,因此该方法一般用于内存资源比较丰富的嵌入式系统的调试。

嵌入式系统一般分资源宽裕型系统和资源紧缺型系统,前者CPU处理能力强、内存资源丰富(一般在M字节级以上),如能支持Linux内核运行的嵌入式系统,而其一般都是选用基于调试代理的远程调试方法来进行开发;而后者的CPU处理能力一般、内存资源有限(一般在100K字节以下),多见于单片机控制器类成本敏感的消费类电子系统,系统程序难以和stub程序一起在内存中运行,因此难以选择基于调试代理的远程调试方法来进行开发,而是选择基于JTAG的片上调试方法或者直接串口打印的方式来进行调试。但是,在资源紧缺型嵌入式系统上,针对带操作系统(如基于UCOS内核、FreeRTOS内核)的应用程序进行调试,基于JTAG的片上调试方法也是难以胜任的。特别是对将应用程序存入外存(这也是极大地节省内存成本的常用手段),在需要运行时才进行加载的嵌入式系统,基于JTAG的片上调试方法的效率是比较低的。例如以下场景:

一般带嵌入式操作系统的电子产品往往都具有多个应用,例如一些带LCD屏的音频播放器,它除了有音乐应用,也有图片应用、FM应用、电子书应用等等,同时还可以充当一个U盘进行文件拷贝。该系统同时可能运行一到两个应用,例如听音乐看电子书,而其他应用则不能同时运行。这些应用程序和操作系统、UI资源文件、配置文件都是存在于外存(如nand flash或者nor flash)的固件区,对使用用户不可见;而音乐文件、电子书等则是存在于外存的用户区,对使用用户可见。从中可看成,各个应用程序是分时复用宝贵的内存资源。由于成本敏感,内存资源的大小是经过精心设计的。对于单个应用程序,也会将代码分为常驻内存类型和可切换类型。例如,对性能影响比较大的解码部分代码就需要常驻内存,而选择文件相关的代码则可以在需要时才加载到内存。同时,还可能固化一部分内核的代码以节省内存。这样,就能做到以100K左右的内存来支撑整个系统的运行。这类系统最大的特点就是:应用程序在非运行状态时存储在外存中,在应用运行时才会被操作系统加载到内存中,同时对可切换类型的代码进行调度切换。

如果要调试这种带操作系统类型的应用程序,由于内存的原因,是不可能选择基于调试代理的远程调试方法的;而在选择基于JTAG的片上调试方法时则会遇到以下问题:

由于没有STUB在目标机运行,所以基于JTAG的片上调试方法只能通过JTAG协议接口来对内存进行读写。而上述应用程序包括常驻代码和可切换类型代码,在未运行时需要存储到外存中,在需要的时候才能由定制的操作系统加载到内存中。很明显,JTAG接口无法将代码写到外存中去。因此,需要通过其他的手段将固件(包括操作系统、所有的应用程序、UI资源文件、配置文件)烧写到固件区,才能使用基于JTAG的片上调试方法进行调试。即基于JTAG的片上调试方法不能满足这类系统的写外存需求,只能先通过其他方式写外存之后,再使用JTAG进行调试(读内存、设置断点等)。

请同时参阅图3,其为现有技术中调试带操作系统类型的应用程序的流程图。因此,调试这种带操作系统类型的应用程序一般的流程如下:

(1)调试过程中遇到问题,停止调试,修改程序,编译链接该应用程序。

(2)打包固件,将操作系统、所有的应用程序、UI资源文件、配置文件等打包成一个固件。

(3)烧写固件,一般使用USB量产工具,或者直接的外存烧写工具。

(4)启动系统,并运行到该程序,进入调试状态。

然而,现有技术的这种调试方式最大的问题就是效率很低。因为每次修改程序,都要重新打包整个固件,一般要耗费10分钟,甚至更长;同时,还要重新烧写整个固件,烧写前还要先擦除外存,这里也要耗费不少时间。另外,由于烧写固件和JTAG调试是两套不同的工具,来回切换也需要消耗不少时间。



技术实现要素:

本发明的目的在于克服现有技术的缺点与不足,提供了一种能够高效地进行调试的嵌入式系统交叉调试方法和装置。

本发明通过以下的方案实现:一种嵌入式系统交叉调试方法,包括以下步骤:

步骤S1:上电启动,加载并运行操作系统;

步骤S2:判断是否有接收到进入“更新程序”的触发命令,若是,则进入步骤S3;

步骤S3:操作系统加载程序更新模块及外存对应的驱动程序,并运行该模块程序,接管CPU控制权;

步骤S4:利用JTAG下载修改后的应用程序到内存;

步骤S5:利用JTAG写入应用程序名称、写入内存的起始地址、应用程序大小三个信息到预定内存地址;

步骤S6:当程序更新模块监控到所述预定内存发生变化后,解析该预定内存中的内容,将之前写入到内存中的应用程序(步骤S4)写入到外存的固件区;

步骤S7:在系统固件区的文件系统目录项中添加一条指向新增应用程序的目录记录。

作为本发明的进一步改进,还包括步骤S8:通过LED灯提示更新结束,并执行系统重启。

作为本发明的进一步改进,在步骤S2中,当判断没有接收到进入“更新程序”的触发命令时,执行以下步骤:

步骤S9:进入正常加载状态,从外存固件区文件系统的目录项末尾开始往前检索对应的应用目录项,最先检索到的目录项即是最新的应用程序对应的目录项;

步骤S10:根据最新目录项加载最新的应用程序,并开始运行该应用程序;

步骤S11:再次启动JTAG调试,进入正常的调试状态。

本发明还提供了一种嵌入式系统交叉调试装置,包括:

启动模块,用于加载并启动操作系统;

判断加载模块,用于判断是否有接收到进入“更新程序”的触发命令;如果收到,则进入程序更新状态,由操作系统加载程序更新模块并运行;如果没收到,则进入正常的应用加载状态。

程序更新模块,对预订内存块的内容进行监控。若监控到所述预定内存发生变化后,解析该预定内存中的内容,将之前通过JTAG写入到内存中的应用程序写到外存的固件区;

目录新增模块,用于在系统固件区的文件系统目录项中添加一条指向新增应用程序的目录记录。

作为本发明的进一步改进,还包括提醒模块,用于通过控制LED灯提示更新结束,并执行系统重启。

作为本发明的进一步改进,还包括:

检索模块,用于进入正常加载状态时,从外存系统固件区文件系统的目录项末尾开始往前检索对应的应用目录项,最先检索到的目录项即是最新的应用程序对应的目录项;

加载模块,用于根据最新目录项加载最新的应用程序,并开始运行该应用程序;

调试模块,用于启动JTAG调试,进入正常的调试状态。

相比于现有技术,本发明是通过对操作系统进行局部修改,新增一个“更新程序”状态,将写入到内存的应用程序通过驱动程序写入到外存的系统固件区,并在系统固件区的文件系统目录项中新增一条指向该应用程序的目录项。这时,系统固件区将存在该应用程序的两个版本,一个是旧版本,一个是新版本;同时系统固件区的文件目录项也存在两条记录,分别指向旧版本和新版本的应用程序。但是新版本应用程序对应的目录项位于文件系统目录项的末尾,而旧版本应用程序对应的目录项则位于文件系统目录项的前面。因此,在系统重启后的正常状态下,操作系统将从文件系统目录项的末尾开始向前检索对应的目录项,最先检索到的目录项即是最新的应用程序对应的目录项。接着,操作系统根据最新目录项加载最新的应用程序并运行。此时,再次启动JTAG调试即可进入正常的调试状态,而调试的目标是更新后的应用程序。

相比于现有技术,本发明不需要重新打包整个固件、不需要擦除和烧写整个固件、不需要切换调试工具和烧写工具,仅仅是利用JTAG调试工具下载修改后的应用程序,并重启系统。整个过程将调试效率大大提高。

为了更好地理解和实施,下面结合附图详细说明本发明。

附图说明

图1是基于JTAG的片上调试方法的连接框图。

图2是基于调试代理的远程调试方法的连接框图。

图3是现有技术中调试带操作系统类型的应用程序的流程图。

图4是本发明的嵌入式系统交叉调试方法的步骤流程图。

图5是本发明的嵌入式系统交叉调试装置的模块框图。

具体实施方式

为了解决现有技术中在修改应用程序时,需要重新打包整个固件并进行固件擦除烧写,才能再次进行调试,所耗时间过长的缺陷,本发明提供了一种能够更高效地完成应用程序的更新,以便节约调试时间的调试方法和装置。具体通过以下的实施例进行介绍。

在本发明中,通过对操作系统进行局部修改,新增了一个“更新程序”的状态,将写入到预定内存的应用程序通过驱动程序写入到外存的系统固件区,并在系统固件区的文件系统目录项中新增一条对应该应用程序的目录项记录。这样在系统重启后的正常状态下,操作系统将可以加载到新的应用程序并运行。以下介绍调试的过程。

请参阅图4,其为本发明的嵌入式系统交叉调试方法的步骤流程图。

本发明提供了一种嵌入式系统交叉调试方法,包括以下步骤:

步骤S1:上电启动,加载并运行操作系统。

步骤S2:判断是否有接收到进入“更新程序”的触发命令,若是,则进入步骤S3;当判断没有接收到进入“更新程序”的触发命令时,执行步骤S9。

在本步骤中,可以通过在操作系统启动过程中增加一个按键检测,当检测到按下时,系统将进入“更新程序”状态。如果按键没有按下,即代表进入正常的程序加载运行状态。而作为其他变形方式,也可以通过其他形式实现进入“更新程序”状态。

步骤S3:操作系统加载程序更新模块程序和外存对应的驱动程序,并运行该模块程序接管CPU控制权。

在本步骤中,当系统将进入“更新程序”状态时,可以在启动JTAG调试接管控制权后,通过JTAG将应用程序(bin格式)下载到指定的内存,需确保该该内存区域不被其他模块占用。

步骤S4:利用JTAG下载修改后的应用程序到内存。

步骤S5:利用JTAG写入应用程序名称、写入内存的起始地址、应用程序大小三个信息到预定内存地址。

在本步骤中,用户需要通过JTAG调试命令写入应用程序名称、应用程序下载到内存中的地址、应用程序的长度三个信息写到与程序更新模块商定好的内存块。

步骤S6:当程序更新模块监控到所述预定内存发生变化后,解析该预定内存中的内容,将之前写入到内存中的应用程序写入到外存的系统固件区。

在本步骤中,更新程序会一直监控这块预定内存,当更新程序模块监控到这块内存发生变化后,会解析这块内存的内容,将应用程序从内存写入到固件区。

步骤S7:在系统固件区的文件系统目录项中添加一条指向新增应用程序的目录项记录。

在本步骤中,当将新的应用程序写入到固件区后,需要在固件区的文件系统目录项中添加一条记录指向新的应用程序。由于外存一般是flash,不能直接修改旧的目录项,所以要在有效目录项的最后增加一条记录。

步骤S8:通过LED灯提示更新结束,并执行系统重启。

在本步骤中,当程序更新的过程完成后可以通过LED指示灯来通知用户,代表更新程序完成,可以重启并再次调试。而作为其他的变形方式,也可以通过其他形式进行提醒。

步骤S9:进入正常加载状态,从外存的系统固件区文件系统目录项的末尾开始往前检索对应的应用目录项,最先检索到的目录项即是最新的应用程序对应的目录项。

在本步骤中,当在启动过程中,如按键没有按下,操作系统会进入正常的应用加载运行状态。当要加载某个应用时,先从固件区文件系统目录项的末尾开始往前检索对应的应用目录项。最先检索到的目录项即是最新的应用程序对应的目录项。

步骤S10:根据最新目录项加载最新的应用程序,并开始运行该应用程序。

步骤S11:启动JTAG调试,进入正常的调试状态。

请同时参阅图5,其为本发明的嵌入式系统交叉调试装置的模块框图。另外,结合本发明的系统调试方法,本发明还提供了一种用于实现上述方法的嵌入式系统交叉调试装置,包括:启动模块1、判断加载模块2、程序更新模块3、目录新增模块4、提醒模块5、检索模块6、加载模块7和调试模块8。

首先,通过所述启动模块1,启动并加载运行操作系统。

接着,通过所述判断加载模块2,判断是否有接收到进入“更新程序”的触发命令。若有接收到触发命令,进入“更新程序状态”,操作系统加载程序更新模块及外存对应的驱动程序,并运行该模块程序,接管CPU控制权。

然后,所述程序更新模块3,对预定内存进行监控。当监控到所述预定内存发生变化后,解析该预定内存中的内容,将该预定内存中的应用程序写入到外存的系统固件区。

接着,通过所述目录新增模块4,在系统固件区的文件系统目录项添加一条指向新增应用程序的目录项记录。

最后,通过提醒模块5,用于通过控制LED灯提示更新结束,并执行系统重启。

如果所述判断加载模块没有收到触发命令时,则进入正常的应用加载状态时,执行以下的处理流程:

通过检索模块6,从外存的系统固件区文件系统目录项的末尾开始往前检索对应的应用目录项,最先检索到的目录项即是最新的应用程序对应的目录项。

再由所述加载模块7,根据最新目录项加载最新的应用程序,并开始运行该应用程序。

最后,启动JTAG调试,进入正常的调试状态。

综上所述,相比于现有技术,本发明是通过对操作系统进行局部修改,新增一个“更新程序”状态,将写入到内存的应用程序通过驱动程序写入到外存的系统固件区,并在系统固件区的文件系统目录项中新增一条指向该应用程序的目录项。这时,系统固件区将存在该应用程序的两个版本,一个是旧版本,一个是新版本;同时系统固件区的文件目录项也存在两条记录,分别指向旧版本和新版本的应用程序。但是新版本应用程序对应的目录项位于文件系统目录项的末尾,而旧版本应用程序对应的目录项则位于文件系统目录项的前面。因此,在系统重启后的正常状态下,操作系统将从文件系统目录项的末尾开始向前检索对应的目录项,最先检索到的目录项即是最新的应用程序对应的目录项。接着,操作系统根据最新目录项加载最新的应用程序并运行。此时,再次启动JTAG调试即可进入正常的调试状态,而调试的目标是更新后的应用程序。

相比于现有技术,本发明不需要重新打包整个固件、不需要擦除和烧写整个固件、不需要切换调试工具和烧写工具,仅仅是利用JTAG调试工具下载修改后的应用程序,并重启系统。整个过程将调试效率大大提高。

本发明并不局限于上述实施方式,如果对本发明的各种改动或变形不脱离本发明的精神和范围,倘若这些改动和变形属于本发明的权利要求和等同技术范围之内,则本发明也意图包含这些改动和变形。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1