版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学习必备欢迎下载vxworks&tornado 读书笔记reference :vxworks 程序员指南王金刚等 . 清华大学出版社vxworks 高级程序设计李方敏 . 清华大学出版社vxworks 开发指南与tornado 实用手册李方敏 . 清华大学出版社第一章vxworks 操作系统介绍1.vxworks 中断响应程序( isr)的上下文:isr 在一个专门的上下文中执行,是处于任务的上下文之外;每个任务都有自己的上下文, 但是所有的 isr 共享一个上下文, 当中断嵌套时, 对这个上下文的大小有一定的要求,在设计初要考虑这个问题。2.上下文切换:context switch
2、,也叫 task switch,是指 cpu 寄存器内容的切换,也就是任务切换。每个任务都有自己的上下文, 即拥有各自的 cpu 环境和系统资源(指任务被内核调度时所使用的资源)。在任务切换时, 任务的上下文保存在任务控制块(tcb)中。我的理解:在任务运行时,运行时的一些相关信息,即上下文是保存在什么地方?应该是在系统运行时总的环境里。比如说,cpu 有一套寄存器, 如果哪个任务运行,则这个任务的上下文就被保存到系统的这些寄存器中;如果有任务切换,系统将当前正在运行任务的上下文保存到这个任务的tcb 中,然后从将要执行任务的tcb 中取出它的上下文,放到系统的寄存器中。3.上下文内容:任务的
3、执行点,即任务的程序计数器;cpu 中的寄存器;动态变量和函数调用所需的堆栈; 一个延时定时器; 一个时间片定时器; 内核控制结构; 信号句柄。4.vxworks 操作系统内核:wind 内核;一个操作系统分为核心态和用户态。内核在核心态运行,为用户的应用程序服务。5.任务创建的两种方式精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 1 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 1 页,共 11 页 - - - - - - - - -学习必备欢迎下载
4、方式一:使用 taskinit()函数创建任务,创建时处于挂起状态,必须激活这个创建的任务才能使其进入就绪状态;方式二: 使用发起任务( spawning)的原语,调用一个函数就能创建并激活任务;删除任务:任务可以在任何一种状态被删除。6.任务的几种状态:就绪( ready ): 任务仅等待 cpu 的状态,不等待其他任何资源;阻塞( pend):任务由于一些资源不可用而被阻塞;睡眠( delay ): 处于睡眠的任务状态;挂起( suspend):该状态时任务不执行,主要用于调试用。这里没有运行状态的任务( uc/os-ii 中有),其实也是有的。在 vxworks 中,具有最高优先级并处于
5、就绪状态的任务就是运行状态的任务。7.任务调度控制函数:1)tasklock()禁止任务调度;当任务调用这个函数时,这个任务在执行时不会发生基于优先级的抢占;但是任务在执行中被阻塞或挂起,调度程序将选择有资格执行且优先级最高的任务执行。当抢占上锁的任务被解除阻塞并且重新开始执行,抢占将再一次被禁止。抢占上锁只能阻止任务的上下文切换, 并不能禁止中断; 其可以实现互斥操作;2)taskunlock()允许任务调度;每个vxworks 任务控制块都维护一个计数器锁变量 lockcnt,tasklock()使其加 1,taskunlock()使其减1,当 lockcnt 大于 0 时,调度程序便被禁
6、止。3)taskpriorityset()改变任务优先级;4)status kerneltimeslice(int ticks) 任务可以调用此函数来开放或禁止时间片轮转调度。 ticks 指定以 tick 为单位的时间片大小。 如果任务通过 tasklock()禁止抢占,系统将不对该任务的时间片进行计数,直到 taskunlock()允许抢占。5)tasksafe() /*保护调用任务免于删除 */6)taskunsafe() /*解除任务删除保护 */8.辅助函数说明:精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 2 页,共 11 页 - -
7、- - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 2 页,共 11 页 - - - - - - - - -学习必备欢迎下载taskname ()得到与任务号相关的任务名tasknametoid()寻找与任务名相关的任务idtaskidself()获得调用此函数的任务id 号taskidverify()检查一个特定任务的存在性taskidlistget() 用 id 填充一组所有激活的任务taskinfoget() 得到任务的信息taskpriorityget() 查看任务的优先级taskregsget() 检查任务寄存器(不能
8、使用当前任务时)taskregsset() 设置任务寄存器(不能使用当前任务时)taskissuspended() 检查任务是否处于挂起状态taskisready() 检查任务是否处于就绪状态tasktcb() 获得任务控制块的指针第二章任务间通信8.调度程序的时间开销调度程序开销主要取决于保存和恢复上下文需要复制的寄存器数,要求该过程非常快。9.任务栈每个任务都有独立的栈空间,栈用于任务的函数调用,分配自动变量和函数返回值。任务控制块wind_tcb 记录了位置和大小等栈信息。wind_tcb本身放在任务栈开始部分。在vxworks 中,所有任务在同一地址空间运行,任务之间没有任何地址保护机
9、制,因此栈溢出会引起连锁反应(比如说任务a 栈溢出到任务 b 的栈里面, 这样任务 b 很可能也不能正常工作了) 。在设置栈大小时,一般设置一个较大的值,以存储空间换取可靠性。栈大小在taskspawn ()创建时指定。10.中断栈只要体系和 bsp支持, vxworks 支持独立的中断栈。对所以的isr 使用相同的中断栈。如果系统不支持,中断栈属于被中断任务栈的一部分。11.posix 精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 3 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - -
10、- - - - - - - 第 3 页,共 11 页 - - - - - - - - -学习必备欢迎下载posix 具有多重含义,通常指posix 标准,该标准是一个可移植操作系统接口( portable operating system interface ),由 ieee 提出, ansi 和 iso 将其标准化。 posix 的目标是使应用程序源代码可以在兼容posix 的操作系统上移植。 理想目标是应用程序移植到另一个操作系统只需要重新编译就可以运行。12.vxworks 任务间的通信方式种类:共享内存、信号量、消息队列、管道、网络套接字、信号;13.信号量控制函数sembcreate
11、() 分配并初始化一个二进制信号量,函数返回创建信号量的 idsemmcreate() 分配并初始化一个互斥信号量,函数返回创建信号量的idsemccreate() 分配并初始化一个计数器信号量,函数返回创建信号量的 idsemdelete() 终止并释放一个信号量semtake() 获取一个信号量semgive() 提供一个信号量semflush() 解锁所有正在等待信号量的任务14.用二进制信号量如何实现互斥(二进制信号量实现互斥在创建之初是可用的状态,但是二进制信号量实现同步时初始状态是不可用的):semtake(semmutex, wait_forever);/*临界区域,任何时候仅单
12、个任务可以访问*/semgive(semmutex);就象上面的 3行代码一样,每个任务要想访问临界区域, 必须先获得信号量;如果此时信号量不可用,则等待;如果为可用,则获得这个信号量,那么其他的任务就不能获得这个信号量了,等到这个任务释放这个信号量了才可以使用。sem_empty 表示信号量不可用sem_full 表示信号量可用16.消息队列的函数说明精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 4 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 4
13、页,共 11 页 - - - - - - - - -学习必备欢迎下载msgqcreate() 分配并初始化一个消息队列msgqdelete() 终止并释放一个消息队列msgqsend() 向一个消息队列发送消息msgqreceive() 从一个消息队列接收消息17.管道( 将管道当成i/o 设备使用 )管道使用 vxworks 操作系统中的 i/o 系统,并提供替换消息队列的接口。 管道是由驱动程序 pipedrv 管理的虚拟 i/o 设备。函数 pipedrvcreate ()创建管道设备以及与该管道相连的低层消息队列。18.套接字vxworks 操作系统中, 套接字是穿越网络的任务间通信的
14、基本形式。套接字是任务间通信终端,数据从一个套接字传送到另一个套接字。在建立套接字时需指定数据传输的互联网通信协议。vxworks 支持互联网的 tcp 协议和udp 协议。19.信号: 主要作用是在任务运行时,一个异步的信号发生,任务对其进行及时响应 (相当于中断的作用)vxworks 操作系统中, 还有一种叫做信号的机制。 与通用任务间通信机制相比,信号机制更适合于错误和异常的处理。信号主要用于任务之间传递控制信号,是一个软件的概念。信号在很多方面类似于硬件中断。信号的发生通常与硬件中断相联系。有时也称信号为软中断。任何一个任务或 isr 都可以对某个任务引发一个信号。收到信号的任务立即挂
15、起当前执行的线程, 并在下次任务被调度时执行该任务事先指定的信号处理程序。当信号处理方式为“捕捉”时,需要为信号指定一个“信号处理函数”,该函数和中断服务程序一样,当捕捉到对应的信号时,系统自动调用该函数。信号处理函数在被信号中断的任务上下文中运行(为任务设置堆栈大小时要考虑信号处理函数开销);信号处理函数运行时具有所属任务的优先级,调度时仍然遵从系统调度策略。信号处理函数运行结束后,任务回到被中断前的状态;精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 5 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - -
16、- - - - - - - - - - - - 第 5 页,共 11 页 - - - - - - - - -学习必备欢迎下载23.中断处理相关的一些函数intconnect() 设置中断处理的 c 程序(为中断指定一个中断处理函数)intcontext() 如果是从中断级调用,返回真intcount() 获得当前中断嵌套深度intlevelset() 设置处理器的中断屏蔽级intlock() 禁止中断intunlock() 重新允许中断intvecbaseset() 设置向量基地址intvecbaseget() 得到向量基地址intvecset() 设置异常向量intvecset() 获得异常
17、向量所有中断服务程序使用相同的中断堆栈。该堆栈由系统启动时根据指定配置参数来定位和初始化。为能够处理最坏情况下的中断嵌套,必须分配足够大的中断堆栈空间。开发过程中,可以使用checkstack ()函数观察堆栈的使用情况。许多 vxworks 函数在中断服务程序中使用时仍存在许多重要限制。这些限制是由于中断服务程序不在一个固定的任务上下文中执行,而且没有任务控制块,因此所有中断服务程序必须共享一个单独的堆栈。所以,中断服务程序基本限制为禁止调用导致调用者堵塞的函数。例如禁止试图使用一个信号量,不能调用任何用于创建或删除的函数。第三章socket通信1.关于 socket 函数说明1)int s
18、ocket(int domain, int type, int rotocol); 打开(创建)一个socket。创建 socket 是 socket 通信的第一步,调用这个函数,返回socket 描述符。该描述符被其他socket 接口函数和标准i/o 使用,以唯一标示创建的socket。参数 domain表明通信域, 对 vxworks 总是 af_inet, 即 internet 域;参数 type 指定 socket 类型:sock _stream 、 sock_dgram 、sock_raw ;参数 protocol 表示该 socket 属于何种通信协议,即ip 协议层的载荷类型。
19、精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 6 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 6 页,共 11 页 - - - - - - - - -学习必备欢迎下载2)status bind(int s, struct sockaddr * name, int namelen) ;将 socket 和一个“ 端点地址 ” 绑定。参数 s 为 socket 描述符;name为要绑定的本地端点地址;namelen为 name 的结构体长度。3)list
20、en() 允许连接到socket(也可以说是侦听连接请求)4)accept() 接受 socket 上的一个连接5)connect() 发起建立socket 连接。如果连接失败,应该将socket关闭,才能再使用该socket。6)connectwithtimeout() 在指定时间内尝试建立socket 连接7)sendto() 发送 message到 socket 8)send() 发送 data到 socket 9)sendmsg() 发送 message到 socket 10)recvfrom() 从 socket 接收 message 11)recv() 从 socket 接收 da
21、ta 12)recvmsg() 从 socket 接收 message 13)setsockopt() 设置 socket 选项14)getsockopt() 读取 socket 选项15)getsockname() 读取本地socket 端点地址16)getpeername() 读取连接的另一端端点地址17)shutdown() 关闭连接2.大小端模式(大端字节序、小端字节序)big-endian : 序列中的高位值存放在较低的存储地址;little-endian :序列中的低位值存放在较低的存储地址;当数据在网络上传输时,采取的是大端字节序,即数据帧发送顺序为从帧的高位值到帧的低位值。摩托
22、罗拉芯片采用的是大端字节序,而英特尔的芯片采用的小端字节序。解决字节序的问题就是将主机字节序转换成和网络字节序一致。转换在应用程序级完成。vxworks 定义了 4 个宏用于字节序转换: htons() 将短整数从主机字节序转换到网络字节序htonl() 将长整数从主机字节序转换到网络字节序精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 7 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 7 页,共 11 页 - - - - - - - - -学习必备欢迎
23、下载ntohs() 将短整数从网络字节序转换到主机字节序ntohl() 将长整数从网络字节序转换到主机字节序3.socket 端点地址socket 端点地址由结构体sockaddr_in 表示。 ip 地址由sockaddr_in 结构体内的结构体in_addr 表示。习惯上以“. ”表示的是点分十进制ip 地址,在in_addr 中的表示是将点分十进制表示中的4 个整数直接转换为二进制,对应到in_addr.s_addr 的 4 个字节上。例如 ip 地址 “127.0.0.1 ”表示为 in_addr.s_addr=0 x7f000001 。4.socket 应用类型sock_stream
24、 面向连接的应用类型(基于 tcp 协议的 socket 应用( 在 internet 域) ) sock_dgram 面向无连接的应用类型(基于 udp 协议的 socket应用 (在 internet 域) ) 5.地址绑定显式通过一个函数调用指定本地的端点地址(包括ip 地址和端口号) ,这一动作为“ 地址绑定 ” 。 通常面向连接的服务器应用中在侦听一个端口之前需要先绑定本地端点地址。无连接的服务器应用中,也常常在等待客户数据到达前先绑定本地端点地址。除了地址绑定, 还可以让系统自动选择本地端点地址,这样就不需要显式的调用函数进行绑定。第四章i/o 系统1.使用设备的过程使用设备的过程
25、通常包括:驱动程序初始化;创建设备;打开文件;i/o 操作;关闭文件;删除设备。块设备:一个设备可以实现不同的文件系统,可以有多个文件;非块设备: 一个设备通常对应一个文件。2.基本 i/o 函数说明vxworks 中 i/o 分为基本 i/o 和缓冲 i/o,基本 i/o 是 vxworks 中最底层的i/o,以下是 7 个标准 c 语言库兼容的接口:#include “iolab.h ” 1)int open(const char *name, int flags, int mode); 打开/创建文件,第一个参数为文件名,第二个参数定义对打开的文件进行的操作,它可以是 o_rdonly,
26、 o_wronly, o_rdwr, o_creat 。精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 8 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 8 页,共 11 页 - - - - - - - - -学习必备欢迎下载2)status close(int fd); 关闭文件,其将终止 fd 与物理文件之间的关联,并释放在文件描述符表中占用的资源。释放后文件描述符和文件描述符表的空间能够重新使用。3)int creat (const char *n
27、ame, int flags) 创建文件同时以指定标志打开文件。实际上, creat创建文件时先确定文件所在设备,然后调用设备驱动程序提供的函数创建文件。4)status remove(const char *name) 删除文件;和 creat一样,remove先确定文件所在设备,然后调用设备驱动程序提供的函数删除文件。5)int read(int fd, char *buffer, size_t maxbytes); 读取之前创建或者打开的文件;第二个参数是读取数据缓冲区指针,第三个参数是最大读取字节数。函数返回的是函数实际读取的字节数;6)int write(int fd, char *
28、buffer, size_t nbytes) 写入到之前创建或者打开的文件。第二个参数是输出数据缓冲区指针,第三个参数是要求写得字节数。其返回值表示所写的字节数,如果等于0,表示没有写入任何数据。7)int ioctl(int fd, int function, int arg); 特殊控制。其对描述符fd 指定的对象执行在 function 中给出的操作,文件描述符:所有的基本 i/o 操作都引用文件描述符( fd)。文件描述符是调用 open()或者 create()返回的一个正数值,其他i/o 调用需要使用该 fd参数。文件描述符全局可见,两个不同的任务通过相同的文件描述符访问的将是同一
29、个文件。 vxworks 支持有限的文件描述符,具体在i/o 系统初始化时指定有效的 fd 数目(宏定义 num_files )。因此当文件不再使用时应该立即关闭文件,防止超出系统限制。第五章vxworks 启动过程3.vxworks 启动过程vxworks 的启动过程需要解决:处理器初始化:使处理器复位,禁止中断,内部寄存器都为确定的值;代码装入:将执行映像从存储介质装入ram 执行;精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 9 页,共 11 页 - - - - - - - - -精品学习资料 可选择p d f - - - - - - - - - - - - - - 第 9 页,共 11 页 - - - - - - - - -学习必备欢迎下载硬件初始化:使硬件复位,并初始化为中断或查询方式为系统服务;内核激活 (函数为 kernelinit():使多任务微内核开始调度任务运行;操作系统组件初始化:初始化用户应用需要的各种操作系统功能。“处理器初始化”和“代码装入”即通常所说的引导代码(rominit.s 和romstart.c)。通常的启动过程为:引导,准备激活内核,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广告的制作和刊登行业相关项目经营管理报告
- 废水回用技术行业营销策略方案
- 广告设计行业相关项目经营管理报告
- 蜂箱用木格子市场发展前景分析及供需格局研究预测报告
- 自行车刹车操纵闸把市场分析及投资价值研究报告
- 皮制长外衣商业机会挖掘与战略布局策略研究报告
- 电打字机细分市场深度研究报告
- 为保护数据进行计算机安全威胁分析行业市场调研分析报告
- 广告分发行业营销策略方案
- 牙科用贵金属合金市场发展前景分析及供需格局研究预测报告
- 危重病人护理评估及安全管理
- 工业自动化的柔性制造与定制化生产
- 小班化教学和合作学习
- 《永辉案例分享》课件
- 酒店总经理管理培训课件
- 时钟的英语表达法
- 《同学之间如何相处》课件
- 《巴洛克风格》课件
- 七十二香谱图
- 《办公软件教程WPS》课件
- 人教版新、旧高中化学教材必修一对比与分析
评论
0/150
提交评论