VxWorks任务基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在任务被创建时从系统内存池中分配 任务创建后堆栈的大小就固定了 内存在堆栈中预留了一些空间,使得实际可用 的堆栈空间比申请的堆栈空间要小 超过堆栈大小(stack crash)会导致系统不可 预见行为
任务选项(options)
在任务创建时,可以按位“与”或者“或”同 时使用 – VX_FP_TASK 增加对浮点的支持 – VX_NO_STACK_FILL 不使用0xee填充stack – VX_UNBREKABLE 禁止断点 – VX_DEALLOCATE_STACK 当任务退出时对 stack和TCB进行回收 使用taskOptionGet()来查询任务的option 使用taskOptionSet()来设置或复位option

错误消息
VxWorks使用错误符号表(statSymTbl)将错误号 转换为错误消息 为了得到一个错误号所代表的错误信息字符串 Char errStr [ NAME_MAX ]; Strerror_r ( errno, errStr ); 在Winsh窗口中打印一个和错误号相对应的错 误消息使用 – >printError ( 0x110001 ) S_memLib_NOT_ENOUGH_MEMORY
代码重载是指同一段代码可以被多个任务调用, 而且不出错。 代码内应该无全局变量或静态变量;代码不修 改自身。 VxWorks使用下面的机制来实现重入 – 动态堆栈变量 – 由信号量保护的全局或静态变量 – 任务变量

4.5.4 任务信息(task information)
ti(taskNameOrId) 该命令列出下列信息 – 堆栈信息 – 任务选项 – CPU寄存器

4.3 VxWorks的任务状态

就绪态:任务正在等待CPU资源 休眠态:任务正在等待除CPU资源外的其他资 源 延迟态:任务正在等待一定的时间延时 悬置态:任务无法执行,主要是用于调试的一种 状态。
4.4 任务状态的转换
状态转换 就绪态→悬置态 就绪态→延迟态 就绪态→休眠态 悬置态→就绪态 悬置态→休眠态 延迟态→就绪态 延迟态→休眠态 休眠态→就绪态 函数 semTake()/msgQReceive() taskDelay() taskSuspend() semGive()/msgQSend() taskSuspend() Expired delay taskSuspend() taskResume()

任务创建过程中要注意的问题

在对时间要求非常严格的代码中,任务的创建过 程是非常耗时的 为了减少创建时间,在任务被创建时可以设置 VX_NO_STACK_FILL选项 或者在系统启动时创建任务然后立即阻塞它, 当需要时再重新使得它成为就绪状态
4.5.2 删除任务

taskDelete(tid) 删除一个给定的任务 释放TCB和stack所占空间

4.5 VxWorks中的任务
一个VxWorks的任务包含 – 一个堆栈(用于存储变量和传送给程序的参 数) – 一个TCB(用于OS控制) 不要混淆可执行代码和执行它的任务 – 代码是在任务启动之前可以被下载的 – 多个任务可以执行同样的代码(如printf())
4.5.1创建一个任务
为了创建一个任务,VxWorks必须 – 再内存池中为任务分配Stack和TCB的存储空间。 taskSpawn()函数在一块连续的空间分配这些存 储空间。 – 初始化Stack(例如为任务创建一个有初始化值 的Stack) – 初始化TCB(在TCB中存储函数入口点指针,初 始化stack指针) – 把任务放到Ready队列
资源回收
资源回收必须由应用程序自己来实现 只有TCB和堆栈是自动回收的 任务应该在退出之前进行资源回收 – 释放内存 – 是否被锁定或共享的资源 – 关闭打开的文件 – 当父任务退出时要删除子任务

任务控制
(1)任务重启 taskRestart(tid) 任务被中止执行,并使用原来的参数、tid、和 TCB重新启动 通常用于错误恢复

任务优先级
从0(最高)到255(最低) 程序员可以动态地对优先级进行操作 – taskPriorityGet (tid, &priority) – taskPrioritySet (tid, priority) 使用这些函数会使得程序分析起来比较困难,不 建议使用

任务堆栈(stack)


什么时候会发生上下文切换
任务在执行过程中会发生同步上下文切换 – 任务自身发生阻塞、延时、挂起等状态变化 – 当一个优先级高的任务准备运行 – 降低任务的优先级或任务退出执行(不常发生) 当有中断ISR到来时会发生异步上下文切换 – 使得一个优先级高的任务准备运行 – 挂起当前的任务或降低它的优先级(不常发生) 同步上下文切换比异步上下文切换要保存的寄 存器少,因此切换速度快

