1 / 36

VxWorks 及其应用开发

VxWorks 及其应用开发. 陈香兰 xlanchen@ustc.edu.cn http://staff.ustc.edu.cn/~xlanchen 2006 年 7 月. 课程内容. VxWorks 和 Tornado 简介 任务和任务间通信 信号、中断处理与定时机制 调试环境与实例分析 网络编程 VxWorks 操作系统配置. 信号、中断处理与定时机制. xlanchen@2006.7.18. 1 、信号. VxWorks 支持软件信号功能,任何任务和 ISR 都可向指定任务发信号 获得信号的任务立即挂起,并在下次调度运行时转去执行指定的信号处理程序。

maude
Download Presentation

VxWorks 及其应用开发

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VxWorks及其应用开发 陈香兰 xlanchen@ustc.edu.cn http://staff.ustc.edu.cn/~xlanchen 2006年7月

  2. 课程内容 • VxWorks和Tornado简介 • 任务和任务间通信 • 信号、中断处理与定时机制 • 调试环境与实例分析 • 网络编程 • VxWorks操作系统配置

  3. 信号、中断处理与定时机制 xlanchen@2006.7.18

  4. 1、信号 • VxWorks支持软件信号功能,任何任务和ISR都可向指定任务发信号 • 获得信号的任务立即挂起,并在下次调度运行时转去执行指定的信号处理程序。 • 信号处理程序的运行使用接收者的上下文和堆栈 • 当任务被阻塞时,信号处理程序仍然可以被唤醒

  5. 与任务间通信相比,信号机制适合于错误和异常处理与任务间通信相比,信号机制适合于错误和异常处理 • 可以将信号处理程序作为ISR看待: • 信号与中断都是异步的 • 任何可能导致阻塞的函数均不能在信号处理程序中调用(信号处理程序能够调用的函数与ISR中能够安全使用的函数一样)

  6. Wind内核支持两种类型的信号接口 • UNIX BSD风格的信号 • POSIX兼容的信号 • 建议:编程时不要混合使用不同的接口形式

  7. 1.1、基本的信号接口

  8. sigInit() • 在调用任何信号接口之前,必须先使用sigInit初始化信号函数库。 • 正常情况下,在中断允许之前,在程序usrConfig.c的usrInit函数中调用

  9. 基本信号接口提供31个不同的信号,使用sigVec()或sigAction()可为信号指定一个信号处理程序基本信号接口提供31个不同的信号,使用sigVec()或sigAction()可为信号指定一个信号处理程序 UNIX BSD 当信号到来时,指定的信号处理程序将被运行 指明信号处理程序对应的信号 指明信号处理程序 保存对应信号原来的信息

  10. sigaction与sigvec差别不大 sigVec中的struct sigvec和sigaction中的struct sigaction 都在signal.h中定义

  11. kill()将一个信号发给指定的任务

  12. sigsetmask()、sigblock()、sigprocmask()用来屏蔽信号 UNIX BSD 31个信号使用一个int类型的数可以表示, 其中每位代表一个信号 Sigsetmask设置任务的信号屏蔽信息为mask, mask中某个位为1就表示对应位的信号将被屏蔽

  13. UNIX BSD 与sigsetmask的区别,sigblock在原有的基础上增加 一些需要被屏蔽的信号,而sigsetmask是设置操作

  14. Sigprocmask使用how参数指明对信号屏蔽信息要执行的操作,包括:Sigprocmask使用how参数指明对信号屏蔽信息要执行的操作,包括: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK

  15. 1.2 POSIX信号队列 • sigqueue()提供与kill()类似的功能:向任务发送信号 • sigqueue()将发送给任务的多个信号排队,而kill仅仅提交一个信号

  16. 接收信号的另外一种手段(POSIX 1003.1b) • sigwaitinfo()允许接收一个信号,而不用注册信号处理程序 • 当信号到来时,sigwaitinfo()返回信号的值,而不会调用信号处理程序(尽管可能已经注册了信号处理程序) //返回值

  17. sigtimedwait()与sigwaitinfo()相似,但允许设置超时参数sigtimedwait()与sigwaitinfo()相似,但允许设置超时参数

  18. 信号使用举例

  19. 2、中断服务程序 • 硬件中断的处理是实时系统设计的最重要、最关键的问题 • 一个中断往往对应着一个外部事件,系统通过中断与外部事件交互 • 中断响应时间应该尽可能快,因此VxWorks的ISR运行在特定的上下文中(在所有任务上下文之外) • 因此中断处理不会涉及任何任务上下文的交换 • VxWorks的库intLib和intArchLib提供中断函数

  20. 2.1 设置中断处理程序 • VxWorks提供intConnect()函数,将指定的C函数与任意指定的中断相关联 intConnect()中指定的C函数routine与指定的中断向量vector相联系, 当中断发生时就会调用routine并使用parameter作为routine的参数

  21. 中断处理程序routine在中断级以supervisor方式调用中断处理程序routine在中断级以supervisor方式调用 • 建立一个合适的C环境 • 保存必要的寄存器 • 建立堆栈 • 中断处理程序不能调用任何可能引起阻塞和执行I/O操作的操作系统函数

  22. 事实上,中断向量不是直接指向intConnect()指定的C函数事实上,中断向量不是直接指向intConnect()指定的C函数 • intConnect()将创建一小段代码 • 保存必要的寄存器 • 设置堆栈入口 • 包含将要传递的参数 • 这段代码或者在一个特殊的堆栈或者在当前任务的堆栈中被调用

  23. 当中断处理函数运行结束,返回时 • 这段代码先恢复寄存器和堆栈 • 然后退出中断

  24. 中断处理过程

  25. 2.2 中断堆栈 • 中断在特殊的上下文中运行 • 有的体系结构允许所有的ISRs使用相同的中断堆栈,有的不允许 • 无论哪种情况,堆栈必须足够大 • 能够处理正常和最坏情况下中断的嵌套 • 使用checkStack()可以查看一个任务堆栈的使用情况,或整个系统堆栈的使用情况

  26. 2.3 ISR的特殊限制 • 由于ISR不是在规则的任务上下文中运行,例如 • 没有TCB • 所有的中断共享一个堆栈 • 因此ISR不能调用可能引起阻塞的函数 • 下表列出了ISR可以调用的函数

  27. 2.4 中断与任务的通信 • VxWorks支持运行在中断级的ISR直接与一般任务进行通信 • 由于ISR能够调用的函数有限制,只能通过如下方法通信 • 共享存储区、环缓冲 • 部分信号量(ISR只能释放) • 消息队列,可以发送,若队列满则丢弃 • 管道,可以写,若管道满则丢弃 • 信号,可以发信号

  28. 中断处理程序举例

More Related