VxWorks 学习笔记
A system is described as being deterministic if its response time is predictable.
Deterministic response is the key to real-time performance.
缺点:1)各个构件无法按照不同的速率执行;2)没有优先级;3)无法抢占;
优点:没有任务切换的开销。
多任务
执行速度快:1) 轻量级的任务,上下文切换快; 2)没有系统调用的开销
运行的确定性:基于优先级的抢占式调度确保了高优先级任务的响应速度。
Ready
Delay: waiting for a mount of time to pass
Pend: waiting for an object event
Pend & Delay
Suspend
VxWorks中管理任务的是Wind Kernal;
使用TCB跟踪管理任务;
TCB数据结构定义:WIND_TCB
获取TCB指针:函数taskTcb()
对每一个Pend的Event,有独立的Queue
分为两种类型:Synchronous、Asynchronous
Asynchronous切换是由ISR引起的任务切换
Synchronous需要保存的寄存器少,所以速度更快
ISR的优先级比任务高
抢占式调度是基于优先级的,高优先级抢占低优先级的任务
重新调度发生的时刻:1) Kernal calls, 2) Interrupts (e.g. System clock ticks)
优先级的高低取决于任务计时的要求,而不是任务的重要性
作用于相同优先级的任务
Round-robin scheduling is disabled by default. To allow equal priority tasks to preempt each other, time slicing must be turned on: kernelTimeSlice (ticks)
-> clockRate = sysClkRateGet( )
All tasks reside in a common address space. 1) Makes intertask communication fast and easy. 2) Makes context switch faster (don’t need to save and restore virtual address contexts). 3) A deviant task can corrupt other tasks.
All tasks run in supervisor (privileged) mode. No system call overhead.
Message passing queues for intertask communication within a CPU
Network routines for intertask communication between CPU’s
Semaphores to protect data which is shared by tasks
Timers and other interrupts to trigger task execution
I/O system facilities to read/write data to hardware devices
TCB
Stack:存储自动变量和函数参数
Allocate memory for the stack and TCB from a memory pool.
Initialize the stack.
Initialize the TCB.
Put task into ready queue.
newTid = taskSpawn (“tMyTask”, 150, 0, 20000, myRoutine, arg1, arg2, 0, 0, 0, 0, 0, 0, 0, 0)
A task id of zero refers to task making call (self).
相关函数:taskIdSelf, taskIdListGet, taskIdVerify
相关函数:taskName, taskNameToId
Timing requirements rather than hazy ideas about task importance should govern priorities.
One can manipulate priorities dynamically with: taskPriorityGet (tid, &priority),taskPrioritySet (tid, priority)
Fixed size after creation.
The kernel reserves some space from the stack, making the stack space actually available slightly less than the stack space requested.
Each byte in a task’s stack is filled with 0xee when the task is created. The checkStack( ) function searches from the end of the stack for this value in order to find the maximum stack usage.
VxSim targets add 8000 bytes to the requested stack size, to deal with simulated interrupts, which are handled on the stack of the current task.
taskOptionsGet
taskOptionsSet
During time critical code, task creation can be unacceptably time consuming.
To reduce creation time, a task can be spawned with the VX_NO_STACK_FILL option bit set.
Alternatively, spawn a task at system start-up which blocks immediately, and waits to be made ready when needed.
相关函数:taskDelete, exit
相关函数:taskRestart
通常用于错误恢复
一个任务重起自身时,是由任务tRestart完成
相关函数:taskSuspend, taskResume
相关函数:taskDelay(ticks)
延迟1/7 秒:taskDelay (sysClkRateGet( ) / 7)
sysClkRateGet:Get the number of ticks per second of the system clock
Use only stack variables in applications.
Protect the resource with a semaphore.
Use task variables to make the variable private to a task.
Task Variables cause a 32-bit value to be saved and restored on context switches, like a register.
User-defined code can be executed on every context switch, at task creation, or at ask deletion: taskSwitchHookAdd ( ) , taskCreateHookAdd( ), taskDeleteHookAdd ( )
VxWorks uses a switch hook to implement task variables.
-> ti
全局变量errno用来保存当前执行任务的错误状态;
任务上下文切换时,errno会保存到任务的TCB中;
底层函数根据情况设置errno,上层调用函数检查errno的值确定函数调用失败的原因;
错误码格式:模块编码(16bits)+错误类型(16bits);
由错误码获取描述信息:shell命令printErrno, 函数strerror( );
定义用户自己的错误码;
tUsrRoot
tLogTask
tExcTask
tWdbTask