基于改进任务调度机制的多任务断点调试方法与流程

文档序号:16811189发布日期:2019-02-10 13:40阅读:233来源:国知局
基于改进任务调度机制的多任务断点调试方法与流程

本发明属于工业自动化控制领域,特别提供了基于改进任务调度机制的多任务断点调试方法,用于工业过程控制系统中分布式控制器的软件内核设计。



背景技术:

随着工业生产过程对自动化水平的要求不断提高,dcs/plc控制系统在各个领域得到了广泛的应用。在工艺复杂、控制实时性和精确性要求较高的场合,分布式控制器(以下简称控制器)不仅要有常规的控制功能,而且需要支持多个周期运算任务,以满足同一系统不同对象的控制要求。

应用场景的复杂度直接导致了控制器控制逻辑复杂度的增大,这给逻辑调试带来了诸多不便。常规的逻辑调试方法仅能通过逻辑的运算结果判断逻辑的正确性,而无法获取逻辑运算过程中的断面数据,因此调试效率低下,逻辑漏洞查找困难。为解决上述问题,需要在控制器中集成断点调试功能,以实现对运算任务运行的人为控制。而现有工控厂家往往并不支持该功能或支持的断点调试功能单一。

对于dcs/plc控制系统而言,断点调试,指在控制逻辑的调试过程中,为了找到控制逻辑的错误或漏洞,在控制逻辑的某最小运算单元处设置一个断点,在调试状态下,控制逻辑运算到断点处则停止执行,所有数据保持当前状态。通过设置多个断点或使用诸如逐步、逐页、逐块的虚拟断点,一步一步跟踪控制逻辑的运算过程,根据控制逻辑停止时的断面数据,定位控制逻辑的错误或漏洞。

断点调试通过控制逻辑中的断点干预控制器运算任务的运行过程,其中涉及到控制器对控制逻辑的执行机制。目前控制器对于控制逻辑的处理,一般分为两类,即解释执行机制和编译执行机制。采用解释执行机制的控制器,其内核对算法逻辑边解释边执行。而采用编译执行机制的控制器,其内核执行的是由算法逻辑语言编译形成的机器指令码。如果在采用编译执行机制的控制器上实现调试功能,需要维护算法组态和目标程序之间的编译信息,而采用解释执行机制,则可以简化调试过程。



技术实现要素:

有鉴于此,本发明提供了基于改进任务调度机制的多任务断点调试方法,该方法属于解释执行机制的范畴,整个控制逻辑由若干逻辑组态页组成,每个逻辑组态页由若干个实例化了的算法单元通过输入输出的连接组成。每个算法单元实例对象通过全局唯一的页号和块号组合进行定位标记。在此基础上,实现控制器对多周期逻辑运算任务的支持,以及对控制逻辑的断点调试功能。从而提高控制逻辑的调试效率,更快捷地定位控制逻辑错误或漏洞。

本发明提供的基于改进任务调度机制的多任务断点调试方法,包括如下步骤:

a)根据多运算任务间的协调管理需求,定义一级任务控制块,一个或多个一级任务控制块组成一级任务控制队列;

b)根据单个运算任务的控制需求、断点信息存储需求及运算任务中断后恢复运行所需的必要信息,定义二级任务控制块;

c)在满足多运算任务基本调度需求且多优先级运算任务的周期及负荷相互之间不影响、不受限的条件下,建立多运算任务间的一级任务管理机制,实现在不同时间片内,控制多个运算任务根据优先级的高低顺序依次执行,并将相关控制信息通过一级任务控制块发送到二级任务控制块;

d)依据断点调试功能的类别,针对每类调试指令,建立相应的指令预处理机制,实现调试指令到结构化的任务控制描述的转化并添加到二级任务控制块;

e)定义运算任务的多个运行状态,根据二级任务控制块中的控制信息,实现运算任务不同运行态之间的转换。

