一种嵌入式软件的任务调度方法及装置与流程

文档序号:15444949发布日期:2018-09-14 23:15阅读:147来源:国知局

本发明属于嵌入式系统的技术领域,尤其是涉及一种嵌入式软件的任务调度方法及装置。



背景技术:

在嵌入式系统的软件设计中,根据具体应用要求和系统资源大小,选择合适的嵌入式操作系统,针对嵌入式系统的mcu进行移植,根据应用逻辑划分任务,然后利用操作系统提供的一系列api,建立任务队列,以消息或事件的形式进行任务间通信,管理系统滴答,实现任务调度,这种设计方式可以让开发人员将精力集中在应用逻辑的开发上,不仅可以实现软件的模块化,还可以灵活地进行修改和维护。

一般而言,在这种方式下,mcu上电初始化时首先建立任务队列,为每个任务设定合适的优先级,分配一定的堆栈用于存储任务上下文。在系统运行阶段,系统滴答、发送消息或事件、各种系统中断都会触发任务调度,当任务队列中存在准备就绪的新任务时,执行任务切换。切换任务时,首先要将当前任务的上下文数据(mcu中的各类寄存器和系统栈)保存到当前任务的堆栈中,然后将新任务的堆栈恢复到mcu各类寄存器和系统栈中,根据新的pc(程序计数器)指针执行新任务。

为每个任务堆栈分配一定的ram资源存储上下文会消耗宝贵的ram资源,当系统中存在大量频繁的中断时,上下文的存储和恢复会极大消耗mcu的计算资源,因此,只有在ram资源丰富、主频高的高端mcu中才选择使用操作系统。在那些由于成本限制只能选择ram资源较小、主频较低的中低端mcu的嵌入式系统的软件设计中,只能采用不加操作系统的裸机方式。

在传统的裸机开发方式中,只存在一个系统栈,mcu循环调用由各种软件模块组成的主循环体,发生中断时,mcu将一些局部变量、中间计算结果和寄存器存入系统栈,执行完中断处理程序后恢复系统栈,继续执行中断前的程序指令。在这种方式下,一般以大量的全局变量和标志位实现各个软件模块的交互,造成各个软件模块之间耦合性强,修改和维护不灵活。

综上所述,现有技术中如何避免加载操作系统对ram资源的消耗、避免任务上下文切换对mcu计算资源的消耗,以及如何降低软件模块间的耦合性、方便软件修改和维护的问题,尚缺乏行之有效的解决方案。



技术实现要素:

针对现有技术中存在的不足,解决现有技术中如何避免加载操作系统对ram资源的消耗、避免任务上下文切换对mcu计算资源的消耗,以及如何降低软件模块间的耦合性、方便软件修改和维护的问题,本发明提出了一种嵌入式软件的任务调度方法及装置,按照具体应用划分若干逻辑任务,这些逻辑任务共享一个系统栈,每个逻辑任务都有自己的事件队列和任务处理程序,任务之间通过发送事件的形式进行通信;本发明既避免了加载操作系统对系统ram资源和mcu计算资源的消耗,同时实现类似于操作系统的任务调度机制。

本发明的第一目的是提供一种嵌入式软件的任务调度方法。

为了实现上述目的,本发明采用如下一种技术方案:

一种嵌入式软件的任务调度方法,该方法包括:

按照逻辑任务优先级从低到高的顺序初始化mcu,进入主循环体;

在主循环体中执行任务调度程序,按照逻辑任务优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序,直至当前逻辑任务的优先级为最低时,退出任务调度程序返回进入主循环体;

逻辑任务间通过发送事件进行通信,当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;

所述逻辑任务结构体用于表示逻辑任务,包括任务id和事件队列;所述任务id用于表示逻辑任务优先级,所述事件队列用于存储填充的事件,执行任务处理程序时根据其对应的逻辑任务结构体的事件队列中具体事件执行相关操作。

作为进一步的优选方案,所述逻辑任务根据具体应用进行划分。

