基于中断通讯的嵌入式系统的在线调试仿真方法

文档序号:6464808阅读:216来源:国知局

专利名称::基于中断通讯的嵌入式系统的在线调试仿真方法
技术领域
:本发明涉及嵌入式系统,尤其涉及对嵌入式系统的在线调试仿真方法。
背景技术
:嵌入式系统的调试仿真一般分为软件离线仿真和在线硬件调试仿真,软件离线仿真对仿真程序要求比较高,且得不到实际运行过程中硬件的实时信息,而嵌入式系统一般直接和硬件打交道,因而此方法受到局限。在线硬件调试仿真可直接在运行硬件系统上进行在线调试仿真,传统的单片机仿真器硬件系统有的采用专用仿真的单片机。如arm架构的微处理器(mcu),通常都有jtag协议及硬件支持来实现在线调试仿真,能够得到运行过程中的实时信息,最大程度地提高了调试仿真效率。对于自身没有专用^5更件支持的微处理器(如51系列mcu)也有仿真器支持在线调试仿真,但使用仿真器无疑提高了开发成本,且受到仿真器的制约。有的采用两套单片机,一个单片机用于仿真,另一个单片机则用于目标单片机。这样同样也会提高开发成本。
发明内容本发明要解决的技术问题是提供一种基于中断通讯的嵌入式系统在线调试仿真方法,无需额外硬件即可实现在线调试仿真,且资源占用少。为了解决上述技术问题,本发明提供了一种基于中断通讯的嵌入式系统的在线调试仿真方法,该嵌入式系统同时作为调试目标系统和仿真器并具有一通讯接口,可接收调试主机通过该通讯接口发送的中断信号及操作指令,该在线调试仿真方法包^":需要将运行着的用户程序桂起时,所述调试主机向所述嵌入式系统发送中断信号后再发送准备调试的指令;所述嵌入式系统响应中断后,接收和执行所述指令,先保存堆栈中的程序指针和用户程序断点现场信息,再修改推栈中的程序指针为监控所述通讯接口的一死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环;需要恢复用户程序运行时,所述调试主机向所述嵌入式系统发送中断信号后再发送准备运行用户程序的指令;所迷嵌入式系统响应中断后,接收和执行所述指令,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,将运行状态置为用户程序运行态后,推栈恢复用户程序断点现场,中断返回到用户程序被挂起的位置继续运行。进一步地,上述在线调试仿真方法还可具有以下特点所述嵌入式系统处于调试态或用户程序运行态时,所述调试主机向所述嵌入式系统发送中断信号后发送指令对所述嵌入式系统的数据和/或寄存器进行读、写操作;所述嵌入式系统响应中断后,接收和执行所述指令,判断当前运行状态为调试态或用户程序运行态时,推栈恢复断点现场,中断返回到所述死循环或用户程序。进一步地,上述在线调试仿真方法还可具有以下特点需要实现用户程序的单步运行时,在所述嵌入式系统处于调试态时,所述调试主机向所述嵌入式系统发送中断信号后发送准备单步运行的指令,所述嵌入式系统响应中断,接收、执行所述指令后,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,置位所述通讯接口中断标识产生软中断并将运行状态置为单步运行态后,推栈恢复用户程序断点现场,中断返回到用户程序,运行一条指令后响应所述软中断;所述嵌入式系统响应软中断后,判断当前运行状态为单步运行态,先保存堆栈中的程序指针和用户程序断点现场信息,再修改推栈中的程序指针为所述死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环,完成了对用户程序的单步运行。进一步地,上述在线调试仿真方法还可具有以下特点需要实现用户程序的多步运行时,在所述嵌入式系统处于调试态时,所述调试主机向所述嵌入式系统发送中断信号后发送准备单步运行的指令,并设置一步数值,所述嵌入式系统响应中断,接收、执行所述指令后,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,置位所述通讯接口中断标识产生软中断并将运行状态置为单步运行态后,推栈恢复用户程序断点现场,中断返回到用户程序,运行一条指令后响应软中断;所述嵌入式系统响应软中断后,判断当前运行状态为单步运行态,将所述步数值减一后判断该步数值是否为0,如果不为0,再置位串口中断标识产生软中断,推栈恢复用户程序断点现场,中断返回到用户程序运行一条指令,再按相同的方式响应软中断;如果该步数值为0,先保存堆栈中的程序指针和用户程序断点现场信息,再修文推栈中的程序指针为所述死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环,完成此次用户程序的单步或多步运行。进一步地,上述在线调试仿真方法还可具有以下特点所述嵌入式系统运行状态用一运行状态标志来指示,所述调试主机向所述嵌入式系统发送的准备调试、准备运行用户程序和准备单步运行的指令,是分别将该运行状态标志置为准备调试态、用户程序准备运行态和准备单步运行态;所述嵌入式系统执行所述调试主机发送的指令后,先根据所迷运行状态标志判断当前运行状态,根据该当前运行状态来决定收到所述指令后应执行的操作。进一步地,上迷在线调试仿真方法还可具有以下特点通过以下方式实现断点设置在用户程序中的断点位置插入两条指令,一条指令将嵌入式系统运行状态置为准备调试态,另一条指令置位所述通讯接口中断标识产生软中断,用户程序运行到该位置时立即进入中断响应;所述嵌入式系统进入中断响应后,判断当前运行状态为准备调试态,先保存堆栈中的程序指针和用户程序断点现场信息,再修改推栈中的程序指针为所述死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环。进一步地,上述在线调试仿真方法还可具有以下特点所述嵌入式响应中断,接收调试主机发送的指令后,先判断收到的是否对所述运行状态标志的写操作指令,如果是,再判断其是否合法,如果合法再执行该指令,否则,不执行该指令;所迷指令合法是指当前运行状态为用户程序运行态时,写入值为"准备调试态"的值;或者,当前运行状态为调试态时,写入值为"用户程序准备运行态"或"准备单步运行态"的值。进一步地,上述在线调试仿真方法还可具有以下特点所述通讯接口为所述嵌入式系统支持的可与调试主机通讯的接口,所述调试主机发送的中断信号及命令为所述通讯中断信号及命令,所述死循环为无任何数据^喿作的所述通讯端口监控死循环程序。进一步地,上述在线调试仿真方法还可具有以下特点所述通讯*接口为调试仿真和用户程序所共享,所述嵌入式系统响应中断时还需对用户程序发起的通讯进行处理。进一步地,上述在线调试仿真方法还可具有以下特点所述嵌入式系统的中断有优先级,将所述调试主机发送的中断设为最高优先级的中断,以调试其他优先级低于最高优先级的中断服务子程序。实现了用户程序断点设置、挂起用户程序、恢复用户程序运行、单(多)步执行用户程序等的在线调试仿真功能;另通过运行状态机机制,保证整个在线调试仿真过程健壮运行。对没有专用硬件支持的微处理器,只要原有系统支持以中断方式与调试主机通讯就可以采用本发明方法,无需额外硬件即可实现在线调试仿真,具有廉价、简单实用、通用性高等优点。图1是本发明实施例串口通讯过程的流程图2是本发明实现用户程序的正常运行状态与调试仿真的死循环状态之间的转换的原理图3是本发明实施例完整的串口中断响应的流程图4是本发明实施例状态机及其转换的示意图5是本发明实施例状态监控过程的流程图。具体实施例方式本发明可以用于支持以中断方式与调试主机(如电脑)通讯的任意嵌入式系统的调试仿真。下面以MCU的调试仿真为例,结合附图对本发明的具体实施方式进行详细的i兌明。本实施例中,MCU既作为仿真器也作目标机的MCU用,其实质是一种ROM监控器。要实现在线调试仿真,则必然需要有与PC主机通讯的模块,而MCU—般都支持串口中断通讯,串口通讯一般用于MCU与PC主机进行数据交换、命令传送等,也是一个常用的调试仿真手^a。对于在线调试仿真系统而言,需要读写用户程序中的数据和寄存器信息,即利用串口中断通讯实现对MCU数据空间和寄存器的读写。应该说的是,本实施例虽然以MCU为例,但可以适用于对支持中断通讯的任何嵌入式系统的调试仿真。本实施例虽然是以PC主机作为调试主机,但也可以采用其他如专用的调试设备作为主机。本实施例虽然是以串口通讯为例,但也可以通过其他的通讯接口如USB口等来产生中断和实现调试主机和嵌入式系统之间的通讯。文中,除用于实现串口通讯过程的UART—COM()函数,用于实现状态机监控过程的Status一Machine一MonitorO函数,用于实现调试仿真死循环过程的Debug—TaskO函数,以及用于实现MCU状态切换的MCU—Status一Switch()函数,其他的固件(Firmware)程序统称为用户程序。各函数将在下文中逐一进行详细的说明。利用串口进行MCU的数据和寄存器读写需要保证MCU与PC主机准确的通讯握手,用户的读写命令能够准确无误地被解释和操作。本实施例中,PC主机与调试仿真目标系统的串口通讯过程,以格式为"通讯握手命令字十操作命令字+操作目标地址+操作目标值+通讯校验"的通讯协议将用户命令通过串口传达给MCU。其中操作目标地址是指定的数据或寄存器的读地址或写地址,操作目标值为要写入的数据。MCU在响应串口中断后,需要在串口通讯过程中需要对该通讯协议包进行命令解释操作,本实施例通过UART—COM()函数来实现。请参照图1,在该串口通讯过程中执行以下处理MCU读取串口数据后,判断是否通讯握手信号指示为成功?如果否,直接结束;如果是,根据操作命令字判断该命令的类型如果是读数据命令,MCU根据命令中的操作目标地址读出指定地址数据,以查询方式通过串口发送到PC主机,结束;如果是写数据命令,MCU先执行Status一Machine一Monitor0函数实现的一状态机监控过程,如监控通过,将给定数据写入到指定地址,然后再次读取指定地址的数椐,以查询方式通过串口发送到PC主机,结束;如果是读寄存器命令,MCU读取指定寄存器值,以查询方式通过串口发送到PC主机,结束;如果是写寄存器命令,MCU将给定值写入到指定寄存器,然后再次读取指定寄存器值,以查询方式通过串口发送到PC主机,结束。上述流程中,将写入数据再次读出是为了方便用户确认是否写操作成功。有了上述完整的串口通讯,就为在线调试仿真提供了基本通讯保障。在线调试仿真时,要能将运行着的用户程序按用户需要随时停止、重新运行,以及进一步实现用户程序的单步运行和断点设置等功能。而对于没有特殊硬件支持的MCU系统,能够中断运行着的程序的只有中断方法,如果MCU在中断响应时,中断正常运行的用户程序后并不是直接正常中断返回,而是返回到一个调试仿真用的死循环中,不再正常执^i皮中断的用户程序,就可使用户程序被"停止"挂起。用户程序挂^,也可以利用中断,使MCU在中断响应时并不是正常中断返回到调试仿真死循环中,而是返回原来#_中断的用户程序位置继续正常运行,其原理如图2所示。对于中断有优先级的MCU,应将串口中断设为最高优先级,由于最高优先级的中断可以打断低优先级的中断,因此可以在线断点调试仿真任何低于最高优先级的用户中断服务子程序和用户主程序。本实施例用Debug—TaskO函数来实现用户程序的挂起,其实质是一个无任何数据操作的串口监控死循环程序,在其他实施方式中,该死循环也可以用硬件来实现。在用户程序被挂起进入调试仿真过程后,保证MCU依然可以响应串口中断。PC主机通过串口通讯过程得到用户程序^皮挂起后的所有在线信息,或者使MCU接受用户命令。挂起用户程序需要中断资源,为了不占有更多的中断资源,本实施例利用已经开发好的串口通讯中断,同时用户如果需要利用该通讯中断进行用户程序工作也不会受到影响,只需在其中断响应中加入相关程序即可。在线调试仿真而言的单步运行是指每执行一条指令就停止执行,在利用中断对用户程序运行挂起和继续运行的基础上,再利用MCU中断指令完整性原理可实现用户程序被挂起后恢复执行一条指令后再次挂起。所谓中断指令完整性原理就是MCU在执行中断服务程序时(返回指令RETI之前),系统又有新的低于目前中断优先级或同等优先级的中断信号产生,MCU执行完RETI后并不是马上进入新的中断响应,而是会执行完这次中断响应时被中断位置的后面一条指令后再进入新的中断响应,以保证中断指令执行的完整性。根据这一原理,在需要单步运行时,MCU在恢复用户程序运行的串口中断月良务程序中,主动置位串口中断标示位产生软中断,从而在中断返回到用户程序执行一条指令后,马上又响应串口中断将用户程序挂起,实现了单步运行。再通过增加步数计数器,利用单步原珲即可实现多步运行。用户在调试仿真时需要在指定的用户程序位置将程序挂起,即所谓断点设置,要实现断点设置只需在该位置将MCU运行状态修改为准备调试态,再插入一条串口软中断指令,用户程序立即iiX串口中断将用户程序挂起。详见下文中的流程。从上述描述可以看出,中断响应服务程序中需要进行不同的操作,具体执行哪种操作是根据当前的MCU运行状态来决定的。在MCU中设置有MCU运行状态MCU—RUN_STATUS标志,通过对该标志赋值来设置MCU的运行状态。根据上述原理和说明,有以下几种状态用户程序运行态(Run),准备调试态(Ready—Debug),Debug—Task()函数运行而用户程序挂起的调试态(Debug),用户程序准备运行态(Ready—Run),准备单步运行态(Ready—Step),以及单步运行态(Step)。需要说明的是,上述状态的名称完全可以不同,只要与本发明的该状态的作用相同即应视为同一状态。下面将详细说明如何结合状态的设置和转换来实现上述各项功能。首先描述一下如何将运行着的用户程序挂起以进行调试仿真,以及如何恢复用户程序的运行,即用户程序运行态和调试态之间的切换。要实现用户程序运行态与调试态的切换就需要知道用户程序运行的位置和Debug一Task()函数的位置。Debugjask()函数的位置是已知的,而用户程序运行时,MCU的程序指针(PC)即指示了程序的运行地址(下一条运行指令地址)。在中断时,MCU硬件中断系统响应时会将程序指针推入堆栈,在中断返回(执行RETI指令)时,从堆栈中弹出程序指针地址返回原来被中断的程序继续运行,利用中断的这一特性并加以利用,即可实现用户程序运行态与调试态之间的切换。图3示出了MCU完整的串口中断响应流程图,为了清晰起见,下面对各项功能进行分别描述,分别描述时只写出与该功能相关的步骤。要将运行着的用户程序挂起,即从用户程序运行态转换到调试态,PC主机在用户程序运行态下,先向MCU发起串口中断并在fil^的串行通讯过程中发送写数据命令,将MCU一RUN一STATUS置为准备调试态(Read乙Debug),MCU响应串口中断时,执4亍以下步骤步骤302,关中断,清串口中断标识;步骤304,压栈保护断点现场;这里保护的断点现场是用户程序的,如果原来在调试态,保存的断点现场则是Debug一Task()的。步骤306,执行用户串口中断处理过程,这里是指执行除了用于在线调试仿真的其他串口程序,在线调试仿真可以和用户程序共享串口;步骤308,与PC主机进行在线调试仿真的串口通讯过程;在从用户程序运行态转换到调试态的流程中,该步需要根据PC主机的命令将MCU—RUN—STATUS置为Ready一Debug。这里是通过置运行状态标志来通知MCU准备调试,在其它实施例中也可以通过规定一个约定的指令来实现该通知,其它准备运行用户程序和准备单步运行的指令也同此。步骤314,判断MCLLRU1SLSTATUS是否为Step或Ready—Debug,如果是,执行步骤316,否则,执行步骤328,这个分支与本流程无关,暂不描述;图3中,'步骤314、328和340对应的判断框内将MCU—RUN—STATUS简写成MRS。步骤316,先将堆栈中的程序指针和用户程序断点现场信息保存到指定数据区;本实施例使用数组SAVE一STACK一BUF[]来保存用户程序从运行态切换到调试态的核心数据,以MCS51单片机为例,需要保存的堆栈信息包括堆栈指针SP,通用寄存器组R0-R7,通用寄存器A和B,数据指针寄存器DPTR,程序状态寄存器PSW和程序指针PC等,其总长度约为1720Bytes。步骤318,将堆栈中的程序指针修改为DebugJTaskO函数入口地址;Debug_Task就是一个无数据操作的死循环,无需为其另外开辟数据区保存堆栈中的现场数据,知道入口地址就可以切换到该过程。步骤320,将MCU一RUN一STATUS置为调试态(Debug);步骤322,推栈,即将新的推栈按原序推出;步骤324,开中断;步骤326,中断返回到Debug一Task()函数。这样,在中断返回时,MCU将进入DebugJTaskO的死循环中运行,从而挂起了用户程序运行。在该过程中,调试仿真人员可以再次发起串口中断,并通过串口通讯过程完成向MCU读写数据和寄存器值等调试仿真操作。在这些中断响应过程中,MCU根据MCU_RUN_STATUS标志判断当前MCU运行状态为调试态时,在完成串口通讯过程后不进行状态转换相关的操作,正常返回到Debug一Task()的死循环中。当然,本实施例在用户程序运行时,也可以通过中断通讯对MCU中的数据和/或寄存器进行在线读写。请再参照图3,要中断调试仿真用死循环,从调试态(Debug)切换到用户程序运行态(Run)时,PC主机在调试态下,向MCU发起串口中断并在随后的串口通讯过程中发送写数据指令,将MCU一RUN一STATUS置为用户程序准备运行态(Read乙Run),MCU响应串口中断时,执行以下步骤步骤302~步骤314与从用户程序运行态转换到调试态的流程基本相同,区别在于步骤304中是对正在运行的调试死循环程序执行压栈保护断点现场的操作;另外,在步骤308中,MCU在和PC主机进行的串口通讯过程中,是根据PC主机的命令将MCU—RUN—STATUS置为"Ready—Run"。步骤314中,因为MCU判断MCU_RUN—STATUS不等于Ready—Debug和Step,因此会执行以下步骤步骤328,判断MCU—RUlSLSTATUS是否为Read乙Run,如果是,执行步骤330,否则,执行步骤340,这个分支与本流程无关,暂不描述;步骤330,读取指定数据区保存的程序指针和用户程序断点现场信息,重新存入对应堆栈位置;步骤332,将MCU—RUN—STATUS置为运行态(Run);步骤334,推栈恢复用户程序断点现场;步骤336,开中断;步骤338,中断返回到被中断的用户程序被挂起的位置继续运行。请再参照图3,要实现用户程序的单步运行,PC主机在调试态(Debug)下,向MCU发起串口中断并在随后的串口通讯过程中发送写数据指令,将MCU_RUN—STATUS置为准备单步运行态(Read^Step),MCU响应串口中断时,执行以下步骤步骤302步骤314与从调试态切换到用户程序运行态的流程基本相同,区别仅在于在步骤308的MCU在和PC主机进行的串口通讯过程中,是根据PC主机的命令将MCU—RUN—STATUS置为Ready—Step;步骤314中,因为MCU判断MCU一RUN一STATUS不等于Ready—Debug和Step,会执行步骤328,而在步骤328中,因为MCU判断MCU_RUN_STATUS不等于Ready_Run,会执行以下步骤步骤340,判断MCU—RUN一STATUS是否为Ready—Step,如果是,执行步骤342,否则,执行步骤360;步骤342,读取指定数据区保存的程序指针和用户程序断点现场信息,重新存入对应堆栈位置;步骤344,置位串口中断标识位以产生串口软中断;步骤346,将MCU一RUN一STATUS置为单步运行态(Step);步骤348,推栈恢复用户程序断点现场;步骤350,开中断;步骤352,中断返回到被中断的用户程序从^皮挂起的位置继续运行。之后,用户程序单步运行即运行了一条指令后,就会响应串口软中断而进行串口中断响应,此时MCU一RUN一STATUS标志指示为单步运行态(Step),在该串口中断响应过程中,MCU执行步骤302306的过程与从用户程序运行态转换到调试态的流程相同;步骤308中,由于PC主机没有发出读写命令,MCU无需执行串口通讯过程;在步骤314中,MCU判断MCU一RUN—STATUS为Step后,就会执行步骤316-324,将MCU—RUN—STATUS置为Debug即调试态,中断返回到Debug—Task()函数的死循环中运行。在调试态时,用户可进行调试仿真操作,并可再次进行单步运行。步骤360,推栈恢复断点现场;步骤362,开中断;步骤364,中断返回用户程序或Debug—Task()函数。这个分支相当于在此次中断响应过程中不进行状态切换,直接返回到中断时运行的程序中继续运行。要实现单步或多步运行时,可以在每执行一个单步后将所述计数值减一,直至减到o后停止单步运行从而实现单步或多步运行。具体地,在调试态下要实现多步运行时,PC主机向MCU发送中断信号,并在之后的串口通讯过程将MCU_RUN—STATUS置为Ready—Step,同时设置MCU中一步数计数器的步数值(单步运行可设置为1),在该中断响应的后续处理与上述单步运行流程相同,也需要置位产生软中断和将MCU—RUN—STATUS置为Step;之后,MCU执行一条指令后响应软中断,仍按上述单步运行流程执行到步骤314,判断当前运行状态为Step后,先将步数值减l,再判断该步数值是否为0,如为0,再执行步骤316~324,中断返回后进入调试态,此时已实现了用户程序的多步运行。如果步数值不为0,则再置位串口中断标识产生软中断,推栈恢复用户程序断点现场、开中断后,中断返回到用户程序,运行一条指令后,MCU再按上述方式响应软中断。要实现断点设置,只需在用户程序中的该位置插入两条指令,一条指令将MCU运行状态MCU—RUN_STATUS置为准备调试态(Ready—Debug),另一条是置位产生串口软中断的指令,用户程序运行到该位置时,立即会进入串口中断,ii^串口中断后MCU执行的流程与从用户程序运行态切换到调试态的流程基本相同,但无需通过串口通讯将MCU—RUN—STATUS置为Ready—Debug(已经被置为Ready_Debug)。执行完该次中断后,会将用户程序挂起,MCU进入调试态,用户可进行调试仿真操作,并可恢复用户程序运行或进行用户程序的单步运行。图3大方框中就是用户程序与Debug一TaskO之间切换的核心算法过程,文中将其定义为MCU状态切换过程MCLLStatus一Switch()。本发明通过将串口通讯过程和该MCU状态切换过程结合,用户就可以通过PC主机串口中断发调试仿真命令的方法实现对用户程序的在线调试仿真。其中涉及的MCU运行状态机及其转换方式如图4所示,图中线条的箭头方向为转换方向,线条上的数字如"1"表示第1转换路径包括该线条,"2"表示第2转换路径包括该线条,等等。图4中包括以下3条合法的状态转换路径第1转换路径,当MCU处于Run状态时,PC主机通过串口通讯发命令将MCU_RUN—STATUS置为Ready—Debug,MCU响应串口中断时,再将MCU_RUN—STATUS置为Debug,实现Run到Debug的状态转换;或者,当MCU处于Run状态,运行到用户程序中的断点位置时,产生串口软中断并将MCU_RUN—STATUS置为Ready—Debug,MCU响应串口软中断时,再将MCU—RUN—STATUS置为Debug状态,实现Run到Debug的状态转换。第2转换路径,当MCU处于Debug状态时,PC主机通过串口通讯发命令将MCU_RUN_STATUS置为Ready_Run,MCU响应串口中断时,再将MCU—RUN—STATUS置为Run,完成Debug到Run的状态转换;第3转换路径,当MCU处于Debug状态时,PC主机通过串口通讯发命令将MCU—RUN—STATUS置为Ready_Step,MCU响应串口中断时,产生软中断并将MCU_RUN_STATUS置为Step,中断返回后MCU运行一条用户程序指令,再次进入串口中断响应,在该次响应中将MCU一RUN一STATUS置为Debug,实现Debug到Run单步运行一次后再进入Debug状态的转化。除了上述状态机切换外,其他设置都是非法的,会导致整个系统崩溃。避免状态机非法切换的解决方法一用户在PC主机上发送命令时,先得到MCU确切的运行状态后才能发出相应的合法状态切换指令,保证系统的状态正确切换;但该方法中PC主机与MCU之间的通讯需要一定时间,存在用户程序内部断点可能插入切换过程中的风险,造成系统紊乱,因此本实施例釆用了在串口通讯过程中保证状态机正确切换的方法。将如图5所示的用Status—MachintMonitorO函数实现的状态机监控过程插入到UARTJX)MO函数的数据写操作命令中(见图1),以保证系统运行状态机合法切换运行。MCU收到数据写操作命令后,监控过程步骤如下步骤810,判断写地址是否等于MCU一RUN一STATUS标志的地址,如果不等于,继续数据写操作,结束;如果等于,执行步骤820;步骤820,判断MCU—RUN—STATUS是否为Run,如果是,执行步骤830,否则执行步骤840;步骤830,判断写入值是否等于Ready—Debug,如果是,继续数据写操作,结束,否则终止数据写操作,结束;步骤840,判断MCLLRUl^STATUS是否为Debug,如果否,终止数据写操作,结束;如果是,执行步骤850;步骤850,判断写入值是否等于Ready—Run,如果是,继续数据写操作,结束;否则,执行步骤860;步骤860,判断写入值是否等于Read乙Step,如果是,继续数据写操作,结束;否则,终止数据写操作,结束。本实施例基于中断通讯的在线调试仿真方法具有以下优点和特点A,占有资源少,该方法与用户程序共享一个串口中断,不占有额外的中断资源,该方法只多消耗数据空间约30Bytes,如果不需要对寄存器空间的访问,程序空间只需消耗约400Bytes代码空间,如果需要对如所有MCS51单片机所有寄存器进行访问,则需要的代码空间不超过2K。B,无需专用硬件支持。对已经具有中断通讯功能的系统无需修改原有系统硬件,充分利用单片机系统硬件资源,且不影响用户对所有硬件资源的使用。C,该方法具有通用性。只需要微处理器支持与PC主机的中断通讯即可实现,如串口,USB,并口等。D,该方法在初始化串口通讯配置使能中断后,即可在线调试仿真除了程序。该方法与Keil公司在其KeiljiVisionDDE中提供的在线调试仿真方法的比较如下表,本发明方法的优势是很明显的。<table>tableseeoriginaldocumentpage19</column></row><table>权利要求1、一种基于中断通讯的嵌入式系统的在线调试仿真方法,该嵌入式系统同时作为调试目标系统和仿真器并具有一通讯接口,可接收调试主机通过该通讯接口发送的中断信号及操作指令,该在线调试仿真方法包括需要将运行着的用户程序挂起时,所述调试主机向所述嵌入式系统发送中断信号后再发送准备调试的指令;所述嵌入式系统响应中断后,接收和执行所述指令,先保存堆栈中的程序指针和用户程序断点现场信息,再修改椎栈中的程序指针为监控所述通讯接口的一死循环的入口地址,将运行状态置为调试态后推栈,中断返回到该死循环;需要恢复用户程序运行时,所述调试主机向所述嵌入式系统发送中断信号后再发送准备运行用户程序的指令;所述嵌入式系统响应中断后,接收和执行所述指令,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,将运行状态置为用户程序运行态后,推栈恢复用户程序断点现场,中断返回到用户程序被挂起的位置继续运行。2、如权利要求1所述的在线调试仿真方法,其特征在于所述嵌入式系统处于调试态或用户程序运行态时,所述调试主机向所述嵌入式系统发送中断信号后发送指令对所述嵌入式系统的数据和/或寄存器进行读、写操作;所述嵌入式系统响应中断后,4妾收和执行所述指令,判断当前运行状态为调试态或用户程序运行态时,推栈恢复断点现场,中断返回到所述死循环或用户程序。3、如权利要求1或2所述的在线调试仿真方法,其特征在于需要实现用户程序的单步运行时,在所述嵌入式系统处于调试态时,所述调试主机向所述嵌入式系统发送中断信号后发送准备单步运行的指令,所述嵌入式系统响应中断,接收、执行所述指令后,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,置位所述通讯*接口中断标识产生软中断并将运行状态置为单步运行态后,推栈恢复用户程序断点现场,中断返回到用户程序,运行一条指令后响应所述软中断;所述嵌入式系统响应软中断后,判断当前运行状态为单步运行态,先保存堆栈中的程序指针和用户程序断点现场信息,再修改推栈中的程序指针为所述死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环,完成了对用户程序的单步运行。4、如权利要求1或2所述的在线调试仿真方法,其特征在于需要实现用户程序的多步运行时,在所述嵌入式系统处于调试态时,所述调试主机向所述嵌入式系统发送中断信号后发送准备单步运行的指令,并设置一步数值,所述嵌入式系统响应中断,接收、执行所述指令后,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,置位所述通讯接口中断标识产生软中断并将运行状态置为单步运行态后,推栈恢复用户程序断点现场,中断返回到用户程序,运行一条指令后响应软中断;所述嵌入式系统响应软中断后,判断当前运行状态为单步运行态,将所述步数值减一后判断该步数值是否为0,如果不为O,再置位串口中断标识产生软中断,推栈恢复用户程序断点现场,中断返回到用户程序运行一条指令,再按相同的方式响应软中断;如果该步数值为0,先保存堆栈中的程序指针和用户程序断点现场信息,再修改推栈中的程序指针为所述死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环,完成此次用户程序的单步或多步运行。5、如权利要求3所述的在线调试仿真方法,其特征在于所述嵌入式系统运行状态用一运行状态标志来指示,所述调试主机向所述嵌入式系统发送的准备调试、准备运行用户程序和准备单步运行的指令,是分别将该运行状态标志置为准备调试态、用户程序准备运行态和准备单步运行态;所述嵌入式系统执行所述调试主机发送的指令后,先4艮据所述运行状态标志判断当前运行状态,根据该当前运行状态来决定收到所述指令后应执行的操作。6、如权利要求5所述的在线调试仿真方法,其特征在于,通过以下方式实现断点设置在用户程序中的断点位置插入两条指令,一条指令将嵌入式系统运行状态置为准备调试态,另一条指令置位所述通讯接口中断标识产生软中断,用户程序运行到该位置时立即i^V中断响应;所迷嵌入式系统进入中断响应后,判断当前运行状态为准备调试态,先保存堆栈中的程序指针和用户程序断点现场信息,再修文推栈中的程序指针为所述死循环的入口地址,将运行状态置为调试态后,中断返回到该死循环。7、如权利要求5所述的在线调试仿真方法,其特征在于所述嵌入式响应中断,接收调试主机发送的指令后,先判断收到的是否对所述运行状态标志的写操作指令,如果是,再判断其是否合法,如果合法再执行该指令,否则,不执行该指令;所述指令合法是指当前运行状态为用户程序运行态时,写入值为"准备调试态"的值;或者,当前运行状态为调试态时,写入值为"用户程序准备运行态"或"准备单步运行态"的值。8、如权利要求1或2所迷的在线调试仿真方法,其特征在于所述通讯接口为所述嵌入式系统支持的可与调试主机通讯的接口,所述调试主机发送的中断信号及命令为所述通讯中断信号及命令,所述死循环为无任何数据操作的所述通讯端口监控死循环程序。9、如权利要求1或2所述的在线调试仿真方法,其特征在于所迷通讯接口为调试仿真和用户程序所共享,所述嵌入式系统响应中断时还需对用户程序a的通讯进行处理。10、如权利要求1或2所述的在线调试仿真方法,其特征在于所述嵌入式系统的中断有优先级,将所述调试主机发送的中断设为最高优先级的中断,以调试其他优先级低于最高优先级的中断服务子程序。全文摘要一种基于中断通讯的嵌入式系统的在线调试仿真方法,需要将运行着的用户程序挂起时,调试主机发送中断信号和准备调试的指令;嵌入式系统响应后,保存堆栈中的程序指针和用户程序断点现场信息,修改椎栈中的程序指针为监控通讯接口的一死循环的入口地址,将运行状态置为调试态后推栈,返回到该死循环;需要恢复用户程序运行时,调试主机发送中断信号和准备运行用户程序的指令;嵌入式系统响应后,将保存的程序指针和用户程序断点现场信息重新存入对应堆栈位置,将运行状态置为用户程序运行态后,推栈恢复用户程序断点现场,返回到用户程序被挂起的位置继续运行。本发明无需额外硬件即可实现在线调试仿真,且资源占用少。文档编号G06F9/46GK101339581SQ200810119100公开日2009年1月7日申请日期2008年8月29日优先权日2008年8月29日发明者周雪珍,胡庆庆申请人:北京中星微电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1