vxworks任务管理-课件.ppt

上传人(卖家):晟晟文业 文档编号:3675551 上传时间:2022-10-03 格式:PPT 页数:127 大小:5.80MB
下载 相关 举报
vxworks任务管理-课件.ppt_第1页
第1页 / 共127页
vxworks任务管理-课件.ppt_第2页
第2页 / 共127页
vxworks任务管理-课件.ppt_第3页
第3页 / 共127页
vxworks任务管理-课件.ppt_第4页
第4页 / 共127页
vxworks任务管理-课件.ppt_第5页
第5页 / 共127页
点击查看更多>>
资源描述

1、嵌入式操作系统第3章 VxWorksVxWorks任务管理任务管理1 1、VxWorksVxWorks下的任务下的任务2 2、VxWorksVxWorks下任务控制及任务编程下任务控制及任务编程3 3、VxWorksVxWorks任务调度任务调度2022-9-261嵌入式操作系统第3 章 V x Wo r k s 任务管理1、V x Wo r嵌入式操作系统 重点掌握 VxWorksVxWorks下任务的特点下任务的特点 VxWorksVxWorks提供的任务控制函数及应用提供的任务控制函数及应用 VxWorksVxWorks提供的任务调度策略及应用提供的任务调度策略及应用2022-9-262嵌

2、入式操作系统 重点掌握 V x Wo r k s 下任务的特点2 0嵌入式操作系统1 1、VxWorksVxWorks下任务的特点下任务的特点任务运行的地址空间任务结构任务的标识任务的状态及状态转换任务的上下文切换2022-9-263嵌入式操作系统1、V x Wo r k s 下任务的特点任务运行的地址嵌入式操作系统 VxWorksVxWorks中的中的windwind内核为内核为VxWorksVxWorks提供了提供了 一个高性能的实时多任务操作环境 任务管理、任务创建、任务调度、时钟、中 断、内存管理 在VxWorks中,每个明显独立的程序在运 行时称之为任务2022-9-264嵌入式操作

3、系统 V x Wo r k s 中的w i n d 内核为V x Wo r嵌入式操作系统cobble.cobble.c c 四个任务 第一个任务tCosmos模拟一个中断服务程序 生成新数据cosmos()第二个任务tSchlep收集数据schlep()第三个任务tCrunch处理数据,完成计算并求 出一个结果crunch()第四个任务tMonitor监视结果值,当结果超 出安全范围时,向屏幕打印报警信息 monitor()monitor()子函数nodeAdd(),nodeScrap()nodeScrap()2022-9-265嵌入式操作系统c o b b l e.c 四个任务 第一个任务t

4、 C嵌入式操作系统1.1 1.1 任务运行的地址空间 VxWorksVxWorks操作系统采取线性单一实地址空操作系统采取线性单一实地址空 间模式,所有任务都运行在同一地址空 间,不区分用户态和核心态2022-9-266嵌入式操作系统1.1 任务运行的地址空间 V x Wo r k s 操嵌入式操作系统2022-9-267嵌入式操作系统2 0 2 2/9/2 3 7嵌入式操作系统 VxWorksVxWorks下任务具有如下特点:下任务具有如下特点:任务切换时不需要进行虚拟地址空间切换 任务间可以直接共享变量,不需要通过内核 在不同的地址空间复制数据 系统调用时不需要在核心态和用户态之间切 换,

5、相当于直接的函数调用2022-9-268嵌入式操作系统 V x Wo r k s 下任务具有如下特点:任务嵌入式操作系统!由于没有访问内存任何约束和保护,因而对代码质量提出了更高的要求 当选用VxVMI时,每个任务各自的地址空 间需要进行虚拟地址到物理地址的转换2022-9-269嵌入式操作系统 !由于没有访问内存任何约束和保护,因而对代嵌入式操作系统1.2 1.2 任务的结构data段数据段bss段TCB代码段堆栈段不需要进行用户、内核的区分2022-9-2610嵌入式操作系统1.2 任务的结构d a t a 段数据段b s s 段T C嵌入式操作系统TCBTCB TCBTCB用来描述一个任