作为进一步的优选方案,所述逻辑任务结构体还包括事件队列的引用下标,引用下标包括事件产生索引和事件消费索引,所述事件产生索引用于索引事件队列中填充的事件,所述事件消费索引用于索引执行的事件。

作为进一步的优选方案,所述任务id为预先定义的8位整形数据,最大定义256个逻辑任务;逻辑任务优先级等于任务id,任务id的数值越大,其对应的逻辑任务的优先级越高。

作为进一步的优选方案,所述事件为预先定义的16位整型数据,0代表空事件,最大可定义65536种事件;所述事件队列为预先定义的16位整型数组。

作为进一步的优选方案,在该方法中,按照逻辑任务优先级从低到高的顺序初始化mcu,将各个逻辑任务结构体的事件队列数组成员初始化为0,事件产生索引和事件消费索引初始化为0后,进入主循环体。

作为进一步的优选方案,在该方法中,向逻辑任务结构体中填充事件的填充方法为:

将事件赋值给以该逻辑任务结构体的事件产生索引为引用下标的事件队列数组成员,并更新事件产生索引。

作为进一步的优选方案,在该方法中,任务处理程序的执行方法为:

判断该任务处理程序对应的逻辑任务结构体中的事件队列中是否存在未被处理的事件,

若存在,读取以该逻辑任务结构体的事件消费索引为引用下标的事件队列数组成员,根据具体事件执行相关操作,更新事件消费索引,返回上一判断步骤;

否则,判断当前逻辑任务优先级是否为最低,若是,退出任务调度程序,返回进入主循环体中执行其它程序,否则,执行下一个优先级更低的逻辑任务的任务处理程序。

作为进一步的优选方案,在该方法中,所述事件产生索引的更新方法为:将事件产生索引加一,若事件产生索引的索引值等于事件队列数组的长度,将事件产生索引置零;

所述事件消费索引的更新方法为:将事件消费索引加一,若事件消费索引的索引值等于事件队列数组的长度,将事件消费索引置零。

作为进一步的优选方案,在该方法中,判断任务处理程序对应的逻辑任务结构体中的事件队列中是否存在未被处理的事件的方法为:

比较事件产生索引和事件消费索引,若两者相等,则事件队列中不存在未被处理的事件,若不相等,则存在未被处理的事件。

本发明的第二目的是提供一种计算机可读存储介质。

为了实现上述目的,本发明采用如下一种技术方案:

一种计算机可读存储介质,其中存储有多条指令,所述指令适于由嵌入式终端设备设备的处理器加载并执行以下处理:

按照逻辑任务优先级从低到高的顺序初始化mcu,进入主循环体;

在主循环体中执行任务调度程序,按照逻辑任务优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序,直至当前逻辑任务的优先级为最低时,退出任务调度程序返回进入主循环体;

逻辑任务间通过发送事件进行通信,当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;

所述逻辑任务结构体用于表示逻辑任务,包括任务id和事件队列;所述任务id用于表示逻辑任务优先级,所述事件队列用于存储填充的事件,执行任务处理程序时根据其对应的逻辑任务结构体的事件队列中具体事件执行相关操作。

本发明的第三目的是提供一种嵌入式终端设备。

为了实现上述目的,本发明采用如下一种技术方案:

一种嵌入式终端设备,包括处理器和计算机可读存储介质,处理器用于实现各指令;计算机可读存储介质用于存储多条指令,所述指令适于由处理器加载并执行以下处理:

按照逻辑任务优先级从低到高的顺序初始化mcu,进入主循环体;

在主循环体中执行任务调度程序,按照逻辑任务优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序,直至当前逻辑任务的优先级为最低时,退出任务调度程序返回进入主循环体;

逻辑任务间通过发送事件进行通信,当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;

所述逻辑任务结构体用于表示逻辑任务,包括任务id和事件队列;所述任务id用于表示逻辑任务优先级,所述事件队列用于存储填充的事件,执行任务处理程序时根据其对应的逻辑任务结构体的事件队列中具体事件执行相关操作。

本发明的有益效果:

