CN109240815A - 一种共享堆栈的多任务运行方法、装置及设备 - Google Patents
一种共享堆栈的多任务运行方法、装置及设备 Download PDFInfo
- Publication number
- CN109240815A CN109240815A CN201810972624.8A CN201810972624A CN109240815A CN 109240815 A CN109240815 A CN 109240815A CN 201810972624 A CN201810972624 A CN 201810972624A CN 109240815 A CN109240815 A CN 109240815A
- Authority
- CN
- China
- Prior art keywords
- task
- subfunction
- storehouse
- run
- obstruction
- 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.)
- Granted
Links
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
- G06F9/4887—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues involving deadlines, e.g. rate based, periodic
-
- 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/485—Task life-cycle, e.g. stopping, restarting, resuming execution
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
本申请提供一种共享堆栈的多任务运行方法、装置及设备,用于实现微控制器同时执行多任务。该方法包括:在堆栈中运行至少两个任务中的第一任务,运行至所述第一任务的阻塞子函数时,中断所述第一任务的运行;保存所述阻塞子函数的分支数组,其中,所述分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;在所述堆栈中运行第二任务,其中,所述第二任务是所述至少两个任务中除了所述第一任务之外的一个任务。本申请实施例提供的多任务运行方法具有占用内存空间极小的优点。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种共享堆栈的多任务运行方法、装置及设备。
背景技术
实时操作系统(Real Time Operating System,RTOS)是指当任务产生时,能接收并以足够快的速度予以处理,且能控制多个任务协调一致运行的操作系统。因此要运行RTOS,该设备的随机存储空间至少应该在10K Bytes以上,才能为每个任务分配单独的堆栈存储空间和任务控制块,从而支持多个任务同时运行。
但是对于某些随机存储空间小于10K Bytes的设备,例如空调设备的微控制器,由于空调设备的微控制器的内存空间小于4K Bytes,微控制器如果并行处理多个任务,每个任务分配单独的堆栈空间,很容易发生堆栈溢出,从而导致微控制器的运行进入死循环。
发明内容
本申请实施例提供一种共享堆栈的多任务运行方法、装置及设备,用于实现微控制器同时执行多任务。
本申请实施例提供的具体技术方案如下:
第一方面,提供一种共享堆栈的多任务运行方法,包括:
在堆栈中运行至少两个任务中的第一任务,运行至所述第一任务的阻塞子函数时,中断所述第一任务的运行;
保存所述阻塞子函数的分支数组,其中,所述分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;
在所述堆栈中运行第二任务,其中,所述第二任务是所述至少两个任务中除了所述第一任务之外的一个任务。
当程序运行至阻塞子函数时,阻塞子函数由于需要等待某个事件发生或者等待硬件处理数据,暂时无法运行。本申请实施例中根据阻塞子函数的这一性质,当运行至第一任务的阻塞子函数的时,中断第一任务的运行,在阻塞子函数等待的一段时间内,让渡该堆栈,该堆栈可以用来处理第二任务,从而实现了同一堆栈运行多个任务,且,在中断第一任务的时候,保存第一任务对应的阻塞子函数的分支数组,当后期需要继续运行第一任务时,可以根据阻塞子函数的分支数组,再继续运行第一任务的对应的阻塞子函数,以使第一任务继续运行。且,本申请实施例相较于现有的多任务运行方式,占用的处理器资源较少,运行方式更为简单,能耗更少。
可选的,所述方法,还包括:在所述阻塞子函数对应的事件发生后,根据所述分支数组,在所述堆栈中运行所述阻塞子函数。
本申请实施例中,当运行装置需要继续运行中断的任务时候,可以直接根据记录的阻塞子函数的分支数组,进入该任务对应的子函数继续运行,记录分支数组占用的内存空间极少。
可选的,在堆栈中运行至少两个任务中的第一任务,包括:
在所述堆栈中运行第一任务的对应的主函数,所述主函数的嵌套深度为0;
在所述堆栈中依次运行所述第一任务的所述主函数的第一层子函数至第N层子函数,其中,在依次运行所述第一层子函数至所述第N层子函数过程中,所述第一任务的子函数的嵌套深度从1依次增加至N,N为大于或等于1的整数。
本申请实施例在运行第一任务时候,采用嵌套调用的方式运行,可以使得主函数与子函数的可见性保持一致,也就是说,外部程序可以通过访问主函数还访问子函数,也可以直接访问子函数。且,子函数与主函数的分布位置比较固定,程序逻辑性更强。可选的,所述阻塞子函数位于所述N层子函数中,中断所述第一任务的运行,包括:
从所述第N层子函数依次退回至所述第一任务的所述第一层子函数,其中,在从所述第N层子函数依次退回至所述第一任务的所述第一层子函数的过程中,所述第一任务的嵌套深度从N依次递减至1;
从所述第一层子函数退回至所述第一任务的所述主函数,当退回至所述第一任务的所述主函数时,中断所述第一任务的运行。
运行装置在退出该任务时候,一层一层地退出时采用的是一层层地退出嵌套调用,按照顺序退出,逻辑性更强,运行装置不容易出错。
可选的,在中断所述第一任务的运行之前,所述方法还包括:
将所述第一任务标记为睡眠状态。
在中断第一任务的运行之前,可以将第一任务标记为睡眠状态,避免运行装置不恰当地再次运行第一任务。
可选的,在所述堆栈中运行第二任务,包括:
当退回至所述第一任务的所述主函数时,在所述堆栈中运行第二任务;或,
当运行至所述第N层子函数中的所述阻塞子函数时,在堆栈中运行第二任务。
在第一任务中断之后,运行装置可以利用该堆栈来运行其他任务,充分利用该堆栈,实现共享堆栈中的多任务的运行。
可选的,所述第二任务为,在所述至少两个任务中除了所述第一任务之外的任务中优先级高于阈值的任务。
根据优先级来确定需要运行的任务,降低优先级高的任务的延时。
可选的,所述方法还包括:
当所述阻塞子函数对应的事件发生时,将所述第一任务标记为活动状态;
当所述阻塞子函数对应的事件发生时,根据所述分支数组,在所述堆栈中运行所述阻塞子函数,包括:
当所述阻塞子函数对应的事件发生时,确定所述第一任务是处于活动状态的任务中优先级最高的任务;
根据所述分支数组,运行所述阻塞子函数。
当阻塞子函数对应的事件发生的时候,可以直接根据分支数组,继续运行第一任务,相较于现有技术,本申请实施例直接根据分支数组来确定第一任务运行中断的阻塞子函数所在的位置,减少了堆栈的使用。
第二方面,提供一种共享堆栈的多任务运行装置,包括:
处理模块,用于在堆栈中运行至少两个任务中的第一任务,运行至所述第一任务的阻塞子函数时,中断所述第一任务的运行;
分支模块,用于保存所述阻塞子函数的分支数组,其中,所述分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;
所述处理模块,还用于在所述堆栈中运行第二任务,其中,所述第二任务是所述至少两个任务中除了所述第一任务之外的一个任务。
可选的,所述处理模块还用于:在所述阻塞子函数对应的事件发生后,根据所述分支数组,在所述堆栈中运行所述阻塞子函数。
可选的,所述处理模块用于:在所述堆栈中运行第一任务的对应的主函数,所述主函数的嵌套深度为0;以及,在所述堆栈中依次运行所述第一任务的所述主函数的第一层子函数至第N层子函数,其中,在依次运行所述第一层子函数至所述第N层子函数过程中,所述第一任务的子函数的嵌套深度从1依次增加至N,N为大于或等于1的整数。
可选的,所述处理模块用于:从所述第N层子函数依次退回至所述第一任务的所述第一层子函数,其中,在从所述第N层子函数依次退回至所述第一任务的所述第一层子函数的过程中,所述第一任务的嵌套深度从N依次递减至1;以及,从所述第一层子函数退回至所述第一任务的所述主函数,当退回至所述第一任务的所述主函数时,中断所述第一任务的运行。
可选的,所述处理模块用于:在中断所述第一任务的运行之前,将所述第一任务标记为睡眠状态。可选的,所述处理模块用于:当退回至所述第一任务的所述主函数时,在所述堆栈中运行第二任务;或,当运行至所述第N层子函数中的所述阻塞子函数时,在堆栈中运行第二任务。
可选的,所述第二任务为,在所述至少两个任务中除了所述第一任务之外的任务中优先级高于阈值的任务。
可选的,所述处理模块用于:当所述阻塞子函数对应的事件发生时,将所述第一任务标记为活动状态;以及,当所述阻塞子函数对应的事件发生时,确定所述第一任务是处于活动状态的任务中优先级最高的任务,并根据所述分支数组,运行所述阻塞子函数。
第三方面,提供一种共享堆栈的多任务运行设备,包括:
至少一个处理器,以及
与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令实现如第一方面中任一项所述的方法。
第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如第一方面中任一项所述的方法。
附图说明
图1为本申请实施例提供的共享堆栈的多任务运行方法的一种流程图;
图2为本申请实施例提供的多任务的分布示意图;
图3为本申请实施例提供的共享堆栈的多任务运行方法的一种流程图;
图4为本申请实施例提供的共享堆栈的多任务运行装置的结构图;
图5为本申请实施例提供的共享堆栈的多任务运行设备的结构图。
具体实施方式
为了更好地理解本申请实施例提供的技术方案,下面将结合说明书附图以及具体的实施方式进行详细的说明。
一般微控制器要运行ROTS,要求设备具有相应的闪存(FLASH)空间来存储RTOS的代码。且,当运行RTOS系统来执行任务时,需要有堆栈来支持函数嵌套调用和局部变量,所以运行RTOS系统的设备还需要使用空间来存储堆栈。因此,在现有技术中,一般运行ROTS系统的设备至少应该有10KB的内存。然而,对于使用内置的静态随机存取存储器(RandomAccess Memory,RAM)作为内存的微控制器来说,RAM的大小可能会小于4K,如果通过运行通常的ROTS系统来同时执行多个任务,则会由于微控制器的内存空间过小而导致堆栈溢出。
鉴于此,本申请实施例提供一种共享堆栈的多任务运行方法,下面结合图1,对本申请实施例的方法流程进行详细说明。
步骤101、在堆栈中运行至少两个任务中的第一任务,运行至第一任务的阻塞子函数时,中断第一任务的运行;
步骤102、保存阻塞子函数的分支数组,其中,所述分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;
步骤103、在堆栈中运行第二任务,其中,第二任务是至少两个任务中除了第一任务之外的一个任务。
本申请实施例中的方法,可以应用于共享堆栈的多任务运行装置中,为了简化描述,下文简称为运行装置。该运行装置可以是通过微控制器(Microcontroller Unit,MCU)来实现,微控制器又称为单片机或者单片微型计算机。微控制器是指内存空间较小,处理能力有限的控制器件,例如空调设备中的微控制器。本文不对运行装置的具体实现形式进行限制。
例如,任务可以理解为线程,是调度和分派资源的基本单位,资源包括堆栈。线程一般包括该线程对应的函数地址以及该线程的状态,运行装置可以根据函数地址运行该线程。线程的状态一般包括四种状态,分别是活动状态、运行状态、睡眠状态以及结束状态。活动状态是指线程不一定立即运行,线程还需要与其他线程竞争,以便能获得资源;运行状态是指线程已经获得由运行装置分配的资源,运行装置开始运行该线程;睡眠状态是指,线程并没有运行结束,但是由于一些原因进入阻塞状态,暂时不运行;结束状态是指线程正常运行直到结束或者线程出现异常结束。
运行装置有处于活动状态的至少两个任务需要处理,至少两个任务的数量可以是两个,也可以是多个,本文不对至少两个任务的数量进行具体限制。也就是说,运行装置需要运行的任务不止一个。例如,空调设备的内机程序包括用于接收用户的遥控输入,显示温度和运行状态,控制风机运行。其中,接收用户的遥控输入可以理解为任务X,显示温度和运行状态可以理解为任务Y,控制风机运行可以理解为任务Z,至少两个任务就包括任务X、任务Y和任务Z。因此运行装置需要确定活动的至少两个任务中的哪个任务为第一任务。
运行装置可以是在活动的至少两个任务中随机选择一个任务为第一任务。例如,前文中至少两个任务包括任务X、任务Y和任务Z,运行装置可以随机选择这三个活动任务中的任意的一个任务作为第一任务。
或者,运行装置可以是在至少两个任务中选择优先级最高的一个任务为第一任务,也就是说,运行装置中预存所有任务的优先级高低顺序,运行装置根据至少两个任务中的任务的优先级高低顺序,选择优先级最高的一个任务为第一任务,所有任务的优先级高低顺序可以是由用户手动设置的。例如,至少两个任务包括前文中的任务X、任务Y和任务Z,运行装置中,三个任务的优先级高低分为为:任务X>任务Z>任务Y,因此,运行装置会将优先级最高的任务X确定为第一任务。按照优先级高低顺序来处理任务,能够使得运行装置尽快处理优先级高的任务,从而降低任务优先级高的任务的时延。
或者,运行装置可以是在至少两个任务中选择优先级满足条件的一个任务为第一任务。例如,运行装置可以根据每个任务所要求的时延,将所有的任务划分为多个优先级类别,例如,运行装置可以将所有任务划分为I级、II级和III级,I级的级别最高。其中,所要求的时延小于或等于0.2ms的任务为I级,所要求的时延位于0.2ms~0.4ms之间的任务为II级,所要求的时延大于0.5ms之间的任务为III级,由于任务Y所要求的时延为0.1ms,任务X所要求的时延为0.2ms,任务Z所要求的时延为0.3ms,因此,运行装置确定任务Y和任务X属于I级,任务Z属于II级。因此,运行装置会选择运行高于II级的任务,也就是说,运行装置会选择属于I级或II级的任务,那么运行装置可以在任务Y和任务X中随机选择一个任务,将其确定为第一任务。按照这种方式,可以增加运行装置处理任务的灵活性。
当然,上述只是对运行装置确定第一任务的方式进行示例说明,运行装置确定第一任务的方式并不限于此。
在运行装置确定出至少两个任务中的第一任务之后,执行步骤101,即在堆栈中运行至少两个任务中的第一任务,运行至第一任务的阻塞子函数时,中断第一任务的运行。
下面先对在堆栈中运行至少两个任务中的第一任务过程进行说明。
具体来说,运行第一任务时,先运行第一任务的主函数,主函数的嵌套深度为0,在堆栈中依次运行第一任务的主函数,然后依次运行第一任务的主函数的第一层子函数,再运行第一任务的主函数的第二层子函数,以此类推,再运行第一任务的主函数的第N层子函数,在依次运行第一层子函数至第N层子函数过程中,第一任务的子函数的嵌套深度从1依次增加至N,N为大于或等于1的整数。也就是说,运行装置在堆栈中是层层深入调用第一任务的子函数来运行第一任务的。一层子函数可能包括了很多子函数,运行第一任务时候,可能会运行该层子函数中的一个子函数,也可能会运行该层子函数中的多个子函数,本文不对该层子函数的运行个数进行限制。嵌套深度是可以理解为在运行该第一任务时,第一任务的当前子函数在对应任务的主函数中的调用-层数。
下面结合图2,对运行装置在堆栈中运行至少两个任务中的第一任务的过程进行举例说明。以第一任务为图2中的任务Y为例。运行装置先运行任务Y的主函数,主函数的嵌套深度为0,然后主函数的分支a调用第一层子函数,例如函数B,则函数B的嵌套深度为1,函数B的分支b再调用任务Y的第二层子函数,例如函数C,则函数C的嵌套深度为2,然后函数C的分支c调用任务Y的第三层子函数,例如,函数D。
下面继续对步骤101中,中断第一任务的过程进行说明。当运行至第一任务的阻塞子函数的时候,运行装置中断第一任务的运行。阻塞子函数可以理解为该函数运行时,由于需要等待硬件执行完毕或者需要等待某个事件发生而停止运行一段时间。也就是说,当运行第一任务运行到第N层子函数中的阻塞子函数时,中断第一任务的运行。中断第一任务可以理解为在堆栈中暂时不再运行第一任务,且第一任务不再占用堆栈。
例如,请继续参照图2,继续以任务Y为例,若函数C的分支c为任务Y的阻塞子函数,则当运行装置运行至第二层的分支c,则中断第一任务的运行。且,运行装置还可以保存之前运行的第一任务的结果,以便下一次运行装置可以根据该结果继续运行第一任务。
在本申请实施例中,步骤101中断第一任务的运行的方式可以包括但不限于如下两种实现方式。
第一种方式:
运行装置也可以是先从第N层子函数依次退回至第一任务的第一层子函数,在从第N层子函数依次退回至第一任务的第一层子函数的过程中,第一任务的嵌套深度从N依次递减至1,也就是说,运行装置依次返回至第一层子函数中,再由第一层子函数返回至第一任务的主函数中的时候,运行装置再中断第一任务的运行。。例如,请继续参照图2,继续以任务X为例,分支Y对应的子函数为阻塞子函数,当运行任务X的该分支Y时,运行装置先从第二层子函数退回至第一层子函数,再由第一层子函数退回至任务X的主函数,运行装置再中断第一任务的运行。
在第一种方式中,运行装置是层层退出,从而运行装置中的局部变量无法共享。由于不需要为局部变量预留存储空间,因此,第一种方式中需要保存的数据更少,占用的内存空间极少。
第二种方式:
运行装置可以是运行至第N层子函数中的阻塞子函数时,不用退出至任务X的0层函数,就立即强制性中断第一任务的运行,这样,通过强制性中断第一任务的运行,可以减少任务切换的时间,提高多任务处理的实时性。
在这种情况下,若运行装置强制中断第一任务的执行,然后执行第二任务,则运行装置中包含第一任务和第二任务的上下文,在这种情况下,第一任务和第二任务包含的子函数的各分支可以共享局部变量。
运行装置可以采用上述两种方式中的任意一种来执行步骤101,在此不作限制。
由于运行装置在选择执行任务时,会根据所有任务的优先级来选择执行,则虽然在此次运行过程中运行装置需要中断第一任务,但若第一任务的优先级较高,运行装置可能会重复执行第一任务,因此,为了避免运行装置不恰当地再次运行第一任务,在运行装置中断第一任务的运行之前,运行装置还可以直接将该阻塞子函数对应的第一任务标记为睡眠状态,睡眠状态可以参照前文的论述,此处不再赘述。
在执行完成步骤101之后,运行装置便可以执行步骤102,即运行装置可以保存该阻塞子函数的分支数组。
分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号。嵌套深度可以参照前文论述的内容,此处不再赘述。调用的所有子函数在主函数中对应的分支号,可以理解为对应的子函数在第一任务的主函数中的标识,也就是说,根据该分支号可以识别出运行第一任务中的主函数中具体调用的是哪一个是子函数。也就是说,运行第一任务可能会调用主函数包括的多层的子函数,当运行至第一任务的阻塞子函数的时候,需要将运行过程中调用的子函数的对应的嵌套深度以及子函数对应的分支号都保存。嵌套深度以及分支号的形式可以用数字表示,或者也可以用字母表示,或者也可以用字符串表示,本文不做具体限制。
继续以图2为例,若任务Y的阻塞子函数为分支c,分支c位于第二层,从而根据分支c的嵌套深度以及分支c的标识,确定该阻塞子函数的分支数组为(0,a),(1,b),(2,c)。
需要说明的是,为了能够记录该分支数组,在运行装置执行步骤102之前,所述方法还包括:初始化分支数组。例如,在内存中选择适当的存储空间,用于存储该分支数组,且分支数组的初始元素为0,嵌套深度是0。
当执行完成步骤102之后,运行装置便执行步骤103,即在堆栈中运行第二任务。
在本申请实施例中,由于步骤101包括前述两种实现方式,因此,步骤103的具体实现方式也相应的有如下两种具体情况。
第一种情况:
若运行装置采用第一种方式执行步骤101,则当运行装置退回至所述第一任务的所述主函数时,在所述堆栈中运行第二任务。也就是说,这种情况下,运行装置需要层层退出第一任务之后,才能继续运行第二任务。
第二种情况:
若运行装置采用第二种方式执行步骤101,则当运行装置运行至所述第N层子函数中的所述阻塞子函数时,直接在堆栈中运行第二任务。
在本申请实施例中,所述第二任务为,在所述至少两个任务中除了所述第一任务之外的任务中优先级高于阈值的任务。该阈值可以是预设的优先级级别,例如,优先级级别II。运行装置确定出第二任务的方式可以参照前文中论述的运行装置确定第一任务的方式,此处不再赘述。
需要说明的是,至少两个任务中的除了第一任务之外,可能还有M个任务,而M个任务中,可能有K个处于活动状态的任务以及P个处于睡眠状态的任务,则运行装置在确定第二任务时,可以从处于活动状态的K个任务中确定第二任务,K+P=M,M为大于或等于1的整数。
另外,在堆栈中运行第二任务时,如果运行到第二任务的阻塞子函数时,中断第二任务的运行,运行第二任务以及中断第二任务的过程可以参照前文论述的内容,此处不再赘述。或者,第二任务可能没有阻塞子函数,运行装置可能是直接运行第二任务,直到第二任务结束。
在执行完步骤103之后,本申请实施例中的方法还包括:
当所述阻塞子函数对应的事件发生时,根据所述分支数组,在所述堆栈中运行所述阻塞子函数。
需要说明的是,在执行第二任务中或者中断第二任务的运行之后或者再第二任务结束之后,可能第一任务等待的硬件已经执行完毕或者需要等待某个事件已经发生,或者第二任务完成即为第一任务对应的事件,则,当运行装置确定第一任务的阻塞子函数对应的事件发生时,则将第一任务标记为活动状态,活动状态可以参照前文论述的内容,此处不再赘述。这样,当第二任务执行结束或执行至第二任务的阻塞子函数时,运行装置可以重新执行第一任务。
运行装置可以选择运行至少两个任务中除了第二任务之外的处于活动状态的任务。例如,在除了第二任务之外的任务中,第三任务的优先级最高,第一任务的优先级低于第三任务的优先级,但是第一任务的优先级高于其它任务,运行装置可以在运行第三任务之后,再继续根据优先级高低顺序执行任务,直至运行第一任务。
或者,当所述阻塞子函数对应的事件发生后,运行装置确定第一任务是处于活动状态的任务中优先级最高的任务,则运行装置根据之前存储的分支数组,运行与第一任务对应的阻塞子函数。
在运行装置运行第一任务的时候,运行装置可以根据之前保存的分支数组,根据该分支数组中的嵌套深度和分支号直接运行第一任务对应的阻塞子函数。继续运行第一任务的方式可以参照前文论述的方式,此处不再赘述。
运行装置在运行结束第一任务之后,下一次运行装置需要再次运行第一任务之前,运行装置可以重新将第一任务对应的嵌套深度以及阻塞子函数的分支数组初始化,因此下一次运行第一任务的时候,与上一次运行第一任务的执行过程并不一定完全相同,避免上一次记录的第一任务的相关数据干扰下一次运行第一任务。子函数运行结束时,该子函数对应的分支号重设为零,且,返回值不为零,表示该子函数不需要重新执行。
为了更清楚地各个步骤的关系,请参照图3,以一个具体示例来对本申请实施例中的方法进行说明。
步骤301、运行装置先对任务Y的分支数组、任务X的分支数组进行初始化;
步骤302、在初始化任务Y的分支数组、任务X的分支数组之后,运行装置确定任务Y的优先级高于任务X,先运行任务Y,开始运行任务Y;
步骤303、运行任务Y;
运行任务Y的过程和前文论述第一任务的方式相同,此处不再赘述;
步骤304、运行至任务Y的阻塞子函数时,判断任务Y是否需要阻塞;
确定任务Y是否需要阻塞的过程为:判断任务Y的阻塞子函数对应的事件是否发生,若是则确定该任务Y不需阻塞;否则,确认该任务Y需要阻塞。
步骤305、若任务Y需要阻塞,则等待阻塞子函数对应的事件,标识任务Y进入睡眠状态,运行装置层层退出,直到退回至任务Y的主函数,这时,调度程序中断任务Y的运行,再重新调度执行其他任务;
在图3所示的示例中,以运行装置采用前文中的第一种方式中断任务Y的运行为例,即逐层退出任务Y。
需要说明的是,此时,当前分支数组中记录了任务Y的阻塞子函数的分支数组;
步骤306、任务Y的阻塞子函数对应的事件发生;
步骤307、运行装置激活任务Y。
由于运行装置中存储了任务Y的阻塞子函数的分支数组,因此,运行装置直接进入阻塞子函数。
步骤308、若根据步骤304确定任务Y重新激活,则从阻塞子函数开始继续执行任务Y,并判断该阻塞子函数是否已完成;
步骤309、若任务Y的阻塞子函数已经完成,则任务Y可切换到其他分支继续运行;
步骤310、在任务Y运行其他分支时,保存当前运行的分支的分支号;
或者,判断若任务Y的阻塞子函数没有执行完成,则不切换分支,运行装置执行步骤307。
在前文论述共享堆栈的多任务运行方法的基础上,本申请实施例还提供一种共享堆栈的多任务运行装置,请参照图4,该运行装置包括分支模块401和处理模块402。
具体来说,处理模块402,用于在堆栈中运行至少两个任务中的第一任务,运行至第一任务的阻塞子函数时,中断第一任务的运行;
分支模块401,用于保存阻塞子函数的分支数组,其中,运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;
处理模块402,还用于在堆栈中运行第二任务,其中,第二任务是至少两个任务中除了第一任务之外的一个任务。
可选的,处理模块402,还用于在阻塞子函数对应的事件发生后,根据分支数组,在堆栈中运行阻塞子函数。
可选的,处理模块402,用于在堆栈中运行第一任务的对应的主函数,主函数的嵌套深度为0;以及,
用于在堆栈中依次运行第一任务的主函数的第一层子函数至第N层子函数,其中,在依次运行第一层子函数至第N层子函数过程中,第一任务的子函数的嵌套深度从1依次增加至N,N为大于或等于1的整数。
可选的,处理模块402,用于从第N层子函数依次退回至第一任务的第一层子函数,其中,在从第N层子函数依次退回至第一任务的第一层子函数的过程中,第一任务的嵌套深度从N依次递减至1;以及,
用于从第一层子函数退回至第一任务的主函数,当退回至第一任务的主函数时,中断第一任务的运行。
可选的,处理模块402,在中断第一任务的运行之前,将第一任务标记为睡眠状态。可选的,处理模块402,用于当退回至第一任务的主函数时,在堆栈中运行第二任务;或,
用于当运行至第N层子函数中的阻塞子函数时,在堆栈中运行第二任务。
可选的,第二任务为,在至少两个任务中除了第一任务之外的任务中优先级高于阈值的任务。
在前文论述共享堆栈的多任务运行方法的基础上,本申请实施例还提供一种共享堆栈的多任务运行设备,请参照图5,该运行设备包括处理器501和存储器502。
至少一个处理器501,以及
与所述至少一个处理器501通信连接的存储器502;
其中,所述存储器502存储有可被所述至少一个处理器501执行的指令,所述至少一个处理器501通过执行所述存储器502存储的指令实现如图1中任一项所述的方法。
作为一种实施例,图4中的处理模块可以通过本申请实施例中的处理器501实现。
需要说明的是,本申请实施例中的处理器501的数量可以是一个,也可以是多个。图5中是以处理器501的数量为一个为例,但是实际上不限制处理器501的数量。
在前文论述共享堆栈的多任务运行方法的基础上,本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如图1中任一项所述的方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请实施例进行各种改动和变型而不脱离本申请实施例的精神和范围。这样,倘若本申请实施例的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (18)
1.一种共享堆栈的多任务运行方法,其特征在于,包括:
在堆栈中运行至少两个任务中的第一任务,运行至所述第一任务的阻塞子函数时,中断所述第一任务的运行;
保存所述阻塞子函数的分支数组,其中,所述分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;
在所述堆栈中运行第二任务,其中,所述第二任务是所述至少两个任务中除了所述第一任务之外的一个任务。
2.如权利要求1所述的方法,其特征在于,所述方法,还包括:
在所述阻塞子函数对应的事件发生后,根据所述分支数组,在所述堆栈中运行所述阻塞子函数。
3.如权利要求1所述的方法,其特征在于,在堆栈中运行至少两个任务中的第一任务,包括:
在所述堆栈中运行第一任务的对应的主函数,所述主函数的嵌套深度为0;
在所述堆栈中依次运行所述第一任务的所述主函数的第一层子函数至第N层子函数,其中,在依次运行所述第一层子函数至所述第N层子函数过程中,所述第一任务的子函数的嵌套深度从1依次增加至N,N为大于或等于1的整数。
4.如权利要求3所述的方法,其特征在于,所述阻塞子函数位于所述N层子函数中,中断所述第一任务的运行,包括:
从所述第N层子函数依次退回至所述第一任务的所述第一层子函数,其中,在从所述第N层子函数依次退回至所述第一任务的所述第一层子函数的过程中,所述第一任务的嵌套深度从N依次递减至1;
从所述第一层子函数退回至所述第一任务的所述主函数,当退回至所述第一任务的所述主函数时,中断所述第一任务的运行。
5.如权利要求1-4中任一项所述的方法,其特征在于,在中断所述第一任务的运行之前,所述方法还包括:
将所述第一任务标记为睡眠状态。
6.如权利要求1所述的方法,其特征在于,在所述堆栈中运行第二任务,包括:
当退回至所述第一任务的所述主函数时,在所述堆栈中运行第二任务;或,
当运行至所述第N层子函数中的所述阻塞子函数时,在堆栈中运行第二任务。
7.如权利要求1所述的方法,其特征在于,所述第二任务为,在所述至少两个任务中除了所述第一任务之外的任务中优先级高于阈值的任务。
8.如权利要求2所述的方法,其特征在于,所述方法还包括:
当所述阻塞子函数对应的事件发生时,将所述第一任务标记为活动状态;
当所述阻塞子函数对应的事件发生时,根据所述分支数组,在所述堆栈中运行所述阻塞子函数,包括:
当所述阻塞子函数对应的事件发生时,确定所述第一任务是处于活动状态的任务中优先级最高的任务;
根据所述分支数组,运行所述阻塞子函数。
9.一种共享堆栈的多任务运行装置,其特征在于,包括:
处理模块,用于在堆栈中运行至少两个任务中的第一任务,运行至所述第一任务的阻塞子函数时,中断所述第一任务的运行;
分支模块,用于保存所述阻塞子函数的分支数组,其中,所述分支数组包括运行所述第一任务所调用的所有子函数的嵌套深度,以及所述调用的所有子函数在所述主函数中对应的分支号;
所述处理模块,还用于在所述堆栈中运行第二任务,其中,所述第二任务是所述至少两个任务中除了所述第一任务之外的一个任务。
10.如权利要求9所述的装置,其特征在于,所述处理模块还用于:
在所述阻塞子函数对应的事件发生后,根据所述分支数组,在所述堆栈中运行所述阻塞子函数。
11.如权利要求9所述的装置,其特征在于,所述处理模块用于:
在所述堆栈中运行第一任务的对应的主函数,所述主函数的嵌套深度为0;以及,
用于在所述堆栈中依次运行所述第一任务的所述主函数的第一层子函数至第N层子函数,其中,在依次运行所述第一层子函数至所述第N层子函数过程中,所述第一任务的子函数的嵌套深度从1依次增加至N,N为大于或等于1的整数。
12.如权利要求11所述的装置,其特征在于,所述处理模块用于:
从所述第N层子函数依次退回至所述第一任务的所述第一层子函数,其中,在从所述第N层子函数依次退回至所述第一任务的所述第一层子函数的过程中,所述第一任务的嵌套深度从N依次递减至1;以及,
用于从所述第一层子函数退回至所述第一任务的所述主函数,当退回至所述第一任务的所述主函数时,中断所述第一任务的运行。
13.如权利要求9-12任一所述的装置,其特征在于,所述处理模块用于:
在中断所述第一任务的运行之前,将所述第一任务标记为睡眠状态。
14.如权利要求9所述的装置,其特征在于,所述处理模块用于:
当退回至所述第一任务的所述主函数时,在所述堆栈中运行第二任务;或,
当运行至所述第N层子函数中的所述阻塞子函数时,在堆栈中运行第二任务。
15.如权利要求9所述的装置,其特征在于,所述第二任务为,在所述至少两个任务中除了所述第一任务之外的任务中优先级高于阈值的任务。
16.如权利要求10所述的装置,其特征在于,所述处理模块用于:
当所述阻塞子函数对应的事件发生时,将所述第一任务标记为活动状态;以及,
当所述阻塞子函数对应的事件发生时,确定所述第一任务是处于活动状态的任务中优先级最高的任务,并根据所述分支数组,运行所述阻塞子函数。
17.一种共享堆栈的多任务运行设备,其特征在于,包括:
至少一个处理器,以及
与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令实现如权利要求1-8中任一项所述的方法。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如权利要1-8中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810972624.8A CN109240815B (zh) | 2018-08-24 | 2018-08-24 | 一种共享堆栈的多任务运行方法、装置及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810972624.8A CN109240815B (zh) | 2018-08-24 | 2018-08-24 | 一种共享堆栈的多任务运行方法、装置及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109240815A true CN109240815A (zh) | 2019-01-18 |
CN109240815B CN109240815B (zh) | 2021-07-23 |
Family
ID=65067933
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810972624.8A Active CN109240815B (zh) | 2018-08-24 | 2018-08-24 | 一种共享堆栈的多任务运行方法、装置及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109240815B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618946A (zh) * | 2019-08-19 | 2019-12-27 | 中国第一汽车股份有限公司 | 堆栈内存分配方法、装置、设备和存储介质 |
CN112711478A (zh) * | 2019-10-24 | 2021-04-27 | 珠海零边界集成电路有限公司 | 基于神经网络的任务处理方法、装置、服务器和存储介质 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN101154180A (zh) * | 2006-09-29 | 2008-04-02 | 大唐移动通信设备有限公司 | 一种任务栈溢出的监测方法 |
CN101290591A (zh) * | 2008-06-03 | 2008-10-22 | 北京中星微电子有限公司 | 一种嵌入式操作系统中切换任务的方法和单元 |
GB2461851A (en) * | 2008-07-10 | 2010-01-20 | Cambridge Consultants | Processor, which stores interrupt enable flags in a location used for other functions |
CN101819539A (zh) * | 2010-04-28 | 2010-09-01 | 中国航天科技集团公司第五研究院第五一三研究所 | 一种μCOS-Ⅱ移植到ARM7的中断嵌套方法 |
CN102099781A (zh) * | 2009-05-19 | 2011-06-15 | 松下电器产业株式会社 | 分支预测装置、其分支预测方法、编译器、其编译方法及分支预测程序记录介质 |
US20120311307A1 (en) * | 2011-05-31 | 2012-12-06 | Chynoweth Michael W | Method And Apparatus For Obtaining A Call Stack To An Event Of Interest And Analyzing The Same |
US20130145122A1 (en) * | 2010-08-30 | 2013-06-06 | Huawei Technologies Co., Ltd. | Instruction processing method of network processor and network processor |
CN105224403A (zh) * | 2015-09-17 | 2016-01-06 | 华为技术有限公司 | 一种中断处理方法及装置 |
CN106406991A (zh) * | 2016-08-30 | 2017-02-15 | 西安航天华迅科技有限公司 | 一种ThreadX操作系统在ARM处理器上的运行方法 |
CN107729240A (zh) * | 2017-09-30 | 2018-02-23 | 山东省科学院自动化研究所 | 嵌入式软件堆栈溢出检测方法和装置 |
-
2018
- 2018-08-24 CN CN201810972624.8A patent/CN109240815B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN101154180A (zh) * | 2006-09-29 | 2008-04-02 | 大唐移动通信设备有限公司 | 一种任务栈溢出的监测方法 |
CN101290591A (zh) * | 2008-06-03 | 2008-10-22 | 北京中星微电子有限公司 | 一种嵌入式操作系统中切换任务的方法和单元 |
GB2461851A (en) * | 2008-07-10 | 2010-01-20 | Cambridge Consultants | Processor, which stores interrupt enable flags in a location used for other functions |
CN102099781A (zh) * | 2009-05-19 | 2011-06-15 | 松下电器产业株式会社 | 分支预测装置、其分支预测方法、编译器、其编译方法及分支预测程序记录介质 |
CN101819539A (zh) * | 2010-04-28 | 2010-09-01 | 中国航天科技集团公司第五研究院第五一三研究所 | 一种μCOS-Ⅱ移植到ARM7的中断嵌套方法 |
US20130145122A1 (en) * | 2010-08-30 | 2013-06-06 | Huawei Technologies Co., Ltd. | Instruction processing method of network processor and network processor |
US20120311307A1 (en) * | 2011-05-31 | 2012-12-06 | Chynoweth Michael W | Method And Apparatus For Obtaining A Call Stack To An Event Of Interest And Analyzing The Same |
CN105224403A (zh) * | 2015-09-17 | 2016-01-06 | 华为技术有限公司 | 一种中断处理方法及装置 |
CN106406991A (zh) * | 2016-08-30 | 2017-02-15 | 西安航天华迅科技有限公司 | 一种ThreadX操作系统在ARM处理器上的运行方法 |
CN107729240A (zh) * | 2017-09-30 | 2018-02-23 | 山东省科学院自动化研究所 | 嵌入式软件堆栈溢出检测方法和装置 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618946A (zh) * | 2019-08-19 | 2019-12-27 | 中国第一汽车股份有限公司 | 堆栈内存分配方法、装置、设备和存储介质 |
CN112711478A (zh) * | 2019-10-24 | 2021-04-27 | 珠海零边界集成电路有限公司 | 基于神经网络的任务处理方法、装置、服务器和存储介质 |
CN112711478B (zh) * | 2019-10-24 | 2024-05-28 | 珠海零边界集成电路有限公司 | 基于神经网络的任务处理方法、装置、服务器和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109240815B (zh) | 2021-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8607244B2 (en) | Executing multiple threads in a processor | |
WO2016155335A1 (zh) | 异构多核可重构计算平台上任务调度的方法和装置 | |
US8572622B2 (en) | Reducing queue synchronization of multiple work items in a system with high memory latency between processing nodes | |
CN106569891B (zh) | 一种存储系统中任务调度执行的方法和装置 | |
CN103631661A (zh) | 一种内存管理方法和装置 | |
KR102197874B1 (ko) | 멀티-코어 프로세서를 포함하는 시스템 온 칩 및 그것의 쓰레드 스케줄링 방법 | |
US9411649B2 (en) | Resource allocation method | |
US9170841B2 (en) | Multiprocessor system for comparing execution order of tasks to a failure pattern | |
WO2017070900A1 (zh) | 多核数字信号处理系统中处理任务的方法和装置 | |
CN107577523B (zh) | 一种任务执行的方法及装置 | |
CN107368367B (zh) | 资源分配的处理方法、装置及电子设备 | |
CN108170526B (zh) | 负载能力优化方法、装置、服务器及可读存储介质 | |
EP3436944B1 (en) | Fast transfer of workload between multiple processors | |
CN103534680A (zh) | 多媒体处理器中的无序命令执行 | |
CN105117285B (zh) | 一种基于移动虚拟化系统的非易失性存储器调度优化方法 | |
CN111476344A (zh) | 多径神经网络、资源分配的方法及多径神经网络分析器 | |
CN109240815A (zh) | 一种共享堆栈的多任务运行方法、装置及设备 | |
WO2016202154A1 (zh) | 一种gpu资源的分配方法及系统 | |
CN111597044A (zh) | 任务调度方法、装置、存储介质及电子设备 | |
CN112925616A (zh) | 任务分配方法、装置、存储介质及电子设备 | |
US20130014119A1 (en) | Resource Allocation Prioritization Based on Knowledge of User Intent and Process Independence | |
CN111767121B (zh) | 运算方法、装置及相关产品 | |
CN104298507A (zh) | 资源的处理方法及装置 | |
CN103645941A (zh) | 一种新型无线传感器网络操作系统 | |
CN116244073A (zh) | 混合关键分区实时操作系统的资源感知型任务分配方法 |
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 |