您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > vxworks任务管理-哈尔滨工业大学
嵌入式操作系统第3章VxWorks任务管理1、VxWorks下的任务2、VxWorks下任务控制及任务编程3、VxWorks任务调度嵌入式操作系统•重点掌握–VxWorks下任务的特点–VxWorks提供的任务控制函数及应用–VxWorks提供的任务调度策略及应用嵌入式操作系统1、VxWorks下任务的特点任务运行的地址空间任务结构任务的标识任务的状态及状态转换任务的上下文切换嵌入式操作系统•VxWorks中的wind内核为VxWorks提供了一个高性能的实时多任务操作环境–任务管理、任务创建、任务调度、时钟、中断、内存管理•在VxWorks中,每个明显独立的程序在运行时称之为任务嵌入式操作系统cobble.c•四个任务–第一个任务tCosmos模拟一个中断服务程序生成新数据——cosmos()–第二个任务tSchlep收集数据——schlep()–第三个任务tCrunch处理数据,完成计算并求出一个结果——crunch()–第四个任务tMonitor监视结果值,当结果超出安全范围时,向屏幕打印报警信息——monitor()•子函数——nodeAdd(),nodeScrap()嵌入式操作系统1.1任务运行的地址空间•VxWorks操作系统采取线性单一实地址空间模式,所有任务都运行在同一地址空间,不区分用户态和核心态嵌入式操作系统嵌入式操作系统•VxWorks下任务具有如下特点:–任务切换时不需要进行虚拟地址空间切换–任务间可以直接共享变量,不需要通过内核在不同的地址空间复制数据–系统调用时不需要在核心态和用户态之间切换,相当于直接的函数调用嵌入式操作系统•!由于没有访问内存任何约束和保护,因而对代码质量提出了更高的要求•当选用VxVMI时,每个任务各自的地址空间需要进行虚拟地址到物理地址的转换嵌入式操作系统1.2任务的结构data段数据段bss段TCB代码段堆栈段不需要进行用户、内核的区分嵌入式操作系统TCB•TCB用来描述一个任务,每一任务都与一个TCB关联•TCB用windTcb结构体来描述–VxWorks的taskLib库中定义(taskLib.h)嵌入式操作系统•TCB中上下文信息包含的具体内容:–程序执行点(PC)–CPU状态,包括各种处理器特定的寄存器–––––栈任务的状态延迟定时器时间片定时器I/O操作分配的标准输入/输出,标准错误输出操作嵌入式操作系统–––––––内核控制结构信号处理信息错误信息调试和性能监视状态任务变量(可选)浮点上下文(可选)可扩展项(可选)嵌入式操作系统错误信息•在VxWorks中有一个全局变量errno来存放系统最近的错误状态值•每个任务TCB中都记录有一个全局errno副本—errostatus,属于任务上下文的一部分•ISR也使用独立的errno,但是ISR没有TCB,内核为ISR在中断栈中保存和恢复errno嵌入式操作系统•errno的值由4个字节表示,2个高字节表示产生错误的模块组件编码,2个低字节表示错误编号–如0x110001,表示内存不足•VxWorks提供errnoLib库用于获取和设置任务和中断的错误状态值嵌入式操作系统任务变量•当多个任务需要同一全局变量或静态变量提供不同的值时,VxWorks提供任务变量机制来切换全局变量•任务变量机制允许在任务上下文中定义自己的私有变量,随着上下文切换而切换嵌入式操作系统嵌入式操作系统•每个任务变量允许存放一个4字节的值typedefstructtaskVar/*TASK_VAR*/{structtaskVar*next;int*address;intvalue;}TASK_VAR;•VxWorks提供库taskVarLib库支持任务变量机制嵌入式操作系统•当有多个任务变量时,任务变量以单向链表的形式存在嵌入式操作系统•任务切换时需要遍历任务变量链表,进行变量值的恢复和保存——降低效率•!此机制会降低任务上下文切换的效率,建议编程时谨慎使用嵌入式操作系统堆栈•在任务创建时指定堆栈的大小•TCB记录了位置和大小等栈信息•任务栈大小的设置必须合理高地址pStackEndStackSizepStackBaseTCB低地址pTCBpTaskMem16bytes嵌入式操作系统•VxWorks操作系统提供函数checkStack()来检查任务栈使用情况–checkStack()显示了单个指定任务或者所有任务的栈使用情况,包括:••••栈大小(SIZE)栈当前使用数(CUR)历史使用峰值(HIGH)最大可能空余数(MARGIN=SIZE-HIGH)•Tornado中的browser也可查看栈的使用情况•!堆栈诊断前提:栈初始化时要用0xee填充嵌入式操作系统•shell下创建任务时默认堆栈大小(sp命令)–#defineSHELL_STACK_SIZE10000•VxWorks支持独立的中断栈,对所有的ISR使用相同的中断栈–中断栈在系统启动时根据配置参数设置位置、大小和填充。在configAll.h中有缺省定义:#defineISR_STACK_SIZE1000嵌入式操作系统1.3任务的标识•VxWorks下标识任务有两种途径:任务名称和任务ID号•任务名称–是独一无二的字符串–主机任务以字母u开头–目标机任务以字母t开头•任务ID号–长度为4字节,指向TCB•VxWorks提供任务名称和任务ID之间的转换函数嵌入式操作系统1.4任务的状态•5种基本状态:––––––––––执行(RUN)就绪(READY)——任务只需等待cpu阻塞(PEND)——有cpu以外的资源不可用睡眠(DELAY)——任务处于睡眠状态挂起(SUSPEND)——一般用于调试DELAY+S——睡眠+挂起PEND+S——阻塞+挂起状态PEND+T——延时阻塞状态PEND+T+S——延时阻塞+挂起状态…+I——继承优先级状态,优先级暂时被提升•多种组合状态嵌入式操作系统任务的状态转换图任务创建时,处于挂起状态taskSuspend()taskResume()挂起要使刚创建的任务就绪,taskResume()要激活该任务taskSuspend()taskSuspend()taskResume()/taskActivate()阻塞就绪semTake()/msgQReceive()semGive()/msgQSend()抢占调度睡眠taskDelay()使用spawning原语,可以直接延时已到创建并激活一个任务任务可以在任何状态下被删除执行嵌入式操作系统任务的状态队列嵌入式操作系统1.5任务上下文切换•上下文切换示意图TCB(Old)copyofpccopyofspCPUpcspTCB(New)copyofpccopyofsperrorStatuserrnoerrorStatus嵌入式操作系统•上下文切换分两种情况:同步和异步•同步上下文切换,引起的原因是当前运行的任务执行下列操作:–进行阻塞、延迟、挂起的调用;–使更高优先级任务就绪而发生优先级抢占–降低自身优先级或者退出;•异步上下文切换,通常由ISR使更高优先级任务就绪引起。嵌入式操作系统1.6VxWorks的系统任务•根任务tUsrRoot–内核执行的第一个任务–初始化VxWorks系统的主要功能,例如•发起日志任务、异常处理任务、网络任务和tRlogind后台任务–通常,上述初始化结束之后,根任务终止并删除–用户可以向根任务自由的添加任何必需的初始化代码–对应usrRoot()函数(target/config/all/usrConfig.c)嵌入式操作系统•日志任务:tLogTask–记录系统信息的任务。它不执行输入/输出操作。•异常处理任务:tExcTask–提供VxWorks异常处理包,完成在中断级不能执行的功能–必须具有系统最高的优先级–不能挂起、删除、改变其任务的优先级•目标代理服务:tWdbTask(INCLUDE_WDB)–当目标代理设置为运行在任务模式时,创建此任务–处理来自Tornado目标服务的请求★以上3种任务都属于VxWorks的基本任务嵌入式操作系统•网络任务:tNetTask(INCLUDE_NET_LIB)–后台处理VxWorks网络需要的任务级功能处理•其他可选组件的任务–tShell(INCLUDE_SHELL)–tRlogind(INCLUDE_RLOGIN)–tTelnetd(INCLUDE_TELNET)–tPortmapd(INCLUDE_RPC)嵌入式操作系统与Linux比较•任务控制块的内容多用户性、任务间的亲属关系、文件打开表、队列信息、虚拟内存信息、错误状态等•栈栈的大小、中断栈•任务状态状态的种类、状态间的转换嵌入式操作系统2、VxWorks下任务控制及任务编程••••••任务创建和激活任务删除与任务安全任务的状态控制任务信息的获取任务扩展函数代码的共享与重入嵌入式操作系统•VxWorks提供丰富的任务控制功能,包含在taskLib库中•包括:–任务的创建、删除、状态控制、获取任务信息等等•可以在TornadoIDE提供的shell工具中交互使用这些调用嵌入式操作系统嵌入式操作系统嵌入式操作系统嵌入式操作系统2.1任务的创建与激活•VxWorks的TaskLib库中提供多个函数用于创建任务:调用taskSpawn()taskInit()taskActivate()描述创建并激活一个任务初始化一个新任务激活一个初始化任务嵌入式操作系统taskSpawn()—创建并激活一个新任务inttaskSpawn(char*name,/*新任务的任务名*/intpriority,/*新任务的优先级*/intoptions,/*任务选项字*/intstackSize,/*堆栈大小*/FUNCPTRentryPt,/*新任务的入口函数*/intarg1,arg2,arg3,arg4,arg5,/*传递给入口函数*/intarg6,arg7,arg8,arg9,arg10/*的10参数*/)嵌入式操作系统TaskSpawn()•创建新任务的上下文–堆栈、TCB、含有特定参数的入口程序调用的任务环境(入口程序通常是一个普通的程序)–新的任务将在指定的函数入口处执行–激活新任务•堆栈是系统资源,位于系统内存中–其底端是TCB–堆栈使用0xEE填充•任务名要便于记忆,可以是任意长度、任意内容嵌入式操作系统•taskSpawn中的任务选项参数可以是下表中的选项之一或其组合如果任务使用任何浮点操作,必须要求使用VX_FP_TASK选项嵌入式操作系统•任务的优先级:–Wind内核支持256种优先级,0~255–优先级0为最高,优先级255为最低–一般,0~99分配给系统任务,100~255分配给用户任务嵌入式操作系统taskSpawn()返回值•成功:任务ID号•失败:ERROR。返回的ERRNOS可能有–S_intLib_NOT_ISR_CALLABLE,/*程序不能从一个ISR中调用*/–S_objLib_OBJ_ID_ERROR,/*不正确的任务ID*/–S_smObjLib_NOT_INITIALIZED,/*在指定的分区中,没有足够的内存用于发起任务*/–S_memLib_NOT_ENOUGH_MEMORY,/*没有足够的内存发起任务*/–S_memLib_BLOCK_ERROR,/*不能够对内存分区互斥访问*/–S_taskLib_ILLEGAL_PRIORITY/*非法的优先级*/嵌入式操作系统•在源代码中使用TaskSpawn创建新任务•在TornadoShell中–使用TaskSpawn创建新任务–使用i查看系统中的任务(演示)嵌入式操作系统•taskSpawn()中包含了一些低级的操作,包括初始化和激活一个任务–taskInit()–taskActivate()嵌入式操作系统taskInit()初始化一个任务STATUStaskInit(WIND_TCB*pTcb,/*新任务的TCB地址*/char*name,允许不指定任务名,由系统自动命名/*新任务的名字*/in
本文标题:vxworks任务管理-哈尔滨工业大学
链接地址:https://www.777doc.com/doc-4698559 .html