北邮研究生嵌入式系统实验课程——第4-3节 VxWorks信号中断和定时

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在异常信号处理程序返回后:
– 出现异常的任务将被挂起 – 控制台显示出错信息
异常信号处理程序通常调用:
– Exit():终止当前任务 – taskRestart():重启任务 – Longjmp():从setjmp()保存的位置继续执行
2. 中断服务程序
ISR基本知识 ISR的限制
中断的概念
该函数将指定的C函数与指定的中断向量相联系 ,函数的地址存放在这个中断向量中。当发生中 断时,系统调用该函数。
中断堆栈
大多数体系结构的CPU的ISR使用相同的中断 堆栈 中断堆栈在系统启动时分配 堆栈大小由宏ISR_STACK_SIZE控制,默认 值在configAll.h中定义 堆栈必须足够大,以保证能够处理系统最坏情 况下的中断嵌套 ISR没有任务控制块(TCB),并且所有的ISR 共享一个堆栈
中断号 handler 硬件 中断
myISR() { … }
设置中断处理程序
VxWorks提供函数intConnect(), 它允许将指 定的C函数与任意中断相联系
STATUS intConnect() { VOIDFUNCPTR *vector; /*要联系的中断向量*/ VOIDFUNCPTR *routine; /*中断发生时要调用的函数*/ int parameter; /*传递给中断处理函数的参数*/ }
信号编号
31个信号编号,从1-31
– – – – –
– – – – – – – – – –
#define #define #define #define ught) */ #define / #define future */ #define #define #define #define #define
停止看门狗定时器
要取消原来已经启动的看门狗定时器
STATUS wdCancel (wdId)
要删除一个看门狗定时器(并取消原先启动的定 时器)
STATUS wdDelete ( wdId )
doit程序可以
– 轮询某些硬件设备 – 解锁某些任务 – 检查系统是否出现错误
用看门狗定时器处理超出时限
实时系统任务的一个重要特征是具有时限约束, 任务执行一旦超出时限,系统可能导致灾难性的 后果。看门狗定时器可以用来启动时限事故处理 任务。
WDOG_ID wdId; void foo( void ){ wdId = wdCreate ( ); /*must finished each cycle in under 10 senconds*/ FOREVER{ wdStart( wdId, DELAY_10_SEC, fooISR, 0 ); fooDoWork (); } } void fooDoWork (void ){ /*handle missed deadline*/ }
#define SIGRTMIN 23 #define SIGRTMAX 29 #define SIGUSR1 30 #define SIGUSR2 31
基本的Signal函数
信号处理流程
Pend Queue
4
3 1 2
Ready Queue
运行信号 处理程序
1. 当任务处于阻塞状态时收到signal 2. 任务离开阻塞队列,进入就绪队列,准备运行 3. 当任务成为就绪队列中优先级最高的任务时, 执行信号处理程序 4. 信号处理程序执行完后,任务返回阻塞状态, 保持原始超时信息不变
如何使用ISR
保持ISR尽量短,因为ISR
– 会延迟低或相同优先级的中断 – 延迟所有的任务 – 调试起来比较困难
避免在ISR中使用浮点指针操作 尽量将有些工作放到任务中去完成
– 持续时间长的工作 – 不是非常重要的工作
中断与任务间的通信
共享存储器和环缓冲区
– ISR与任务共享变量、存储器和环缓冲区
– 轮询硬件 – 检查系统错误
VxWorks提供对两种定时器的相同的接口
– 系统时钟 – 辅助时钟
系统时钟
系统时钟完成下列工作
– 增加ticks计数(使用tickGet()获得计数值) – 更新延时和超时计数器 – 检查循环调度
默认的时钟频率是60Hz
sysClkRateSet() sysClkRateGet() 设置时钟频率 获得时钟频率
信号
Kill (tid, signal)
Task或ISR
Task
Void nomalcode() {… /*incoming signal*/ … } Void Handler() {… /*deal with signal*/ … }
信号的特性
软件信号机制,相当于软中断。主要用于错误和异常处 理; VxWorks中总共有31个信号,每个信号对应一个不同的 事件,编号(1-31) 任务可以提供一个信号处理程序对到来的信号进行处理 信号可以异步改变任务的控制流。获得信号的任务立即 挂起当前的执行,在下次调度它运行时转而执行指定的 信号处理程序 当信号处理程序执行完后,任务重新开始执行 即使任务被阻塞,信号服务程序仍可以被激活; UNIX BSD-style信号 、POSIX-compatible信号; 参考sigLib (组件:INCLUDE_SIGNALS)
启动(或重启)一个看门狗定时器
STATUS wdStart (wdId, delay, pRoutine, parameter ) wdId 由wdCreate返回的watchdog Id delay 要延时的ticks pRoutine 当延时超时时,要调用的程序 parameter 传递给程序的参数
/* trace trap (not reset when caught) *
/* used by abort, replace SIGIOT in the /* EMT instruction */ /* floating point exception */ /* kill */ /* bus error */ 11 /* segmentation violation */ /* /* /* /* Realtime signal min */ Realtime signal max */ user defined signal 1 */ user defined signal 2 */
wdStart()可以在超时时运行看门狗程序,要想周期性 执行,看门狗程序必须调用wdStart()自己重新启动
使用看门狗定时器
使用看门狗定时器可以使一段程序周期性地执行
wdId = wdCreate(); wdStart ( wdId, DELAY_PERIOD, myWdIsr, 0); void myWdIsr (param) { doit (param); wdStart ( wdId, DELAY_PERIOD, myWdIsr, 0); }
SIGHUP 1 SIGINT 2 SIGQUIT3 SIGILL 4 SIGTRAP5
SIGABRT 6 SIGEMT 7 SIGFPE 8 SIGKILL 9 SIGBUS 10 SIGSEGV
/* /* /* /*
hangup */ interrupt */ quit */ illegal instruction (not reset when ca
重要提示
信号不适合于实现普通的任务间通信
– 信号处理程序的优先级太高,会阻塞其他任务的执行 – 打断了任务的正常执行顺序。最好创建两个任务,而 不是在一个任务中通过信号控制 – 可能导致任务的重入问题:例如,运行信号服务程序 的任务和运行正常代码的相同任务
ቤተ መጻሕፍቲ ባይዱ
可以用于告诉一个任务将其自身关闭 sigLib包含POSIX和BSD UNIX接口,相互之间 不能混淆使用
VxWorks中断处理流程
保存CPU寄存器 从中断控制器读中断向量号 顺序调用该中断服务程序 通知中断控制器中断服务程序结束 恢复CPU寄存器 返回
中断和优先级
ISR的使用限制
ISR执行完成之前,其它任务不能执行 ISR中不能调用某些VxWorks函数,尤其是,I SR不能被阻塞
信号和异常
硬件异常包括总线错误、地址错误、被零除、 浮点指针溢出等。信号与这些异常情况对应 一个正在执行的任务发生异常时:
– 如果任务加载了信号处理程序来处理异常情况,则V xWorks将向该任务发送信号 – 如果任务没有加载有关信号处理程序,VxWorks将 挂起任务并向控制台发出错误信息
信号处理程序
嵌入式系统实验
第4-3节 VxWorks信号、中断和定时
夏海轮 xiahailun@bupt.edu.cn
北京邮电大学 信息与通信工程学院
本节主要内容
1. 异常处理和信号 2. 中断服务程序 3. 定时器
1. 异常处理和信号
异常的处理 信号 加载用户自定义的信号
异常(exception)处理概述
异常是CPU所产生的非预料的事件,包括如:陷 阱、中断指令、被零除、浮点指针或整数溢出、 错误指令或地址错误。 一个异常将产生一个内部中断。 VxWorks在系统启动时安装异常处理器,当发 生异常事件时,异常处理器将会对该异常进行处 理并发起一个用户定义的异常处理。 VxWorks的异常处理器通过向用户任务发送信 号来进行通信,使得用户任务开始执行。
信号量
– ISR释放信号量,任务等待接收信号量
消息队列
– ISR发送消息,任务等待接收消息,如果消息队列满 ,该消息被丢弃
管道
– ISR向管道写消息,任务读消息
信号
– ISR可以向任务发送signal。
调试中断
中断处理程序可以调用logMsg()向系统输出诊 断信息
logMsg(“foo = %d\n”,foo,2,3,4,5,6)
sysClkRateSet()通常在系统启动时进行设置( VxSim方式下可以随时设置)
看门狗定时器
系统时钟的一个用户接口 能够使C程序在一个给定延时后开始执行 一旦延时超时,指定的程序开始执行 作为系统ISR的一部分,要遵守ISR的编程要求
创建看门狗定时器
创建一个看门狗定时器
– WDOG_ID wdCreate () – 返回wotchdog id或NULL或ERROR
设备向CPU发送中断,通知CPU发生了某些事件 加载用户自定义的程序,在中断到达时执行该程 序 中断服务程序不是一个任务 设备上的板上定时器是一个常见的中断源,可以 通过它来理解中断
中断处理举例
中断向量表 ISR包装代码 用户ISR程序
Handler: Save register call routine Restore register RET
– – – – 不能调用semTake() 不能调用malloc(),free() 不能调用I/O系统函数(如printf()) 不能调用使用浮点协处理器的程序
非法指令或总线错导致硬件异常时,该任务被挂 起,其他任务继续执行 如果ISR没有context被挂起,vxworks将在低 端内存保存对异常的描述,并重启系统
注册一个信号处理程序
使用下面的函数注册一个信号处理函数
– Signal (signo,handler) – Signo 信号号 – Handler 信号到来时所触发的处理程序
返回值为信号处理函数的入口地址,或SIG_ ERR 信号处理程序的声明如下:
Void sigHandler (int sig ); /*signal number* /
向tLogTask发送请求为我们实现printf()的功能
和printf()相似,但必须注意
– 参数必须为4字节 – 函数有6个入口参数
使用具有系统级调试的机制进行调试
– WDB Agent – emulator
3. 定时器
系统时钟中断服务程序 看门狗定时器 辅助时钟
定时器
板上的定时器会周期性地中断CPU 定时器使得用户自定义的程序可以周期性地执行 ,这对下列情况非常有用
相关文档
最新文档