1、本发明所述的一种嵌入式软件的任务调度方法及装置,在裸机开发方式下,以逻辑任务结构体的形式描述逻辑任务,以事件的形式进行逻辑任务间的通信,逻辑任务的耦合性低,内聚性高,有利于提高软件质量。

2、本发明所述的一种嵌入式软件的任务调度方法及装置,每个逻辑任务都有自己的事件队列和任务处理程序,任务之间通过发送事件的形式进行通信,有效避免了加载操作系统对ram资源的消耗,避免了任务上下文切换对mcu计算资源的消耗。

3、本发明所述的一种嵌入式软件的任务调度方法及装置,按照具体应用划分若干逻辑任务,这些逻辑任务共享一个系统栈,根据应用划分逻辑任务,可以清晰地反映应用的实现逻辑,结构性好,软件修改和维护方便。

附图说明

构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。

图1为本发明的本发明的整体方法流程图;

图2是本发明的任务处理程序流程图。

具体实施方式:

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本实施例使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。

需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。

需要注意的是,附图中的流程图和框图示出了根据本公开的各种实施例的方法和系统的可能实现的体系架构、功能和操作。应当注意,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分可以包括一个或多个用于实现各个实施例中所规定的逻辑功能的可执行指令。也应当注意,在有些作为备选的实现中,方框中所标注的功能也可以按照不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,或者它们有时也可以按照相反的顺序执行,这取决于所涉及的功能。同样应当注意的是,流程图和/或框图中的每个方框、以及流程图和/或框图中的方框的组合,可以使用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以使用专用硬件与计算机指令的组合来实现。

在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合下面结合附图与实施例对本发明作进一步说明。

实施例1:

本实施例1的目的是提供一种嵌入式软件的任务调度方法。

为了实现上述目的,本发明采用如下一种技术方案:

如图1所示,

一种嵌入式软件的任务调度方法,该方法包括:

按照逻辑任务优先级从低到高的顺序初始化mcu,进入主循环体;

在主循环体中执行任务调度程序,按照逻辑任务优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序,直至当前逻辑任务的优先级为最低时,退出任务调度程序返回进入主循环体;

逻辑任务间通过发送事件进行通信,当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;

所述逻辑任务结构体用于表示逻辑任务,包括任务id和事件队列;所述任务id用于表示逻辑任务优先级,所述事件队列用于存储填充的事件,执行任务处理程序时根据其对应的逻辑任务结构体的事件队列中具体事件执行相关操作。

在本实施例中,所述逻辑任务根据具体应用进行划分。

在本实施例中,以结构体的形式描述逻辑任务,逻辑任务结构体的成员变量包括任务id、事件队列、事件产生索引、事件消费索引。其中,任务id以task_id表示,事件队列以event[event_queue_size]表示,事件产生索引以tick_idx表示,事件消费索引以talk_idx表示。

以8位整型定义任务id,最大可定义256个逻辑任务。逻辑任务的优先级等于任务id,id值越大,优先级越高。

以16位整型定义事件,以0代表空事件,最大可定义65536种事件。

事件队列为16位整型数组,数组成员有两种引用下标,分别为事件产生索引和事件消费索引。

在本实施例中,mcu初始化时,按照优先级从低到高的顺序,将各个逻辑任务结构体的事件队列数组成员初始化为0,事件产生索引和事件消费索引初始化为0,然后进入主循环体。

在主循环体中执行任务调度程序,按照优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序。

当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;填充方法为:

将事件赋值给以该逻辑任务结构体的事件产生索引为引用下标的事件队列数组成员,并更新事件产生索引。

如图2所示,任务处理程序的执行方法为:

步骤一,判断该任务处理程序对应的逻辑任务结构体中的事件队列中是否存在未被处理的事件,如果存在,进入步骤二,如果不存在,进入步骤三。在本实施例中,在该方法中,判断任务处理程序对应的逻辑任务结构体中的事件队列中是否存在未被处理的事件的方法为:比较事件产生索引和事件消费索引,若两者相等,则事件队列中不存在未被处理的事件,若不相等,则存在未被处理的事件。

