




已阅读5页,还剩241页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章VxWorks操作系统 内容 7 1实时系统7 2多任务管理7 3信号量7 4任务间通信7 5内存管理7 6异常 中断 定时器7 7I O系统7 8本地文件系统7 9网络通讯7 10网络程序设计 7 1实时系统 实时系统是对外来事件在限定时间内能做出反应的系统 评价实时系统的指标 响应时间ResponseTime生存时间SurvivalTime吞吐量Throughput 实时系统与普通系统 在实时计算中 系统的正确性不仅仅依赖于计算的逻辑结果而且依赖于结果产生的时间对于实时系统来说最重要的要求就是实时操作系统必须有满足在一个事先定义好的时间限制中对外部或内部的事件进行响应和处理的能力实时操作系统还需要有效的中断处理能力来处理异步事件和高效的I O能力来处理有严格时间限制的数据收发应用 实时系统分类 根据不同的分类方法可以分为 周期性的和非周期性的硬实时和软实时专用系统和开放系统集中式系统和分布式系统 实时多任务操作系统与分时多任务操作系统 分时操作系统 软件的执行在时间上的要求 并不严格 时间上的错误 一般不会造成灾难性的后果 实时操作系统 主要任务是对事件进行实时的处理 虽然事件可能在无法预知的时刻到达 但是软件上必须在事件发生时能够在严格的时限内作出响应 系统响应时间 即使是在尖峰负荷下 也应如此 系统时间响应的超时就意味着致命的失败 实时操作系统的重要特点是具有系统的可确定性 即系统能对运行情况的最好和最坏等的情况能做出精确的估计 实时操作系统中的重要概念 系统响应时间 Systemresponsetime 系统发出处理要求到系统给出应答信号的时间 任务换道时间 Context switchingtime 是任务之间切换而使用的时间 中断延迟 Interruptlatency 是计算机接收到中断信号到操作系统作出响应 并完成换道转入中断服务程序的时间 实时操作系统应具有如下的功能 任务管理 多任务和基于优先级的任务调度 任务间同步和通信 信号量和共享内存等 存储器优化管理 含ROM的管理 实时时钟服务中断管理服务 硬实时 软实时 一 硬实时 要求在规定的时间内必须完成操作 这是在操作系统设计时保证的对于硬实时系统完成timelyresponse是必须的软实时 没有那么严 只要按照任务的优先级 尽可能快地完成操作即可对于软实时系统基于优先级调度的调度算法可以满足要求 提供高速的响应和大的系统吞吐率这两类系统的区别在于调度算法 硬实时 软实时 二 软实时的RTOS一般应用在消费类电子产品 如手持电脑 个人数字助理 PDA 和机顶盒等消费电子类 WinCE 硬实时的RTOS一般应用于通信 控制和航空航天等实时性强和可靠性高的领域 通信行业使用PSOS VxWorks VRTX航天 航空使用VRTX VxWorks工业PC控制使用QNX 实时系统的体系结构设计 实时系统的体系结构必须满足1 高运算速度2 高速的中断处理3 高的I O吞吐率4 合理的处理器和I O设备的拓扑连接5 高速可靠的和有时间约束的通信6 体系结构支持的出错处理7 体系结构支持的调度8 体系结构支持的操作系统9 体系结构支持的实时语言特性 10 系统的稳定性和容错也非常重要11 还要考虑到实时的分布式应用 实时进程调度算法 静态的周期性调度基本思想是将处理器的时间分为 帧 FIFO也就是将系统中所有的任务组织成一个队列 先到先服务优先级队列算法这种算法从FIFO发展而来 给每个任务设定优先级 然后在FIFO中按照优先级排列 这种算法保证了高优先级的任务的完成 但是对于低优先级的任务很可能无法满足时间的正确性 而且对低优先级的任务来说等待的时间是无法预知的 实时系统内存管理 预先分配内存在系统构造或编译时为每个任务指定其使用的内存空间 这种方法对于硬实时系统来说是很合适的 而且嵌入式实时操作系统很多都是在ROM中运行 仅仅只有需要变化的数据才放在RAM中虚拟内存系统在管理虚拟内存时 不将 锁 住的内存块换出物理内存 嵌入式系统和实时系统 1 嵌入式系统经常被误解为就是实时性系统 其实 多数嵌入式系统并不关心实时性Linux是嵌入式操作系统 但并非实时操作系统 Vxwork pSOS Nucleus和WindowsCE是嵌入式实时操作系统 嵌入式系统和实时系统 2 嵌入式系统的实时性是相对的概念 实时系统要求使用嵌入式实时操作系统 但是使用嵌入式实时操作系统的系统并不一定就是实时系统 它不仅仅取决于操作系统 还取决于硬件 应用软件等因素 它是一个系统的概念 7 2多任务管理 实时系统的任务的基本状态有 1 就绪态 任务只等待系统分配CPU资源 2 悬置态 任务需等待某些不可利用的资源而被阻塞 3 休眠态 如果系统不需要某一个任务工作 则这个任务处于休眠状态 4 延迟态 任务被延迟时所处状态 任务状态迁移 VxWorks任务状态迁移函数 一 就绪态 悬置态semTake msgQReceive 就绪态 延迟态taskDelay 就绪态 休眠态taskSuspend 悬置态 就绪态semGive msgQSend 悬置态 休眠态taskSuspend VxWorks任务状态迁移函数 二 延迟态 就绪态expireddelay延迟态 休眠态taskSuspend 休眠态 就绪态taskResume taskActivate 休眠态 悬置态taskResume 休眠态 延迟态taskResume 多任务内核 任务管理任务是竞争系统资源的最小运行单元 任务可以使用或等待CPU I O设备及内存空间等系统资源 并独立于其它任务 与它们一起并发运行 宏观上如此 VxWorks内核使任务能快速共享系统的绝大部分资源 同时有独立的上下文来控制个别线程的执行 VxWorks实时内核Wind提供了基本的多任务环境 系统内核根据某一调度策略让它们交替运行 系统调度器使用任务控制块的数据结构 简记为TCB 来管理任务调度功能 任务控制快 TCB 任务控制块用来描述一个任务 每一任务都与一个TCB关联 任务控制块里面包含了 当前状态 优先级 要等待的事件或资源 任务程序码的起始地址 初始堆栈指针任务的 上下文 context 任务的上下文就是当一个执行中的任务被停止时 所要保存的所有信息 通常 上下文就是计算机当前的状态 也即各个寄存器的内容 VxWorks中 内存地址空间不是任务上下文的一部分 所有的代码运行在同一地址空间 内核管理示意图 Kernel TCB TCB TCB Suspended Pended Delayed Ready CPU Executing 任务上下文切换 当前运行的任务的上下文被存入TCB将要被执行的任务的上下文从它的TCB中取出 放入各个寄存器中 上下文切换必须很快速 VxWorks的优先级调度 基于优先级的抢占式调度法作为缺省策略为每个任务指定不同的优先级 没有处于悬置或休眠态的最高优先级任务将一直运行下去 当更高优先级的任务由就绪态进入运行时 系统内核立即保存当前任务的上下文 切换到更高优先级的任务 当有内核调用或中断到来时 内核重新调度同时提供了时间片轮转调度 基于优先级的抢占式调度 时间片轮转调度 时间片周期 常量 可编程 混合调度策略 内核时间片 在VxWorks中 时间片的长度可由系统调用KernelTimeSlice ticks 通过输入参数值来指定 当ticks为0时 时间片调度被关闭基于优先级的抢占式调度可以发生在任何时候 时间片轮转调度只能在相同优先级的任务间每隔ticks发生一次 VxWorks任务特性 所有的代码运行在同一地址空间 任务能快速共享系统的绝大部分资源 同时有自己独立的上下文所有的任务都运行在特权模式下 VxWorks共享代码 VxWorks提倡单个子程序或子程序库被多个不同的任务调用 例如printf 一个被多个任务调用的单个拷贝称为共享代码 VxWorks动态链接功能很容易实现代码共享 共享代码必须是可重入的 VxWorks的I O和驱动程序是可重入的 但是要求应用小心设计 对于缓冲I O VxWorks推荐使用文件指针 VxWorks重入机制 动态堆栈变量如果程序仅仅是纯代码 除了自己的动态堆栈变量外没有自己的数据 除了调用者以参数传进的数据外 没有其他数据 任务只在自己的堆栈内进行操作 由信号量保护的全局或静态变量VxWorks的一些库封装对公共数据的访问 需要借用互斥机制任务变量一些程序可能会被多个任务同时调用 这些任务可能要求全局变量和静态变量有不同的值 这种情况下 VxWorks提供了所谓任务变量的机制 这种机制允许在任务上下文中增加4字节的变量 因此每次上下文交换时 该变量的值被保存 这种机制由taskVarLib库中的函数来提供 抢占禁止 taskLock 和taskUnlock 使调度器失效或生效 当一个任务调用taskLock 使调度器失效 任务运行时没有基于优先级的抢占发生 然而 如果任务被阻塞或是悬置时 调度器从就绪队列中取出最高优先级的任务运行 当设置抢占禁止的任务解除阻塞 再次开始运行时 抢占又被禁止 这种抢占禁止防止任务的切换 但对中断处理不起作用 VxWorks怎样满足实时性需求 多任务特性基于抢占式多任务调度快速的任务上下文切换快速确定的系统响应高效的任务间通讯机制 概况 任务创建 taskSpawn Stack TCBPC foo 任务创建函数 inttaskSpawn name priority options stackSize entryPt arg1 arg10 name任务名称 priority任务优先级 0 255 options任务的创建方式stackSize任务堆栈的大小entryPt任务入口arg1 arg10任务的参数 任务ID 任务名称 任务优先级 任务堆栈 任务方式 任务创建 任务删除 exit code taskDelete tid 任务重启动 taskRestart tid 任务挂起和恢复 taskSuspend tid taskResume tid 任务延时 STATUStaskDelay ticks 代码重入和任务变量 任务钩子 任务信息 ti taskNameOrId 任务浏览 错误状态 VxWorks里使用一个全局整型变量errno来描述错误信息程序执行过程中我们可以设置并调用一些函数例程来检测错误信息 并针对错误信息设置相应的错误号然后调用一些函数例程检测错误号 当程序执行异常时可以根据错误号发现相应的错误 错误代码和任务切换 在每次任务切换时系统都会自动的保存和恢复错误代码 TCBerrorStatus errno 设置出错代码 检查错误 系统错误代码的解释 moduleerrornumber 31150 系统任务 任务名称优先级描述tUsrRoot0初始的根任务 初始化完毕后退出tLogTask0消息记录任务tExecTask0错误处理tWdbTask3WDB代理tNetTask50网络处理任务tFtpdTask55FTP服务器 小结 小结 7 3信号量 概述 信号量是最早出现的用来解决进程同步与互斥问题的机制 包括一个称为信号量的变量及对它进行的两个原语操作 信号量作为任务间同步和互斥的机制 是快速和高效的 它们除了被应用在开发设计过程中外 还被广泛地应用在VxWorks高层应用系统中 二进制信号量计数信号量互斥信号量POSIX信号量 信号量的类型定义 每个信号量至少须记录两个信息 信号量的值和等待该信号量的进程队列 它的类型定义如下 用类PASCAL语言表述 semaphore recordvalue integer queue PCB end 其中PCB是进程控制块 是操作系统为每个进程建立的数据结构 s value 0时 s queue为空 s value 0时 s value的绝对值为s queue中等待进程的个数 PV原语 一 对一个信号量变量可以进行两种原语操作 p操作和v操作 定义如下 procedurep vars samephore s value s value 1 if s value 0 asleep s queue procedurev vars samephore s value s value 1 if s value 0 wakeup s queue PV原语 二 其中用到两个标准过程 asleep s queue 执行此操作的进程的PCB进入s queue尾部 进程变成等待状态wakeup s queue 将s queue头进程唤醒插入就绪队列s value初值为1时 可以用来实现进程的互斥 p操作和v操作是不可中断的程序段 称为原语 如果将信号量看作共享变量 则pv操作为其临界区 多个进程不能同时执行 一般用硬件方法保证 一个信号量只能置一次初值 以后只能对之进行p操作或v操作 信号量机制必须有公共内存 不能用于分布式操作系统 这是它最大的弱点 同步问题 Task myGetData requestData waitForData getData 同步问题的解决方法 二进制信号量的创建 SEM IDsemBCreate options intialState options指出信号量的方式 SEM Q PRIORITYorSEM Q FIFO initialState信号量的初始值 SEM FULL或SEM EMPTY 获取二进制信号量 有效 等待 超时 返回ERROR 否 返回OK 是 返回OK 信号量释放 释放信号量图示 信号量可用 有任务阻塞 任务继续信号量变为可用 任务继续信号量保持不变 等待该信号量的任务队列的任务就绪 信号量不可用 Yes No No Yes 多个任务的同步 STATUSsemFlush semId 互斥问题 资源竞争的例子 tTask1 tTask2 charmyBuf BU SIZE storedatahere intmyBufIndex 1 Indexoflastdata myBufPut charch myBufIndex myBuf myBufIndex ch myBufIndex myBufIndex myBuf myBufIndex b myBuf myBufIndex a 解决方法 互斥信号量的创建 SEM IDsemMCreate options 获取互斥信号量 互斥量占有状态 任务试图获取互斥量时将被阻塞 被其他任务占有 调用semTake 的任务将变为占有者 互斥量占有计数器 1 空闲 任务调用semTake 将返回OK互斥量占有计数器加1 被该任务占有 释放互斥量 互斥量占有计数器 互斥量变为有效 1 semGive 返回ERROR 不是占有者 大于1 有任务阻塞 有 互斥量占有计数器减1 阻塞在该互斥量的第一个任务将变成占有者 没有 使用的例子 1 include vxWorks h 2 include semLib h 34LOCALcharmyBuf BUF SIZE Storedatahere 5LOCALintmyBufIndex 1 Indexoflastdata 6LOCALSEM IDmySemId 78voidmyBufInit 9 10mySemID semNCreate SEM Q PRIORITY 11SEM INVERSION SAFE 12SEM DELETE SAFE 13 1415voidmyBufPut charch 16 17semTake mySemId WAIT OREVER 18myBufIndex 19myBuf myBufIndex ch 20semGIve mySemId 21 安全删除 wind内核提供防止任务被意外删除的机制 通常 一个执行在临界区或访问临界资源的任务要被特别保护 我们设想下面的情况 一个任务获得一些数据结构的互斥访问权 当它正在临界区内执行时被另一个任务删除 由于任务无法完成对临界区的操作 该数据结构可能还处于被破坏或不一致的状态 而且 假想任务没有机会释放该资源 那麽现在其他任何任务现在就不能获得该资源 资源被冻结了 任何要删除或终止一个设定了删除保护的任务的任务将被阻塞 当被保护的任务完成临界区操作以后 它将取消删除保护以使自己可以被删除 从而解阻塞删除任务 优先级反转 高优先级 中优先级 低优先级 阻塞 semTake 阻塞 阻塞 就绪 semTake 关键区 就绪 时间 优先级反转 优先级继承 优先级逆转发生在一个高优先级的任务被强制等待一段不确定的时间以便一个较低优先级的任务完成执行 T1 T2和T3分别是高 中 低优先级的任务 T3通过拥有信号量而获得相关的资源 当T1抢占T3 为竞争使用该资源而请求相同的信号量的时候 它被阻塞 如果我们假设T1仅被阻塞到T3使用完该资源为止 情况并不是很糟 毕竟资源是不可被抢占的 然而 低优先级的任务并不能避免被中优先级的任务抢占 一个抢占的任务如T2将阻止T3完成对资源的操作 这种情况可能会持续阻塞T1等待一段不可确定的时间 这种情况成为优先级逆转 因为尽管系统是基于优先级的调度 但却使一个高优先级的任务等待一个低优先级的任务完成执行 互斥信号量有一个选项允许实现优先级继承的算法 优先级继承通过在T1被阻塞期间提升T3的优先级到T1解决了优先级逆转引起的问题 这防止了T3 间接地防止T1 被T2抢占 通俗地说 优先级继承协议使一个拥有资源的任务以等待该资源的任务中优先级最高的任务的优先级执行 当执行完成 任务释放该资源并返回到它正常的或标准的优先级 因此 继承优先级的任务避免了被任何中间优先级的任务抢占 优先级继承 优先级反转的策略 高优先级 中优先级 低优先级 阻塞 优先级提升 semTake 阻塞 阻塞 就绪 semTake 关键区 就绪 时间 semGive 死锁 INT6 INT3 tExcTask tLogTask tEvtTask tWdbTask tNetTask tTaskHi tTaskLow tPortmapd tWvSvc u0 idle semTake semId1 1 semTake semId1 1 semTake semId2 1 semTake semId2 1 计数器信号量 计数器信号量是实现任务同步的和互斥的另一种方法 计数器信号量出了象二进制信号量那样工作外 他还保持了对信号量释放次数的跟踪 信号量每次释放 计数器加一 每次获取 计数器减一 当计数器减到0 试图获取该信号量的任务被阻塞 正如二进制信号量 当信号量释放时 如果有任务阻塞在该信号量阻塞队列上 那么任务解除阻塞 然而 不象二进制信号量 如果信号量释放时 没有任务阻塞在该信号量阻塞队列上 那么计数器加一 计数器信号量适用于保护拥有多个拷贝的资源 小结 二进制信号量 互斥信号量 semBCreate semMCreate semDelete semTake semGiveshow 小结 小结 7 4任务间通讯 介绍 共享内存 tTaskA tTaskB fooLib c LOCALSEM IDfooSem LOCALFOO BUFfooBuffer fooSet fooGet 消息队列和管道 taskA taskB 共享内存 链表 NULL NULL 链表指针 NODE NODE 数据 数据 head tail count 2 环形缓冲 reader writer 消息队列 创建消息队列 MSG Q IDmsgQCreate maxMsgs maxMsgLength options maxMsgs消息队列的最大消息数maxMsgLength每个消息的最大字节数 options消息队列的模式 MSG Q FIFO或MSG Q PRIORITY 发送消息 STATUSmsgQSend msgQId buffer nBytes timeout priority msgQId消息队列ID buffer数据指针 nBytes数据长度timeout超时值 可以是 tick数 WAIT FOREVER或NO WAIT priority优先级管理模式 例子 charbuf BUFSIZE status msgQSend msgQId buf sizeof buf WAIT FOREVER MSG PRI NORMAL status msgQSend msgQId buf sizeof buf NO WAIT MSG PRI URGENT 接收消息 intmsgQReceive msgQId buffer maxNBytes timeout msgQId消息队列IDbuffer接收缓冲 MaxNBytes最大字节数timeout超时值 删除消息队列 STATUSmsgQDelete msgQId 管道 data data data 创建管道 STATUSpipeDevCreate name nMessages nBytes name管道的名称nMessages管道的最大消息数 nBytes每个消息的最大字节数 例子 pipeDevCreate pipe myPipe 10 100 value 0 0 x0 devsdrvname0 null1 tyCo 01 tyCo 12 pipe myPipe 管道的读写 fd open pipe myPipe O RDWR 0 write fd msg len read fd msg len 消息队列与管道 小结 msgQCreate msgQSend msgQReceive 7 5内存管理 内存的布局 LOCAL MEM LOCAL ADRS RAM LOW ADRS FREE RAM ADRS VxWorks SYSTEMMEMORYPOOL sysMemTop WDB POOL SIZE USER RSVED MEM sysPhysMemTop 目标服务器内存池 系统内存池 分配 释放内存 调试选项 内存检查 自由链表 mv152 external mekong MempartOx Totalbytes 3870840Allocatedblocks 86bytes 467224Freeblocks 7bytes 3403584Cummulativeblocks 88bytes 467832FreeList0addr 0 x3fd8f8size 96041addr 0 x4ef90size 3355432 其他内存管理例程 void calloc nElems size 分配内存 并将其清0 void realloc ptr newSize 改变内存块的大小 intmemFindMax 返回自由内存中的最大块字节数 内存分区管理 创建内存分区 PART IDmemPartCreate pPool size pPool指向本内存池的内存指针size分区的大小 管理 例子 partId memPartCreate pMemory 100000 newsymbol partId addedtosymbltable partId 0 x23ff318 value 37745448 0 x23ff328 partId 0 x10 ptr memPartAlloc partId 200 newsymbol ptr addedtosymbltable ptr 0 x23ff2ec value 37652632 0 x23e8898 showpartIdstatusbytesblocksaveblockmaxblockcurrentfree9977619977699776alloc2081208 cumulativealloc2081208 小结 7 6异常 中断 定时器 信号 Signals 一 VxWorks支持软件信号功能 信号可以异步改变任务控制流 任何任务和ISR都可以向指定的任务发信号 获得信号的任务立即挂起当前的执行 在下次调度它运行时转而执行指定的信号处理程序 信号处理程序在信号接收任务的上下文中执行 使用该任务的堆栈 在任务阻塞时 信号处理程序仍可被唤醒信号机制适合于错误和异常处理 通常 信号处理程序可以作为中断处理程序看待 任何可能导致调用程序阻塞的函数均不能在信号处理程序中调用 Wind内核支持两种类型的信号接口UNIXBSD风格的信号POSIX兼容的信号 信号 Signals 二 信号在很多方面跟硬件中断相似 基本信号接口提供了31个不同的信号 调用sigvec 或sigaction 可为信号指定一个信号处理程序 这与调用intConnect 为中断指定一个中断处理程序 ISR 相似 可以调用kill 将信号发送给任务 这类似于于中断发生 函数sigsetmask 和sigblock或sigprocmask 可以用来象屏蔽中断那样屏蔽信号 使用sigInit 初始化信号函数库 使得基本信号函数可用 基本信号接口函数 几个函数原型 intsigvec检测或设置信号处理程序 intsig 于处理程序相联系的信号 conststructsigvec pVec 新的处理程序信息 structsigvec pOvec 旧的处理程序信息 intkill向任务发送一个信号 inttid 接收信号的任务号 intsigno 发送给任务的信号 sigqueue提供与kill 等价的功能 inttid 接收信号的任务 intsigno 发送给任务的信号 constunionsigvalvalue 隋信号发送的值 信号 normalCode mySignalHandler mySignal UNIX信号与VxWorks信号 PendQ ReadyQ 信号 运行信号处理函数 semTake OrgDelay 信号安装 signal signo handler signo信号的编号 handler处理例程 信号和异常 任务安装了信号处理函数 触发该信号 挂起任务并记录时间 myCode 总线错 信号处理句柄 中断 硬件中断处理是实时系统设计的最重要 最关键的问题 为了获得尽可能快的中断响应时间 VxWorks的中断处理程序运行在特定的上下文中 在所有任务上下文之外 因此 中断处理不会涉及任何任务上下文的交换 VxWorks提供函数intConnect 该函数允许将指定的C函数与任意中断相联系 STATUSintConnect VOIDFUNCPTR vector 要联系的中断向量 VOIDFUNCPTR routine 中断发生时要调用的函数 intparameter 传递给中断处理函数的参数 该函数将指定的C函数routine与指定的中断向量vector相联系 函数的地址存储在这个中断向量里 中断函数 中断处理过程 事件 中断 切换到中断堆栈 保存程序计数器和寄存器 调用inConnect指定的中断处理程序 处理该中断 恢复寄存器 返回 中断向量表 执行顺序 1 255 中断堆栈 如果体系结构允许 所有的ISRs使用的中断堆栈 堆栈的定位和初始化由系统在启动时根据指定的配置参数完成 堆栈必须足够大 以保证能够处理系统最坏情形下的中断嵌套 体系结构不允许使用一个特定的堆栈 在这种结构中 ISRs使用中断任务的堆栈 对于这种结构的目标机 应用必须创建足够大的堆栈空间 开发过程中 可以调用checkStack 函数察看一个任务堆栈的使用或整个系统堆栈的使用情况 ISR的特殊限制 基本约束 必须不能调用可能引起调用阻塞的函数 在中断服务程序中不能试图获取一个信号量 因为信号量可能不可用 中断服务程序里面不能使用malloc和free 因为他们都需要获取一个信号量 中断服务程序也不能通过VxWorks驱动执行I O操作 多数设备驱动由于可能需要等待设备而引起调用者阻塞 因此需要任务上下文交换 VxWorks支持纪录功能 任务可以向系统输出平台打印文本信息 logMsg 中断 处理中断 句柄 中断向量表 中断服务例程 ISR 用户ISR 保存寄存器 调用相关例程 恢复寄存器 中断号 硬件 myISR 中断和优先级 中断 中断 中断 任务 任务 任务 系统优先级 中断级别 硬件 执行顺序由硬件决定 执行顺序由内核决定 任务优先级 可设置 中断的堆栈 intlevel2 intlevel3 intlevel5 中断 ISR的限制 ISRs中不允许调用一些可能引起阻塞的函数 如 典型的ISR 定时器 系统时钟 sysClkRateSet freq 设置系统时钟频率 intsysClkRateGet 获取系统时钟频率 看门狗 创建看门狗定时器 WDOG IDwdCreate StatuswdSDtart wdId delay pRoutine parameter wdId看门狗定时器的ID号 delay定时器的延时值 pRoutine期满后的处理函数 parameter处理函数的参数 看门狗定时器的使用 wdId wdCreate wdStart wdId DELAY PERIOD myWdTsr 0 voidmyWdIsr intparam doit param wdStart wdId DELAY PERIOD mywdIsr 0 解除死锁 从一个死锁状态恢复 WDOG IDwdId voidfoo void wdId wdCreate FOREVER wdStart wdId Delay 10 SEC fooISR 0 fooDoWork voidfooISR intparam Handlemisseddeadline 停止看门狗定时器 STATUSwdCancel wdId STATUSwdDelete wdId 关于轮询处理的一些看法 辅助时钟 sysAuxClkConnect 安装处理例程 sysAuxClkRateSet 设置频率 sysAuxClkEnable 启动定时 sysAuxClkDIsable 停止定时 小结 小结 辅助定时器 看门狗定时器 taskDelay 或wdtimer semGive 中断状态 任务状态 低速 高速 7 7I O系统 I O系统的接口 应用程序 I O系统 xxDriver 设备 creat open close read write ioctl xxCreat xxOpen xxClose xxread xxWrite xxIoctl I O系统的优点 设备的安装 pipeDrv 设备的创建 任何设备驱动程序都有一个创建函数 Pipes pipeDevCreate Serial ttyDevCreate 其他驱动 xxDevCreate 这些例程分别对相应的设备进行初始化 设备 devs drv name 0 null1 tyCo 01 tyCo 14columbia 2 pipe dream2 pipe cleaner5 vio 文件描述符 标准的输入输出 0STD IN 1STD OUT 2STD ERR 3 4 n 保留 文件描述符表 标准的输入输出 VoidioGlobalStdSet stdFd newFd 如 fd open columbia vx errLog O RDWR 0 ioGlobalStdSet STD ERR fd voidiotaskStdSet taskId stdFd newFd 文件存取 intopen name flags mode name flags mode 文件名 存取模式 O RDONLY只读方式打开 O WRONLY只写方式打开 O RDWR读写方式打开 O TRUNC截尾方式打开 O CREAT文件不存在时创建新文件 当使用NFS文件系统时 存在权限问题 系统中使用的文件描述符检查 iosFdShow fdnamedrv 3 tyCo 014 socket 310 pipe dream212 pipe cleaner2 关闭文件 STATUSclose fd fd文件描述符 读写操作 intread fd buffer nBytes intwrite fd buffer nBytes fd buffer nBytes 文件描述符 数据缓冲地址 读写的字节数 Ioctl intioctl fd command arg fd文件描述符command命令字arg参数 ioctl 例子 概况 服务 管道 socket 串口等 select select select调用及宏FD CLR FD ISSET FD SET FD ZERO用于I O多路复用 intselect intwidth numberofbitstoexaminefrom0 fd set pReadFds readfds fd set pWriteFds writefds fd set pExceptFds exceptionfdsunsupported structtimeval pTimeout maxtimetowait NULL forever pReadFds监测是否有字符可以从某个描述符读入pWriteFds监测是否某个描述符准备好了可以立即写入pExceptFds监测是否某个描述符有异常出现FD SET fd fdset 从一个集合中添加一个描述符FD CLR fd fdset 从一个集合中删除一个描述符FD ZERO fdset 清空一个集合 fd set 标准I O 应用程序 基本I O例程 设备无关 read write 驱动例程xxRead xxwrite 硬件 I O ANSIstdiofread fwrite fioLibfioRead printf sprintf 标准I O函数 标准I O函数库的使用 INCLUDE STDIOINCLUDE ANSI STDIO 其他ANSI库 库 头文件 描述 例子 ansiCtype ansiString ansiStdarg ansiStdlib ctype h string h stdarg h stdlib h 字符测试和转换 isdigit isalpha toupper 字串操作 可变长度参数 标准例程 strlen strcat strcpy va start var arg va end atoi atof rand 小结 7 8本地文件系统 本地文件系统 初始化和使用 块设备创建例程 ramDevCreate scsiBlkDevCreate xxDevCreate BLK DEV 本地文件系统初始化例程 dosFsDevInit rawFsDevInit localfilesystems ioLib dirLib usrLib例程 open close read write stat fstat mkdir rmdir creat remove 创建RAM文件系统 BLK DEV ramDevCreate ramAddr bytesPerBlk bytesPerTrack nBlocks blkOffset ramAddr地址 bytesPerBlk块的字节数 blksPerTrack每磁道的块数 nBlocks块数 blkOffset块偏移 例子 pBlkDev ramDevCreate 0 512 400 400 0 dosFsMkfs RAM1 pBlkDev 创建文件并写入一个字串 fd creat RAM1 myfile 2 writeBuf Thisisastring n write fd writeBuf strlen writeBuf 1 close fd 打开文件并读取字串 readBuf char malloc 100 fd open RAM1 myfile 2 read fd readBuf 100 printfreadBufThisisastring DOS文件系统 配置dosFs 关于数据完整性 DOS文件名 配置一个新的文件系统 1 pBlkDev xxDevCreate 2 初始化DOS VOL CONFIG结构3 dosFsDevInit DOS pBlkDev pConfig 4 fd open DOS O WRONLY 0 5 ioctl fd FIODISKFORMAT 0 6 ioctl fd FIODISKINIT 0 7 close fd 配置一个新的文件系统 也可以使用下面的方法 1 pBlkDev xxDevCreate 2 dosFsMkfs DOS pBlkDev 介绍 配置Raw文件系统 Raw文件系统的初始化 SCSI介绍 SCSI总线 VxWorks Controller TapeDrive SCSIBus InitiatorBusId 7 BusId 6 BusId 5LUN 0 BusId 6LUN 3 BusId 6LUN 5 SCSI 1限制 SCSI 1配置 SCSI 2接口 SCSI 2配置 初始化SCSI设备 defineINCLUDE SCSI2 pSysScsiCtrl scsiPhysDevcreate pSysScsiCtrl busId LUN 配置内核中包含SCSI 2的支持库 初始化SCSI设备 pScsiPhysDev 初始化逻辑分区 scsiBlkDevcreate pBlkDev dosFsDevInit 初始化文件系统 配置SCSI设备 配置示例 硬盘 1if pSpd20 2scsiPhysDevCreate pSysScsiCtrl 2 0 0 NONE 0 0 0 3 SCSI PHYS DEV NULL 4 5SCSI DEBUG MSG usrScsiConfig 6 scsiPhysDevCreatefailed n 7returnERROR 8 9 创建块设备 10if pSbd0 scsiBlkDevcreate pSpd20 0 x10000 0 11NULL 12 pSbd1 scsiBlkDevcreate pSpd20 0 x10000 0 x10000 13 NULL 14return ERROR 15 配置文件系统分区 16if dosFsDevInit sd0 pSbd0 NULL NULL 17 rawFsDevInit sd1 pSbd1 NULL 18return ERROR 小结 7 9网络通讯 网络协议 简单的网络 UNIX文件服务器 PC主机 VxWorks目标机 以太网 典型的网络模型 路由器 网络上的数据共享 以太网 UNIX VxWorksCPU0 VxWorksCPU1 VMEbus 90 0 0 2 100 0 0 0 100 0 0 2 100 0 0 1 90 0 0 30 90 0 0 0 网络服务 路由 IP地址 IP地址分类 类别 A B C 0 1 0 1 1 0 network7bits network14bits network21bits host24bits host16bits host8bits 例子 90 1 2 4 90 3 6 8 90 0 0 0 CLASSA 128 11 3 21 128 11 5 19 128 11 0 0 CLASSB 192 15 2 10 192 15 2 45 192 15 2 0 CLASSC inetLib 操作IP地址的一些例程库 inet addr 将IP地址转换成32比特的整数inet lnaof 返回IP地址的主机编号部分inet netof 返回IP地址的网络编号部分inet ntoa b 将整数形式的IP地址转换为字串 主机名称 hostAdd hostName hostAddr hostShow 例子 hostAdd styx 147 11 1 80 value 0 0 x0 hostAdd nelson 147 11 1 80 value 0 0 x0 hostShowhostnameinetaddressaliaseslocalhost127 0 0 1ohio147 11 1 81styx147 11 1 80nelsonvalue 0 0 x0 路由表 epimetheus janus mimas 192 15 2 0network 192 15 2 22 192 15 2 1 65 0 0 3 65 0 0 1 65 0 0 0network 网络 网络 网关 网关 192 15 2 0 65 0 0 3 65 0 0 0 192 15 2 1 增加路由 远程登陆 远程登陆的工具 执行远程命令 UNIX VxWorks RSHserver RSHclient shell shellcmd socket UNIX 远程命令 intrcmd host remotePort localUser remoteUser cmd pFd2 host主机名称或地址 remotePort远程机器的地址 通常为514 localUser本地用户名 remoteUser远程主机的用户名 cmd命令 pFd2socket指针 UNIX rcmd例子 unixDate calloc 300 1 unixDate 0 x23ff264 value 37744912 0 x23ff110 aFd rcmd ohio 514 debbie debbie date 0 newsymbol aFd addedtosymboltable aFd 0 x23fefa0 value 4 0 x4 read aFd unixDate 300 value 29 0 x1d printf s n unixDate MonNov1812 25 45PST1991value 30 0 x1e close aFd 远程文件存取 VxWorks可以通过以下两个设备 来存取远程文件系统 NFS NFS使用方法 存取NFS文件系统上的文件需要执行以下操作 在服务器上输出 export 一些文件 在客户机上加载该文件系统 设置访问文件的权限 1 输出文件 VxWorksTarget Fileserver dino usr Workstation 2 加载文件系统 nfsMount host dino dinoNfs fd open dinoNfs comics myFile 2 STATUSnfsMount host fileSystem localName host文件服务器名 fileSystem文件服务器上的输出文件名称localName记载到本地的文件名 检查NFS文件的加载情况 可以使用nfsDevShow来查看文件系统的加载情况 nfsDevShowdevicenamefilesystem usrNfsstyx usr dinoNfscolumbia dinovalue 0 0 x0 netDrv 创建网络文件系统 netDevCreate ohio ohio 1 fd open ohio u teamN 2 STATUSnetDevCreate devName host protocol devName本地文件名 以 结尾 host远程主机名称protocol存取文件的协议 0 RSHor1 FTP 存取权限 iam team8 team8Password iam team8 7 10网
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年保健食品计划试题及答案
- 2025年验船师考试(C级船舶检验专业实务)测试题及答案一
- 2025年注册验船师资格考试(C级船舶检验法律法规)经典试题及答案二
- 2025年环境科学与可持续发展考试试题及答案
- 北京市门头沟区2024-2025学年八年级上学期期末考试英语试题及答案
- 北京市门头沟区2023-2024学年九年级上学期期末质量监测语文试题及答案
- 2025年英语四六级考试作文范文与技巧解析
- 校长建议课件
- 2025年殡仪馆服务流程优化与管理模拟题及解析
- 2025年招聘考试宝典从模拟题看项目经理的必-备知识
- 业财融合与价值创造课件
- 长沙市名校小升初分班考试数学试卷(含答案)
- 肺动脉栓塞护理查房
- 农村房地产转让合同协议
- 拉链专业工艺讲解
- 2025版抵押贷款抵押物抵押权登记及变更手续协议模板
- 《死亡医学证明(推断)书》培训试题(附答案)
- 护理核心制度2025年
- 华文版二年级上册-写字-书法
- 慢性根尖周炎病例分析
- 2025年初中学业水平考试生物试卷(附答案)
评论
0/150
提交评论