6、务,每一任务都与一用来描述一个任务,每一任务都与一 个TCB关联 TCBTCB用用windTcbwindTcb结构体来描述结构体来描述 VxWorksVxWorks的的taskLibtaskLib库中定义(库中定义(taskLib.htaskLib.h)2022-9-2611嵌入式操作系统T C B T C B 用来描述一个任务,每一任务都与嵌入式操作系统 TCBTCB中上下文信息包含的具体内容:中上下文信息包含的具体内容:程序执行点(PC)CPUCPU状态,包括各种处理器特定的寄存器状态,包括各种处理器特定的寄存器栈任务的状态延迟定时器时间片定时器I/OI/O操作分配的标准输入操作分配的标准

7、输入/输出,标准错误输出输出,标准错误输出操作2022-9-2612嵌入式操作系统 T C B 中上下文信息包含的具体内容:程序嵌入式操作系统内核控制结构信号处理信息错误信息调试和性能监视状态任务变量(可选)浮点上下文(可选)可扩展项(可选)2022-9-2613嵌入式操作系统 内核控制结构2 0 2 2/9/2 3 1 3嵌入式操作系统错误信息 在VxWorks中有一个全局变量errno来存放 系统最近的错误状态值 每个任务TCB中都记录有一个全局errno副 本errostatus,属于任务上下文的一部分 ISRISR也使用独立的也使用独立的errnoerrno,但是,但是ISRISR没有

8、没有 TCBTCB,内核为,内核为ISRISR在中断栈中保存和恢复在中断栈中保存和恢复 errnoerrno2022-9-2614嵌入式操作系统错误信息 在V x Wo r k s 中有一个全局变量e嵌入式操作系统 errnoerrno的值由的值由4 4个字节表示,个字节表示,2 2个高字节表示个高字节表示 产生错误的模块组件编码,2个低字节表示 错误编号 如0 x110001,表示内存不足 VxWorksVxWorks提供提供errnoLiberrnoLib库用于获取和设置库用于获取和设置 任务和中断的错误状态值2022-9-2615嵌入式操作系统 e r r n o 的值由4 个字节表示,

9、2 个高字节表嵌入式操作系统任务变量 当多个任务需要同一全局变量或静态变量 提供不同的值时,VxWorks提供任务变量 机制来切换全局变量 任务变量机制允许在任务上下文中定义自 己的私有变量,随着上下文切换而切换2022-9-2616嵌入式操作系统任务变量 当多个任务需要同一全局变量或静态变嵌入式操作系统2022-9-2617嵌入式操作系统2 0 2 2/9/2 3 1 7嵌入式操作系统 每个任务变量允许存放一个4字节的值typedef struct taskVar/typedef struct taskVar/*TASK_VAR TASK_VAR*/struct taskVar struct

10、 taskVar*next;next;int int*address;address;intvalue;intvalue;TASK_VAR;TASK_VAR;VxWorksVxWorks提供库提供库taskVarLibtaskVarLib库支持任务变库支持任务变 量机制2022-9-2618嵌入式操作系统 每个任务变量允许存放一个4 字节的值t y p e嵌入式操作系统 当有多个任务变量时,任务变量以单向链表 的形式存在2022-9-2619嵌入式操作系统 当有多个任务变量时,任务变量以单向链表2 0嵌入式操作系统 任务切换时需要遍历任务变量链表,进行 变量值的恢复和保存降低效率!此机制会降低

11、任务上下文切换的效率,建议编程时谨慎使用2022-9-2620嵌入式操作系统 任务切换时需要遍历任务变量链表,进行 !嵌入式操作系统堆栈 在任务创建时指定 堆栈的大小 TCBTCB记录了位置和记录了位置和 大小等栈信息 任务栈大小的设置 必须合理高地址pStackEndStackSizepStackBaseTCB低地址pTCBpTaskMem16bytes2022-9-2621嵌入式操作系统堆栈 在任务创建时指定 任务栈大小的设置高嵌入式操作系统 VxWorksVxWorks操作系统提供函数操作系统提供函数checkStack()checkStack()来检查任务栈使用情况 checkStac

12、k()checkStack()显示了单个指定任务或者所有显示了单个指定任务或者所有任任 务的栈使用情况,包括:栈大小(SIZE)栈当前使用数(CUR)历史使用峰值(HIGH)最大可能空余数(MARGIN=SIZE-HIGH)TornadoTornado中的中的browserbrowser也可查看栈的使用情也可查看栈的使用情 况!堆栈诊断前提:栈初始化时要用0 xee填 充2022-9-2622嵌入式操作系统 V x Wo r k s 操作系统提供函数c h e c k S嵌入式操作系统 shellshell下创建任务时默认堆栈大小(下创建任务时默认堆栈大小(spsp命命 令)#define S

13、HELL_STACK_SIZE 10000#define SHELL_STACK_SIZE 10000 VxWorksVxWorks支持独立的中断栈,对所有的支持独立的中断栈,对所有的 ISRISR使用相同的中断栈使用相同的中断栈 中断栈在系统启动时根据配置参数设置位 置、大小和填充。在configAll.h中有缺省定 义:#define ISR_STACK_SIZE#define ISR_STACK_SIZE100010002022-9-2623嵌入式操作系统 s h e l l 下创建任务时默认堆栈大小(s p 命嵌入式操作系统1.3 1.3 任务的标识 VxWorksVxWorks下标识

14、任务有两种途径:任务名称和任下标识任务有两种途径:任务名称和任 务ID号 任务名称 是独一无二的字符串 主机任务以字母u开头 目标机任务以字母t开头 任务ID号 长度为4字节,指向TCB VxWorksVxWorks提供任务名称和任务提供任务名称和任务IDID之间的转换函数之间的转换函数2022-9-2624嵌入式操作系统1.3 任务的标识 V x Wo r k s 下标识任务嵌入式操作系统1.4 1.4 任务的状态 5 5种基本状态:种基本状态:执行(RUN)就绪(READY)任务只需等待cpu阻塞(PEND)有cpu以外的资源不可用睡眠(DELAY)任务处于睡眠状态挂起(SUSPEND)一

15、般用于调试DELAY+SDELAY+S睡眠睡眠+挂起挂起PEND+SPEND+S阻塞阻塞+挂起状态挂起状态PEND+TPEND+T延时阻塞状态延时阻塞状态PEND+T+SPEND+T+S延时阻塞延时阻塞+挂起状态挂起状态+I+I继承优先级状态,优先级暂时被提升继承优先级状态,优先级暂时被提升 多种组合状态2022-9-2625嵌入式操作系统1.4 任务的状态 5 种基本状态:执行(嵌入式操作系统任务的状态转换图任务创建时,处于挂起状态taskSuspend()taskResume()挂起要使刚创建的任务就绪,taskResume()要激活该任务 taskSuspend()taskSuspend

16、()taskResume()/taskActivate()阻塞就绪semTake()/msgQReceive()semGive()/msgQSend()抢占调度睡眠taskDelay()使用spawning原语,可以直接延时已到 创建并激活一个任务任务可以在任何状态下被删除执行2022-9-2626嵌入式操作系统任务的状态转换图任务创建时,处于挂起状态t a s嵌入式操作系统任务的状态队列2022-9-2627嵌入式操作系统任务的状态队列2 0 2 2/9/2 3 2 7嵌入式操作系统1.5 1.5 任务上下文切换 上下文切换示意图TCB(Old)copy of pccopy of spCPU

17、pcspTCB(New)copy of pccopy of sperrorStatuserrnoerrorStatus2022-9-2628嵌入式操作系统1.5 任务上下文切换 上下文切换示意图T C嵌入式操作系统 上下文切换分两种情况:同步和异步 同步上下文切换,引起的原因是当前运行的任务 执行下列操作:进行阻塞、延迟、挂起的调用;使更高优先级任务就绪而发生优先级抢占 降低自身优先级或者退出;异步上下文切换,通常由ISR使更高优先级任务就 绪引起。2022-9-2629嵌入式操作系统 上下文切换分两种情况:同步和异步 进行阻嵌入式操作系统1.6 VxWorks1.6 VxWorks的系统任务

18、的系统任务 根任务tUsrRoot 内核执行的第一个任务 初始化VxWorks系统的主要功能,例如 发起日志任务、异常处理任务、网络任务和 tRlogindtRlogind后台任务后台任务 通常,上述初始化结束之后,根任务终止并删除 用户可以向根任务自由的添加任何必需的初始化代码 对应usrRoot()函数(target/config/all/usrConfig.c)2022-9-2630嵌入式操作系统1.6 V x Wo r k s 的系统任务 根任务t U嵌入式操作系统 日志任务:tLogTask 记录系统信息的任务。它不执行输入/输出操作。异常处理任务:tExcTask 提供VxWork

19、s异常处理包,完成在中断级不能执行的 功能 必须具有系统最高的优先级 不能挂起、删除、改变其任务的优先级 目标代理服务:tWdbTask(INCLUDE_WDB)当目标代理设置为运行在任务模式时,创建此任务 处理来自Tornado目标服务的请求以上3种任务都属于VxWorks的基本任务2022-9-2631嵌入式操作系统 日志任务:t L o g T a s k 记录系统信息嵌入式操作系统 网络任务:tNetTask(INCLUDE_NET_LIB)后台处理VxWorks网络需要的任务级功能处理 其他可选组件的任务 tShelltShell(INCLUDE_SHELLINCLUDE_SHELL

20、)tRlogindtRlogind(INCLUDE_RLOGININCLUDE_RLOGIN)tTelnetdtTelnetd(INCLUDE_TELNETINCLUDE_TELNET)tPortmapdtPortmapd(INCLUDE_RPCINCLUDE_RPC)2022-9-2632嵌入式操作系统 网络任务:t N e t T a s k(I N C L U D E嵌入式操作系统与Linux比较 任务控制块的内容多用户性、任务间的亲属关系、文件打开表、队列信 息、虚拟内存信息、错误状态等 栈栈的大小、中断栈 任务状态状态的种类、状态间的转换2022-9-2633嵌入式操作系统与L i

21、n u x 比较 任务控制块的内容多用户性、嵌入式操作系统2 2、VxWorksVxWorks下任务控制及任务编程下任务控制及任务编程任务创建和激活任务删除与任务安全任务的状态控制任务信息的获取任务扩展函数代码的共享与重入2022-9-2634嵌入式操作系统2、V x Wo r k s 下任务控制及任务编程 任务创嵌入式操作系统 VxWorksVxWorks提供丰富的任务控制功能,包含在提供丰富的任务控制功能,包含在 taskLibtaskLib库中库中 包括:任务的创建、删除、状态控制、获取任务信息 等等 可以在Tornado IDEIDE提供的提供的shellshell工具中交互使用工具中

22、交互使用 这些调用2022-9-2635嵌入式操作系统 V x Wo r k s 提供丰富的任务控制功能,包含嵌入式操作系统2022-9-2636嵌入式操作系统2 0 2 2/9/2 3 3 6嵌入式操作系统2022-9-2637嵌入式操作系统2 0 2 2/9/2 3 3 7嵌入式操作系统2022-9-2638嵌入式操作系统2 0 2 2/9/2 3 3 8嵌入式操作系统2.1 2.1 任务的创建与激活 VxWorksVxWorks的的TaskLibTaskLib库中提供多个函数用于创建库中提供多个函数用于创建 任务:调用taskSpawn()taskSpawn()taskInit()tas

23、kInit()taskActivate()taskActivate()描述创建并激活一个任务初始化一个新任务激活一个初始化任务2022-9-2639嵌入式操作系统2.1 任务的创建与激活 V x Wo r k s 的T嵌入式操作系统taskSpawn()taskSpawn()创建并激活一个新任务创建并激活一个新任务int taskSpawnint taskSpawn (char char*name,/name,/*新任务的任务名新任务的任务名*/int priority,/int priority,/*新任务的优先级新任务的优先级*/int options,/int options,/*任务选

24、项字任务选项字*/int stackSize,/int stackSize,/*堆栈大小堆栈大小*/FUNCPTR entryPt,/FUNCPTR entryPt,/*新任务的入口函数新任务的入口函数*/int arg1,arg2,arg3,arg4,arg5,/int arg1,arg2,arg3,arg4,arg5,/*传递给入口函传递给入口函数数*/int arg6,arg7,arg8,arg9,arg10/int arg6,arg7,arg8,arg9,arg10/*的的1010参数参数*/)2022-9-2640嵌入式操作系统t a s k S p a w n()创建并激活一个新任

25、务i嵌入式操作系统TaskSpawn()TaskSpawn()创建新任务的上下文 堆栈、TCB、含有特定参数的入口程序调用的 任务环境(入口程序通常是一个普通的程序)新的任务将在指定的函数入口处执行 激活新任务 堆栈是系统资源,位于系统内存中 其底端是TCB 堆栈使用0 xEE填充 任务名要便于记忆,可以是任意长度、任意内容2022-9-2641嵌入式操作系统T a s k S p a w n()创建新任务的上下文2嵌入式操作系统 taskSpawn中的任务选项参数可以是下表中的选 项之一或其组合如果任务使用任何浮点操作,必须要求使用VX_FP_TASK选项2022-9-2642嵌入式操作系统

26、 t a s k S p a w n 中的任务选项参数可以是下嵌入式操作系统 任务的优先级:WindWind内核支持内核支持256256种优先级,种优先级,02550255 优先级0为最高,优先级255为最低 一般,099分配给系统任务,100255分配给用 户任务2022-9-2643嵌入式操作系统 任务的优先级:2 0 2 2/9/2 3 4 3嵌入式操作系统taskSpawn()taskSpawn()返回值返回值 成功:任务ID号 失败:ERROR。返回的ERRNOS可能有 S_intLib_NOT_ISR_CALLABLE,S_intLib_NOT_ISR_CALLABLE,/*程序不

27、能从一个程序不能从一个ISRISR中调用中调用*/S_objLib_OBJ_ID_ERROR,/S_objLib_OBJ_ID_ERROR,/*不正确的任务不正确的任务IDID*/S_smObjLib_NOT_INITIALIZED,S_smObjLib_NOT_INITIALIZED,/*在指定的分区中,没有足够的内存用于发起任务在指定的分区中,没有足够的内存用于发起任务*/S_memLib_NOT_ENOUGH_MEMORY,S_memLib_NOT_ENOUGH_MEMORY,/*没有足够的内存发起任务没有足够的内存发起任务*/S_memLib_BLOCK_ERROR,S_memLib_

28、BLOCK_ERROR,/*不能够对内存分区互斥访问不能够对内存分区互斥访问*/S_taskLib_ILLEGAL_PRIORITY/S_taskLib_ILLEGAL_PRIORITY/*非法的优先级非法的优先级*/2022-9-2644嵌入式操作系统t a s k S p a w n()返回值 成功:任务I D嵌入式操作系统 在源代码中使用TaskSpawn创建新任务 在Tornado ShellShell中中 使用TaskSpawn创建新任务 使用i查看系统中的任务(演示)2022-9-2645嵌入式操作系统 在源代码中使用T a s k S p a w n 创建新任务嵌入式操作系统 t

29、askSpawn()taskSpawn()中包含了一些低级的操作,包括初始中包含了一些低级的操作,包括初始 化和激活一个任务 taskInit()taskInit()taskActivate()taskActivate()2022-9-2646嵌入式操作系统 t a s k S p a w n()中包含了一些低级的操嵌入式操作系统taskInit()taskInit()初始化一个任初始化一个任务务STATUS taskInitSTATUS taskInit (WIND_TCB WIND_TCB*pTcb,/pTcb,/*新任务的新任务的TCBTCB地址地址*/char char*namenam

30、e,允许不指定任务名,由系统自动命名/*新任务的新任务的名字名字*/int priority,/int priority,/*新任务的优先级新任务的优先级*/int options,/int options,/*任务选项字任务选项字*/char char*pStackBase,/pStackBase,/*任务堆栈基地址任务堆栈基地址*/初始化指定的内存区域作为任务的堆栈 和控制块,而不像taskSpawn()那样由系 int stackSize,/int stackSize,/*堆栈大小堆栈大小*/FUNCPTR entrypt,FUNCPTR entrypt,统自动分配/*任务入口任务入口*

31、/int arg1,arg2,arg3,arg4,arg5,/int arg1,arg2,arg3,arg4,arg5,/*入口参数入口参数*/可以方便应用进行调试,并将堆栈分配 在指定位置int int arg6,arg7,arg8,arg9,arg10arg6,arg7,arg8,arg9,arg10 )2022-9-2647嵌入式操作系统t a s k I n i t()初始化一个任务S T A T U S嵌入式操作系统 taskInittaskInit的返回值:的返回值:成功:OK 任务不能初始化则:ERROR。可能返回的 ERRNOSERRNOS值有:值有:S_intLib_NOT_

32、ISR_CALLABLES_intLib_NOT_ISR_CALLABLE /*程序不能从一个程序不能从一个ISRISR中调用中调用*/S_objLib_OBJ_ID_ERRORS_objLib_OBJ_ID_ERROR /*不正确的任务不正确的任务IDID*/2022-9-2648嵌入式操作系统 t a s k I n i t 的返回值:S _ i n t L嵌入式操作系统taskActivate()taskActivate()激活一个任激活一个任务务 STATUS taskActivate(int tid)STATUS taskActivate(int tid)taskActivate()

33、taskActivate()激活由激活由taskInit()taskInit()创建的任务,创建的任务,其参其参 数是taskInit()中第一个参数任务TCB的地址,强 制类型转换如下:tid=(int)tid=(int)pTcb;pTcb;注意:当应用需要对任务定位和激活进行控制 时,才使用这两个函数,通常使用taskSpawn()就 可以了2022-9-2649嵌入式操作系统t a s k A c t i v a t e()激活一个任务 S嵌入式操作系统管理任务名称和ID号的函数 由任务号得到任务名taskName()taskName()由任务名得到任务ID号taskNameTold()

34、taskNameTold()taskIDSelf()taskIDSelf()得到任务自身的ID号taskIdVerify()taskIdVerify()证实一个特定任务的存在(由任务ID指定)2022-9-2650嵌入式操作系统管理任务名称和I D 号的函数 嵌入式操作系统任务选项相关函数 尽管TaskSpawn()中options参数指定的新任务的 选项,使用下列函数可以动态读取或设置指定任 务的选项 taskOptionsGet()taskOptionsGet():获取任务选项:获取任务选项 taskOptionsSet()taskOptionsSet():设置任务选项:设置任务选项 当前

35、只有VX_UNBREAKABLE选项可以改变2022-9-2651嵌入式操作系统任务选项相关函数 尽管T a s k S p a w n()嵌入式操作系统获取任务信息taskIDListGet()taskIDListGet():获取所有活动任务的:获取所有活动任务的IDID号号taskInfoGet()taskInfoGet():得到指定任务的信息:得到指定任务的信息taskPriorityGet()taskPriorityGet():查看指定任务的优先:查看指定任务的优先级级taskRegsGet()taskRegsGet():查看任务的寄存器:查看任务的寄存器taskRegsSet()ta

36、skRegsSet():设置任务的寄存器:设置任务的寄存器taskIsSuspended()taskIsSuspended():查看指定任务是否挂:查看指定任务是否挂起起taskIsReady()taskIsReady():查看指定任务是否就绪:查看指定任务是否就绪taskTCBtaskTCB:得到任务控制块指针:得到任务控制块指针2022-9-2652嵌入式操作系统获取任务信息 t a s k I D L i s t G e t():嵌入式操作系统taskSpawntaskSpawn应用实例应用实例1 12022-9-2653嵌入式操作系统t a s k S p a w n 应用实例1 2

37、0 2 2/9/2 3嵌入式操作系统 结果演示2022-9-2654嵌入式操作系统 结果演示2 0 2 2/9/2 3 5 4嵌入式操作系统 仿真器上显示信息:2022-9-2655嵌入式操作系统 仿真器上显示信息:2 0 2 2/9/2 3 5 5嵌入式操作系统 将s2_tasks中的优先级101改为101-i2022-9-2656嵌入式操作系统 将s 2 _ t a s k s 中的优先级1 0 1 改为1 0嵌入式操作系统 演示结果2022-9-2657嵌入式操作系统 演示结果2 0 2 2/9/2 3 5 7嵌入式操作系统taskSpawntaskSpawn应用实例应用实例2 2202

38、2-9-2658嵌入式操作系统t a s k S p a w n 应用实例2 2 0 2 2/9/2 3嵌入式操作系统 演示结果2022-9-2659嵌入式操作系统 演示结果2 0 2 2/9/2 3 5 9嵌入式操作系统 仿真器上显示信息:2022-9-2660嵌入式操作系统 仿真器上显示信息:2 0 2 2/9/2 3 6 0嵌入式操作系统2.2 2.2 任务删除和删除安全 任务可以动态地从系统中删除 删除任务的函数调用若任务的入口函数指定返回,则将隐含调用exit();另外,任务可以在任何时候调用exit杀死自身;exit()exit():终止任务自身的执行,释放所占用:终止任务自身的执

39、行,释放所占用的的 内存(stack和TCB)taskDelete()taskDelete():终止一个指定任务,释放所:终止一个指定任务,释放所占占 用的内存(同上)任务可以在任何时候调用taskDelete删除其他任务任务终止时,其执行时任务分配的内存不会被释放,如malloc()分配的内存,必须由任务自身编程释放。2022-9-2661嵌入式操作系统2.2 任务删除和删除安全 任务可以动态地从嵌入式操作系统taskDeletetaskDelete应用实例应用实例延迟0.5秒2022-9-2662嵌入式操作系统t a s k D e l e t e 应用实例延迟0.5 秒2 0 2嵌入式操

40、作系统2022-9-2663嵌入式操作系统2 0 2 2/9/2 3 6 3嵌入式操作系统 演示结果2022-9-2664嵌入式操作系统 演示结果2 0 2 2/9/2 3 6 4嵌入式操作系统 仿真器上显示信息:2022-9-2665嵌入式操作系统 仿真器上显示信息:2 0 2 2/9/2 3 6 5嵌入式操作系统 注意:不要在一个不合适的时刻删除任务,在删 除之前,该任务必须释放它所持有的所有资源 保护任务不被删除的函数调用任务访问临界区时就需要这种保护。例如,为了对某些数据结构互斥访问,任务可能取得一个信号量。但若正在临界区执行的任务被删除,会导致这个任务无法完成临界区的访问,从而使得该

41、数据结构可能处于一种被破坏或不一致的状 taskSafe()taskSafe():保护任务不被删除:保护任务不被删除态。taskUnsafe()taskUnsafe():解除任务保护:解除任务保护此外,由于该任务没有释放信号量,其他任务将无法获得信号量,从而导致该临界资源不可用。使用taskDelete()删除另一个被保护的任务,会导致调用者任务被阻塞,直到被保护的任务解除保护任务保护使用一个计数器实现保护的嵌套,仅当计数器为0时才真正的解除保护2022-9-2666嵌入式操作系统 注意:不要在一个不合适的时刻删除任务,在删嵌入式操作系统 下面的代码段说明如何使用taskSafe()和 tas

42、kUnsafe()taskUnsafe()来保护一段临界区代码来保护一段临界区代码taskSafe();taskSafe();semTake(semID,WAIT_FOREVER);semTake(semID,WAIT_FOREVER);/*Block until semaphore Block until semaphore availableavailable*/临界区操作代码semGive(semID);/semGive(semID);/*Release semaphoreRelease semaphore*/taskUnsafe();taskUnsafe();2022-9-2667嵌入

43、式操作系统 下面的代码段说明如何使用t a s k S a f e(嵌入式操作系统2.3 2.3 任务运行的控制 下列函数用于控制任务的执行VxWorksVxWorks的调试功能希的调试功能希望能够挂起/恢复任务的执行,从而可以冻结任务的执行状态终止任务,然后使用原有参数重新创建任务。提供一个简单的任务睡眠机制。区别,taskDelay()将会导致任务被移到相同优先级就绪队列的尾 这是一个POSIX函数,部,例如taskDelay(0)可以将CPU交给同优先级的另一个任务 与taskDelay()以下调用将任务延时半秒:一样可以实现延时,但延时单位不同,可以直接指明延时。而调用nanoslee

44、p实现延时0被认为是错误的2022-9-2668嵌入式操作系统2.3 任务运行的控制 下列函数用于控制任务嵌入式操作系统taskResume()taskResume()taskSuspend()taskSuspend()taskResume()/taskActivate()taskResume()/taskActivate()taskSuspend()taskSuspend()taskSuspend()taskSuspend()taskResume()taskResume()挂起阻塞就绪睡眠 taskDelay()taskDelay()延时已到执行taskRestart()taskRestar

45、t()2022-9-2669嵌入式操作系统t a s k R e s u m e()t a s k R e s u m e(嵌入式操作系统应用实例12022-9-2670嵌入式操作系统应用实例1 2 0 2 2/9/2 3 7 0嵌入式操作系统2022-9-2671嵌入式操作系统2 0 2 2/9/2 3 7 1嵌入式操作系统2022-9-2672嵌入式操作系统2 0 2 2/9/2 3 7 2嵌入式操作系统 演示结果2022-9-2673嵌入式操作系统 演示结果2 0 2 2/9/2 3 7 3嵌入式操作系统 仿真器上显示信息:2022-9-2674嵌入式操作系统 仿真器上显示信息:2 0

46、2 2/9/2 3 7 4嵌入式操作系统 将taskResume换成taskActivate,结果一样2022-9-2675嵌入式操作系统 将t a s k R e s u m e 换成t a s k A c t i嵌入式操作系统应用实例22022-9-2676嵌入式操作系统应用实例2 2 0 2 2/9/2 3 7 6嵌入式操作系统不能延迟到myFunc任务已结束2022-9-2677嵌入式操作系统不能延迟到m y F u n c 任务已结束2 0 2 2/9/嵌入式操作系统 演示结果2022-9-2678嵌入式操作系统 演示结果2 0 2 2/9/2 3 7 8嵌入式操作系统 仿真器上显示

47、信息:2022-9-2679嵌入式操作系统 仿真器上显示信息:2 0 2 2/9/2 3 7 9嵌入式操作系统2.4 2.4 任务扩展函数 有时任务需要在任务创建、删除或上下文切换 时增加相应的处理,又不需要修改内核 VxWorksVxWorks的内核的内核windwind提供钩子函数机制实现上提供钩子函数机制实现上 述目标,使得当任务创建、上下文切换、删除 时调用用户附加的函数 下列函数可以设置任务创建/切换/删除时的钩子 函数2022-9-2680嵌入式操作系统2.4 任务扩展函数 有时任务需要在任务创建嵌入式操作系统taskHookLibtaskHookLib所有HOOK函数的入参都是函

48、数指针2022-9-2681嵌入式操作系统t a s k H o o k L i b 所有H O O K 函数的入参都嵌入式操作系统 由于用于任务切换时的钩子函数只能运行在内 核上下文中,因此这个钩子函数能够调用的函 数调用有限制,只能是:缓冲区管理库 协处理器(浮点)状态的保存和恢复链表操作库体系结构无关的中断例程库 C的数学计算库环形缓冲区操作库任务管理库出错处理2022-9-2682嵌入式操作系统 由于用于任务切换时的钩子函数只能运行在内缓嵌入式操作系统应用实例2022-9-2683嵌入式操作系统应用实例2 0 2 2/9/2 3 8 3嵌入式操作系统在任务创建时,就会调用myTaskH

49、ook 演示结果 ShellShell下输出信息:下输出信息:2022-9-2684嵌入式操作系统在任务创建时,就会调用m y T a s k H o o k 嵌入式操作系统 仿真器输出信息:2022-9-2685嵌入式操作系统 仿真器输出信息:2 0 2 2/9/2 3 8 5嵌入式操作系统2.5 2.5 代码的共享和重入 VxWorks提倡:单个子程序的备份或子程序库被多 个不同的任务调用 定义:一个被多个任务调用的单个备份成为共享 代码VxWorksVxWorks动态链接功能很容易实现代码共享动态链接功能很容易实现代码共享2022-9-2686嵌入式操作系统2.5 代码的共享和重入 V

50、x Wo r k s 提倡嵌入式操作系统重入 共享代码必须是可重入的:一个子程序是可重入的,如果该程序的单个备 份可以被多个任务同时调用而不会发生冲突 典型的冲突:对全局或静态变量的修改 VxWorksVxWorks的很多子程序是可重入的的很多子程序是可重入的 惯例:所有somename_r()命名的子程序被认为 是不可重入的 VxWorksVxWorks的的I/OI/O和驱动程序是可重入的和驱动程序是可重入的2022-9-2687嵌入式操作系统重入 共享代码必须是可重入的:2 0 2 2/9/嵌入式操作系统 大部分VxWorks函数使用下列3种重入技术:动态堆栈变量 这种函数一般是纯代码,除

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 商业、管理、HR类
版权提示 | 免责声明

1,本文(vxworks任务管理-课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|