其中步骤a)中的一级任务控制块进一步包含运算任务的运算周期、时间计数、运算权需求标记及该运算任务所对应的二级任务控制块入口;一级任务控制块按运算周期由小到大的顺序形成一级任务控制队列。

其中步骤b)中的二级任务控制块进一步包含断点信息列表、控制信息及状态信息三部分;定义断点信息列表,存储多类别可结构化的调试指令信息并设置每个断点信息的生命周期,列表元素包含一级页号和二级块号,采用有序存储;定义控制信息,存储运算任务与一级任务控制过程及调试指令预处理过程交互的信号量;定义状态信息,存储表征运算任务当前运行状态的信息。

其中步骤c)中设置不同运算周期之间的最小步长时间,该时间也是控制器所支持的最小运算周期。

其中步骤c)中多周期运算任务的优先级以周期大小为依据,运算周期越小优先级越高。

其中步骤d)所述的断点调试功能包含以下类别:调试模式设置及取消、继续运算、逐步运算、逐页运算、逐块运算、断点设置、断点删除、断点全部删除。

其中步骤e)所述的运算任务运行状态包括:不存在态、初始化态、运行态、结束态、挂起态、阻塞态、终止态。

其中步骤e)所述的运算任务运行态之间的转换,均由运算任务本身通过二级任务控制块控制信息自行实现,运算任务对外只保留创建和销毁接口。

与现有技术相比,本发明的优点是:在支持多周期运算任务的同时,最大限度地保证了高优先级运算任务的执行及处理器资源的充分利用;实现了对控制逻辑的断点调试功能;支持多类型的调试指令并允许设定断点信息的生命周期;断点信息以结构体列表形式存放,采用一级页号加二级块号的有序存放机制,可减少断点查找时间,提高断点判断的执行效率。

附图说明

图1一级任务控制块及队列示意图;

图2二级任务控制块示意图;

图3一级任务控制流程图;

图4运算权分配流程图;

图5调试指令预处理流程图;

图6运算任务状态转换示意图;

图7运算任务运行流程图;

图8断点列表处理流程图。

具体实施方式

为使本发明的上述内容、特征和优点能够更加清晰易懂,下面结合附图对本发明的详细实施步骤做具体的说明。

本发明基于面向对象的软件开发理念,将控制器的核心运算任务与其他任务解耦。采用中间层语言实现解释执行机制,实现了多周期运算任务运行的控制策略,并支持多类别多数量的调试指令。整个方案主要包含四部分内容,即建立任务控制块结构、建立一级任务控制过程、建立调试指令预处理过程及建立支持断点调试功能的二级任务控制过程。

一、建立任务控制块结构

首先根据多运算任务间的协调管理需求,定义一级任务控制块,一个或多个一级任务控制块组成一级任务控制队列。一级任务控制块至少包含本运算任务的运算周期、时间计数、运算权需求标记及二级任务控制块入口。以一个实施例来说明,一级任务控制块及队列的结构示意图如图1所示,其中包含的信息主要有:

(1)任务周期,表征该运算任务的扫描周期,是一级任务控制过程设置运算权需求标记的依据之一;同时也表征了本运算任务的优先级,任务周期越小,优先级越高,进而决定了本一级任务控制块在队列中的位置。

(2)时间计数,记录运算任务在当前周期内已流逝的时间,时间计数与任务周期相等时表示本周期结束;时间计数大于任务周期时表示新周期的开始,需要将时间计数重置为初始值,并设置运算权需求标记。

(3)运算权需求标记,表征该运算任务是否需要运算权,任务周期开始时设置该标记,运算任务主动释放运算权后清除该标记。

(4)二级任务控制块入口,该运算任务对应的二级任务控制块首地址,用于向二级任务控制块发送控制信息或读取运算任务运行状态。

其次,根据单个运算任务的控制需求、断点信息存储需求及运算任务中断后恢复运行所需的必要信息,定义二级任务控制块。以一个实施例来说明,二级任务控制块的结构示意图如图2所示,主要包含断点信息列表、控制信息、状态信息三部分,分别描述如下:

