VxWorks读书笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章VxWorks基础
1 任务产生
Table 2-3: Task Creation Routines
Call Description
taskSpawn( ) Spawn (create and activate) a new task.
taskInit( ) Initialize a new task.
taskActivate( ) A ctivate an initialized task.
id = taskSpawn ( name, priority, options, stacksize, main, arg1, arg10 ),VxWorks习惯用ID号为0的任务作为调用发出的任务?
阻塞,是指进程因某个事件不能使程序继续运行下去,如要对某I/O操作时!简单的说:阻塞,指进程在主存中并等待一个事件的完成
在虚拟内存中,当主存中没有处于就绪状态的进程时操作系统就把被阻塞的进程换出到磁盘中的挂起队列,挂起的原来就差不多是这样,挂起需要和阻塞或就绪结合,简单的说,就是进程在辅存中并等待一个事件。
任务控制块(WIND_TCB)
多任务设计能随时打断正在执行着的任务,对内部和外部发生的事件在确定的时间里作出响应。VxWorks实时Wind内核提供了基本的多任务环境。从表面上来看,多个任务正在同时执行,实际上,系统内核根据某一调度策略让它们交替运行。系统调度器使用任务控制块的数据结构(TCB)来管理任务调度功能。任务控制块用来描述一个任务,每一任务都与一个TCB关联。TCB包括了任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务最初被激活时以及从休眠态重新被激活时,要用到这些信息,TCB使多个任务得以独立运行,如表1-1所示任务控制块TCB。
表1-1 任务控制块TCB
为了便于调试,每个任务都有一个独一无二的字符串表示的名称,在任务被创建时由用户程序指定或者系统默认生成。几乎所有的任务控制函数都采用任务ID(等于TCB地址)表示一个任务。VxWorks提供任务名称和任务ID之间的转换函数。
TCB的一个重要内容就是任务上下文(ContExT),代表了任务运行状态。VxWorks的任务切换就是将当前任务(被换出CPU)的上下文保存到该任务的TCB,然后从调度程序(Scheduler)选择新任务(被换入CPU)的TCB中恢复上下文。
任务上下文:
多任务为应用程序对多个离散的现实事件的控制和反应提供了基本的机制。VxWorks的实时内核wind提供了一个基本的多任务环境。内核按照一种调度算法交替运行各个任务,造成一种多个任务并行运行的假象,每一个任务都有自己的任务上下文。任务上下文是任务每次被调度运行时所能看到的CPU环境和系统资源。在一次上下文切换中,一个任务的上下文被存在任务控制块(TCB)中。一个任务的上下文包括:
l 一个用于执行的线程,即任务的程序计数器
l CPU的寄存器和可选择的浮点寄存器
l 用于动态变量和函数调用的堆栈
l 对标准的输入、输出、出错的I/O口的分配
l 延时(休眠)时钟
l 时间片时钟
l 内核的控制结构
l 信号句柄
l 调试和性能监视参数
在VxWorks中,一个非常重要但并不是任务上下文的一项资源就是存储器地址空间:所有代码(任务)都在一个单一的公有的地址空间运行,这一点是区别于许多非实时操作系统的(UNIX,Windows)。
2 option
当任务生成后,一个选项参数一定要给出。
若生成一个任务,涉及到浮点操作,则如下定义:
tid = taskSpawn ("tMyTask", 90, VX_FP_TASK, 20000, myFunc, 2387, 0, 0, 0, 0, 0, 0, 0, 0, 0)
Table 2-5: Task Options
Name
Hex
Value
Description
VX_FP_TASK 0x8 Execute with the floating-point
coprocessor.
VX_NO_STACK_FILL0x100 Do not fill stack with 0xee.
VX_PRIVATE_ENV 0x80 Execute task with a private
environment.
VX_UNBREAKABLE0x2 Disable breakpoints for the task.
选项还可以被检查是否合法
Table 2-6: Task Option Routines
Call Description
taskOptionsGet( )E xamine task options.
taskOptionsSet( )S et task options.
3 获取任务信息
当一个任务被调度的时候,可以检查当时该任务的上下文,获取该任务的信息。
Table 2-7: Task Information Routines
Call Description
taskIdListGet( )Fill an array with the IDs of all active
tasks.
taskInfoGet( )Get information about a task.
taskPriorityGet( )E xamine the priority of a task.
taskRegsGet( )Examine a task's registers.
taskRegsSet( )Set a task's registers.
taskIsSuspended( )C heck if a task is suspended.
taskIsReady( )Check if a task is ready to run.
taskTcb( )Get a pointer to task's control block.
4 删除任务
当一个任务被删除之前,一定要确保该任务释放了所有占有的共享资源。
Table 2-8: Task-Deletion Routines
Call Description
exit( )Terminate the calling task and free memory (task
stacks and task control blocks only).1 taskDelete( )T erminate a specified task and free memory (task
stacks and task control blocks only).* taskSafe( )Protect the calling task from deletion.
taskUnsafe( )U ndo a taskSafe( ) (make the calling task
available for deletion).
任务删除存在的安全隐患:
一个任务可以占有一个信号灯,来占有临界资源;当这个任务被任务删除时,占用的临界资源没有被释放,其他任务就无法得到该临界资源。因为该任务无法释放信号灯。使用tasksafe()和taskUnsafe( )可以解决这个问题。前者可