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