VxWorksTornado读书笔记文档格式.docx
- 文档编号:12935469
- 上传时间:2022-09-30
- 格式:DOCX
- 页数:10
- 大小:18.86KB
VxWorksTornado读书笔记文档格式.docx
《VxWorksTornado读书笔记文档格式.docx》由会员分享,可在线阅读,更多相关《VxWorksTornado读书笔记文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
我的理解:
在任务运行时,运行时的一些相关信息,即上下文是保存在什么地方?
应该是在系统运行时总的环境里。
比如说,CPU有一套寄存器,如果哪个任务运行,则这个任务的上下文就被保存到系统的这些寄存器中;
如果有任务切换,系统将当前正在运行任务的上下文保存到这个任务的TCB中,然后从将要执行任务的TCB中取出它的上下文,放到系统的寄存器中。
3.
上下文内容:
任务的执行点,即任务的程序计数器;
CPU中的寄存器;
动态变量和函数调用所需的堆栈;
一个延时定时器;
一个时间片定时器;
内核控制结构;
信号句柄。
4.
VxWorks操作系统内核:
wind内核;
一个操作系统分为核心态和用户态。
内核在核心态运行,为用户的应用程序服务。
5.
任务创建的两种方式
方式一:
使用taskInit()函数创建任务,创建时处于挂起状态,必须激活这个创建的任务才能使其进入就绪状态;
方式二:
使用发起任务(spawning)的原语,调用一个函数就能创建并激活任务;
删除任务:
任务可以在任何一种状态被删除。
6.
任务的几种状态:
就绪(READY):
任务仅等待CPU的状态,不等待其他任何资源;
阻塞(PEND):
任务由于一些资源不可用而被阻塞;
睡眠(DELAY):
处于睡眠的任务状态;
挂起(SUSPEND):
该状态时任务不执行,主要用于调试用。
这里没有运行状态的任务(uc/os-II中有),其实也是有的。
在VxWorks中,具有最高优先级并处于就绪状态的任务就是运行状态的任务。
7.
任务调度控制函数:
1)
taskLock()禁止任务调度;
当任务调用这个函数时,这个任务在执行时不会发生基于优先级的抢占;
但是任务在执行中被阻塞或挂起,调度程序将选择有资格执行且优先级最高的任务执行。
当抢占上锁的任务被解除阻塞并且重新开始执行,抢占将再一次被禁止。
抢占上锁只能阻止任务的上下文切换,并不能禁止中断;
其可以实现互斥操作;
2)
taskUnlock()允许任务调度;
每个VxWorks任务控制块都维护一个计数器锁变量lockCnt,taskLock()使其加1,taskUnlock()使其减1,当lockCnt大于0时,调度程序便被禁止。
3)
taskPrioritySet()改变任务优先级;
4)
STATUSkernelTimeSlice(intticks)任务可以调用此函数来开放或禁止时间片轮转调度。
Ticks指定以tick为单位的时间片大小。
如果任务通过taskLock()禁止抢占,系统将不对该任务的时间片进行计数,直到taskUnlock()允许抢占。
5)
taskSafe()/*保护调用任务免于删除*/
6)
taskUnsafe()/*解除任务删除保护*/
8.
辅助函数说明:
taskName()得到与任务号相关的任务名
taskNameToId()寻找与任务名相关的任务ID
taskIdSelf()获得调用此函数的任务ID号
taskIdVerify()检查一个特定任务的存在性
taskIDListGet()用ID填充一组所有激活的任务
taskInfoGet()得到任务的信息
taskPriorityGet()查看任务的优先级
taskRegsGet()检查任务寄存器(不能使用当前任务时)
taskRegsSet()设置任务寄存器(不能使用当前任务时)
taskIsSuspended()检查任务是否处于挂起状态
taskIsReady()检查任务是否处于就绪状态
taskTcb()获得任务控制块的指针
第二章任务间通信
调度程序的时间开销
调度程序开销主要取决于保存和恢复上下文需要复制的寄存器数,要求该过程非常快。
9.
任务栈
每个任务都有独立的栈空间,栈用于任务的函数调用,分配自动变量和函数返回值。
任务控制块WIND_TCB记录了位置和大小等栈信息。
WIND_TCB本身放在任务栈开始部分。
在VxWorks中,所有任务在同一地址空间运行,任务之间没有任何地址保护机制,因此栈溢出会引起连锁反应(比如说任务A栈溢出到任务B的栈里面,这样任务B很可能也不能正常工作了)。
在设置栈大小时,一般设置一个较大的值,以存储空间换取可靠性。
栈大小在taskSpawn()创建时指定。
10.
中断栈
只要体系和BSP支持,VxWorks支持独立的中断栈。
对所以的ISR使用相同的中断栈。
如果系统不支持,中断栈属于被中断任务栈的一部分。
11.
POSIX
POSIX具有多重含义,通常指POSIX标准,该标准是一个可移植操作系统接口(PortableOperatingSystemInterface),由IEEE提出,ANSI和ISO将其标准化。
POSIX的目标是使应用程序源代码可以在兼容POSIX的操作系统上移植。
理想目标是应用程序移植到另一个操作系统只需要重新编译就可以运行。
12.
VxWorks任务间的通信方式种类:
共享内存、信号量、消息队列、管道、网络套接字、信号;
13.
信号量控制函数
semBCreate()分配并初始化一个二进制信号量,函数返回创建信号量的ID
semMCreate()分配并初始化一个互斥信号量,函数返回创建信号量的ID
semCCreate()分配并初始化一个计数器信号量,函数返回创建信号量的ID
semDelete()终止并释放一个信号量
semTake()获取一个信号量
semGive()提供一个信号量
semFlush()解锁所有正在等待信号量的任务
14.
用二进制信号量如何实现互斥(二进制信号量实现互斥在创建之初是可用的状态,但是二进制信号量实现同步时初始状态是不可用的):
semTake(semMutex,WAIT_FOREVER);
/*临界区域,任何时候仅单个任务可以访问*/
semGive(semMutex);
就象上面的3行代码一样,每个任务要想访问临界区域,必须先获得信号量;
如果此时信号量不可用,则等待;
如果为可用,则获得这个信号量,那么其他的任务就不能获得这个信号量了,等到这个任务释放这个信号量了才可以使用。
SEM_EMPTY表示信号量不可用
SEM_FULL表示信号量可用
16.
消息队列的函数说明
msgQCreate()分配并初始化一个消息队列
msgQDelete()终止并释放一个消息队列
msgQSend()向一个消息队列发送消息
msgQReceive()从一个消息队列接收消息
17.
管道(将管道当成I/O设备使用)
管道使用VxWorks操作系统中的I/O系统,并提供替换消息队列的接口。
管道是由驱动程序pipeDrv管理的虚拟I/O设备。
函数pipeDrvCreate()创建管道设备以及与该管道相连的低层消息队列。
18.
套接字
VxWorks操作系统中,套接字是穿越网络的任务间通信的基本形式。
套接字是任务间通信终端,数据从一个套接字传送到另一个套接字。
在建立套接字时需指定数据传输的互联网通信协议。
VxWorks支持互联网的TCP协议和UDP协议。
19.
信号:
主要作用是在任务运行时,一个异步的信号发生,任务对其进行及时响应(相当于中断的作用)
VxWorks操作系统中,还有一种叫做信号的机制。
与通用任务间通信机制相比,信号机制更适合于错误和异常的处理。
信号主要用于任务之间传递控制信号,是一个软件的概念。
信号在很多方面类似于硬件中断。
信号的发生通常与硬件中断相联系。
有时也称信号为软中断。
任何一个任务或ISR都可以对某个任务引发一个信号。
收到信号的任务立即挂起当前执行的线程,并在下次任务被调度时执行该任务事先指定的信号处理程序。
当信号处理方式为“捕捉”时,需要为信号指定一个“信号处理函数”,该函数和中断服务程序一样,当捕捉到对应的信号时,系统自动调用该函数。
信号处理函数在被信号中断的任务上下文中运行(为任务设置堆栈大小时要考虑信号处理函数开销);
信号处理函数运行时具有所属任务的优先级,调度时仍然遵从系统调度策略。
信号处理函数运行结束后,任务回到被中断前的状态;
23.
中断处理相关的一些函数
intConnect()设置中断处理的C程序(为中断指定一个中断处理函数)
intContext()如果是从中断级调用,返回真
intCount()获得当前中断嵌套深度
intLevelSet()设置处理器的中断屏蔽级
intLock()禁止中断
intUnlock()重新允许中断
intVecBaseSet()设置向量基地址
intVecBaseGet()得到向量基地址
intVecSet()设置异常向量
intVecSet()获得异常向量
所有中断服务程序使用相同的中断堆栈。
该堆栈由系统启动时根据指定配置参数来定位和初始化。
为能够处理最坏情况下的中断嵌套,必须分配足够大的中断堆栈空间。
开发过程中,可以使用checkStack()函数观察堆栈的使用情况。
许多VxWorks函数在中断服务程序中使用时仍存在许多重要限制。
这些限制是由于中断服务程序不在一个固定的任务上下文中执行,而且没有任务控制块,因此所有中断服务程序必须共享一个单独的堆栈。
所以,中断服务程序基本限制为禁止调用导致调用者堵塞的函数。
例如禁止试图使用一个信号量,不能调用任何用于创建或删除的函数。
第三章socket通信
关于socket函数说明
intsocket(intdomain,inttype,introtocol);
打开(创建)一个socket。
创建socket是socket通信的第一步,调用这个函数,返回socket描述符。
该描述符被其他socket接口函数和标准I/O使用,以唯一标示创建的socket。
参数domain表明通信域,对VxWorks总是AF_INET,即Internet域;
参数type指定socket类型:
SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;
参数protocol表示该socket属于何种通信协议,即IP协议层的载荷类型。
STATUSbind(ints,structsockaddr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VxWorksTornado 读书笔记