为任务死循环提供定位信息的方法和装置制造方法及图纸

技术编号:3843673 阅读:260 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种为任务死循环提供定位信息的方法和装置。所述方法中,在时钟中断处理程序中,连续记录任务被打断时的寄存器上下文信息;当检测到当前任务发生死循环时,将该死循环发生之前记录的当前任务每次被打断时的寄存器上下文信息输出为所述定位信息。使用本发明专利技术能够提供较为丰富的定位信息,从而降低定位难度。

【技术实现步骤摘要】

本专利技术涉及嵌入式系统
,具体涉及为任务死循环提供定位信息 的方法和装置。
技术介绍
图1为一个简化的嵌入式系统任务运行示意图。图中有两个队列, 一个 是"睡眠任务队列",队列中的任务是暂时不需要执行的,必须等待某个触发因素满足条件之后,操作系统才会将其放入"等待运行队列";第二个就 是"等待运行队列",队列中的所有任务已经就绪,只等待操作系统选中自 己运行。系统的任务除了当前正在运行的任务,其他任务都在且仅在其中一 个队列上。如图1所示,假设系统中有N个任务,都在排队等待运行。假设这N 个任务都具有相同的优先级。N个任务轮流使用系统中唯一的CPU资源, 任务1先运行,持续使用CPU资源,直到所需的运行时间得到满足之后, 让出CPU资源,然后排队到任务N的后面,成为新的队尾。接着任务2得 到了 CPU资源并开始运行,假设由于运行过程中需要的关键资源(如内存、 信号量、事件等)没有得到满足,因此在运行一段时间后,让出了 CPU资 源,并排到任务l的后面,成为队尾。如此随着CPU时间序列的不断进展, 队尾任务N也会得到CPU资源并运行,当它完成所需工作,让出CPU资源 后,系统中的N个任务完成了一轮循环。接着,从任务1再次开始新的一 轮循环。在图1中,位于CPU时间序列线下方且指向任务块的一系列箭头表示 时钟中断事件。时钟中断是由硬件定时触发的硬件信号,CPU —旦检测到这个信号,就会按照硬件设定的逻辑中止当前任务的处理,转去执行一段特定 的软件代码,这段代码就称为时钟中断处理程序。当时钟中断处理程序执行 完毕,返回之后,原先被中止的任务就可以从被打断的位置继续执行。为了便于说明问题,这里选择任务1作为描述对象,并假定其是按照如图2所示的逻辑设计运行。当任务1开始运行后,执行步骤A的"任务初始化操作,,,并且只执 行一次。之后将在顺序执行步骤B的"判断消息队列非空"到步骤F的"消 息结束处理"这5步操作。如果在步骤B中判定任务1的消息队列为"空", 则释放CPU资源,操作系统会把任务1放入到睡眠任务队列中,然后从等 待运行队列中选择下一个就续的任务2开始执行。当其他任务给任务l发送 了新的消息后,操作系统就会将任务1从睡眠任务队列中取出来,放入等待 运行队列中排队。当任务1重新开始执行时,如果在步骤B中判定消息队列 为"非空,,,则可以接着执行从步骤C开始的一系列操作,包括步骤C的 "消息初始处理",步骤D的"交给模块l处理"、步骤E的"交给模块2 处理"和步骤F的"消息结束处理"。其中,模块1和模块2是当前任务处 理当前消息时可能会涉及到的功能模块,对于不同任务、不同消息,涉及到 的功能模块可能不同。若任务1的消息队列里有多个消息,则任务1就会重 复执行B到F这5步操作,直到消息队列里的消息被取空。若任务1的运行介于两次时钟中断信号之间,则不会被时钟中断处理程 序打断;若任务1的运行跨越了一个时钟中断信号,则在被时钟中断处理程 序打断的时候,任务1可能正在执行步骤B、 C、 D、 E、 F中的任何一步操 作;若任务1连续处理多个消息,其任务1的运行跨越了多个时钟中断信号, 则任务1在每一次被时钟中断处理程序打断的时候,也可能在执行步骤B、 C、 D、 E、 F中的任何一步操作,且每次打断的位置有可能不一样。由于嵌入式系统任务运行过程比较复杂,任务较多,容易发生死循环, 即任务执行路径进入一个无限循环。为了检测死循环并在发生死循环时及时 告警和提供一些用于死循环定位的信息,通常采用如下方式进行死循环的检测和处理在每次时钟中断信号来的时候,时钟中断处理程序获取当前被打断任务 的累计运行时间。如果当前被打断任务的累计运行时间超过了某个事先设定 的上限阈值,则认为该任务陷入了死循环,发出告警。最常见的告警方式就是打印信息,包括打印死循环的系统告警信息;打印当前任务被打断位置的 寄存器上下文信息,该寄存器包括所有的通用寄存器;打印调用栈信息;这 些打印出的信息用于进行问题定位。接着根据预先设置中止任务的执行或者 重新启动设备。现有技术的不足之处在于,打印出的死循环定位信息不够充分,在某些 情况下依据这些信息难以分析出死循环的原因。例如,仍以任务l为例,若 任务l陷入了死循环,最大的可能是消息队列里总有消息,导致步骤B判断 消息队列非空的操作结果总是"非空",永远得不到"空"的结果,使得任 务l陷入死循环。按现有技术方案,当检测到死循环后,根据打印出的信息 可以知道任务1是在执行B、 C、 D、 E、 F这5步操作的某一步时发生了死 循环。但是这个信息并没有什么价值。原因在于,很显然任务l就是被设计 成一个循环,只要任务l在运行,任何一次时钟中断信号发生时,时钟中断 处理程序一定是在B, C, D, E, F这5步操作的某一步打断了任务的运行。我们可以设想这样一个场景,假设问题发生的根源在于,在执行步骤D 的"交给模块1处理"操作时,错误的给任务1自己发送了一个消息。按照 图2的处理逻辑,步骤D完成后,任务1的消息队列中增加了一个消息。 当任务1执行完步骤F的"消息结束处理"操作后,回到步骤B的"判断 消息队列非空",此时得到的结果是"非空",又可以继续执行;到了步骤 D的"交给模块l处理"时,发送完消息,消息队列又从空变成了非空。如 此就一直循环执行下去。所以,正是由于这个消息,使得任务l的处理陷入 了 一个不能结束的死循环状态。可见,现有的死循环检测技术除了报告了一次死循环,并提供检测到死 循环时的寄存器上下文信息和调用栈信息,并没有提供更多的有价值信息,采用这些有限的信息进行死循环定位难度很大。
技术实现思路
有鉴于此,本专利技术提供了一种为死循环提供定位信息的方法,能够提供 较为丰富的死循环定位信息,从而降低定位难度。该方法包4舌在时钟中断处理程序中,连续记录任务被打断时的寄存器上下文信息;当检测到当前任务发生死循环时,将该死循环发生之前记录的当前任务 每次被打断时的寄存器上下文信息输出为所述定位信息。其中,记录的所述寄存器上下文信息包括通用寄存器上下文信息中任 务被打断的位置信息。较佳地,记录的所述寄存器上下文信息进一步包括硬件状态寄存器中 的信息,和/或所述通用寄存器上下文信息中除任务被打断的位置信息之外 的信息。较佳地,所述记录任务被打断时的寄存器上下文信息的同时,进一步记 录当前调用栈信息;当检测到当前任务发生死循环时,进一步将该死循环发生之前记录的当 前任务每次被打断时的调用栈信息输出为所述定位信息。其中,所述在时钟中断处理程序中,连续记录任务被打断时的寄存器上 下文信息,包括预先定义数组和数组索引,数组索引用于指示将数据存入所述数组时的 存储位置;每次任务切换时,将所述数组索引置为初始值;在时钟中断处理程序中,获取当前任务被打断时的寄存器上下文信息, 将获取的信息存入所述数组,将所述数组索引的值递增。较佳地,所述数组中数组元素的个数为fxT; f为系统时钟中断的发生 频率;T为预设的任务累计运行时间的上限阈值,当任务的累计运行时间大于T,则判定任务进入死循环。较佳地,所述数组采用循环记录方式,当所述数组索引的值等于所述数 组中数组元素个数减1时,则将所述数组索引重置为初始值。其中,本文档来自技高网
...

【技术保护点】
一种为死循环提供定位信息的方法,其特征在于,该方法包括: 在时钟中断处理程序中,连续记录任务被打断时的寄存器上下文信息; 当检测到当前任务发生死循环时,将该死循环发生之前记录的当前任务每次被打断时的寄存器上下文信息输出为所述定位 信息。

【技术特征摘要】

【专利技术属性】
技术研发人员:余斌
申请(专利权)人:杭州华三通信技术有限公司
类型:发明
国别省市:86[中国|杭州]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1