(1)断点信息列表,由若干个断点信息节点组成,每个断点信息节点包含下述信息:页号,断点运算单元所在页的页号;块号,断点运算单元的块号;生命周期使能,标记生命周期属性是否启用;生命周期,本断点信息的有效命中次数。其中页号、块号组合唯一标识了每个运算单元,也严格定位了每个断点位置;生命周期主要有两方面作用,对于逐步、逐页、逐块的调试指令,可以转化为生命周期为1的断点信息,命中后即清除,此外允许设置每个断点的生命周期,当该值为0时自动清除本断点信息,无需手动删除,如果需要该断点信息长期有效则生命周期使能置0即可,此时,运算任务不再根据生命周期删除断点信息,断点信息的删除由断点删除调试指令触发。

(2)控制信息,存储运算任务与一级任务控制过程及调试指令预处理过程交互的信号量。运算权分配信号,表示运算任务获取到运算权,具备了转入运行态的条件;任务终止信号,表示运算任务即将退出运行,转入终止态至销毁;运算权释放信号,当前周期内运算任务进入结束态或阻塞态时,运算任务设置该信号,表示本运算任务主动交出运算权且当前周期内无需再分配运算权,一级任务控制过程收到该信号后清除其对应的一级任务控制块的运算权需求标记;调试模式设置信号,表示运算任务即将进入调试模式,在运算中要判断断点命中情况,主要响应调试模式设置或取消命令;调试控制信号,控制运算任务由阻塞态到运行态的转换,主要由继续运算调试指令触发。

(3)状态信息,存储表征运算任务当前运行状态的信息。任务运行态,表征运算任务当前所处的运行状态;调试模式标记,表征运算任务是否处于调试模式;当前页号、当前块号,表征即将进行运算的控制逻辑运算单元,其作用主要有两个,一是在运算任务由挂起态、结束态、阻塞态恢复运行态时,指定开始运算的控制逻辑运算单元,二是运算任务处于阻塞态时,指定了当前命中的断点运算单元,调试指令预处理过程据此将逐步运算、逐页运算、逐块运算指令转化为结构化断点信息。

二、建立一级任务控制过程

在定义了合理的一级、二级任务控制块结构之后,首先建立运算任务的一级任务控制过程,主要通过二级任务控制块的运算权分配信号和运算权释放信号控制运算任务的运行状态。

一级任务控制过程遵循图3所示的步骤。首先进入步骤301,等待固定时间的中断指令,该固定时间即为不同运算周期之间的最小步长时间,也是控制器所支持的最小运算周期;中断指令到来后,进入步骤302,更新各一级任务控制块时间计数,对于大于任务周期的时间计数,需要将时间计数重置为初始值;之后进行步骤303的判断,根据时间计数值判断是否有到达新周期的运算任务,如有,则进入步骤304,否则,转入步骤305。

承接步骤304,设置到达新周期运算任务的运算权需求标记,即每个运算任务每个周期内至少获取一次运算权。

之后进行步骤305的判断,根据一级任务控制块的运算权需求标记,判断是否有运算任务等待运算权,如有,则进入步骤306,否则,返回步骤301。

承接步骤306,在所有等待运算权的运算任务中查找优先级最高的运算任务,并将运算权分配给该运算任务,之后等待其主动释放运算权。一旦运算权被主动释放,则回到步骤305,继续下一轮的运算权分配,直至无运算任务需要运算权。此外,步骤306的运行过程可被步骤307的中断指令打断,进而回到步骤302,重复步骤302到306的执行过程。

其中步骤306又可细分为如图4所示的流程。首先进行步骤401的判断,检查运算权是否已被最高优先级的运算任务占用,如是,则进入步骤403,否则,进入步骤402。

承接步骤402,一级任务控制过程强行收回运算权,并重新分配给最高优先级的运算任务,之后进入步骤403。

承接步骤403,等待占有运算权的运算任务释放运算权,之后进入步骤404,清除本运算任务的运算权需求标记,至此,流程结束。

