CN116974728B - 单片机任务调度方法、单片机产品及存储介质 - Google Patents
单片机任务调度方法、单片机产品及存储介质 Download PDFInfo
- Publication number
- CN116974728B CN116974728B CN202311211698.7A CN202311211698A CN116974728B CN 116974728 B CN116974728 B CN 116974728B CN 202311211698 A CN202311211698 A CN 202311211698A CN 116974728 B CN116974728 B CN 116974728B
- Authority
- CN
- China
- Prior art keywords
- task
- current
- execution
- time
- tasks
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 51
- 230000003068 static effect Effects 0.000 claims abstract description 15
- 230000006870 function Effects 0.000 claims description 13
- 238000012545 processing Methods 0.000 claims description 7
- 238000004590 computer program Methods 0.000 claims description 6
- 101150083764 KCNK9 gene Proteins 0.000 description 18
- 101150039208 KCNK3 gene Proteins 0.000 description 17
- 230000000737 periodic effect Effects 0.000 description 8
- 238000004891 communication Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 230000007246 mechanism Effects 0.000 description 4
- 230000008569 process Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/484—Precedence
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5021—Priority
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种单片机任务调度方法、单片机产品及存储介质,其中方法包括:接收到中断请求后,进入到对应的时基任务调度服务;将各任务对应的当前时间计数值加1;从预设的静态的执行任务列表中依次获取一个任务作为当前任务,若当前任务处于就绪状态且不存在更高优先级或同级的任务正在执行,则将当前任务的当前时间计数值减去当前任务的执行周期,并将当前任务的执行状态更新为执行态,执行当前任务,当前任务执行完毕后,将当前任务的执行状态更新为非执行态;直至所有任务遍历完毕后,退出该时基任务调度服务。采用本发明的方法,不仅能实现任务抢占调度和各任务按确定时序规则进行执行的需求,而且代码量少易于理解,占用资源少。
Description
技术领域
本发明涉及单片机编程技术领域,特别是涉及一种单片机任务调度方法、单片机产品及存储介质。
背景技术
工控单片机产品,由于成本压力,选用的芯片资源往往比较紧张,主频不高、代码、数据空间有限。
随着产品功能越来越多,若采用裸机任务调度程序,则各任务都在主循环中按顺序排队轮流执行,即使某任务紧急也要等其他任务执行完,轮到自已时才能执行。这种任务调度方式中所有任务都是平级的,不能抢占,受限于主频低,实时性难以保证。
若采用ucos、freertos、rt-thread等主流嵌入式实时操作系统(Embedded Real-time Operation System,RTOS),虽然实时性可以得到保证,但各任务都是无限循环结构,而且每个任务都有独立任务栈,需要占用不少空间资源。
工控产品的各任务通常是有关联的,不仅需要某一任务按固定的周期执行,各任务还需要按一定的时序规则配合执行,即各任务时间起点一致,任务之间的时序也是保持不变的。例如,短周期任务A执行N次后,紧跟执行长周期任务B,需一直保持这种确定的时序关系。而RTOS各任务单独工作,不同任务的时序通常是没有关联的,当然可以使用RTOS的同步和通信机制来实现类似的需求,但这部分机制又要多占用芯片资源。
因此,一种既能实现任务抢占调度,又能保持确定时序,占用资源少的单片机任务调度方法是目前亟须解决的问题。
发明内容
本发明实施例旨在提供一种单片机任务调度方法、单片机产品及存储介质,以解决现有技术中适应于单片机的任务调度程序存在实时性难以保证或占用资源较大的问题。
为解决上述技术问题,本发明实施例提供以下技术方案:
根据本发明的一方面,提供一种单片机任务调度方法,所述方法包括:
接收到任务时基定时器的中断请求后,保存正在运行的程序状态,进入到所述中断请求对应的时基任务调度服务;
步骤A:将预设的任务时间计数表中各任务对应的当前时间计数值加1;
步骤B:从预设的静态的执行任务列表中依次获取一个任务作为当前任务,判断所述当前任务是否处于就绪状态,若是,则转入步骤C,若否,则转入步骤D;
步骤C:判断是否存在更高优先级或同级的任务正在执行,若否,则将所述当前任务的当前时间计数值减去所述当前任务的执行周期,并将所述当前任务的执行状态更新为执行态,执行所述当前任务,当所述当前任务执行完毕后,将所述当前任务的执行状态更新为非执行态;
步骤D:判断所述执行任务列表中各任务是否遍历完毕,若否,则转入步骤B,若是,则退出所述时基任务调度服务。
可选地,所述执行任务列表中存储有各任务对应的函数指针,且各任务对应的函数指针按照各任务的优先级从高到低排列。
可选地,所述步骤C中,若存在更高优先级或同级的任务正在执行,则退出所述时基任务调度服务。
可选地,所述判断所述当前任务是否处于就绪状态包括:
获取所述当前任务对应的当前时间计数值和所述当前任务对应的执行周期;
若所述当前任务对应的当前时间计数值大于或等于所述当前任务对应的执行周期,则判断所述当前任务处于就绪状态。
可选地,所述方法还包括:
预设任务执行状态表和任务执行状态掩码表,所述任务执行状态表和所述任务执行状态掩码表中各任务对应的任务掩码为位数相同的二进制数据,且各任务在所述任务掩码中对应的位段和在所述任务执行状态表中对应的位段相同,其中,在所述任务执行状态表中,每一比特位的值用于指示该比特位对应的任务是否处于执行态,在所述任务掩码中,每一比特位的值用于指示该比特位对应的任务的优先级是否高于或等于自身任务的优先级;
所述判断是否存在更高优先级或同级的任务正在执行包括:
将所述当前任务对应的任务掩码与所述当前任务执行状态表进行“与”操作;
若“与”操作后的结果非0,则判断存在更高优先级或同级的任务正在执行,若“与”操作后的结果为0,则判断不存在更高优先级或同级的任务正在执行。
可选地,所述任务时间计数表中各任务的当前时间计数值在初始状态下为不完全相同的时间偏移量,且所述时间偏移量小于任务的执行周期除以所述任务时基定时器的时基。
可选地,各任务的程序被设计为:
在程序的起始,建立所述任务对应的缓冲数据变量,将输入数据赋值给所述缓冲数据变量;
在程序的中间,对所述缓冲数据变量进行处理;
在程序的结尾,将所述缓冲数据变量赋值给输出数据进行输出。
可选地,在将所述当前任务的执行状态更新为执行态之后,以及在执行所述当前任务之前还包括:
开启所述任务时基机定时器的中断重入;
在所述当前任务执行完毕之后,以及将所述当前任务的执行状态更新为非执行态之前还包括:
关闭所述任务时基机定时器的中断重入。
根据本发明的另一方面,提供一种单片机产品,包括存储器、处理器及存储在存储器上运行的计算机程序,所述处理器执行所述程序时实现上述任一项所述的单片机任务调度方法的步骤。
根据本发明的再一方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,当所述计算机程序被处理器执行时,所述处理器执行上述任一项所述的单片机任务调度方法的步骤。
本发明实施例的有益效果是:区别于现有技术的情况,本发明实施例中,提供了一种单片机任务调度方法,一方面,所有任务在时基中断服务中执行,新的时基到时,可以打断正在执行的任务,根据优先级决定是否切换任务,保证了任务调度的实时性;另一方面,通过少量与任务相关的静态数据和内核调度代码,不仅实现了任务抢占调度和各任务按确定时序规则进行执行,而且代码量少、易于理解,占用资源少,尤其适合资源紧张的单片机使用。
附图说明
一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定,附图中具有相同参考数字标号的元件表示为类似的元件,除非有特别申明,附图中的图不构成比例限制。
图1是本发明实施例提供的一种单片机任务调度方法的流程图;
图2是本发明实施例提供的一种单片机程序初始化方法的流程图;
图3是本发明实施例提供的一种多任务执行时序示意图;
图4是本发明实施例提供的一种跨时基的多任务执行时序示意图;
图5是本发明实施例提供的一种单片机产品的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本发明提供一种单片机任务调度方法以及实现所述单片机任务调度方法的单片机产品。为了尽可能减少空间占用,与主流RTOS设计不同,本发明中采用静态的执行任务列表来存储各项任务,不做任务的动态创建与删除,也不做任务周期的动态配置;各任务不是无限循环结构,也不是独立堆栈,而是使用同一主栈,来减少切换任务私有栈的时间和空间开销。本发明提供的单片机任务调度方法由硬件中断机制自动保存现场,按固定顺序执行任务,实现了周期任务的抢占调度和确定时序功能。
实施例一
请参阅图1,为本发明实施例提供的一种单片机任务调度方法的流程图。所述方法适应于资源紧张的单片机产品,所述方法包括:
步骤S101,接收到任务时基定时器的中断请求后,保存正在运行的程序状态,进入到所述中断请求对应的时基任务调度服务。
在计算机领域,中断是指处理器接收到来自硬件或软件的信号,提示发生了某个应该被注意的事件。时钟中断是一种最常见的中断,是指系统时钟定期向CPU发出中断,CPU通过专门的时钟中断处理程序来保持计时。
本申请中,预先配置任务时基定时器的时间周期(即时基)和使能中断,比如,将时基设置为1ms,则任务时基定时器每隔1ms向CPU发出中断请求。CPU接收到中断请求后,由硬件中断机制自动保存现场,保存正在运行的程序状态。
时基任务调度服务程序在任务时基定时器中断服务中运行,当定时时基时间到时,响应中断后,即进入到中断请求对应的时基任务调度服务,该时基任务调度服务包括下面的步骤S102至步骤S108。退出时基任务调度服务后,将返回到步骤S101中被中断打断前的程序状态位置,继续执行该被打断的程序。
步骤S102,将预设的任务时间计数表中各任务对应的当前时间计数值加1。
所述任务时间计数表[d],用于存储各任务的当前时间计数值,采用数组形式实现。具体的,每进入到一个新的时基中断时,各任务的当前时间计数值加1,每当一个任务得到执行时,对该任务的当前时间计数值进行重置,即将当前时间计数值减去任务的执行周期。其中,任务执行的条件是,任务处于就绪状态。而任务处于就绪状态的条件是,任务的当前时间计数值大于或等于该任务的执行周期时。例如,[d]={任务1时间计数,任务2时间计数,任务3时间计数}={Count1,Count2,Count3}。当Count1≥Period1时,任务1进入就绪,当任务1得到执行时,重置计数值,Count1=Count1-Period1。
步骤S103,从预设的静态的执行任务列表中依次获取一个任务作为当前任务。
所述静态的执行任务列表[a],用于存储各任务对应的函数指针。优选地,执行任务列表[a]采用数组实现,且各任务的函数指针在数组中按照任务优先级从高到低排列。例如,[a]={任务1,任务2,任务3}={Task1,Task2,Task3}。其中,Task1的优先级>Task2的优先级>Task3的优先级。
执行任务列表中的任务均属于抢占级任务,除执行任务列表中的抢占级任务外,还有一个无限循环的空闲任务,执行任务列表中任一任务都可以抢占它。单片机产品中无抢占级任务执行时,就执行空闲任务。通常情况下,空闲任务为执行耗时长的任务或非周期任务等。
各任务的执行周期通过任务执行周期表[b]来存储。优选地,任务执行周期表[b]也采用数组实现,且任务执行周期表[b]中各任务对应的执行周期的排列方式与执行任务列表[a]中各任务对应的函数指针的排列方式对应。
抢占式周期任务的优先级和执行周期相关,优先级越高,执行周期越短。因此,当执行任务列表[a]中各任务对应的函数指针按照任务的优先级从高到低排列时,任务执行周期表[b]中各任务对应的执行周期按照从短到长排列。例如,[b]={任务1的执行周期,任务2的执行周期,任务3的执行周期}={Period1,Period2,Period3}。其中,Period1≤Period2≤Period3。
步骤S104,判断所述当前任务是否处于就绪状态,若是,则转入步骤S105,若否,则转入步骤S107。
在一些实施例中,判断当前任务是否处于就绪状态包括:获取当前任务对应的当前时间计数值和当前任务对应的执行周期;若该当前时间计数值大于或等于该执行周期,则判断当前任务处于就绪状态;若该当前时间计数值小于该执行周期,则判断当前任务处于非就绪状态。
步骤S105,判断是否存在更高优先级或同级的任务正在执行,若否,则进入步骤S106,若是,则进入步骤S107。
为了更好实现任务抢占调度和各任务按预设的时序执行,本发明还构建了任务执行状态掩码表[c]和任务执行状态表[e]。
其中,任务执行状态掩码表[c],用于存储各任务对应的任务掩码,为常数数组。所述任务掩码为二进制数据,位数一般与任务数量相同。各任务在所述任务掩码中分别对应不同的位段。所述任务掩码中,每一比特位的值用于指示该比特位对应任务的优先级是否高于或等于自身任务的优先级,所述自身任务即任务掩码对应的任务。具体的,对应自身任务或更高优先级任务的比特位的值为1,对应低优先级任务的比特位的值为0。
例如,[c]={任务1掩码,任务2掩码,任务3掩码}={001b,011b,111b}。b代表数值为二进制形式。任务1掩码为001b,最右位数字代表任务1的位段,中间位数字代表任务2的位段,最左位数字代表任务3的位段。单片机在执行任务调度程序时,在任务1执行周期到达时,因任务1的优先级最高,仅需判断有无本身任务正在执行即可。因为即使有低优先级任务在执行,也要抢占掉低优先级任务而执行任务1,所以任务1的掩码为任务1位段为1,任务2、3位段为0。而任务2的执行周期到达时,需判断是否有任务1和任务2在执行,所以任务2的掩码为011b。在上述实施例中,任务掩码中各任务的位段对应的数位顺序与各任务的优先级呈反向;在其他实施例中,也可以呈正向,比如:[c]={任务1掩码,任务2掩码,任务3掩码}={100,110,111},各任务掩码中,最左位数字代表任务1的位段,中间位数字代表任务2的位段,最右位数字代表任务3的位段。为了更有利于程序的编写,优选地,任务掩码中各任务的位段对应的数位顺序与各任务的优先级呈反向。在编程时,各具有优先级的任务序号通常是从0开始,0,1,2,…,0代表最高优先级;而对于数据而言,其最右侧是第0位,只需要把数字1左移任务序号位数即可得到任务位段,即任务序号是几就移几位。如任务1,序号为0,将数字1左移0位,即得001b;任务2,序号为1,将数字左移1位,即得010b。任务位段可与下面的任务执行状态表配合使用,来更新各任务的执行状态。
任务执行状态表[e],用于存储各任务当前的执行状态。为了与任务执行状态掩码表[c]中的任务掩码配合使用,任务执行状态表[e]也为二进制数据,位数与任务掩码的位数相同。各任务在任务执行状态表中对应的位段和在任务掩码中对应的位段相同。在任务执行状态表[e]中,每一比特位的值用于指示该比特位对应的任务是否处于执行态。具体的,任务处于执行态时,该任务的位段值为1;任务处于非执行态时,该任务的位段值为0。例如,[e]={010b},最右位代表任务1的位段,中间位代表任务2的位段,最左位代表任务3的位段。010b,代表当前正在执行任务2,任务1、3未执行。
通过任务执行状态表[e]和任务执行状态掩码表[c]可判断是否存在更高优先级或同级的任务正在执行,具体包括:将当前任务对应的任务掩码与任务执行状态表进行“与”操作;若“与”操作后的结果非0,则判断存在更高优先级或同级的任务正在执行,若“与”操作后的结果为0,则判断不存在更高优先级或同级的任务正在执行。
例如,任务1就绪时,任务1的任务掩码001b与任务执行状态表010b进行“与操作”:001b&010b=0,结果为0,表示无更高优先级或同级的任务正在执行,切换到任务1执行。任务2就绪时,任务2的任务掩码011b与执行状态表010b进行“与操作”:011b&010b=010b,结果非0,表示存在更高优先级或同级的任务正在执行,不切换任务。
在一示例中,当执行任务列表中各任务按照任务优先级从高到低排列时,则步骤S103按任务优先级从高到低进行遍历,若步骤S105中判断存在比当前任务具有更高优先级或同级的任务正在执行,由于剩余未遍历任务的优先级均不可能高于正在执行任务的优先级,为提高调度效率,可不进入步骤S107,而进入步骤S108,直接退出时基任务调度服务。在上述的案例中,若存在比任务2具有更高优先级或同级的任务正在执行,则不再遍历任务3,直接退出时基任务调度服务。
在其他示例中,当执行任务列表中各任务未按照任务优先级从高到低排列时(例如各任务在执行任务列表中为无序排列时),若步骤S105中判断存在比当前任务具有更高优先级或同级的任务正在执行,由于无法确定剩余未遍历任务的优先级是否高于正在执行任务的优先级,因此,需要进入步骤S107对剩余未遍历任务进行一一判断。
步骤S106,将所述当前任务的当前时间计数值减去所述当前任务的执行周期,并将所述当前任务的执行状态更新为执行态,执行所述当前任务,当所述当前任务执行完毕后,将所述当前任务的执行状态更新为非执行态。
在对任务执行状态表[e]进行更新时,当前任务执行前,新[e]等于原[e]置位当前任务位段;当前任务执行完,新[e]等于原[e]清空当前任务位段。具体的,当前任务执行状态表[e]由原任务执行状态表[e]和当前任务位段进行异或运算得到。
例如,[e]={010b},最右位代表任务1的位段,中间位代表任务2的位段,最左位代表任务3的位段。010b,代表当前正在执行任务2,任务1、3未执行。任务2处于执行态,假设任务1又满足执行条件时,任务1执行前,新[e]=原[e]{010b}“异或”当前任务1位段{001b}={011b}。当任务1执行完毕后,新[e]=原[e]{011b}“异或”当前任务1位段{001b}={010b}。
为避免任务时基定时器的中断重入引发数据出错,可在对关键数据进行处理时进行中断保护。其中,中断重入是指在一个中断服务程序的执行过程中,又被一个新来的同种中断打断,发生了同种中断嵌套执行的情况。比如,时基1的中断服务程序尚未执行完毕,时基2的中断时间就到了,如果不对中断重入进行关闭的话,则时基2的中断服务程序将嵌套在时基1的中断服务程序中进行执行,只有当时基2的中断服务程序执行完毕后,才能继续回到时基1的中断服务程序。
在一些示例中,仅在执行任务的过程中,允许任务时基定时器的中断重入,其他时间都禁止任务时基定时器的中断重入。具体的,步骤106中在将当前任务的执行状态更新为执行态之后,以及在执行当前任务之前,开启任务时基定时器的中断重入;在当前任务执行完毕之后,以及将当前任务的执行状态更新为非执行态之前,关闭任务时基定时器的中断重入。
在其他一些示例中,针对每次关键数据的处理进行中断保护。具体的,在进行关键数据的处理前,先关闭任务时基定时器的中断重入功能,直到关键数据处理完成后,再开启任务时基定时器的中断重入功能。所述关键数据包括各任务的执行状态和各任务的当前时间计数值。
步骤S107,判断所述执行任务列表中各任务是否遍历完毕,若否,则转入步骤S103,若是,则进入步骤S108。
步骤S108,退出所述时基任务调度服务。
本发明的实施例中,为了更好实现任务抢占调度和各任务按预设的时序执行,构建了3个静态数据表和2个动态数据表。其中,3个静态数据表包括执行任务列表[a]、任务执行周期表[b]和任务执行状态掩码表[c],2个动态数据表包括任务时间计数表[d]和任务执行状态表[e]。通过上述5个静态/动态数据表和内核调度代码,实现了任务抢占调度和各任务按确定时序规则进行执行,代码量少易于理解,占用资源少,适合资源紧张的单片机使用。
在接收任务时基定时器的中断请求之前,还包括单片机程序的初始化过程。如图2所示,所述初始化过程具体包括:
步骤S201,单片机硬件初始化。
步骤S202,系统数据初始化。
具体的,对上述3个静态数据表和2个动态数据表的数据进行初始化。其中,执行任务列表[a]、任务执行周期表[b]、任务执行状态掩码表[c]为静态数据表,其初始化值根据实际情况进行设置;任务时间计数表[d]和任务执行状态表[e]为动态数据表,任务执行状态表[e]各二进制位的初始化值均为0。
在一些示例中,任务时间计数表[d]中各任务对应的当前时间计数值的初始化值为0。
在其他一些示例中,任务时间计数表[d]中各任务对应的当前时间计数值的初始化值为不完全相同的时间偏移量,详见后述。
步骤S203,配置任务时基定时器。
具体的,配置任务时基定时器的时基大小和设置中断使能。
步骤S204,执行空闲任务。
当无抢占级任务执行时,单片机执行空闲任务,等待抢占级任务进入就绪状态。
下面以3个任务为例来说明多任务基于上述的单片机任务调度方法进行调度时的执行时序。3个任务Task1、Task2和Task3的执行周期分别为1、4和8,时基为1。可以理解的是,时基为时基任务调度服务中最小的时间单位,各任务的执行周期均为时基的整数倍。
基于以上设置,在8个时基时间内,Task1执行8次,Task2执行2次,Task3执行1次,如图3所示。第8个时基为3个任务的执行周期的最小公倍数。当多个就绪任务均可以在对应的时基内完成执行时,后续将重复执行这个任务执行时序,即第9个时基与第1个时基相同,第10个时基与第2个时基相同,依次进行。
每次定时时基到时,单片机任务调度服务按任务执行列表中的各任务的顺序依次检索执行各任务,由此确定任务的执行时序。如图3中第4个时基,总是先执行Task1,再执行Task2;第8个时基,总是先执行Task1,再执行Task2,最后才执行Task3。
为方便说明,将各任务执行周期的最小公倍时间称为一个任务时序循环周期。为保证所有任务在一个任务时序循环周期内能执行完,则任务执行列表中的各任务的执行时间需满足:
Task1执行时间*Task1执行次数+Task2执行时间*Task2执行次数+……+TaskN执行时间*TaskN执行次数<任务时基*时基次数,其中,任务执行次数是指该任务在一个任务时序循环周期内的执行次数,时基次数是指一个任务时序循环周期对应的时基次数。在上面的案例中,需满足8次Task1执行时间+2次Task2执行时间+1次Task3执行时间<8。
当任务执行时间较长时,可能出现在单个时基内执行不完的情形。如图4所示,在第8个时基时刻,Task1、Task2和Task3均处于就绪状态,但是第8个时基内仅完成了Task1,Task2和Task3则跨越了多个时基才完成。其中,Task2跨越了第8时基、第9时基和第10时基,并在第10时基完成,Task3从第10时基开始执行,在第14时基完成。
具体的,Task2在第8时基的执行过程中,被第9时基的中断打断,响应中断,对Task2的程序状态进行保存后,进入到第9时基的时基任务调度服务。在第9时基的时基任务调度服务中,Task1就绪且优先级最高,执行Task1;执行完Task1之后,获取Task2,Task2此时处于非就绪状态;再获取Task3,Task3处于就绪状态,但优先级低于正在执行的Task2,因此,Task3并未得到执行。至此,3个任务均遍历完毕,退出第9时基对应的时基任务调度服务,回到第8时基任务调度服务,继续执行任务2。依次类推,得到Task1、Task2和Task3在第8个时基到第16个时基的任务执行时序。
通过上述案例可知,低优先级任务在执行过程中,可能会被高优先级任务打断。为使得数据完整,各任务的程序可设计为:在程序的开始,先做数据的集中输入,之后执行逻辑运算功能,在程序的结尾,再做数据的集中输出。必要时,可在任务数据的集中输入和集中输出阶段通过关闭任务时基定时器的中断使能来进行保护。
具体的,各任务的程序被设计为:
在程序的起始,建立所述任务对应的缓冲数据变量,将输入数据赋值给所述缓冲数据变量;
在程序的中间,对所述缓冲数据变量进行处理;
在程序的结尾,将所述缓冲数据变量赋值给输出数据进行输出。
进一步地,为减少中断重入的发生,可减少单个时基内的就绪任务数量,即使得各任务在不同的时基进入就绪。在一些示例中,将任务时间计数表[d]中各任务对应的当前时间计数值的初始化值设置为不完全相同的时间偏移量。当时间偏移量为X时,任务TaskN的就绪时刻计算方法为:
(时基次数+X)* 时基)% TaskN的执行周期 = 0
其中,时基次数是1,2,3,4……这样逐渐增加的无限序列,%代表取余运算,X的取值小于TaskN周期/时基。
下面以Task1的执行周期为1,Task2的执行周期为4,Task3的执行周期为8,任务时基为1,对不加时间偏移量和加上时间偏移量分别进行举例说明。
(1)不加时间偏移量的情形(即X = 0)
Task1就绪时刻:((Cnt + 0)* 1)% 1 = 0,即Cnt % 1 = 0;
Cnt表示时基次数,时基次数对1取余运算为0时为Task1的就绪时刻,由于任何数对1取余运算都为0,所以Task1就绪时刻为1,2,3,4,……,即Task1在每个时基时刻都就绪。
Task2就绪时刻:((Cnt + 0)* 1)% 4 = 0,即Cnt % 4 = 0。
时基次数对4取余运算为0时为Task2的就绪时刻,所以Task2的就绪时刻为4,8,12,16,……。
Task3就绪时刻:((Cnt + 0)* 1)% 8 = 0,即Cnt % 8 = 0。
时基次数对8取余运算为0时为Task3的就绪时刻,所以Task3就绪时刻为8,16,24,32,……。
采用上述方式,在时基次数为4时,Task1、Task2两个任务就绪,在时基次数为8时,Task1、Task2、Task3三个任务就绪,时基次数为8时,执行的任务多,执行时间压力比其他时刻大。
(2)加上时间偏移量的情形(各任务的时间偏移量可不同)
Task2就绪时刻:((Cnt + X)* 1)% 4=0。
当时间偏移量X=1时,(Cnt + 1)% 4 = 0,就绪时刻为3,7,11,15,……。
当时间偏移量X=2时,(Cnt + 2)% 4 = 0,就绪时刻为2,6,10,14,……。
当时间偏移量X=3时,(Cnt + 3)% 4 = 0,就绪时刻为1,5,9,13,……。
当时间偏移量X>=4时,X大于等于TaskN周期/时基,会重复X=0,1,2,3的序列。
Task3就绪时刻:((Cnt+ X)*1)%8=0。
当时间偏移量X=1时,(Cnt+1)%8=0,就绪时刻为7,15,23,31,……。
同理,可得到其他时间偏移量下,Task3的就绪时刻。
假如Task1、Task2时间偏移量为0,Task3时间偏移量为1,则每个时基内最多有两个任务就绪,任务更容易在每个时基内都执行完成。通过为每个任务选取合适的时间偏移量,可最大化地减少每个时基内的就绪任务数量,减少中断重入的发生。同时更适用于各任务之间相对独立,对配合执行时序没有要求时的单片机的任务调度程序。
本发明实施例提供的单片机任务调度方法,所有任务均使用同一主栈,一方面,所有任务在时基中断服务中执行,新的时基到时,可以打断正在执行的任务,根据优先级决定是否切换任务,保证了任务调度的实时性;另一方面,通过少量与任务相关的静态数据/动态数据和内核调度代码,不仅实现了任务抢占调度和各任务按确定时序规则进行执行,而且代码量少易、于理解,占用资源少,尤其适合资源紧张的单片机使用。
实施例二
根据本发明实施例,提供一种单片机产品,如图5所示,本发明实施例提供的一种单片机产品的结构示意图,该单片机产品可以包括处理单元501、输入输出接口502、程序存储器503、数据存储器504、通信总线505、定时器506和中断系统507,其中,处理单元501、输入输出接口502、程序存储器503、数据存储器504通过通信总线505完成相互间的通信。处理单元501可以调用程序存储器503中的逻辑指令,更新数据存储器504的状态,以执行实施例一中的单片机任务调度方法,该方法包括:接收到任务时基定时器的中断请求后,保存正在运行的程序状态,进入到所述中断请求对应的时基任务调度服务;步骤A:将预设的任务时间计数表中各任务对应的当前时间计数值加1;步骤B:从预设的静态的执行任务列表中依次获取一个任务作为当前任务,判断所述当前任务是否处于就绪状态,若是,则转入步骤C,若否,则转入步骤D;步骤C:判断是否存在更高优先级或同级的任务正在执行,若否,则将所述当前任务的当前时间计数值减去所述当前任务的执行周期,并将所述当前任务的执行状态更新为执行态,执行所述当前任务,当所述当前任务执行完毕后,将所述当前任务的执行状态更新为非执行态;步骤D:判断所述执行任务列表中各任务是否遍历完毕,若否,则转入步骤B,若是,则退出所述时基任务调度服务。
此外,上述程序存储器503中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在几个计算机可读存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,计算机软件产品存储于一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器或者网络设备等)执行本发明实施例一中任一所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
上述产品可执行实施例一中任一所述的单片机任务调度方法,具备方法相应的功能模块和有益效果,未在本实施例中详尽描述的技术细节,可参见本发明实施例一提供的单片机任务调度方法。
实施例三
根据本发明实施例,提供一种计算机可读存储介质,其类型如实施例二中所述,所述计算机可读存储介质存储有计算机程序,当所述计算机程序被处理器执行时,所述处理器执行实施例一中所述的单片机任务调度方法的步骤。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用直至得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;在本发明的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本发明的不同方面的许多其它变化,为了简明,它们没有在细节中提供;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。
Claims (9)
1.一种单片机任务调度方法,其特征在于,所述方法包括:
接收到任务时基定时器的中断请求后,保存正在运行的程序状态,进入到所述中断请求对应的时基任务调度服务;
步骤A:将预设的任务时间计数表中各任务对应的当前时间计数值加1;
步骤B:从预设的静态的执行任务列表中依次获取一个任务作为当前任务,判断所述当前任务是否处于就绪状态,若是,则转入步骤C,若否,则转入步骤D;
步骤C:判断是否存在更高优先级或同级的任务正在执行,若否,则将所述当前任务的当前时间计数值减去所述当前任务的执行周期,并将所述当前任务的执行状态更新为执行态,执行所述当前任务,当所述当前任务执行完毕后,将所述当前任务的执行状态更新为非执行态;
步骤D:判断所述执行任务列表中各任务是否遍历完毕,若否,则转入步骤B,若是,则退出所述时基任务调度服务;
所述执行任务列表中各任务的优先级从高到低排列,所述步骤C中,若存在更高优先级或同级的任务正在执行,则退出所述时基任务调度服务。
2.根据权利要求1所述的方法,其特征在于,所述执行任务列表中存储有各任务对应的函数指针,且各任务对应的函数指针按照各任务的优先级从高到低排列。
3.根据权利要求1所述的方法,其特征在于,所述判断所述当前任务是否处于就绪状态包括:
获取所述当前任务对应的当前时间计数值和所述当前任务对应的执行周期;
若所述当前任务对应的当前时间计数值大于或等于所述当前任务对应的执行周期,则判断所述当前任务处于就绪状态。
4.根据权利要求1至3任一项所述的方法,其特征在于,所述方法还包括:
预设任务执行状态表和任务执行状态掩码表,所述任务执行状态表和所述任务执行状态掩码表中各任务对应的任务掩码为位数相同的二进制数据,且各任务在所述任务掩码中对应的位段和在所述任务执行状态表中对应的位段相同,其中,在所述任务执行状态表中,每一比特位的值用于指示该比特位对应的任务是否处于执行态,在所述任务掩码中,每一比特位的值用于指示该比特位对应的任务的优先级是否高于或等于自身任务的优先级;
所述判断是否存在更高优先级或同级的任务正在执行包括:
将所述当前任务对应的任务掩码与所述当前任务执行状态表进行“与”操作;
若“与”操作后的结果非0,则判断存在更高优先级或同级的任务正在执行,若“与”操作后的结果为0,则判断不存在更高优先级或同级的任务正在执行。
5.根据权利要求1至3任一项所述的方法,其特征在于,所述任务时间计数表中各任务的当前时间计数值在初始状态下为不完全相同的时间偏移量,且所述时间偏移量小于任务的执行周期除以所述任务时基定时器的时基。
6.根据权利要求1至3任一项所述的方法,其特征在于,各任务的程序被设计为:
在程序的起始,建立所述任务对应的缓冲数据变量,将输入数据赋值给所述缓冲数据变量;
在程序的中间,对所述缓冲数据变量进行处理;
在程序的结尾,将所述缓冲数据变量赋值给输出数据进行输出。
7.根据权利要求1至3任一项所述的方法,其特征在于,在将所述当前任务的执行状态更新为执行态之后,以及在执行所述当前任务之前还包括:
开启所述任务时基定时器的中断重入;
在所述当前任务执行完毕之后,以及将所述当前任务的执行状态更新为非执行态之前还包括:
关闭所述任务时基定时器的中断重入。
8.一种单片机产品,包括存储器、处理器及存储在存储器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1-7任一项所述的单片机任务调度方法的步骤。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,当所述计算机程序被处理器执行时,所述处理器执行如权利要求1-7任一项所述的单片机任务调度方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311211698.7A CN116974728B (zh) | 2023-09-20 | 2023-09-20 | 单片机任务调度方法、单片机产品及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311211698.7A CN116974728B (zh) | 2023-09-20 | 2023-09-20 | 单片机任务调度方法、单片机产品及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116974728A CN116974728A (zh) | 2023-10-31 |
CN116974728B true CN116974728B (zh) | 2024-01-02 |
Family
ID=88473268
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311211698.7A Active CN116974728B (zh) | 2023-09-20 | 2023-09-20 | 单片机任务调度方法、单片机产品及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116974728B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117421106B (zh) * | 2023-12-11 | 2024-03-08 | 湖南行必达网联科技有限公司 | 一种嵌入式软件的任务调度方法、系统及设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0332148A2 (en) * | 1988-03-10 | 1989-09-13 | Honeywell Inc. | Multi-tasking operating system |
CN1529233A (zh) * | 2003-10-17 | 2004-09-15 | 清华大学 | 嵌入式实时操作系统的二分查找式任务调度方法 |
CN101290588A (zh) * | 2008-03-07 | 2008-10-22 | 重庆邮电大学 | 一种微嵌入式实时任务调度器及调度方法 |
CN101751289A (zh) * | 2008-12-19 | 2010-06-23 | 黄强 | 一种嵌入式实时操作系统的混合调度方法 |
CN103995742A (zh) * | 2014-05-20 | 2014-08-20 | 万向钱潮股份有限公司 | 一种基于mcu的嵌入式实时调度控制装置及方法 |
CN113986500A (zh) * | 2021-10-28 | 2022-01-28 | 浙江中控技术股份有限公司 | 多任务系统中的任务确定性调度方法和任务诊断方法 |
CN116414464A (zh) * | 2023-05-26 | 2023-07-11 | 摩尔线程智能科技(北京)有限责任公司 | 调度任务的方法和装置、电子设备和计算机可读介质 |
-
2023
- 2023-09-20 CN CN202311211698.7A patent/CN116974728B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0332148A2 (en) * | 1988-03-10 | 1989-09-13 | Honeywell Inc. | Multi-tasking operating system |
CN1038712A (zh) * | 1988-03-10 | 1990-01-10 | 霍尼韦尔有限公司 | 用于多任务操作环境的操作系统 |
CN1529233A (zh) * | 2003-10-17 | 2004-09-15 | 清华大学 | 嵌入式实时操作系统的二分查找式任务调度方法 |
CN101290588A (zh) * | 2008-03-07 | 2008-10-22 | 重庆邮电大学 | 一种微嵌入式实时任务调度器及调度方法 |
CN101751289A (zh) * | 2008-12-19 | 2010-06-23 | 黄强 | 一种嵌入式实时操作系统的混合调度方法 |
CN103995742A (zh) * | 2014-05-20 | 2014-08-20 | 万向钱潮股份有限公司 | 一种基于mcu的嵌入式实时调度控制装置及方法 |
CN113986500A (zh) * | 2021-10-28 | 2022-01-28 | 浙江中控技术股份有限公司 | 多任务系统中的任务确定性调度方法和任务诊断方法 |
CN116414464A (zh) * | 2023-05-26 | 2023-07-11 | 摩尔线程智能科技(北京)有限责任公司 | 调度任务的方法和装置、电子设备和计算机可读介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116974728A (zh) | 2023-10-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6360243B1 (en) | Method, device and article of manufacture for implementing a real-time task scheduling accelerator | |
US6430593B1 (en) | Method, device and article of manufacture for efficient task scheduling in a multi-tasking preemptive priority-based real-time operating system | |
US6128672A (en) | Data transfer using software interrupt service routine between host processor and external device with queue of host processor and hardware queue pointers on external device | |
JP4693326B2 (ja) | 組込み型プロセッサにおいてゼロタイムコンテクストスイッチを用いて命令レベルをマルチスレッド化するシステムおよび方法 | |
EP2312441B1 (en) | Scheduling of instructions groups for cell processors | |
CN116974728B (zh) | 单片机任务调度方法、单片机产品及存储介质 | |
CN106557369B (zh) | 一种多线程的管理方法及系统 | |
US8769543B2 (en) | System and method for maximizing data processing throughput via application load adaptive scheduling and context switching | |
US20070033384A1 (en) | Real-time embedded simple monitor method and computer product | |
JPWO2009150815A1 (ja) | マルチプロセッサシステム | |
US20160249354A1 (en) | Scheduling function calls | |
CN102541642A (zh) | 一种增强实时性能的任务管理方法 | |
US8042116B2 (en) | Task switching based on the execution control information held in register groups | |
JP4523910B2 (ja) | 並列処理装置及び並列処理方法及び並列処理プログラム | |
CN114327929A (zh) | 基于amp架构的优先级处理方法、装置、调度器及多核系统 | |
EP1770517A2 (en) | Improvements relating to reduced-overhead context-saving in static priority scheduled operating systems | |
JP2008537248A (ja) | デジタルシグナルプロセッサ上でのマルチタスクの実施 | |
JP2008033577A (ja) | マルチタスクスケジューリング機能搭載装置及びプログラム | |
JP4292705B2 (ja) | タスクスケジューリング装置 | |
JP2012093832A (ja) | 情報処理装置 | |
Marinho et al. | Job phasing aware preemption deferral | |
US11055163B2 (en) | Method and device for error handling in a communication between distributed software components | |
JP2693916B2 (ja) | タスクスケジュール方法 | |
CN107562527B (zh) | 一种rtos上的smp的实时任务调度方法 | |
US8694999B2 (en) | Cooperative scheduling of multiple partitions in a single time window |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CB03 | Change of inventor or designer information |
Inventor after: Lei Jianhua Inventor after: Ma Hui Inventor after: Pei Binbin Inventor after: Guo Zhihua Inventor before: Lei Jianhua Inventor before: Ma Hui Inventor before: Pei Binbin Inventor before: Guo Zhihua |
|
CB03 | Change of inventor or designer information |