一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

任务执行方法、装置、计算机设备、存储介质和程序产品与流程

2022-06-01 11:27:19 来源:中国专利 TAG:


1.本技术涉及操作系统技术领域,特别是涉及一种任务执行方法、装置、计算机设备、存储介质和程序产品。


背景技术:

2.汽车电子开放式系统osek中根据任务执行特点将任务归为两类,基础任务(bts)和扩展任务(ets)。其中,bts没有等待状态,一旦开始执行就会一直执行到结束,而ets内部可以使用引起任务挂起的接口。因此,对于ets来说,由于涉及任务执行过程中任务的挂起,在任务上下文切换时必须进行栈内存的备份。
3.通常,针对ets栈内存共享,目前主要是通过设置共享栈(bts所在的栈) 和私有栈(每个ets专属),通过修改ets任务栈针将ets的部分工作执行在 bts栈中,以此实现两种任务栈内存的共享。目前,对于共享栈内存的使用采用的是任务优先级抢占机制。然而,传统的共享栈内存使用方法,存在因任务抢占出现共享栈内存覆盖的问题。


技术实现要素:

4.本技术实施例提供了一种任务执行方法、装置、计算机设备、存储介质和程序产品,可以用于解决共享栈内存使用时因任务抢占出现的共享栈内存覆盖的问题。
5.第一方面,本技术实施例提供了一种任务执行方法,包括:
6.在第一任务运行至阻塞点时,将所述第一任务的相关数据备份至预设存储空间中之后,挂起所述第一任务;其中,所述预设存储空间为共享栈资源池之外的存储资源;
7.在所述第一任务被唤醒时,将所述预设存储空间中所述第一任务的相关数据写入第一栈内存中,并基于所述第一栈内存执行所述第一任务;所述第一栈内存是在所述第一任务被唤醒时从所述共享栈资源池中获取的。
8.第二方面,本技术实施例提供了一种任务执行装置,包括:
9.备份模块,用于在第一任务运行至阻塞点时,将所述第一任务的相关数据备份至预设存储空间中之后,挂起所述第一任务;其中,所述预设存储空间为共享栈资源池之外的存储资源;
10.第一执行模块,用于在所述第一任务被唤醒时,将所述预设存储空间中所述第一任务的相关数据写入第一栈内存中,并基于所述第一栈内存执行所述第一任务;所述第一栈内存是在所述第一任务被唤醒时从所述共享栈资源池中获取的。
11.第三方面,本技术实施例提供了一种计算机设备,包括存储器及处理器,所述存储器中储存有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如第一方面所述的任务执行方法的步骤。
12.第四方面,本技术实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的任务执行方法的步骤。
13.第五方面,本技术实施例提供了一种计算机程序产品,包括计算机程序,该计算机
程序被处理器执行时实现如第一方面所述的任务执行方法的步骤。
14.上述任务执行方法、装置、计算机设备、存储介质和程序产品,在第一任务运行至阻塞点时,将第一任务的相关数据备份至预设存储空间中之后,挂起第一任务,并在第一任务被唤醒时,将预设存储空间中第一任务的相关数据写入第一栈内存中,基于第一栈内存执行第一任务,由于该过程中预设存储空间为共享栈资源池之外的存储资源,这样在第一任务挂起时将第一任务的相关数据备份至了共享栈资源池之外,这样其他的任务抢占第一任务的栈内存后不会出现第一任务的栈内存中的数据被覆盖的情况,另外,在第一任务被唤醒时,由于是从共享栈资源池中获取的第一栈内存,将预设存储空间中第一任务的相关数据写入了第一栈内存中,这样避免了第一任务被唤醒时,第一任务占用其他任务的栈内存执行第一任务的情况出现,避免了不同任务抢占同一栈内存,解决了因任务抢占出现的共享栈中数据被覆盖的问题。
附图说明
15.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
16.图1为一个实施例中任务执行方法的应用环境图;
17.图2为一个实施例中函数调用关系图的示意图;
18.图3为一个实施例中执行任务t1、t2时的任务切换示意图;
19.图4为一个实施例中无sets栈内存的任务执行示意图;
20.图5为一个实施例中有sets栈内存的任务执行示意图;
21.图6为一个实施例中的堆栈示意图;
22.图7为一个实施例中任务执行方法的流程图;
23.图8为一个实施例中的任务的调用层级示意图;
24.图9为另一个实施例中任务执行方法的流程图;
25.图10为另一个实施例中任务执行方法的流程图;
26.图11为一个实施例中任务执行装置的结构框图。
具体实施方式
27.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
28.本技术实施例提供的任务执行方法,可以应用于如图1所示的应用环境中。其中,计算机设备包括通过系统总线连接的处理器、存储器,该存储器中存储有计算机程序,处理器执行该计算机程序时可以执行下述方法实施例的步骤。可选的,该计算机设备还可以包括网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器,该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行
提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。可选的,该计算机设备可以是服务器,可以是个人计算机,还可以是个人数字助理,还可以是其他的终端设备,例如平板电脑、手机等等,还可以是云端或者远程服务器,本技术实施例对计算机设备的具体形式并不做限定。
29.本领域技术人员可以理解,图1中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
30.传统技术中,针对ets栈内存共享,主要是设置共享栈(bts所在的栈)和私有栈(每个ets专属),通过修改ets任务栈针将ets的部分工作执行在bts栈中,以此实现两种任务栈内存的共享,通常将这种ets命名为sets(半扩展任务)。 sets本质上还是ets,sets拥有自己独立的栈,在这个私有栈上可以调用阻塞系统,如消息、信号量等。然而,对于sets中某些没有阻塞接口调用的函数,sets 可以将栈切到bts所在的栈上,即共享栈,将触发栈切换的函数称为切换函数。如果一个半扩展任务sets的入口函数是切换函数,那么这个半扩展任务sets就完全作为bts执行。反之,如果半扩展任务sets没有任何切换函数,那么这个半扩展任务sets就作为ets执行。
31.示例性地,如图2和图3所示,图2、图3中的t1、t2均表示任务,e1表示任务t1的入口函数,e2表示任务t2的入口函数,f表示调用函数,s表示阻塞函数,图2为函数调用关系图(call graph),如图2所示,当t1、t2均运行至阻塞函数时,将运行调用函数f。如图3所示,为执行任务t1、t2时的任务切换示意图,例如,任务t1在执行过程中激活任务t2,任务t2执行完成后再返回执行任务t1。进一步,如图4和图5所示,展示了sets栈内存使用相比普通bts/ets栈内存使用的情况,其中,图4和图5中的每个小方框都表示的是占用10个bytes,需要说明的是,图4和图5中e1所在的框表示占用10个bytes,f1所在的框表示占用2个小框,f1占用20个bytes,s所在的框表示占用5个小框,s占用50个bytes,图4展示的是没有 sets的情况,t1、t2都设置独立的栈,各栈占用60bytes,一共占用120bytes。使用了sets后,f1()、f2()和s()不触发阻塞,可以切换到共享栈中执行。如图5 所示,使用了sets后,共享栈最多占用50bytes,t1,t2的私有栈更小,各占用 10bytes,该模型使用的栈总共占70bytes。
32.通常,上述切换函数的实现方式并不复杂,在任务执行过程中,每个函数调用在栈上都有一个调用帧,包含调用传递的参数、局部变量和返回地址。该调用帧由寄存器中的堆栈指针esp和基指针ebp进行寻址,esp指针指向该层栈的未尾,子函数使用它作为起点进行调用帧的存储;ebp指针指向返回地址和参数块,用于访问参数。为了实现切换函数,通过限制编译器采用的访问模式,使得局部变量通过esp指针访问,而参数通过ebp指针来访问,通过分离局部变量和参数的访问路径,将参数和局部变量放置在不同内存位置,即将参数放置在私有栈中,将局部变量放置在共享栈中。另外,为了执行实际的栈针切换,利用编译器在任务的切换函数入口处添加了一条指令,将esp指针设置为共享栈的顶部,从而实现任务上下文的切换。
33.示例性地,以f1()函数的执行过程为例,在f1()进入时,原始的栈针存储在%ebp中,修改%esp指向共享栈内存地址(tos_bts),f1函数内部的函数体的执行均在共享栈中执行。当函数返回时,标准的函数返回操作通过%ebp来恢复%esp,退出时就会返回到私有栈中执行。如图6所示,图6的堆栈图展示了sets 抢占bts并用f1()切换到共享栈的情况,
sets抢占bts后开始从入口函数e2开始执行任务,调用函数f1时,在函数入口处依次压栈arg2、arg1,返回地址old ebp到 sets的私有栈中,把当前所在esp赋值给ebp(ebp存储私有栈此时的sp,需要保证在f1执行中不再使用ebp来查询局部变量,可以通过修改编译器来实现),之后tos_bts赋值esp,sets的栈此时切入bts的共享栈中,之后在共享栈里调用 bar,把需要的变量通过esp压在共享栈中(local1-local4),然后执行bar,退出返回时就直接把ebp存的私有栈的值赋给esp,切回共享栈,再弹出之前存储在私有栈里的参数。
34.但是,上述方案会因为任务抢占出现共享栈内容覆盖的情况,假设任务t1 正在共享栈执行,一个外部中断到来触发优先级高于任务t1的任务t2,任务t2 将抢占任务t1的共享栈,由于所有切换函数都使用tos_bts作为栈帧起始,此时将会出现共享栈覆盖的情况。
35.针对上述共享栈内存使用方法,存在因任务抢占出现共享栈内存覆盖的问题,本技术实施例提出一种任务执行方法、装置、计算机设备、存储介质和程序产品,用于解决共享栈内存使用时因任务抢占出现的共享栈内存覆盖的问题。
36.在一个实施例中,如图7所示,提供了一种任务执行方法,以该方法应用于图1中的计算机设备为例进行说明,包括以下步骤:
37.s201,在第一任务运行至阻塞点时,将第一任务的相关数据备份至预设存储空间中之后,挂起第一任务;其中,预设存储空间为共享栈资源池之外的存储资源。
38.首先,需要说明的是,本技术实施例的应用场景可以为多核基于优先级调度的抢占式嵌入式系统,也可以适用于单核的场景下,不同任务的入口函数一致,触发方式一致。下面以应用的系统的cpu拥有4个核,触发方式均为消息触发为例进行说明。
39.其中,阻塞点是指任务运行至该点后无法再继续执行任务的点,例如,任务运行到某个点时,会死等接收消息,或者,会死等接收事件,则可以将死等接收消息的点称为阻塞点,或者,可以将死等接收事件的点称为阻塞点。
40.需要说明的是,本技术实施例的应用场景可以进行推广,不仅限于消息接收发送任务,对于所有具有多个任务阻塞在某资源的场景,本技术实施例提供的任务执行方法均使用,例如,对于多个任务阻塞于信号量、事件等本技术实施例提供的任务执行方法均使用。
41.可选地,为了避免高优先级任务抢占低优先级任务造成任务栈的覆盖,本技术实施例中为每一个优先级的任务单独提供栈内存,不同优先级的任务对应不同的栈内存。可选的,不同的任务可以根据自身的优先级从共享栈资源池中确定对应的栈内存。
42.在多核场景中,为了减少多核抢占引起的额外开销,可以为每个核单独设置了一个共享栈资源池。那么,对于上述第一任务来说,上述共享栈资源池即为第一任务所在核对应的共享栈资源池。可选的,共享栈资源池可以包括多个栈内存,对于栈内存的分配,可以利用block算法,对共享资源池中的内存按照2kb为单位分块进行分配,得到共享资源池包括的多个栈内存。
43.另外,为了避免高优先级任务抢占低优先级任务造成任务栈的覆盖,对于同优先级任务的栈内存,每个任务可以将与自身相关的数据备份至除共享栈资源池之外的存储资源中,例如,静态堆,或者,也可以为除共享栈资源池之外的其他存储资源等,也就是说,本实施例中预设存储空间可以为静态堆,或者,也可以为除共享栈资源池之外的其他存储资源。可选的,第一任务的相关数据可以包括第一任务的寄存器配置、第一任务的任务栈帧的
偏移值以及第一任务的局部变量等,本技术实施例中不加以限制。
44.s202,在第一任务被唤醒时,将预设存储空间中第一任务的相关数据写入第一栈内存中,并基于第一栈内存执行第一任务;第一栈内存是在第一任务被唤醒时从共享栈资源池中获取的。
45.其中,上述第一栈内存是第一任务被唤醒时从上述共享栈资源池中获取的,可选的,上述共享栈资源池为第一任务所在核对应的共享栈资源池,也就是说,上述第一栈内存为第一任务被唤醒时,从上述第一任务所在核对应的共享栈资源池中确定的。
46.可选的,第一栈内存可以是唤醒第一任务的其他任务从上述共享栈资源池中为第一任务申请的,也可以是其他运行的任务从上述共享栈资源池中为第一任务申请的。在本实施例中,在上述第一任务被唤醒时,从上述共享栈资源池中获取到上述第一栈内存后,第一栈内存可以从上述预设存储空间中读取上述第一任务的相关数据,并将第一任务的相关数据写入第一任务对应的第一栈内存中,之后,计算机设备可以基于写入了第一任务的相关数据的第一栈内存执行上述第一任务。
47.上述任务执行方法中,在第一任务运行至阻塞点时,将第一任务的相关数据备份至预设存储空间中之后,挂起第一任务,并在第一任务被唤醒时,将预设存储空间中第一任务的相关数据写入第一栈内存中,基于第一栈内存执行第一任务,由于该过程中预设存储空间为共享栈资源池之外的存储资源,这样在第一任务挂起时将第一任务的相关数据备份至了共享栈资源池之外,这样其他的任务抢占第一任务的栈内存后不会出现第一任务的栈内存中的数据被覆盖的情况,另外,在第一任务被唤醒时,由于是从共享栈资源池中获取的第一栈内存,将预设存储空间中第一任务的相关数据写入了第一栈内存中,这样避免了第一任务被唤醒时,第一任务占用其他任务的栈内存执行第一任务的情况出现,避免了不同任务抢占同一栈内存,解决了因任务抢占出现的共享栈中数据被覆盖的问题。
48.进一步地,在一个实施例中,上述相关数据包括第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第一任务在第二栈内存的保存寄存器偏移值、返回地址值、第一任务的封装线程局部变量和第一任务的接收消息局部变量中的至少一个;其中,第二栈内存为第一任务创建之前从共享栈资源池中确定的用于存储相关数据的栈内存。下面对备份这些数据的原因加以详细说明:
49.a,当不同任务的入口函数一致,每个任务在进行上下文切换时的寄存器配置是一致的,因此,可以将任务的寄存器配置进行备份,需要说明的是,对于保存寄存器s0的配置需要在运行时计算后再进行备份。
50.b,在进行任务的上下文切换时,各任务栈帧指向的位置相对于栈底的偏移是固定的,因此可以将各任务栈帧的偏移值进行备份。
51.c,任务执行至阻塞点之前会经历几层调用层,每层调用将会在栈上存储保存寄存器s0的值和返回地址ra的值,由于调用函数一致,因此,每层调用的返回地址ra的值是固定的,保存寄存器s0相对于栈底的偏移值也是固定的,因此,可以将第一任务在第二栈内存的保存寄存器偏移值和返回地址值进行备份。其中,第二栈内存为第一任务创建之前从共享栈资源池中确定的用于存储上述相关数据的栈内存。可选的,在本实施例中,第二栈内存可以为在第一任务创建前,根据第一任务的优先级从共享栈资源池中确定的。可以理解的是,在多核场景中,为每个核单独设置了一个共享栈资源池,那么,对于上述第一任务来说,上
述共享栈资源池即为第一任务所在核对应的共享栈资源池,也就是说,上述第二栈内存为根据第一任务的优先级从第一任务所在核对应的共享栈资源池中确定的。继续以上述收消息任务的入口函数为例,当任务执行至第6行消息队列-接收消息tx_queue_receive直到上下文切换前将经历4层调用,这四层调用层级的示意图如图8所示,这四层调用每层调用会在栈上存储保存寄存器s0 的值和返回地址ra的值,由于调用函数一致,所以这四层每层的ra值固定,保存寄存器s0的值相对于栈底的偏移固定,因此,可以将该消息任务的栈内存的保存寄存器偏移值和返回地址值进行备份。
52.d,在消息队列-接收消息tx_queue_receive中从系统挂起接口返回时,需要使用局部变量封装线程thread_ptr的值,由于每个任务的封装线程thread_ptr局部变量的值不固定,因此,可以将封装线程thread_ptr局部变量进行备份。
53.e,在各任务的入口函数线程输入thread_entry中,唯一需要关注的局部变量是接收消息received_msg局部变量,该值作为出参将存储在栈中,但是该值数据的写入是在发送任务或者发送消息时获取,因此直接使用该局部变量所在地址传入会引起执行异常,例如另一同优先级任务正在执行,发送的消息会直接写入共享栈中,由于值的覆盖可能会出现运行异常。因此接收消息receive_msg 局部变量需要将其进行备份。
54.进一步地,上述预设存储空间包括系统控制块和预设内存,上述s201中的“将第一任务的相关数据备份至预设存储空间中”包括以下中的至少一项:
55.第一项,将第一任的寄存器配置、第一任务的任务栈帧的偏移值、第一任务在第二栈内存的保存寄存器偏移值和返回地址值中的至少一个,备份至预设内存中。
56.在本实施例中,上述预设存储空间包括预设内存,该预设内存可以为共享栈资源池之外的存储资源,例如可以为静态堆等。
57.进一步地,由于各任务的寄存器配置是一致的,因此,计算机设备可以全局预设一块内存例如静态堆等,并将各任务的寄存器配置备份在该内存中。
58.对于各任务在进行上下文切换时,各任务栈帧指向的位置相对于栈底的偏移是固定,因此可以全局存储各任务栈帧的偏移值,而各任务栈帧的偏移值和各任务的寄存器配置是相关的,因此,可以将各任务栈帧的偏移值备份在上述预设的内存中;
59.由于各任务的调用函数是一致的,所以各调用的层的返回地址值是固定的,各任务栈内存的保存寄存器s0相对于栈底的偏移是固定的,因此,也可以将各任务的栈内存的保存寄存器偏移值和各任务的返回地址值进行全局存储,也就是说,可以将各任务的栈内存的保存寄存器偏移值和各任务的返回地址值也备份在上述预设内存中。
60.第二项,将第一任务的封装线程局部变量和/或第一任务的接收消息局部变量,备份至系统控制块中。
61.在本实施例中,上述预设存储空间包括系统控制块,系统控制块是和操作系统相关的,而各任务的封装线程thread_ptr局部变量和各任务的接收消息 receive_msg局部变量也是和操作系统相关的,因此,可以在操作系统的系统控制块中存储各任务的封装线程thread_ptr局部变量和/或各任务的接收消息 receive_msg局部变量,那么,对于第一任务来说,可以将第一任务的封装线程 thread_ptr局部变量和/或第一任务的接收消息receive_msg局部变量备份至预设存储空间中的系统控制块中。
62.进一步地,作为一种可选的实施方式,可以通过修改实时操作系统rtos 的任务控
制块结构体,以将各任务的封装线程thread_ptr局部变量和/或各任务的接收消息receive_msg局部变量备份至上述系统控制块中。
63.另外,需要说明的是,由于各任务的系统控制块的地址唯一,因此,将各任务的封装线程thread_ptr局部变量和/或各任务的接收消息receive_msg局部变量备份在系统控制块中,也不会出现各任务的系统控制块彼此覆盖的情况。
64.进一步地,以本技术提供的任务执行方法的应用场景为所有任务拥有独立的栈内存,共有44个任务,每个任务使用2kb栈内存,合计使用88kb的栈内存为例,经过大量实验后得到采用本技术提供的任务执行方法的有益效果如下:
65.在本技术提供的任务执行方法下,栈内存使用量取决于各核使用的优先级数量,最大规格下核0拥有10个优先级,核1至3各拥有4个优先级,最终使用的内存计算如下:
66.1.栈内存资源池使用为44kb。
67.2.每个任务的任务控制块额外需要8字节,分别存储局部变量和接收的消息,内存占用352bytes。
68.3.全局存储的上下文切换寄存器备份数据内存占用64bytes。
69.4.全局存储的栈针sp距栈底偏移内存占用4bytes。
70.5.全局存储的4级调用栈所需的s0偏移以及返回地址内存占用32bytes。
71.合计使用内存45508bytes,相比未优化时内存的使用减少了49.4%。
72.通过上述实验数据的描述可知,本技术提供的任务执行方法在对系统性能产生较小影响的情况下在一定程度上合并了同优先级任务的栈,帮助解决了嵌入式系统中内存紧张的问题。
73.本实施例中,第一任务的相关数据包括第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第一任务在第二栈内存的保存寄存器偏移值、返回地址值、第一任务的封装线程局部变量和第一任务的接收消息局部变量中的至少一个,通过将第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第一任务在第二栈内存的保存寄存器偏移值和返回地址值中的至少一个备份至预设内存中,将第一任务的封装线程局部变量和/或第一任务的接收消息局部变量备份至系统控制块中,能够避免第一任务的相关数据不会被其他任务的数据覆盖,解决了因任务抢占出现的共享栈中数据被覆盖的问题。
74.进一步地,在上述将第一任务的相关数据备份至预设存储空间中之后的场景中,可以将第二栈内存释放,以使第二栈内存为一空内存,在上述实施例的基础上,在一个实施例中,上述方法还包括:将相关数据备份至预设存储空间中之后,释放第二栈内存。
75.在本实施例中,由于将第一任务的相关数据备份至预设存储空间中之后,第一任务的相关数据有了备份数据,此时可以将第二栈内存释放,使第二栈内存成为一空内存,对已经备份的数据不再进行存储。进一步地,作为一种可选的实施方式,在释放之后的第二栈内存中可以执行第二任务,或者,也可以在释放之后的第二栈内存中执行其他任务,这样能够有效地避免空闲的栈内存的资源浪费,确保了对栈内存的有效使用。
76.在上述将第一任务的相关数据备份至预设的存储空间的过程中,为了避免出现同一块栈内存被两个任务同时使用的情况,在一个实施例中,上述方法还包括:在将相关数据备份至预设存储空间的过程中,控制操作系统关闭抢占功能;以及,在释放第二栈内存之后,控制操作系统开启抢占功能;抢占功能表示允许第一任务之外的其他任务抢占第二栈
内存。
77.其中,抢占功能表示允许上述第一任务之外的其他任务抢占上述第二栈内存,例如,任务t1正在其所在的栈内存中执行任务,当一个外部中断或出现任务t2时,且任务t2的优先级高于任务t1时,任务t2将抢占任务t1的栈内存,在进行上下文切换期间,也即备份第一任务的相关数据期间,控制操作系统将抢占功能关闭后,上述任务t2将无法抢占任务t1的栈内存。但是,当第一任务的相关数据备份完成,且第二栈内存被完全释放之后,任务t2可以抢占该第二栈内存。
78.在本实施例中,将上述第一任务的相关数据备份至预设的存储空间的过程中,为了避免除第一任务之外的其他任务抢占第一任务对应的第二栈内存,可以控制操作系统将抢占功能关闭,避免了同一栈内存被两个任务同时使用的情况;并在将第一任务存储在第二栈内存中的相关数据备份至预设的存储空间,释放了第二栈内存之后,由于此时第一任务存储在第二栈内存中的相关数据已经进行了备份,第二栈内存释放后已为一空内存,其他任务可以使用释放后的第二栈内存,因此,在第二栈内存释放之后,可以控制操作系统开启上述抢占功能,使得栈内存可以被灵活使用,避免资源浪费。
79.为了便于本领域技术人员的理解,以下对本技术提供的任务执行方法进行详细介绍,请参考图9和图10,其中,图9中的任务a表示第一任务,任务b 表示第二任务,且任务a和任务b为同一类型的任务,如图9所示,任务a和任务b为收消息任务,首先为任务a申请任务栈内存,创建任务a后将自动执行任务a,当任务a运行至阻塞点(如收消息点)时发生阻塞,可以将任务a 对应的栈内存中的关键数据进行备份,并释放任务a对应的栈内存挂起任务a,之后,任务b可以向任务a发生消息唤醒任务a,并为任务a申请栈内存,恢复任务a栈关键数据,调度任务a并执行任务a,在接收到消息时对接收到的消息进行处理。
80.如图10所示该方法的完整过程可以包括:
81.s1,在第一任务创建前,根据第一任务的优先级从第一任务核对应的共享栈资源池中确定第二栈内存。
82.s2,在第一任务运行至阻塞点时,将第一任务存储在第二栈内存中的第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第二栈内存的保存寄存器偏移值和返回地址值中的至少一个,备份至预设内存中;将第一任务的封装线程局部变量和/或第一任务的接收消息局部变量,备份至系统控制块中。
83.s3,在将相关数据备份至预设存储空间的过程中,控制操作系统关闭抢占功能。
84.s4,挂起第一任务,释放第二栈内存,在释放第二栈内存之后,控制操作系统开启抢占功能。
85.s5,在释放之后的第二栈内存中执行第二任务。
86.s6,第一任务被唤醒时,从第一任务所在核对应的共享栈资源池中为第一任务确定对应的第一栈内存。
87.s7,将预设存储空间中第一任务的相关数据写入第一任务对应的第一栈内存中,并基于第一栈内存执行第一任务。
88.需要说明的是,针对上述s1-s7中的描述可以参见上述实施例中相关的描述,且其效果类似,本实施例在此不再赘述。
89.应该理解的是,虽然如上的各实施例所涉及的流程图中的各个步骤按照箭头的指
示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
90.基于同样的发明构思,本技术实施例还提供了一种用于实现上述所涉及的任务执行方法的任务执行装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个任务执行装置实施例中的具体限定可以参见上文中对于任务执行方法的限定,在此不再赘述。
91.在一个实施例中,如图11所示,提供了一种任务执行装置,包括:备份模块和第一执行模块,其中:
92.备份模块,用于在第一任务运行至阻塞点时,将第一任务的相关数据备份至预设存储空间中之后,挂起第一任务;其中,预设存储空间为共享栈资源池之外的存储资源。
93.第一执行模块,用于在第一任务被唤醒时,将预设存储空间中第一任务的相关数据写入第一栈内存中,并基于第一栈内存执行第一任务;第一栈内存是在第一任务被唤醒时从共享栈资源池中获取的。
94.可选的,上述相关数据包括第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第一任务在第二栈内存的保存寄存器偏移值、返回地址值、第一任务的封装线程局部变量和第一任务的接收消息局部变量中的至少一个;其中,第二栈内存为第一任务创建之前从共享栈资源池中确定的用于存储相关数据的栈内存。
95.可选的,第二栈内存为从第一任务创建之前从第一任务所在核对应的共享栈资源池中确定的。
96.可选的,第一栈内存为第一任务被唤醒时,从第一任务所在核对应的共享栈资源池中确定的。
97.可选的,上述共享栈资源池包括多个栈内存,不同优先级的任务对应不同的栈内存。
98.本实施例提供的任务执行装置,可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
99.在上述实施例的基础上,可选的,上述预设存储空间包括系统控制块和预设内存;上述备份模块,包括以下第一备份单元和第二备份单元中的至少一个,其中:
100.第一备份单元,用于将第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第二栈内存的保存寄存器偏移值和返回地址值中的至少一个,备份至预设内存中。
101.第二备份单元,用于将第一任务的封装线程局部变量和/或第一任务的接收消息局部变量,备份至系统控制块中。
102.本实施例提供的任务执行装置,可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
103.在上述实施例的基础上,可选的,上述装置还包括:确定模块,其中:
104.确定模块,用于在第一任务创建前,根据第一任务的优先级从共享栈资源池中确
定第二栈内存。
105.本实施例提供的任务执行装置,可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
106.在上述实施例的基础上,可选的,上述装置还包括:释放模块,其中:
107.释放模块,用于将相关数据备份至预设存储空间中之后,释放第二栈内存。
108.本实施例提供的任务执行装置,可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
109.在上述实施例的基础上,可选的,上述装置还包括:第二执行模块,其中:
110.第二执行模块,用于在释放之后的第二栈内存中执行第二任务。
111.本实施例提供的任务执行装置,可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
112.在上述实施例的基础上,可选的,上述装置还包括:控制模块,其中:
113.控制模块,用于在将相关数据备份至预设存储空间的过程中,控制操作系统关闭抢占功能;以及,在释放第二栈内存之后,控制操作系统开启抢占功能;抢占功能表示允许第一任务之外的其他任务抢占第二栈内存。
114.本实施例提供的任务执行装置,可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
115.上述任务执行装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
116.在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
117.在第一任务运行至阻塞点时,将第一任务的相关数据备份至预设存储空间中之后,挂起第一任务;其中,预设存储空间为共享栈资源池之外的存储资源;
118.在第一任务被唤醒时,将预设存储空间中第一任务的相关数据写入第一栈内存中,并基于第一栈内存执行第一任务;第一栈内存是在第一任务被唤醒时从共享栈资源池中获取的。
119.可选的,上述相关数据包括第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第一任务在第二栈内存的保存寄存器偏移值、返回地址值、第一任务的封装线程局部变量和第一任务的接收消息局部变量中的至少一个;其中,第二栈内存为第一任务创建之前从共享栈资源池中确定的用于存储相关数据的栈内存。
120.可选的,上述第二栈内存为第一任务创建之前从第一任务所在核对应的共享栈资源池中确定的。
121.可选的,上述第一栈内存为第一任务被唤醒时,从第一任务所在核对应的共享栈资源池中确定的。
122.可选的,共享栈资源池包括多个栈内存,不同优先级的任务对应不同的栈内存。
123.在一个实施例中,预设存储空间包括系统控制块和预设内存;处理器执行计算机程序时还实现以下步骤中的至少一项:
124.将第一任务的寄存器配置、第一任务的任务栈帧的偏移值、第二栈内存的保存寄
存器偏移值和返回地址值中的至少一个,备份至预设内存中;
125.将第一任务的封装线程局部变量和/或第一任务的接收消息局部变量,备份至系统控制块中。
126.在一个实施例中,处理器执行计算机程序时还实现以下步骤:
127.在第一任务创建前,根据第一任务的优先级从共享栈资源池中确定第二栈内存。
128.在一个实施例中,处理器执行计算机程序时还实现以下步骤:
129.将相关数据备份至预设存储空间中之后,释放第二栈内存。
130.在一个实施例中,处理器执行计算机程序时还实现以下步骤:
131.在释放之后的第二栈内存中执行第二任务。
132.在一个实施例中,处理器执行计算机程序时还实现以下步骤:
133.在将相关数据备份至预设存储空间的过程中,控制操作系统关闭抢占功能;以及,在释放第二栈内存之后,控制操作系统开启抢占功能;抢占功能表示允许第一任务之外的其他任务抢占第二栈内存。
134.本技术实施例还提供了一种计算机可读存储介质。一个或多个包含计算机可执行指令的非易失性计算机可读存储介质,当所述计算机可执行指令被一个或多个处理器执行时,使得所述处理器执行上述任务执行方法的步骤。
135.本技术实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述任务执行方法。
136.需要说明的是,本技术所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
137.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(read-only memory,rom)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(reram)、磁变存储器(magnetoresistive random access memory,mram)、铁电存储器 (ferroelectric random access memory,fram)、相变存储器(phase changememory,pcm)、石墨烯存储器等。易失性存储器可包括随机存取存储器 (random access memory,ram)或外部高速缓冲存储器等。作为说明而非局限,ram可以是多种形式,比如静态随机存取存储器(static random accessmemory,sram)或动态随机存取存储器(dynamic random access memory, dram)等。本技术所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本技术所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
138.以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛
盾,都应当认为是本说明书记载的范围。
139.以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本技术专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术的保护范围应以所附权利要求为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献