书签 分享 收藏 举报 版权申诉 / 127
上传文档赚钱

类型vxworks任务管理-哈尔滨工业大学备课讲稿课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2891508
  • 上传时间:2022-06-08
  • 格式:PPT
  • 页数:127
  • 大小:5.74MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《vxworks任务管理-哈尔滨工业大学备课讲稿课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    vxworks 任务 管理 哈尔滨工业大学 备课 讲稿 课件
    资源描述:

    1、嵌入式操作系统第3章 VxWorks任务管理任务管理1、 VxWorks下的任务下的任务2、 VxWorks下任务控制及任务编程下任务控制及任务编程3、 VxWorks任务调度任务调度嵌入式操作系统 重点掌握 VxWorks下任务的特点下任务的特点 VxWorks提供的任务控制函数及应用提供的任务控制函数及应用 VxWorks提供的任务调度策略及应用提供的任务调度策略及应用嵌入式操作系统1、 VxWorks下任务的特点下任务的特点任务运行的地址空间任务结构任务的标识任务的状态及状态转换任务的上下文切换嵌入式操作系统 VxWorks中的中的wind内核为内核为VxWorks提供了提供了 一个高性

    2、能的实时多任务操作环境 任务管理、任务创建、任务调度、时钟、中 断、内存管理 在VxWorks中,每个明显独立的程序在运 行时称之为任务嵌入式操作系统cobble.c 四个任务 第一个任务tCosmos模拟一个中断服务程序 生成新数据cosmos( ) 第二个任务tSchlep收集数据schlep( ) 第三个任务tCrunch处理数据,完成计算并求 出一个结果crunch( ) 第四个任务tMonitor监视结果值,当结果超 出安全范围时,向屏幕打印报警信息 monitor( ) 子函数nodeAdd( ),nodeScrap( )嵌入式操作系统1.1 任务运行的地址空间 VxWorks操作

    3、系统采取线性单一实地址空操作系统采取线性单一实地址空 间模式,所有任务都运行在同一地址空 间,不区分用户态和核心态嵌入式操作系统嵌入式操作系统 VxWorks下任务具有如下特点:下任务具有如下特点: 任务切换时不需要进行虚拟地址空间切换 任务间可以直接共享变量,不需要通过内核 在不同的地址空间复制数据 系统调用时不需要在核心态和用户态之间切 换,相当于直接的函数调用嵌入式操作系统 !由于没有访问内存任何约束和保护,因而对代码质量提出了更高的要求 当选用VxVMI时,每个任务各自的地址空 间需要进行虚拟地址到物理地址的转换嵌入式操作系统1.2 任务的结构data段数据段bss段TCB代码段堆栈段

    4、不需要进行用户、内核的区分嵌入式操作系统TCB TCB用来描述一个任务,每一任务都与一用来描述一个任务,每一任务都与一 个TCB关联 TCB用用windTcb结构体来描述结构体来描述 VxWorks的的taskLib库中定义(库中定义(taskLib.h)嵌入式操作系统 TCB中上下文信息包含的具体内容:中上下文信息包含的具体内容: 程序执行点(PC) CPU状态,包括各种处理器特定的寄存器状态,包括各种处理器特定的寄存器栈任务的状态延迟定时器时间片定时器I/O操作分配的标准输入操作分配的标准输入/输出,标准错误输出输出,标准错误输出操作嵌入式操作系统内核控制结构信号处理信息错误信息调试和性能

    5、监视状态任务变量(可选)浮点上下文(可选)可扩展项 (可选)嵌入式操作系统错误信息 在VxWorks中有一个全局变量errno来存放 系统最近的错误状态值 每个任务TCB中都记录有一个全局errno副 本errostatus ,属于任务上下文的一部分 ISR也使用独立的也使用独立的errno,但是,但是ISR没有没有 TCB,内核为,内核为ISR在中断栈中保存和恢复在中断栈中保存和恢复 errno嵌入式操作系统 errno的值由的值由4个字节表示,个字节表示,2个高字节表示个高字节表示 产生错误的模块组件编码,2个低字节表示 错误编号 如0 x110001,表示内存不足 VxWorks提供提供

    6、errnoLib库用于获取和设置库用于获取和设置 任务和中断的错误状态值嵌入式操作系统任务变量 当多个任务需要同一全局变量或静态变量 提供不同的值时,VxWorks提供任务变量 机制来切换全局变量 任务变量机制允许在任务上下文中定义自 己的私有变量,随着上下文切换而切换嵌入式操作系统嵌入式操作系统 每个任务变量允许存放一个4字节的值typedef struct taskVar /* TASK_VAR */ struct taskVar * next; int *address; intvalue; TASK_VAR; VxWorks提供库提供库taskVarLib库支持任务变库支持任务变 量机

    7、制嵌入式操作系统 当有多个任务变量时,任务变量以单向链表 的形式存在嵌入式操作系统 任务切换时需要遍历任务变量链表,进行 变量值的恢复和保存降低效率 !此机制会降低任务上下文切换的效率, 建议编程时谨慎使用嵌入式操作系统堆栈 在任务创建时指定 堆栈的大小 TCB记录了位置和记录了位置和 大小等栈信息 任务栈大小的设置 必须合理高地址pStackEndStackSizepStackBaseTCB低地址pTCBpTaskMem16bytes嵌入式操作系统 VxWorks操作系统提供函数操作系统提供函数checkStack( ) 来检查任务栈使用情况 checkStack( )显示了单个指定任务或者

    8、所有任显示了单个指定任务或者所有任 务的栈使用情况,包括:栈大小(SIZE)栈当前使用数(CUR)历史使用峰值(HIGH)最大可能空余数(MARGIN=SIZE-HIGH) Tornado中的中的browser也可查看栈的使用情也可查看栈的使用情 况 !堆栈诊断前提:栈初始化时要用0 xee填 充嵌入式操作系统 shell下创建任务时默认堆栈大小(下创建任务时默认堆栈大小(sp命命 令) #define SHELL_STACK_SIZE 10000 VxWorks支持独立的中断栈,对所有的支持独立的中断栈,对所有的 ISR使用相同的中断栈使用相同的中断栈 中断栈在系统启动时根据配置参数设置位

    9、置、大小和填充。在configAll.h中有缺省定 义:#define ISR_STACK_SIZE1000嵌入式操作系统1.3 任务的标识 VxWorks下标识任务有两种途径:任务名称和任下标识任务有两种途径:任务名称和任 务ID号 任务名称 是独一无二的字符串 主机任务以字母u开头 目标机任务以字母t开头 任务ID号 长度为4字节,指向TCB VxWorks提供任务名称和任务提供任务名称和任务ID之间的转换函数之间的转换函数嵌入式操作系统1.4 任务的状态 5种基本状态:种基本状态:执行(RUN)就绪(READY)任务只需等待cpu阻塞(PEND)有cpu以外的资源不可用睡眠(DELAY)

    10、任务处于睡眠状态挂起(SUSPEND)一般用于调试DELAY+S睡眠睡眠+挂起挂起PEND+S阻塞阻塞+挂起状态挂起状态PEND+T延时阻塞状态延时阻塞状态PEND+T+S延时阻塞延时阻塞+挂起状态挂起状态+I继承优先级状态,优先级暂时被提升继承优先级状态,优先级暂时被提升 多种组合状态嵌入式操作系统任务的状态转换图任务创建时,处于挂起状态taskSuspend()taskResume()挂起要使刚创建的任务就绪, taskResume()要激活该任务 taskSuspend() taskSuspend()taskResume()/taskActivate()阻塞就绪semTake()/msg

    11、QReceive()semGive()/msgQSend()抢占调度睡眠taskDelay() 使用spawning原语,可以直接延时已到 创建并激活一个任务任务可以在任何状态下被删除执行嵌入式操作系统任务的状态队列嵌入式操作系统1.5 任务上下文切换 上下文切换示意图TCB(Old)copy of pccopy of spCPUpcspTCB(New)copy of pccopy of sperrorStatuserrnoerrorStatus嵌入式操作系统 上下文切换分两种情况:同步和异步 同步上下文切换,引起的原因是当前运行的任务 执行下列操作: 进行阻塞、延迟、挂起的调用; 使更高优先

    12、级任务就绪而发生优先级抢占 降低自身优先级或者退出; 异步上下文切换,通常由ISR使更高优先级任务就 绪引起。嵌入式操作系统1.6 VxWorks的系统任务的系统任务 根任务tUsrRoot 内核执行的第一个任务 初始化VxWorks系统的主要功能,例如 发起日志任务、异常处理任务、网络任务和 tRlogind后台任务后台任务 通常,上述初始化结束之后,根任务终止并删除 用户可以向根任务自由的添加任何必需的初始化代码 对应usrRoot()函数(target/config/all/usrConfig.c)嵌入式操作系统 日志任务:tLogTask 记录系统信息的任务。它不执行输入/输出操作。

    13、异常处理任务:tExcTask 提供VxWorks异常处理包,完成在中断级不能执行的 功能 必须具有系统最高的优先级 不能挂起、删除、改变其任务的优先级 目标代理服务:tWdbTask(INCLUDE_WDB) 当目标代理设置为运行在任务模式时,创建此任务 处理来自Tornado目标服务的请求以上3种任务都属于VxWorks的基本任务嵌入式操作系统 网络任务:tNetTask(INCLUDE_NET_LIB) 后台处理VxWorks网络需要的任务级功能处理 其他可选组件的任务 tShell(INCLUDE_SHELL) tRlogind(INCLUDE_RLOGIN) tTelnetd(INC

    14、LUDE_TELNET) tPortmapd(INCLUDE_RPC)嵌入式操作系统与Linux比较 任务控制块的内容多用户性、任务间的亲属关系、文件打开表、队列信 息、虚拟内存信息、错误状态等 栈栈的大小、中断栈 任务状态状态的种类、状态间的转换嵌入式操作系统2、VxWorks下任务控制及任务编程下任务控制及任务编程任务创建和激活任务删除与任务安全任务的状态控制任务信息的获取任务扩展函数代码的共享与重入嵌入式操作系统 VxWorks提供丰富的任务控制功能,包含在提供丰富的任务控制功能,包含在 taskLib库中库中 包括: 任务的创建、删除、状态控制、获取任务信息 等等 可以在Tornado

    15、 IDE提供的提供的shell工具中交互使用工具中交互使用 这些调用嵌入式操作系统嵌入式操作系统嵌入式操作系统嵌入式操作系统2.1 任务的创建与激活 VxWorks的的TaskLib库中提供多个函数用于创建库中提供多个函数用于创建 任务:调用taskSpawn()taskInit()taskActivate()描述创建并激活一个任务初始化一个新任务激活一个初始化任务嵌入式操作系统taskSpawn()创建并激活一个新任务创建并激活一个新任务int taskSpawn ( char *name,/*新任务的任务名新任务的任务名*/ int priority,/*新任务的优先级新任务的优先级*/

    16、int options,/*任务选项字任务选项字*/ int stackSize,/*堆栈大小堆栈大小*/ FUNCPTR entryPt,/*新任务的入口函数新任务的入口函数*/ int arg1,arg2,arg3,arg4,arg5, /*传递给入口函数传递给入口函数*/ int arg6,arg7,arg8,arg9,arg10 /*的的10参数参数*/ )嵌入式操作系统TaskSpawn() 创建新任务的上下文 堆栈、TCB、含有特定参数的入口程序调用的 任务环境(入口程序通常是一个普通的程序) 新的任务将在指定的函数入口处执行 激活新任务 堆栈是系统资源,位于系统内存中 其底端是T

    17、CB 堆栈使用0 xEE填充 任务名要便于记忆,可以是任意长度、任意内容嵌入式操作系统 taskSpawn中的任务选项参数可以是下表中的选 项之一或其组合如果任务使用任何浮点操作,必须要求使用VX_FP_TASK选项嵌入式操作系统 任务的优先级: Wind内核支持内核支持256种优先级,种优先级,0255 优先级0为最高,优先级255为最低 一般,099分配给系统任务,100255分配给用 户任务嵌入式操作系统taskSpawn()返回值返回值 成功:任务ID号 失败:ERROR。返回的ERRNOS可能有 S_intLib_NOT_ISR_CALLABLE, /*程序不能从一个程序不能从一个I

    18、SR中调用中调用*/ S_objLib_OBJ_ID_ERROR, /*不正确的任务不正确的任务ID*/ S_smObjLib_NOT_INITIALIZED, /*在指定的分区中,没有足够的内存用于发起任务在指定的分区中,没有足够的内存用于发起任务*/ S_memLib_NOT_ENOUGH_MEMORY, /*没有足够的内存发起任务没有足够的内存发起任务*/ S_memLib_BLOCK_ERROR, /*不能够对内存分区互斥访问不能够对内存分区互斥访问*/ S_taskLib_ILLEGAL_PRIORITY /*非法的优先级非法的优先级*/嵌入式操作系统 在源代码中使用TaskSpaw

    19、n创建新任务 在Tornado Shell中中 使用TaskSpawn创建新任务 使用i查看系统中的任务(演示)嵌入式操作系统 taskSpawn()中包含了一些低级的操作,包括初始中包含了一些低级的操作,包括初始 化和激活一个任务 taskInit() taskActivate()嵌入式操作系统taskInit()初始化一个任务初始化一个任务STATUS taskInit ( WIND_TCB *pTcb, /*新任务的新任务的TCB地址地址*/ char *name, 允许不指定任务名,由系统自动命名/*新任务的名新任务的名字字*/ int priority,/*新任务的优先级新任务的优先

    20、级*/ int options,/*任务选项字任务选项字*/ char *pStackBase,/*任务堆栈基地址任务堆栈基地址*/ 初始化指定的内存区域作为任务的堆栈 和控制块,而不像taskSpawn()那样由系 int stackSize,/*堆栈大小堆栈大小*/ FUNCPTR entrypt, 统自动分配/*任务入口任务入口*/ int arg1,arg2,arg3,arg4,arg5,/*入口参数入口参数*/ 可以方便应用进行调试,并将堆栈分配 在指定位置int arg6,arg7,arg8,arg9,arg10 )嵌入式操作系统 taskInit的返回值:的返回值: 成功:OK

    21、任务不能初始化则:ERROR。可能返回的 ERRNOS值有:值有: S_intLib_NOT_ISR_CALLABLE /*程序不能从一个程序不能从一个ISR中调用中调用*/ S_objLib_OBJ_ID_ERROR /*不正确的任务不正确的任务ID*/嵌入式操作系统taskActivate()激活一个任务激活一个任务 STATUS taskActivate(int tid) taskActivate()激活由激活由taskInit()创建的任务,其参创建的任务,其参 数是taskInit()中第一个参数任务TCB的地址,强 制类型转换如下: tid = (int) pTcb; 注意:当应用

    22、需要对任务定位和激活进行控制 时,才使用这两个函数,通常使用taskSpawn()就 可以了嵌入式操作系统管理任务名称和ID号的函数 由任务号得到任务名taskName() 由任务名得到任务ID号taskNameTold()taskIDSelf() 得到任务自身的ID号taskIdVerify() 证实一个特定任务的存在(由任务ID指定)嵌入式操作系统任务选项相关函数 尽管TaskSpawn()中options参数指定的新任务的 选项,使用下列函数可以动态读取或设置指定任 务的选项 taskOptionsGet():获取任务选项:获取任务选项 taskOptionsSet():设置任务选项:设

    23、置任务选项 当前只有VX_UNBREAKABLE选项可以改变嵌入式操作系统获取任务信息taskIDListGet():获取所有活动任务的:获取所有活动任务的ID号号taskInfoGet():得到指定任务的信息:得到指定任务的信息taskPriorityGet():查看指定任务的优先级:查看指定任务的优先级taskRegsGet():查看任务的寄存器:查看任务的寄存器taskRegsSet():设置任务的寄存器:设置任务的寄存器taskIsSuspended():查看指定任务是否挂起:查看指定任务是否挂起taskIsReady():查看指定任务是否就绪:查看指定任务是否就绪taskTCB:得到

    24、任务控制块指针:得到任务控制块指针嵌入式操作系统taskSpawn应用实例应用实例1嵌入式操作系统 结果演示嵌入式操作系统 仿真器上显示信息:嵌入式操作系统 将s2_tasks中的优先级101改为101-i嵌入式操作系统 演示结果嵌入式操作系统taskSpawn应用实例应用实例2嵌入式操作系统 演示结果嵌入式操作系统 仿真器上显示信息:嵌入式操作系统2.2 任务删除和删除安全 任务可以动态地从系统中删除 删除任务的函数调用若任务的入口函数指定返回,则将隐含调用exit();另外,任务可以在任何时候调用exit杀死自身; exit():终止任务自身的执行,释放所占用的:终止任务自身的执行,释放所

    25、占用的 内存(stack和TCB) taskDelete():终止一个指定任务,释放所占:终止一个指定任务,释放所占 用的内存(同上)任务可以在任何时候调用taskDelete删除其他任务任务终止时,其执行时任务分配的内存不会被释放,如malloc()分配的内存,必须由任务自身编程释放。嵌入式操作系统taskDelete应用实例应用实例延迟0.5秒嵌入式操作系统嵌入式操作系统 演示结果嵌入式操作系统 仿真器上显示信息:嵌入式操作系统 注意:不要在一个不合适的时刻删除任务,在删 除之前,该任务必须释放它所持有的所有资源 保护任务不被删除的函数调用任务访问临界区时就需要这种保护。例如,为了对某些数

    26、据结构互斥访问,任务可能取得一个信号量。但若正在临界区执行的任务被删除,会导致这个任务无法完成临界区的访问,从而使得该数据结构可能处于一种被破坏或不一致的状 taskSafe():保护任务不被删除:保护任务不被删除态。 taskUnsafe():解除任务保护:解除任务保护此外,由于该任务没有释放信号量,其他任务将无法获得信号量,从而导致该临界资源不可用。使用taskDelete()删除另一个被保护的任务,会导致调用者任务被阻塞,直到被保护的任务解除保护任务保护使用一个计数器实现保护的嵌套,仅当计数器为0时才真正的解除保护嵌入式操作系统 下面的代码段说明如何使用taskSafe()和 taskU

    27、nsafe()来保护一段临界区代码来保护一段临界区代码taskSafe();semTake(semID, WAIT_FOREVER); /*Block until semaphore available*/临界区操作代码semGive(semID); /*Release semaphore*/taskUnsafe();嵌入式操作系统2.3 任务运行的控制 下列函数用于控制任务的执行VxWorks的调试功能希的调试功能希望能够挂起/恢复任务的执行,从而可以冻结任务的执行状态终止任务,然后使用原有参数重新创建任务。提供一个简单的任务睡眠机制。区别,taskDelay()将会导致任务被移到相同优先级

    28、就绪队列的尾 这是一个POSIX函数,部,例如taskDelay(0)可以将CPU交给同优先级的另一个任务 与taskDelay() 以下调用将任务延时半秒: 一样可以实现延时,但延时单位不同,可以直接指明延时。而调用nanosleep实现延时0被认为是错误的嵌入式操作系统taskResume() taskSuspend()taskResume()/taskActivate()taskSuspend()taskSuspend()taskResume()挂起阻塞就绪睡眠 taskDelay()延时已到执行taskRestart()嵌入式操作系统应用实例1嵌入式操作系统嵌入式操作系统嵌入式操作系统

    29、 演示结果嵌入式操作系统 仿真器上显示信息:嵌入式操作系统 将taskResume换成taskActivate,结果一样嵌入式操作系统应用实例2嵌入式操作系统不能延迟到myFunc任务已结束嵌入式操作系统 演示结果嵌入式操作系统 仿真器上显示信息:嵌入式操作系统2.4 任务扩展函数 有时任务需要在任务创建、删除或上下文切换 时增加相应的处理,又不需要修改内核 VxWorks的内核的内核wind提供钩子函数机制实现上提供钩子函数机制实现上 述目标,使得当任务创建、上下文切换、删除 时调用用户附加的函数 下列函数可以设置任务创建/切换/删除时的钩子 函数嵌入式操作系统taskHookLib所有HO

    30、OK函数的入参都是函数指针嵌入式操作系统 由于用于任务切换时的钩子函数只能运行在内 核上下文中,因此这个钩子函数能够调用的函 数调用有限制,只能是:缓冲区管理库 协处理器(浮点)状态的保存和恢复链表操作库体系结构无关的中断例程库 C的数学计算库环形缓冲区操作库任务管理库出错处理嵌入式操作系统应用实例嵌入式操作系统在任务创建时,就会调用myTaskHook 演示结果 Shell下输出信息:下输出信息:嵌入式操作系统 仿真器输出信息:嵌入式操作系统2.5 代码的共享和重入 VxWorks提倡:单个子程序的备份或子程序库被多 个不同的任务调用 定义:一个被多个任务调用的单个备份成为共享 代码VxWo

    31、rks动态链接功能很容易实现代码共享动态链接功能很容易实现代码共享嵌入式操作系统重入 共享代码必须是可重入的: 一个子程序是可重入的,如果该程序的单个备 份可以被多个任务同时调用而不会发生冲突 典型的冲突: 对全局或静态变量的修改 VxWorks的很多子程序是可重入的的很多子程序是可重入的 惯例:所有somename_r()命名的子程序被认为 是不可重入的 VxWorks的的I/O和驱动程序是可重入的和驱动程序是可重入的嵌入式操作系统 大部分VxWorks函数使用下列3种重入技术: 动态堆栈变量 这种函数一般是纯代码,除动态堆栈变量外没有自己 的数据,以调用者提供的数据为参数进行操作。 受信号

    32、量保护的全局和静态变量 这种函数一般含有公共数据,在调用时,必须借助于 互斥机制,禁止任务同时在代码临界区域内执行,明 确地实现重入。 任务变量 一些可被多个任务同时调用的程序,程序中的全局变 量或静态变量对每次任务的调用需要不同的值。嵌入式操作系统VxWorks与与Linux比较比较 任务创建函数:taskSpawn()与fork()/exec() 在fork/exec模型下,先调用fork函数为新任务创建一份 与父任务完全相同的内存空间,后调用exec函数装入新 任务代码,并用它来覆盖原有的属于父任务的内容。 这样做的好处是如果需要,可以从父任务那里继承代 码、数据等属性。 在spawn模

    33、型下,摈弃了继承的功能,在创建新任务 时,直接为它分配全新的地址空间,然后将新代码装 入并运行。嵌入式操作系统3、VxWorks任务调度任务调度 任务调度策略 任务调度时机 抢占上锁嵌入式操作系统3.1 任务调度策略 调度是针对多任务而言的 调度是指:根据一定的约束规则,将CPU分配 给符合条件的任务使用 上述约束规则就是所谓的调度策略(或算法) Wind内核默认采用基于优先级的抢占式调度内核默认采用基于优先级的抢占式调度 Priority-based preemptive scheduling 同时还使用轮转(Round-Robin)调度算法嵌入式操作系统任务队列 activeQHead 记

    34、录了一个线程从生成到删除过程中的每一个任务信 息 ,是一个FIFO队列 readyQHead 记录所有就绪任务,是一个优先级队列 tickQHead 记录所有延迟状态的任务,是一个优先级队列 pendQHead 记录所有阻塞状态的任务,是一个优先级队列 WorkQ 记录所有中断发起的任务,是一个环形队列嵌入式操作系统控制任务调度的几个函数 kernelTimeSlice() taskPrioritySet() taskLock() taskUnlock()控制轮转调度改变任务的优先级禁止任务调度允许任务调度嵌入式操作系统基于优先级的抢占式任务调度 基于优先级的抢占式任务调度 系统中的每个任务都

    35、拥有一个优先级 任意时刻,内核将CPU分配给处于就绪态的优先 级最高的任务运行 抢占: 一旦内核发现有一个比当前正在运行的任务的优 先级高的任务就绪,内核立即保存当前任务的上 下文,切换到这个高优先级任务的上下文中运行嵌入式操作系统嵌入式操作系统任务优先级 VxWorks支持支持256个优先级,编号个优先级,编号0255,优先级,优先级0 最高,255最低,一般099分配给系统任务, 100255分配给用户任务。分配给用户任务。 任务的优先级在创建时指定 任务可以调用taskPrioritySet改变自己的优先级嵌入式操作系统应用示例 下面程序,创建了3个优先级各不相同的任务:嵌入式操作系统嵌

    36、入式操作系统嵌入式操作系统嵌入式操作系统 演示结果:嵌入式操作系统 如何修改程序,使得任务的执行顺序变为: taskOne,taskTwo,taskThree?嵌入式操作系统 修改程序,使得taskOne、taskTwo同时具有最高 优先级运行:嵌入式操作系统 演示结果嵌入式操作系统 基于优先级的抢占是任务调度的缺陷: 当多个相同优先级的任务需要共享一台处理器 时,如果某个执行的任务永不阻塞,那么他将一 直独占处理器,其它相同优先级的任务就没有机 会执行。嵌入式操作系统轮转调度 轮转调度通常配合基于优先级的抢占式调度进行 轮转调度:让优先级相同的、处于就绪态的任务 公平地共享CPU 轮转调度使

    37、用时间片来分配CPU 每个任务执行一个预先确定的时间段(即时间 片) 在大多数系统里,并不一定需要使用轮转调度算 法。但在相同代码被多份复制执行时,如在用户 接口任务内执行时,需要使用轮转调度算法嵌入式操作系统 VxWorks中,调用函数中,调用函数kernelTimeSlice()来实现来实现 轮转调度 此函数位于kernelLib库中 参数为时间片的长度(tick数) (即:在某个任务放弃CPU给另一个同优先级 的任务之前,系统允许它运行的最大时间长 度) 如kernelTimeSlice(sysClkRateGet()/2)表示时间 片为0.5秒 kernelTimeSlice(0)关闭

    38、时间片轮转调度策关闭时间片轮转调度策 略嵌入式操作系统 使用轮转调度算法时,每个任务都有一个运行时 间计数器 随着系统时钟增加而增加 达到规定的值(时间片的值)时,清0 此时,任务放到所在优先级队列的尾部 一个新加入的任务放在所属优先级队列的尾部,计数 器初始为0 当任务被阻塞或者被更高优先级的任务抢占,将保存 其时间计数值,并且在其重新执行时恢复计数嵌入式操作系统嵌入式操作系统应用实例 下面的例子创建三个优先级相同的任务,分别向 控制台输出他们的任务id号和任务名。 s5_rrsched()调用调用kernelTimeSlice()允许系统使用轮转调允许系统使用轮转调 度。 本例中使用的时间

    39、片TIMESLICE为1/60秒(函数 sysClkRateGet()返回每秒的时钟返回每秒的时钟tick数)数) 在设置了调度时间片后,程序发起三个任务,注意: 必须保证发起的任务优先级要低于100。 另外为了演示时间片轮转的效果,要保证任务具有足 够的执行时间,在本例中使用一个循环次数为 LONG_TIME的长循环。的长循环。嵌入式操作系统嵌入式操作系统嵌入式操作系统嵌入式操作系统嵌入式操作系统 演示结果:嵌入式操作系统 增加第四个任务,其优先级为80,他和其他任务 输出相同的信息。嵌入式操作系统 取消时间片轮转: 第一种方法: 第二种方法:嵌入式操作系统 演示结果嵌入式操作系统任务切换

    40、任务切换:终止正在运行的任务(当前任务), 转而去运行另外一个任务 任务的切换实质就是断点数据的切换,需要完成 以下工作: 把被终止的任务断点指针(PC)保存到任务堆栈中 把处理器通用寄存器的内容保存到任务堆栈中 把被终止的任务堆栈指针当前值(SP)保存到该任务的TCB中 获得待运行任务的TCB 使处理器通过TCB获得待运行任务的SP 把待运行任务堆栈中通用寄存器的内容回复到处理器的通用寄存 器中 使处理器获得待运行任务的断点指针(PC)嵌入式操作系统3.2 任务调度时机本章难点 三个关键函数 reschedule intExit windExit嵌入式操作系统 调度时机任务相关的操作:生成/

    41、删除/挂起/恢/Lock/Unlock.WD的创建的创建/开始和销毁开始和销毁TICK时钟中断时钟中断信号量的某些操作Give/TakeEvent的发送和接受的发送和接受MsgQ销毁销毁Posix消息队列的销毁消息队列的销毁/接受和发送接受和发送Posix的的mutex的销毁的销毁/锁定锁定/解锁解锁中断执行退出嵌入式操作系统任务管理中函数之间的关系嵌入式操作系统3.3 抢占上锁 在实际应用中,有时候需要避免抢占,以免发生 不合理的抢占或发生一些意想不到的情况 Wind的调度器提供的调度器提供taskLock()和和taskUnlock()来禁来禁 止/允许抢占:嵌入式操作系统 当一个任务调用

    42、taskLock(),将会禁止抢占,在该 任务执行时,将不会发生基于优先级的抢占 注意:禁止抢占只能防止任务的上下文切换,不 能禁止中断 禁止抢占可以用来实现互斥 但是,应当尽量使禁止抢占的时间最小嵌入式操作系统任务调度方面与Linux的比较 任务的实时优先级数 VxWorks任务的优先级任务的优先级0255,数值越小优先级越高,数值越小优先级越高 Linux的实时进程优先级的实时进程优先级099,数值越大优先级越高,数值越大优先级越高 调度策略的种类 Linux支持支持SCHED_RR、SCHED_FIFO、 SCHED_OTHER三种调度策略三种调度策略 VxWorks只支持前两种只支持前两种嵌入式操作系统 调度策略所基于的对象 VxWorks的调度策略不是基于某个任务的,而是针对的调度策略不是基于某个任务的,而是针对 整个系统的所有任务 Linux的调度策略是基于进程的,某个进程的调度策略的调度策略是基于进程的,某个进程的调度策略 的设置不影响其他进程嵌入式操作系统

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:vxworks任务管理-哈尔滨工业大学备课讲稿课件.ppt
    链接地址:https://www.163wenku.com/p-2891508.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


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

    163文库