多周期运算任务的优先级以周期大小为依据,运算周期越小优先级越高。

一级任务控制队列按运算周期由小到大,即运算任务优先级由高到低的顺序存储,便于查找不同条件下优先级最高的运算任务。

三、建立调试指令预处理过程

在二级任务控制块结构的基础上,建立调试指令预处理过程,将各类调试指令转化为结构化的任务控制描述,通过对断点信息列表的编辑操作及调试模式设置信号、调试控制信号实现对运算任务的运行状态及模式的控制。

如图5所示,调试指令预处理过程主要包含以下方法步骤:在调试指令缓存区读取一条调试指令,完成步骤501。通过解析调试指令中的页号,查找对应的运算任务及其一级任务控制块,从而定位其二级任务控制块入口,完成步骤502。之后根据不同的指令类别进入不同的处理流程。

进入步骤503,判断本条调试指令是否是调试模式设置或取消指令,如是,则进入步骤504,否则,进入步骤505。

承接步骤504,设置或清除调试模式设置信号,本条指令处理结束。

承接步骤505,判断本条调试指令是否是继续运算指令,如是,则进入步骤506,否则,进入步骤508。

承接步骤506,判断运算任务当前是否处于阻塞状态,如是,则进入步骤507,设置调试控制信号,本条指令处理结束;否则,不做任何处理。

承接步骤508,判断本条调试指令是否是逐步、逐页、逐块运算指令,如是,则进入步骤509,否则,进入步骤512。

承接步骤509,判断运算任务当前是否处于阻塞状态,如是,则进入步骤510,根据当前命中的断点信息,将逐步、逐页、逐块指令,转换成具有一定生命周期的结构化断点信息并根据页号、块号组合按序压入断点信息列表对应位置,之后进入步骤511,设置调试控制信号,本条指令处理结束;否则,不做任何处理。

承接步骤512,判断本条调试指令是否是断点设置、删除或全部删除指令,如是,则进入步骤513,否则,表示本条指令类型非法,不做任何处理。

承接步骤513,判断运算任务当前是否处于调试模式,如是,则进入步骤514,等待运算任务进入非运行态,即运算任务进入阻塞态、结束态或挂起态,随后进入步骤515;否则,直接进入步骤515。

承接步骤515,对断点信息列表进行按页号、块号组合顺序添加、定点删除或清空操作,本条指令处理结束。

由于调试指令预处理过程和运算任务的运行过程均可能对断点信息列表进行写操作,因此需要对断点信息列表进行写保护。运算任务运行过程中,只有在调试模式且处于运行状态时才会编辑断点信息列表,因此调试指令预处理过程在编辑断点信息列表时要对运算任务运行模式和运行状态进行判断。

四、建立支持断点调试功能的二级任务控制过程

如前所述,运算任务,包括不存在态、初始化态、运行态、结束态、挂起态、阻塞态、终止态七个状态,各状态定义如下:

不存在态,一种虚拟的状态,用以表示运算任务被创建前或被销毁后的状态;

初始化态,即运算任务实例化到首次获取运算权之前的状态,主要完成运算任务各属性的初始化及初始逻辑组态的解析;

运行态,运算任务获取运算权后进行断点信息判断及控制逻辑运算的过程;

结束态,运算任务完成控制逻辑最后一个运算单元的运算,并主动释放运算权之后的状态,即每个运算周期内本运算任务所属的控制逻辑已运算完毕等待下一周期到来的状态;

挂起态,运算任务在运行态时,运算权被强制收回后的状态,此时运算任务的运算过程被暂停,直至再次获取运算权后恢复至运行态;

阻塞态,命中断点逻辑运算单元后运算任务暂停运行,直到收到继续运算的指令后运算任务恢复运行,此阶段称为阻塞态;

终止态,运算任务被销毁之前,终止等待运算权及控制逻辑的运算并释放运算权等相关资源,等待销毁操作的状态。

