一、vxWorks6.9
1. 多任务简介
实时系统是在多任务和任务间通信的基础上建立起来的。一个多任务环境允许将实时应用构成一组独立的任务,每个任务拥有各自的线程和系统资源。
为了更快的得到中断响应,vxWorks操作系统里的中断服务程序(ISR)在一个专门的上下文中执行,是处于环境的上下文之外。
每个任务有各自的上下文,即各自拥有自己的CPU环境和系统环境(指任务被内核调度执行时所使用的资源)。上下文切换时,任务的上下文保存在任务控制块(TCB).
2. 任务状态
状态 | 描述 |
---|---|
就绪(READY) | 仅等待CPU的资源,不等待其他任务资源 |
阻塞 (PEND) | 由于一些资源不可用而被阻塞 |
睡眠(DELAY) | 处于睡眠的任务 |
挂起(SUSPEND) | 该状态任务不执行,主要用于调试用 |
3. 优先级
Wind内核中,默认是基于优先级的抢占式调度,当然也可以使用时间片轮转,两种调度都基于优先级。有256种优先级,优先级从0到255,优先级0最高,优先级255最低。
3.1 基于优先级的抢占式任务调度
当一个新任务优先级高于系统当前执行任务的优先级时,它将抢占CPU执行。这意味某个任务比当前任务优先级高,并处于就绪状态,系统内核会立刻保存当前任务的上下文,并切换到高优先级任务的上下文中。
缺点:当多个任务优先级相同,并且任务永不阻塞,那么它将一直独占处理器,其他任务将没机会执行。但轮转式调度可以解决这一问题。
3.2 轮转式调度
当所有相同优先级任务处于就绪状态时,通过时间片获得相同的CPU处理时间,调动kernelTimeSlice()将启动轮转式调度
一般不使用轮转式调度,除非相同代码被复制执行多次。
3.3 抢占上锁
通过调用taskLock()和taskUnLock()函数。当任务调用taskLock()函数时,将禁止使用调度程序,若该任务正在执行时,不会发生基于优先级的抢占。
抢占上锁只能阻止任务的上下文切换,并不禁止中断
3.4 驱动程序支持的任务优先级
所有应用程序的优先级应该在100-250之间,但驱动程序支持的任务(与中断服务程序关联的任务)优先级一般位于51-99之间。
4. 任务控制
4.1 创建和激活任务
//参数:新任务名、优先级、可选字段、堆栈大小、入口函数、10个函数参数
//返回值:任务ID
extern TASK_ID taskSpawn (char * name, int priority, int options,
size_t stackSize, FUNCPTR entryPt,
_Vx_usr_arg_t arg1, _Vx_usr_arg_t arg2,
_Vx_usr_arg_t arg3, _Vx_usr_arg_t arg4,
_Vx_usr_arg_t arg5, _Vx_usr_arg_t arg6,
_Vx_usr_arg_t arg7, _Vx_usr_arg_t arg8,
_Vx_usr_arg_t arg9, _Vx_usr_arg_t arg10);
4.2 任务堆栈
为了避免堆栈溢出和破坏任务堆栈,最初分配堆栈空间时,可以分配大一点的空间,然后周期性的调用checkStack()函数周期性的监控,若可以使用更小的空间,将修改分配空间尺寸。
4.3 任务删除
调用函数 | 描述 |
---|---|
exit() | 终止任务调用,释放内存 |
taskDelete() | 终止指定任务,释放内存 |
taskSafe() | 保护调用任务免于删除 |
taskUnsafe() | 解除任务删除保护 |
任务创建时,如果指定的入口函数返回,任务将隐含调用exit()函数,当调用taskDelete()函数,一个任务能够删除自身或另另一个任务。
4.4 任务控制
调用函数 | 描述 |
---|---|
taskSuspend() | 挂起任务 |
taskResume() | 恢复任务执行 |
taskRestart() | 重新启动任务 |
taskDelay() | 延时任务,延时单位为“tick” |
nanosleep() | 延时任务,延时时间为纳秒 |
sysClkRateGet() //返回系统时钟的,单位是tick
taskDelay(sysClkRateGet() / 2);
//延时时间为0,只能调用taskDelay(),nanosleep()禁止为0
4.5 操作系统任务
4.5.1 根任务:tUsrRoot
根任务是内核执行的首个任务,可初始化vxWorks操作系统的大部分程序。正常情况下,根任务在所有初始化结束后,终止任务并且被删除。
4.5.2 日志任务:tLogTask
当前任务上下文中不执行输入/输出操作时,被操作系统用来记录系统信息
4.5.3 异常处理任务:tExcTask
必须拥有系统的最高优先级,禁止被挂起、删除、或改变任务。
4.5.4 网络任务:tNetTask
用于vxWorks网络任务级程序。通常配置INCLUDE_NET_LIB组件的操作系统可以发起网络任务
4.5.5 tShell
用INCLUDE_SHELL组件配置vxWorks操作系统关于目标机命令解释器
4.5.6 目标代理任务:tWdbTask
用INCLUDE_WDB组件配置目标代理任务
4.5.5 tTelnetd
还后台允许远程用户使用telnet登陆到vxWorks操作系统,使用INCLUDE_TELNET组件配置telnet功能