360 likes | 591 Views
VxWorks 及其应用开发. 陈香兰 xlanchen@ustc.edu.cn http://staff.ustc.edu.cn/~xlanchen 2006 年 7 月. 课程内容. VxWorks 和 Tornado 简介 任务和任务间通信 信号、中断处理与定时机制 调试环境与实例分析 网络编程 VxWorks 操作系统配置. 信号、中断处理与定时机制. xlanchen@2006.7.18. 1 、信号. VxWorks 支持软件信号功能,任何任务和 ISR 都可向指定任务发信号 获得信号的任务立即挂起,并在下次调度运行时转去执行指定的信号处理程序。
E N D
VxWorks及其应用开发 陈香兰 xlanchen@ustc.edu.cn http://staff.ustc.edu.cn/~xlanchen 2006年7月
课程内容 • VxWorks和Tornado简介 • 任务和任务间通信 • 信号、中断处理与定时机制 • 调试环境与实例分析 • 网络编程 • VxWorks操作系统配置
信号、中断处理与定时机制 xlanchen@2006.7.18
1、信号 • VxWorks支持软件信号功能,任何任务和ISR都可向指定任务发信号 • 获得信号的任务立即挂起,并在下次调度运行时转去执行指定的信号处理程序。 • 信号处理程序的运行使用接收者的上下文和堆栈 • 当任务被阻塞时,信号处理程序仍然可以被唤醒
与任务间通信相比,信号机制适合于错误和异常处理与任务间通信相比,信号机制适合于错误和异常处理 • 可以将信号处理程序作为ISR看待: • 信号与中断都是异步的 • 任何可能导致阻塞的函数均不能在信号处理程序中调用(信号处理程序能够调用的函数与ISR中能够安全使用的函数一样)
Wind内核支持两种类型的信号接口 • UNIX BSD风格的信号 • POSIX兼容的信号 • 建议:编程时不要混合使用不同的接口形式
sigInit() • 在调用任何信号接口之前,必须先使用sigInit初始化信号函数库。 • 正常情况下,在中断允许之前,在程序usrConfig.c的usrInit函数中调用
基本信号接口提供31个不同的信号,使用sigVec()或sigAction()可为信号指定一个信号处理程序基本信号接口提供31个不同的信号,使用sigVec()或sigAction()可为信号指定一个信号处理程序 UNIX BSD 当信号到来时,指定的信号处理程序将被运行 指明信号处理程序对应的信号 指明信号处理程序 保存对应信号原来的信息
sigaction与sigvec差别不大 sigVec中的struct sigvec和sigaction中的struct sigaction 都在signal.h中定义
sigsetmask()、sigblock()、sigprocmask()用来屏蔽信号 UNIX BSD 31个信号使用一个int类型的数可以表示, 其中每位代表一个信号 Sigsetmask设置任务的信号屏蔽信息为mask, mask中某个位为1就表示对应位的信号将被屏蔽
UNIX BSD 与sigsetmask的区别,sigblock在原有的基础上增加 一些需要被屏蔽的信号,而sigsetmask是设置操作
Sigprocmask使用how参数指明对信号屏蔽信息要执行的操作,包括:Sigprocmask使用how参数指明对信号屏蔽信息要执行的操作,包括: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK
1.2 POSIX信号队列 • sigqueue()提供与kill()类似的功能:向任务发送信号 • sigqueue()将发送给任务的多个信号排队,而kill仅仅提交一个信号
接收信号的另外一种手段(POSIX 1003.1b) • sigwaitinfo()允许接收一个信号,而不用注册信号处理程序 • 当信号到来时,sigwaitinfo()返回信号的值,而不会调用信号处理程序(尽管可能已经注册了信号处理程序) //返回值
sigtimedwait()与sigwaitinfo()相似,但允许设置超时参数sigtimedwait()与sigwaitinfo()相似,但允许设置超时参数
2、中断服务程序 • 硬件中断的处理是实时系统设计的最重要、最关键的问题 • 一个中断往往对应着一个外部事件,系统通过中断与外部事件交互 • 中断响应时间应该尽可能快,因此VxWorks的ISR运行在特定的上下文中(在所有任务上下文之外) • 因此中断处理不会涉及任何任务上下文的交换 • VxWorks的库intLib和intArchLib提供中断函数
2.1 设置中断处理程序 • VxWorks提供intConnect()函数,将指定的C函数与任意指定的中断相关联 intConnect()中指定的C函数routine与指定的中断向量vector相联系, 当中断发生时就会调用routine并使用parameter作为routine的参数
中断处理程序routine在中断级以supervisor方式调用中断处理程序routine在中断级以supervisor方式调用 • 建立一个合适的C环境 • 保存必要的寄存器 • 建立堆栈 • 中断处理程序不能调用任何可能引起阻塞和执行I/O操作的操作系统函数
事实上,中断向量不是直接指向intConnect()指定的C函数事实上,中断向量不是直接指向intConnect()指定的C函数 • intConnect()将创建一小段代码 • 保存必要的寄存器 • 设置堆栈入口 • 包含将要传递的参数 • 这段代码或者在一个特殊的堆栈或者在当前任务的堆栈中被调用
当中断处理函数运行结束,返回时 • 这段代码先恢复寄存器和堆栈 • 然后退出中断
2.2 中断堆栈 • 中断在特殊的上下文中运行 • 有的体系结构允许所有的ISRs使用相同的中断堆栈,有的不允许 • 无论哪种情况,堆栈必须足够大 • 能够处理正常和最坏情况下中断的嵌套 • 使用checkStack()可以查看一个任务堆栈的使用情况,或整个系统堆栈的使用情况
2.3 ISR的特殊限制 • 由于ISR不是在规则的任务上下文中运行,例如 • 没有TCB • 所有的中断共享一个堆栈 • 因此ISR不能调用可能引起阻塞的函数 • 下表列出了ISR可以调用的函数
2.4 中断与任务的通信 • VxWorks支持运行在中断级的ISR直接与一般任务进行通信 • 由于ISR能够调用的函数有限制,只能通过如下方法通信 • 共享存储区、环缓冲 • 部分信号量(ISR只能释放) • 消息队列,可以发送,若队列满则丢弃 • 管道,可以写,若管道满则丢弃 • 信号,可以发信号