步骤二,读取以该逻辑任务结构体的事件消费索引为引用下标的事件队列数组成员,根据具体事件执行相关操作,更新事件消费索引,返回步骤一;

步骤三,判断当前逻辑任务优先级是否为最低,若是,退出任务调度程序,返回进入主循环体中执行其它程序,否则,执行下一个优先级更低的逻辑任务的任务处理程序。

在本实施例中,所述事件产生索引的更新方法为:将事件产生索引加一,若事件产生索引的索引值等于事件队列数组的长度,将事件产生索引置零;

所述事件消费索引的更新方法为:将事件消费索引加一,若事件消费索引的索引值等于事件队列数组的长度,将事件消费索引置零。

实施例2:

本实施例2的目的是提供一种计算机可读存储介质。

为了实现上述目的,本发明采用如下一种技术方案:

一种计算机可读存储介质,其中存储有多条指令,所述指令适于由嵌入式终端设备设备的处理器加载并执行以下处理:

按照逻辑任务优先级从低到高的顺序初始化mcu,进入主循环体;

在主循环体中执行任务调度程序,按照逻辑任务优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序,直至当前逻辑任务的优先级为最低时,退出任务调度程序返回进入主循环体;

逻辑任务间通过发送事件进行通信,当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;

所述逻辑任务结构体用于表示逻辑任务,包括任务id和事件队列;所述任务id用于表示逻辑任务优先级,所述事件队列用于存储填充的事件,执行任务处理程序时根据其对应的逻辑任务结构体的事件队列中具体事件执行相关操作。

实施例3:

本实施例3的目的是提供一种嵌入式终端设备。

为了实现上述目的,本发明采用如下一种技术方案:

一种嵌入式终端设备,包括处理器和计算机可读存储介质,处理器用于实现各指令;计算机可读存储介质用于存储多条指令,所述指令适于由处理器加载并执行以下处理:

按照逻辑任务优先级从低到高的顺序初始化mcu,进入主循环体;

在主循环体中执行任务调度程序,按照逻辑任务优先级从高到低的顺序依次执行每个逻辑任务的任务处理程序,直至当前逻辑任务的优先级为最低时,退出任务调度程序返回进入主循环体;

逻辑任务间通过发送事件进行通信,当逻辑任务的中断处理程序或任务处理程序向其他逻辑任务发送事件时,向该逻辑任务结构体中填充事件;

所述逻辑任务结构体用于表示逻辑任务,包括任务id和事件队列;所述任务id用于表示逻辑任务优先级,所述事件队列用于存储填充的事件,执行任务处理程序时根据其对应的逻辑任务结构体的事件队列中具体事件执行相关操作。

这些计算机可执行指令在设备中运行时使得该设备执行根据本公开中的各个实施例所描述的方法或过程。

在本实施例中,计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

本文所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本公开内容操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如c++等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本公开内容的各个方面。

应当注意,尽管在上文的详细描述中提及了设备的若干模块或子模块,但是这种划分仅仅是示例性而非强制性的。实际上,根据本公开的实施例,上文描述的两个或更多模块的特征和功能可以在一个模块中具体化。反之,上文描述的一个模块的特征和功能可以进一步划分为由多个模块来具体化。

本发明的有益效果:

1、本发明所述的一种嵌入式软件的任务调度方法及装置,在裸机开发方式下,以逻辑任务结构体的形式描述逻辑任务,以事件的形式进行逻辑任务间的通信,逻辑任务的耦合性低,内聚性高,有利于提高软件质量。

2、本发明所述的一种嵌入式软件的任务调度方法及装置,每个逻辑任务都有自己的事件队列和任务处理程序,任务之间通过发送事件的形式进行通信,有效避免了加载操作系统对ram资源的消耗,避免了任务上下文切换对mcu计算资源的消耗。

3、本发明所述的一种嵌入式软件的任务调度方法及装置,按照具体应用划分若干逻辑任务,这些逻辑任务共享一个系统栈,根据应用划分逻辑任务,可以清晰地反映应用的实现逻辑,结构性好,软件修改和维护方便。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

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