专利名称:嵌入式系统内存越界错误快速定位方法
技术领域:
本发明涉及嵌入式系统,具体涉及嵌入式系统内存越界错误快速定位方法。
背景技术:
内存越界错误是软件中比较常见的错误,也是非常致命的错误。C语言的广泛应用是一把双刃剑,好处是它使大量的没受过专业教育的人员能够较快的掌握程序设计,具备一定软件设计能力,也使软件编码过程大大缩短,坏处是或者是由于项目进度的压力,或者是由于程序员的失误,很多应该在编译阶段就排除的软件错误,没有被编译系统发现;或者已被发现并有警告信息输出,但是被程序员忽略;最后演变成严重的运行错误,内存越界错误多数就由此产生,如图4、图5、图6和图7这几种情况,错误的根源都很微小,或掉了个“ ”号,或循环变量数值仅仅多了 I,看起来只是个简单笔误,但引起了内存越界错误。内存越界错误由于对内存的不合法使用,产生的后果非常严重,轻者由于使用的数据并非正确数据,导致系统输出错误的结果,如图4和图6的情形,虽然软件读越界或写越界,但由于误读的数据或误修改的数据未进一步使用,而是直接输出了,在这种情况下,系统仍健壮,但输出结果错误;重者由于越界错误破坏了系统核心,导致系统崩溃,如图5和图7的情形,前者将一个非预期的数据当作一个函数执行,后果可想而知,后者则直接清除了中断向量表,当有中断产生时系统将崩溃。而且,随着系统趋于庞大,内存越界错误越来越难找到直接原因,尤其是在引起内存越界的执行路径执行的概率非常低时。一个模块引起的内存越界错误,排查时间有时甚至远远超过设计该模块的时间。嵌入式系统由于它本身的固有特性,调试往往采用结合主机和目标机的远程调试,每一步调试都需要主机和目标机的多次交互,调试效率极低,排查内存错误的困难远比单纯调试主机软件大。因此,调试主机软件的有效手段“设断点“、“单步”、“在断点处检查变量和内存”等等,基本不能在嵌入式系统中运用,排查嵌入式系统的隐蔽错误常常通过代码检查和在可疑代码内部插入打印某些重要变量的语句然后基于打印的信息进行分析的方式完成,而这些,需要在花费大量的时间的基础上才能实现,并且,这些调试手段是否有效很大程度上依赖于编程人员的能力和经验。由此可见,急需一种嵌入式系统内存越界错误快速定位方法,以减少排查嵌入式系统隐蔽错误的时间,提闻系统调试的效率。
发明内容
本发明所要解决的技术问题是解决嵌入式系统在调试过程中,对于内存越界错误排查时间长的问题。为了解决上述技术问题,本发明所采用的技术方案是提供一种嵌入式系统内存越界错误快速定位方法,包括以下步骤
通过可编程逻辑器件监视其上配置的若干越界使用内存区域,当任何一个所述越界使用内存区域被访问时产生中断;
CPU查询中断前正在执行的当前任务,并根据当前任务的指令计数器得到访问所述越界使用内存区域的函数;
根据所述可编程逻辑器件上配置的合法访问任务集和合法访问函数合,确定所述函数是否为引起内存越界的函数,并输出引起内存越界的函数的任务名及指令地址。在上述方法中,所述越界使用内存区域包括起始地址、结束地址和活跃标志区,当越界使用内存区域被访问时,其标志区设定为“活跃”,并清除其它越界使用内存区域的“活跃”标志;
所述合法访问任务信息包括任务标识和任务名;
所述合法访问函数信息包括函数名、函数起始地址和函数结束地址;
所述任务名与所述函数名相关联。在上述方法中,所述可编程逻辑器件周期性地对CPU地址总线采样,获得当前任务使用的内存地址。在上述方法中,根据所述当前任务的任务控制块信息得到访问所述越界使用内存区域的指令地址,并根据可编程逻辑器件中配置的任务集和函数集,判断所述当前任务是否为访问所述越界使用内存区域的合法访问任务,同时判断上述指令地址对应的函数是否为访问所述越界使用内存区域的合法访问函数,如果上述两个判断结果中至少有一个为否,则输出当前任务名及指令地址。本发明,借助于可编程逻辑器件,结合硬件和软件,快速确定引起内存越界错误的任务(或进程,以下都以任务表示)以及该任务调用的直接引起内存越界错误的具体函数,以减少了排查嵌入式系统隐蔽错误的时间,提高系统调试的效率。
图I为本发明的流程 图2为可编程逻辑器件与CPU的连接关系示意 图3为可编程逻辑器件的配置信息示意 图4为内存读越界对系统的轻度影响示意图; 图5为内存读越界对系统的崩溃性影响示意 图6为内存写越界对系统的轻度影响示意 图7为内存写越界对系统的崩溃性影响示意 图8为实时多任务操作系统的任务控制块实例。
具体实施例方式本发明提供的嵌入式系统内存越界错误快速定位方法,通过可编程逻辑器件监视其上配置的若干越界使用内存区域,并在任何一个越界使用内存区域被访问时产生中断,(PU根据中断判断当前任务及访问越界使用内存区域的函数是否合法,并输出引起内存越界的函数及指令地址。下面结合附图对本发明作出详细的说明。图I为本发明的流程图,如图I所示,嵌入式系统内存越界错误快速定位方法包括以下步骤。
步骤I :在可编程逻辑器件上设定若干越界使用内存区域以及合法访问上述内存区域的任务集和函数集,简称为合法访问任务集和合法访问函数集。如图3所示,每一个越界使用内存区域包括起始地址、结束地址和活跃标志区,当多个越界使用内存区域中的某一个被访问时,其标志区设定为“活跃”;标志位“活跃”目的是区分越界使用内存区域中哪一个当前在被访问,以方便软件处理。每一个合法访问任务包括任务标识和任务名;每一个合法访问函数包括函数名、函数起始地址和函数结束地址;任务名与函数名相关联。步骤2、通过CPU设定可编程逻辑器件的采样频率,通过可编程逻辑器件上的监视任务监视其上配置的若干越界使用内存区域,当任何一个越界使用内存区域被访问时产生中断。监视任务的启动和停止由CPU发出的启动或停止命令控制。具体说明如下
图2是可编程逻辑器件与CPU的连接示意图,这里只给出了为实现地址总线监测采样 部分的连接关系图,而CPU管理和控制可编程器件的接口连接关系具有一般性,在此不再赘述。CPU管理和控制可编程逻辑器件的接口用来实现CPU和可编程逻辑器件之间的信息交互,与系统使用可编程逻辑器件的一般情况相同,即可编程逻辑器件的内部存储作为(PU可访问的地址空间直接使用,也可以将可编程逻辑器件视作CPU的外围设备管理和访问。嵌入式系统的主存储器可以是SRAM或DRAM (包括SDRAM和DDR等),对于SRAM和DRAM,地址总线检测的连接关系和逻辑是有很大差别的,图2实际给出了包括SRAM或DRAM的一个总的连接关系,实际应用中视具体情况而定。如果使用DRAM类存储器件,则只使用地址线“AO. . A31”中的一个子集作为行地址和列地址输入,行选“RAS”、列选“CAS”必须使用,使用SDRAM的系统,“SDRAM_CLK”也需采用。如果使用SRAM类存储器件,则地址线“AO. . A31 ”视SRAM器件的情况选用,“RAS”、“CAS”和“SDRAM_CLK”则不采用。“INTR”是中断请求信号,当可编程逻辑器件判断地址总线采样命中某个已配置好的内存区域范围,则在“ INTR”输出一个脉冲以向CPU请求中断。CPU通过管理控制接口向可编程逻辑器件写入越界使用内存区域(可以是一条或多条)以及合法访问上述内存区域的任务集和函数集,监视内存区域范围信息(可以是一条或多条)、合法任务信息和合法访问函数信息(每个任务集可以包括一条任务,也可以包括多条任务;每个函数集同样可以包括一条函数或多条函数)。如图3所示,越界使用内存区域包括多条内存范围信息,每条内存范围信息包括起始地址、结束地址和活跃标志区;合法任务信息包括任务标识和任务名;合法函数信息包括函数名、函数起始地址和函数结束地址;任务名与函数名相关联。在配置信息设置好后,通过CPU设定可编程逻辑器件的采样频率,值得注意的是采样频率不应低于存储器的访问频率,否则,有可能一些重要的内存访问没有被监测到。然后可编程逻辑器件根据其上的“启动/停止”标志位的状态启动或停止执行监测任务,“启动/停止”标志位可以通过CPU的启动或停止命令改变,也可以根据可编程逻辑器件的工作状态由可编程逻辑器件自动修改,CPU发出启动命令,则”启动/停止”标志位修改为“启动”,CPU发出停止命令,则”启动/停止”标志位修改为“停止”。当“启动/停止”标志位为“启动”时,可编程逻辑器件开始周期性的对地址线采样等操作,否则不做任何操作。如果在可编程逻辑器件采样过程中,CPU修改“启动/停止”标志位为“停止”,则可编程逻辑器件在下一采样周期停止工作。当某次采样确定得到的地址落在某条配置好的内置区域范围内,而且配置的内存区域范围信息多于一条,则置位该内存区域的活跃标志区为“活跃”,清除其它内存区域的活跃标志区的“活跃”标记,并且将“启动/停止”标志位修改为“停止”。然后在中断请求信号“INTR”上输出一个脉冲。上述功能中,除配置信息通过CPU和可编程逻辑器件共同完成外,其它功能由可编程逻辑器件自动完成。步骤3 =CPU查询中断前正在执行的当前任务,并获得所述当前任务的指令计数器,然后基于所述指令计数器的值得到访问所述越界使用内存区域的函数。步骤4 :根据所述可编程逻辑器件上配置的合法访问任务集和合法访问函数集,确定所述函数是否为引起内存越界的函数,并输出引起内存越界的函数的任务及指令地 址。中断服务程序的设计随着CPU和实时多任务操作系统的不同可能存在较大的差异,但主要机制和原理是相似的。大多数情况下如下初始化中断服务程序时将中断服务程序和一个中断向量相连,在中断服务程序开始执行时关中断和清除相关中断状态,在中断服务程序结束时开中断。值得注意的是,在嵌入式系统中,中断服务程序不适宜占用太多的CPU时间,一般情况下,中断服务程序仅仅响应产生中断的时间,记录一些信息,然后通知与该中断关联的任务,大部分工作都交给关联的任务去完成。本发明中,中断服务程序同样设计只做较少的工作,中断服务程序响应中断后,所做的工作是获取当前被中断的任务标识并存储到合适位置,然后通知与中断关联的任务去完成余下工作,之所以要获取当前被中断的任务并缓存,是因为监测任务会抢先执行,系统会发生任务调度,在监测任务开始执行时无法获取真实的当前被中断的任务信息。实际上,监测任务中所完成的合法访问任务和合法访问函数过滤工作及可编程器件中监测任务的启动和停止都可以放在中断服务程序中完成。如果在中断服务程序中完成这些工作的好处是可以防止系统发生过多的任务调度,因为当前活跃任务不是监测任务,那么从当前活跃任务切换到监测任务系统需要重新调度。坏处是如果合法访问任务信息和函数信息过多,合法访问任务和函数信息过滤工作将占用较多的CPU时间,而嵌入式系统中,中断应尽可能少占用CPU时间,因此将这些功能移到监测任务中实现比较好。监测任务是配合中断服务程序而设置的,从技术上来讲,监测任务所做的工作在中断服务程序里都可以实现,但嵌入式系统中,中断服务程序是不适合占用太多CPU时间,因此,大部分工作都移到监测任务中完成更合理。首先,监测任务需从中断服务程序得到通知(通常是以信号量传递的方式),然后开始完成自己的工作(如得不到中断服务程序通知,监测任务则处于阻塞状态)。然后,监测任务需从中断服务程序得到该内存区域的当前访问任务标识A(存储到某个区域),并基于A标识得到任务控制块,任务控制块的实例如图8所示,图8描述的是实时多任务操作系统VXW0RKS中的任务控制块的部分信息。通过任务控制块进一步得到当前执行的指令计数器(指令地址),接着执行合法访问任务过滤功能。如果过滤结果该任务非该内存区域的合法访问任务,则输出该任务信息及指令计数器信息。如果过滤结果该任务是该内存区域的合法访问任务,接着,监测任务还需完成合法访问函数过滤功能,如果过滤结果是合法访问函数,则不执行任何操作,否则输出该任务信息及指令计数器信息。在上述过滤功能及对应的操作完成后,将“启动/停止”标志位修改为“启动”,回到继续等待中断服务程序通知的状态。监测任务实际上是周期性任务,从收到中断服务程序的通知开始,到输出结果或完成过滤但无结果输出结束为一个处理周期。但处理周期不是固定值,而与可编程器件的中断上报关联。本发明中,可编程逻辑器件可以是GAL、CPLD或FPGA等器件,如系统内已有此类器件,可直接与其它功能模块复用此器件,而不需专门增加一片此类器件;如系统内没有此类 器件,则可视具体情况选用合适的器件。嵌入式系统的软件基于实时多任务操作系统,该实时多任务操作系统可以是VXffORKS, LINUX、OS II、ECOS等嵌入式操作系统中的一种。本发明不局限于上述最佳实施方式,任何人应该得知在本发明的启示下作出的结构变化,凡是与本发明具有相同或相近的技术方案,均落入本发明的保护范围之内。
权利要求
1.嵌入式系统内存越界错误快速定位方法,其特征在于,包括以下步骤 通过可编程逻辑器件监视其上配置的若干越界使用内存区域,当任何一个所述越界使用内存区域被访问时产生中断; CPU查询中断前正在执行的当前任务,并根据当前任务的指令计数器得到访问所述越界使用内存区域的函数; 根据所述可编程逻辑器件上配置的合法访问任务集和合法访问函数合,确定所述函数是否为引起内存越界的函数,并输出引起内存越界的函数的任务名及指令地址。
2.如权利要求I所述的嵌入式系统内存越界错误快速定位方法,其特征在于, 所述越界使用内存区域包括起始地址、结束地址和标志区,当越界使用内存区域被访问时,其标志区设定为“活跃”,并清除其它越界使用内存区域的“活跃”标志; 所述合法访问任务信息包括任务标识和任务名; 所述合法访问函数信息包括函数名、函数起始地址和函数结束地址; 所述任务名与所述函数名相关联。
3.如权利要求I所述的嵌入式系统内存越界错误快速定位方法,其特征在于, 所述可编程逻辑器件周期性地对CPU地址总线采样,获得当前任务使用的内存地址。
4.如权利要求I所述的嵌入式系统内存越界错误快速定位方法,其特征在于, 根据所述当前任务的任务控制块信息得到访问所述越界使用内存区域的指令地址,并根据可编程逻辑器件中配置的任务集和函数集,判断所述当前任务是否为访问所述越界使用内存区域的合法访问任务,同时判断上述指令地址对应的函数是否为访问所述越界使用内存区域的合法访问函数,如果上述两个判断结果中至少有一个为否,则输出当前任务名及指令地址。
全文摘要
本发明公开了一种嵌入式系统内存越界错误快速定位方法,包括以下步骤通过可编程逻辑器件监视其上配置的若干越界使用内存区域,当所述越界使用内存区域被访问时产生中断;CPU查询中断前正在执行的当前任务,并获得访问所述越界使用内存区域的函数;根据所述可编程逻辑器件上配置的合法访问任务集和合法访问函数集,确定所述函数是否为引起内存越界的函数,并输出引起内存越界的函数的任务及指令地址。本发明,能够快速确定引起内存越界错误的任务以及该任务调用的直接引起内存越界错误的具体函数,减少了排查嵌入式系统隐蔽错误的时间,提高系统调试的效率。
文档编号G06F11/36GK102866951SQ20121035565
公开日2013年1月9日 申请日期2012年9月21日 优先权日2012年9月21日
发明者戴锦友, 余少华, 汪学舜, 刘志炉, 黄婷熙, 朱国胜 申请人:武汉烽火网络有限责任公司