目录
实时多任务
1.1 任务生命周期管理
1.2 任务状态控制
1.3 任务调度
1.4 用户接口
结语:
实时操作系统是基于多任务和任务间通信的概念的操作系统,多任务环境允许一个实时应用由一组各自独立的任务组成,每个任务拥有自己的执行线程和一组系统资源。
实时多任务
任务管理和调度是实时操作系统的核心,该模块提供任务生命周期管、控制和调度支持。
任务生命周期管理包括:任务创建、任务删除等。
任务状态控制包括:任务在就:绪态(Ready)、阻塞(Pend)、挂起(Suspend)、延时(Delay)四个状态间的切换,任务优先级设置与获取,任务调度锁定。
任务调度,提供基于优先级抢占式任务调度,在同优先级的任务提供可选的Round-Robin时间片轮转调度。
1.1 任务生命周期管理
1、任务创建和删除。
任务创建使用taskSpawn()函数,
函数原型:
int taskSpawn()
{
char* name,
int periority,
int options,
int stackSize,
FUNCPTR entryPt;
int arg1,
int arg2,
int arg3,
int arg4,
int arg5,
int arg6,
int arg7,
int arg8,
int arg9,
int arg10
}
该函数共有15参数,分别表示:任务名、任务优先级、任务选项字、任务堆栈大小、任务入口函数、以及任务入口函数的10个可选参数;
任务创建和激活成功后返回任务ID号,失败时返回ERROR;
针对参数有一下要求:
1)任务名:便于记忆,最好是以t或者u开始的一个字符串;
2)任务优先级:0~255之间,最高优先级是0,最低优先级是255,建议创建任务优先级在150之后;
3)任务选项字:当任务有浮点数操作计算或者调用浮点计算函数时,任务选项字是VX_FP_TASK;当任务没有浮点数操作计算,也不调用浮点计算函数时,任务选项字是0;
4)任务堆栈:创建任务时分配的内存,包含了任务控制块(TCB)和任务名,剩余内存是任务堆栈,默认使用0XEE填充,这种初始化填充主要用于任务堆栈检查函数checkStack();
5)任务入口函数:任务创建和激活成功后,系统调用这个函数,最多有10个可选参数,任务入口函数在任务堆栈空间运行,因此必须设置足够大的任务堆栈,并且任务入口函数及其调用函数中不允许使用大量占用空间的数组,结构体变量等。
2、任务删除函数;
taskDelete()
函数原型:
STATUS taskDelete
{
int tid;
}
taskDelete()只有一个参数,是任务名称,任务删除成功后返回OK,失败时返回ERROR。
1.2 任务状态控制
任务状态控制包括:就绪(Ready)、阻塞(Pend)、挂起(Suspend)、延迟(Delay)。
内核记录系统中每个任务的当前状态,应用程序的内核函数调用可以使得每个任务从一个状态转换为另一种状态,当任务被创建时,任务进入挂起状态,激活很快,任务可以先创建后激活,还有一种方式是直接使用taskSpawn例程,可以在创建任务的同时激活任务。且任务可以在任何状态下被和删除。
一、任务状态情况:
1)READY:任务处于等待获取CPU并执行的状态;
2)PEND:任务等待某种资源而处于阻塞状态;
3)DELAY:任务处于等待一个时间段的状态;
4)SUSPEND:任务处于一个不可执行的状态,该状态主要用于调试,suspend状态除了禁止任务执行外,并不禁止任务的状态迁移,因此,pended-suspend状态的任务
可以被unlock,而处于delayded-suspend状态的任务可以被awake;
5) DELAY + S:任务处于delay-suspend的状态
6)PEND + S:任务处于pended-suspend的状态
7)PEND + T:任务处于pend状态,但有timeout值,一旦超时,任务的pend状态将被清除;
8)PEND + S + T:任务处于pend-suspend状态,但有timeout值,一旦超时,任务的pend状态将被清除;
9)stste + 1:任务处于state状态(stste表示上述状态之一),且有继承优先级1;
引起任务迁移的函数如下:
ready-->pended 【semTake()/msgQReceive】
ready-->delayed 【taskDelay】
ready-->suspend【taskSuspend】
pended-->ready 【semGive()/msgQSend】
pended-->suspend 【taskSuspend】
delayed-->ready 【expired delay 延时耗尽】
delayed-->suspend 【taskSuspend】
suspend-->ready 【taskResume()/taskActivate()】
suspended-->pended 【taskResume】
suspended-->delayed 【taskResume】
二、任务优先级设置
优先级设置函数原型:taskPriorityGet()
STATUS taskPrioritySet()
{
int tid;
int newpPriority
}
函数taskPriority()有两个参数,第一个参数是任务的id号,第二个参数是新优先级,优先级范围从0~255,优先级设置成功返回OK,当任务ID非法时返回ERROER;
三、任务优先级获取
任务优先级获取函数原型:
taskPriorityGet()
STATUS taskPriorityGet()
{
int tid,
int *pPriority
}
函数taskPriorityGet()有两个参数,第一个参数是任务ID号,第二个参数是整型指针,表示优先级地址。任务优先级获取任务时返回OK,当任务非法时返回ERROR。
1.3 任务调度
多任务需要一个调度算法在就绪任务之间分配CPU,VxWorks的默认调度算法是基于优先级的可抢占调度,但是用户也可以在相同优先级任务之家选择Round-Robin调度算法;
1)可抢占的优先级调度
使用可抢占优先级调度时,每个任务都有自己的优先级,内核保证将CPU分配给优先级最高的任务并运行该任务,这个调度是可抢占的,如果有一个比当前任务优先级更高的任务就绪时,内核马上保存当前任务的上下文,切换到高优先级任。
2)Round-Robin调度算法;
可抢占优先级调度可以由Round-Robin调度算法扩充,Round-Robin调度算法尝试在所有相同优先级就绪任务之间平等共享CPU,Round-Robin调度使用时间片成组地在相同优先级任务之间公平分配CPU,每个组中的每个任务执行指定的时间间隔或者时间片,然后在另一个任务执行相同的时间,循环往复。Round-Robin调度由函数kernelTimeSize()启动,将时间片或者时间间隔作为参数。这个时间间隔是每个任务在放弃CPU给相同优先级之间执行的所有时间。如果一个任务在它的时间片被高优先级任务抢占,它的运行计数器被保存。当任务重新执行时就恢复;
3)抢占锁
内核可以通过调用taskLock()和taskUnlock()来使调度器生效和失效。当一个任务调taskLock()使调度器失效,任务运行时没有基于优先级的抢占发生,然而,如果任务被阻塞或者被悬置时,调度器就从就绪队列中去取出最高优先级的任务运行,当设置禁止抢占的任务接触阻塞,再次开始运行时,抢占又被禁止。抢占锁阻止了任务上下文切换但并不封锁中断处理。抢占所可以用于完成互斥,但是为了保证系统响应应该保持抢占锁定的时间最短。
1.4 用户接口
1、任务调度控制函数:
1)kernelTimeSlice():控制Round-Robin调度;
2)taskPerioritySet():改变任务优先级;
3)taskLock():取消任务调度;
4)taskUnlock():启动任务调度;
2、任务创建函数:
1)taskSpawn():创建和激活一个新任务;
2)taskInit():初始化一个新任务;
3)taskActivate():激活一个已经初始化的任务;
3、任务名称和ID函数:
1)taskName():得到和任务ID相关的任务名称;
2)taskNameTold():得到和任务名称相关的任务ID;
3)taskIDSelf():得到调用任务的ID;
4)taskIdVerify():检验特定任务的存在性;
4、任务选项函数:
1)taskOptionsGet():检验任务选项;
2)taskOptionsSet():设置任务选项;
5、任务信息函数:
1)taskIdListGet():将所有激活任务的id填充一个数组;
2)taskInfoGet():得到一个任务的信息;
3)taskPriorityGet():检查任务的优先级;
4)taskRegsGet():检查任务的寄存器;
5)taskRegsSet():设置任务的寄存器;
6)taskIsSuspended():检查任务是否挂起;
7)taskIsReady():检查任务是否就绪;
8)taskTcb():得到任务控制块指针;
6、任务删除函数:
1)exit():终止调用任务,释放内存空间(只是任务堆栈和任务控制块);
2)taskDelete():终止指定的任务,释放内存空间(只是任务堆栈和任务控制块);
3)taskSafe():从删除中保护调用任务;
4)taskUnsafe():撤销taskSafe()(使得调用任务对于删除可用)
7、任务控制函数
1)taskSuspend():挂起一个任务u;
2)taskResume():重新激活一个任务;
3)taskRestart():重启一个任务;
4)taskDelay():延时一个任务,延时单位是滴答;
5)nanosleep():延时一个任务,延时单位是ns;
8、任务扩展函数
1)taskCreatHookAdd():添加一个函数,在任务创建时调用;
2)taskCreatHookDelete():删除一个原先添加的任务创建函数;
3)taskSwitchHookAdd():添加一个函数,在任务切换时调用;
4)taskSwitchHookDelete():删除一个原先添加的任务切换函数;
5)taskDeleteHookAdd():添加一个函数,在任务删除时调用;
6)taskDeleteHookDelete():删除一个原来添加的任务删除函数;
文章来源:https://www.toymoban.com/news/detail-629231.html
结语:
以上就是对VxWorks实时多任务的介绍啦,接下来的篇章我将展开来讲一讲VxWorks任务间间通信的结构和使用方式,希望与各位读者朋友一起探讨进步,我是指尖比比,我们下个好文再见!!!
文章来源地址https://www.toymoban.com/news/detail-629231.html
到了这里,关于【Vxworks操作系统】实时多任务介绍-NO.2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!