基于轮转的调度
任务间平等地占用CPU时间 轮转调度机制使得具有相同优先级地任务公平地分享 CPU 轮转调度使用时间片来实现相同优先级任务对CPU的公 平分配。 时间片设置 – KernelTimeSlice(ticks) (当ticks=0时,时间片设置被关 闭) 基于优先级的调度总是优先的 – 基于轮转的调度仅仅用于具有相同优先级的任务 基于优先级的重新调度可以在任何时间发生 – 基于轮转的调度要以系统的ticks为间隔
4.5.5 任务错误状态
VxWorks使用一个全局整型变量errno来传递错 误信息。 – 低层程序发现错误,并设置errno – 调用程序检查errno并发现被调用程序出现错误 的原因 代码中如果要使用errno,则必须包含errno.h文 件。

设置errno
低层程序(被调用的程序)检测到一个错误设置errno值, 并返回ERROR。 STATUS myRoutine() {… if ( myNum > MAX_NUM ) {errno = S_myLib_TOO_MANY_NUM) return ( ERROR); } … } 如果在使用C语言标准函数时发生错误,就直接返回 ERROR,而不需要修改errno值。
休眠态→悬置态 休眠态→延迟态
taskSuspend() taskResume()
上下文切换
每当停止执行一个任务,并有一个新的任务开始执 行,就会发生上下文的切换。 为了对一个新任务实现重新调度,内核必须做如下 工作: – 将目前正在执行的任务的上下文保存进它的TCB中; – 将要执行的任务的上下文从它的TCB中恢复。 上下文切换的速度必须非常快
4.2 VxWorks的多任务内核
Wind内核是VxWorks中直接控制任务的部分。 根据VxWorks的调度机制为任务分配CPU。 使用任务控制块(TCB)来控制任务。 – 每个任务都有一个任务控制块 – TCB的数据结构定义WIND_TCB在头文件taskLib.h 中。 – 操作系统关于任务的控制信息包括,状态、任务优先级、 延时时间、断点列表、出错状态等。 – CPU的上下文信息包括,PC、SP、CPU寄存器等。

基于优先级的调度
不同的应用应该有不同的优先级,这一点应该在CPU的 分配中得到体现。 抢占调度是基于任务的优先级,该优先级的选择反应了 任务的重要性。默认情况下相同优先级的任务之间不会 发生抢占 系统内核一旦发现有一个优先级比当前正在运行的任务 的优先级高的任务处于Ready状态,内核就立即保存当 前任务的上下文切换,将当前任务变为pended状态,并 切换到该高优先级任务的上下文执行。 下列情况在任何时候会导致重新调度。 – 内核调用(kernel calls) – 中断(例如系统时钟中断) 上下文的切换不会延迟到下一个系统时钟中断。
任务控制
(3)任务睡眠(delayed) 使任务睡眠一定的系统时钟周期 – STATUS taskDelay(ticks) 每隔1/7秒进行轮询 FOREVER{ taskDelayed( sysClkRateGet()/7); … } 使用sysClkRateSet()改变时钟频率
4.5.3 代码重入(Reentrancy)
任务控制
(2)任务挂起/恢复(suspend/resume) taskSuspend(tid) 使任务不能够执行 可以被增加阻塞和睡眠状态 一个任务可以安全地挂起自己 taskResume(tid) 取消挂起 通常taskSuspend()和taskResume()被用于调试 和开发的目的

创建一个任务
int taskSpawn( name, priority, options, stackSize,entryPt, arg1,…,arg10) Name 任务名,如果是NULL系统就给一个默认的名字 Priority 任务优先级,值从0-255 Options 任务选项,如VX_UNBREAKABLE stackSize 所分配的以字节为单位的堆栈大小 entryPt 开始执行的代码的地址 Arg1…arg10 entryPt总共可以有10个参数 如果函数执行成功,则返回任务标识(id),否则返回错误号。 例如 – NewTid=taskSpawn(“tMyTask”,150,0,2000,myRoutine(), arg1,arg2,0,0,0,0,0,0,0,0)

Leabharlann Baidu
任务名
为方便人们理解而设置 – 通常在开发过程中在Shell中使用 – 在程序中使用task id 为了方便起见,起任务名时一般以t作为开头; 由系统所起的默认的任务名为t后面带一个顺序 增加的数字 任务名不一定是唯一的(但通常都是唯一的) 相关的taskLib例程有 – taskName() 从tid得到任务名 – taskNameToId 从任务名得到tid
VxWorks应用设计
中科信软培训中心
四、VxWorks任务基础
4.1 VxWorks的实时多任务简介

实时性使得一个控制系统能够及时响应对该系统 的控制。 如果一个系统的响应时间是可以预测的,则它 就是一个具有确定性的系统。 从一个事件发生到它被响应之间的时间称为 Latency。 确定性响应是实时系统性能关键因素。

任务标识(task id)
内核在任务创建时分配给任务的 对每个任务是唯一的 在任务退出后可以重用 相关的taskLib例程 – taskIdSelf() 得到调用任务的ID号 – taskIdListGet() 得到所有正在执行任务的ID号 列表 – taskIdVerify() 证实任务的ID号是否有效
相关文档
最新文档