其状态转换如图6所示。其中,转换①、⑩由控制器主进程管理。运算任务初始化完成后自动进入运行态,完成转换②;运算任务收到任务终止信号后,直接跳出运算过程并释放资源,完成转换⑨。非调试模式下,运算任务在运行态、结束态及挂起态三种状态之间转换,即转换③、④、⑤、⑥;调试模式下,运算任务在运行态、结束态、挂起态及阻塞态四种状态之间转换,即转换③、④、⑤、⑥、⑦、⑧,其中转换⑦、⑧仅在命中断点的情况下发生。

支持断点调试功能的二级任务控制过程即运算任务运行过程如图7所示,详细步骤如下:

运算任务完成初始化操作,即步骤701,之后进入步骤702,等待一级任务控制过程分配运算权,获取运算权后进行步骤703的判断,判断运算任务当前是否处于阻塞态,如是,则进入步骤704,否则,直接进入步骤705。

承接步骤704,判断调试控制信号是否为真,即是否收到继续运算指令,如是,则进入步骤705,否则,直接进入步骤720,主动释放运算权,再返回步骤702,重新等待一级任务控制过程分配运算权。

承接步骤705,运算任务切换至运行态,之后进行步骤706的判断。由于运算权会被一级任务控制过程强制收回,因此需再次判断本运算任务是否占用运算权,如是,则进入步骤707,否则,进入步骤708,运算任务切换至挂起态,并返回步骤702,重新等待一级任务控制过程分配运算权。

承接步骤707,通过任务终止信号判断运算任务是否需要终止,如是,则进入步骤709,否则,进入步骤711。

承接步骤709,运算任务切换至终止态,之后完成步骤710,主动释放运算权等资源,待一级任务控制过程完成销毁操作后,本运算任务生命周期结束。

承接步骤711,判断运算任务是否处于调试模式,如是,则进入步骤712,否则,进入步骤716。

承接步骤712,判断当前页号、当前块号指向的控制逻辑运算单元是否为断点,即该页号、块号组合是否存在于断点信息列表中,如是,则进入步骤713,否则,进入步骤716。承接步骤713,根据需要更新断点信息列表相关节点属性或删除相关节点,之后进入步骤714,清除调试控制信号,以等待继续运算指令,转入步骤715,运算任务切换至阻塞态,继续进行步骤720,主动释放运算权,再返回步骤702,重新等待一级任务控制过程分配运算权。

承接步骤716,执行当前页号、块号指向的控制逻辑运算单元的运算,之后根据步骤717,更新当前页号、块号,如块号是当前页的最后一个运算单元,则页号累加至下一个非空页的页号,块号更新为新页内首个运算单元的块号;否则页号不变,块号累加至本页内下一个运算单元;如果当前页号、块号指向的控制逻辑运算单元为本运算任务所属控制逻辑的末位运算单元,则页号、块号分别更新为本运算任务所述控制逻辑的首个运算单元。

进入步骤718,判断更新后的当前页号、块号是否指向本运算任务所属控制逻辑的首个运算单元,如是,则表示本周期运算结束,转入步骤719,运算任务切换至结束态,之后进行步骤720,主动释放运算权,再返回步骤702,重新等待一级任务控制过程分配运算权;否则,返回步骤706,继续下一运算单元的运算及断点判断。

图7中的步骤713,对断点信息列表的处理,可进一步细化为如图8所示的过程。

首先进入步骤801的判断,根据断点信息结构中的生命周期使能标记判断本次命中断点的生命周期属性是否使能,如是,则进入步骤802,否则不做任何处理,直接结束。

承接步骤802,将本断点的生命周期在当前值的基础上减1,之后进入步骤803,判断本断点生命周期是否结束,如结束,则进入步骤804,否则本次断点信息列表处理结束。

承接步骤804,将本断点从断点信息列表中删除,至此,本次断点信息列表处理结束。

断点信息以结构体列表形式存放,采用一级页号加二级块号的有序存放机制,可减少断点查找时间,提高断点判断的执行效率。

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