VxWorks实时操作系统SIGNAL机制的应用.doc_第1页
VxWorks实时操作系统SIGNAL机制的应用.doc_第2页
VxWorks实时操作系统SIGNAL机制的应用.doc_第3页
VxWorks实时操作系统SIGNAL机制的应用.doc_第4页
VxWorks实时操作系统SIGNAL机制的应用.doc_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ECC/BJ VXWORKS实时操作系统SIGNAL机制的应用 版本:1.0版 摘要介绍VXWORKS实时操作系统的信号机制以及各种处理方法,特别是利用该机制实现异常情况的恢复和处理。1. 概述信号可用来在同一任务内部或不同任务之间实现异步通信,从而改变对多个任务的控制流程。所有任务或中断服务程序均能向指定的任务发送信号,该信号的接收任务将立刻挂起当前的执行线程,而激活任务指定的信号处理程序。信号处理程序是由用户定义的,它关联与特定的信号,而且任务接收到该指定信号时的所有必要处理都在该程序中实现。信号的这种机制使得它特别适合于用来实现差错和异常处理。2. 信号屏蔽在信号处理时,可通过信号屏蔽来选择需要进行处理的信号,接收到被屏蔽的信号,即使指定了相应的处理程序,也不作任何处理。为了实现对信号的屏蔽,需要定义数据类型为sigset_t的变量,同时必须包含头文件“signal.h”。下面介绍实现这一功能的函数:int sigemptyset ( sigset_t *pSet )该函数初始化信号集,使得该信号集不包含任何信号;int sigfillset ( sigset_t *pSet )该函数初始化信号集,使得该信号集包含所有信号;int sigaddset ( sigset_t *pSet , int signo )该函数向信号集中增加新的信号;int sigdelset ( sigset_t *pSet , int signo )该函数删除信号集中的信号;int sigismember ( sigset_t *pSet , int signo )该函数用来判断信号集是否包含某信号;int sigprocmask ( int how, const sigset_t *pSet, sigset_t *pOset )该函数用来设置信号屏蔽;这里,pSet为新的信号集,pOset为当前的信号集,而how则指示处理方式,其取值与处理方式对应关系如下:SIG_BLOCK 结果信号集为当前信号集和指定信号集二者的并集,通过这种方式,可向当前信号集增添指定的元素;SIG_UNBLOCK 结果信号集为指定信号集的补集和当前信号集二者的交集;通过这种方式,可从当前信号集删除指定的元素;SIG_SETMASK 结果信号集为指定信号集;3. 信号发送int raise (int signo )任务调用该函数来向自己发送指定的信号;int kill (int tid, int signo )该函数可向任何任务发送指定的信号;4. 信号处理程序如果一个任务指定了对于某个信号的处理程序,不管该任务是否被挂起时,接收到该信号将立刻调用信号处理程序,信号处理程序执行完毕后,任务恢复到先前的状态,比如:任务在挂起状态接收到该信号,那么处理程序执行完毕后任务将返回到挂起状态。由于信号处理函数由操作系统调用,所以其函数形式有着严格的要求,包括下面的两种形式:第一方案:利用signal函数实现信号与处理函数的关联void* signal( int signo, void* pHandler () ) ()该函数建立信号signo与处理函数pHandler之间的联系;同时,其返回当前信号处理函数的指针;void sigHandler (int signo);单参数信号处理程序,这里sigHandler为用户自己定义的函数名(下同),该函数只提供了不同的信号编号signo,进一步的信号代码信息无法获取。void sigHandler (int signo, int code, struct sigcontext * pContext);多参数信号处理程序,该函数只提供了不同的信号编号signo和信号代码code信息,可对信号接收所更加详细的处理。第二方案:利用sigaction函数实现信号与处理函数的关联int sigaction ( int signo, const struct sigaction *pAct, struct sigaction *pOact );该函数建立信号signo与pAct结构中指定的处理函数之间的联系;同时,当前信号处理函数的有关信息将保存在结构pOact中;另外,为了调用多参数处理程序,pAct结构中的成员sa_flags必须设置SA_SIGINFO;void sigHandler (int signo);单参数信号处理程序,这里sigHandler为用户自己定义的函数名(下同),该函数只提供了不同的信号编号signo,进一步的信号代码信息无法获取。void sigHandler (int signo, siginfo_t * pInfo, void * pContext);多参数信号处理程序,该函数只提供了不同的信号编号signo和信号代码code信息,可对信号接收所更加详细的处理。这里有必要介绍一下几个数据结构:typedef struct siginfo intsi_signo; /*信号的编号信息*/intsi_code;/*信号的来源信息*/union sigvalsi_value; /*信号的代码信息*/ siginfo_t;union sigval intsival_int;/*信号的代码*/ void*sival_ptr;struct sigactionunionvoid(*_sa_handler)(int);void(*_sa_sigaction)(int, siginfo_t *, void *);sa_u;#define sa_handlersa_u._sa_handler /*单参数处理程序*/#define sa_sigactionsa_u._sa_sigaction /*多参数处理程序*/sigset_tsa_mask;/*信号屏蔽集*/intsa_flags;/*处理方式*/;下面以Intel i386/i486为例进行进一步的解释:列出信号定义如下:SignalCodeExceptionSIGILLILL_DIVIDE_ERRORDivide errorSIGEMTEMT_DEBUGDebugger callSIGILLILL_NON_MASKABLENMI interruptSIGEMTEMT_BREAKPOINTBreakpointSIGILLILL_OVERFLOWINTO-detected overflowSIGILLILL_BOUNDBound range exceededSIGILLILL_INVALID_OPCODEInvalid opcodeSIGFPEFPE_NO_DEVICEDevice not availableSIGILLILL_DOUBLE_FAULTDouble faultSIGFPEFPE_CP_OVERRUNCoprocessor segment overrunSIGILLILL_INVALID_TSSInvalid task state segmentSIGBUSBUS_NO_SEGMENTSegment not presentSIGBUSBUS_STACK_FAULTStack exceptionSIGILLILL_PROTECTION_FAULTGeneral protectionSIGBUSBUS_PAGE_FAULTPage faultSIGILLILL_RESERVED(intel reserved)SIGFPEFPE_CP_ERRORCoprocessor ErrorSIGBUSBUS_ALIGNMENTAlignment check对应于Signal的列也就是前面函数中的signo或第二方案中结构pInfo的成员si_signo,对应于Code的列也就是第一方案中的code和第二方案中结构pInfo的成员si_value.sival_int。具体实现参见后面的例子程序。另外,VXWORKS操作系统定义了两个用户自定义信号,其对应的Signal列项为SIGUSR1和SIGUSR2,没有对应的Code列项。5. 异常处理当任务在执行过程中出现硬件异常时,将自动的发送相应的信号,用户可以利用这种机制来实现异常处理。利用setjmp和longjmp的相互配合可实现对异常情况的处理。为了利用这两个函数必须包含头文件“setjmp.h”,同时定义类型为jmp_buf公共变量。int setjmp ( jmp_buf env )该函数用于保存任务的运行环境;正常情况下,其返回值为0,出现异常时,其返回值为非0,具体值由函数longjmp的第二个参数确定。另外,保存的运行环境不包括公共变量。void longjmp ( jmp_buf env, int val )该函数恢复由保存的setjmp运行环境,并将控制转交给setjmp。该机制的具体运用见后面的实例程序。6. 程序实例实例1:单参数信号处理程序以及信号的发送#include #include #include #include void sigHandler(int sig);void myMain()int A10;signal(SIGILL,&myHandler);signal(SIGBUS,&myHandler);signal(SIGUSR1,&myHandler);raise(SIGUSR1);A11=1; /*人为设置的下标越界差错*/void myHandler(int sig)if(sig=SIGUSR1)printf(SIGUSR);elseprintf(ERRORn);exit(0);输出结果为: SIGUSRERROR实例2:信号屏蔽#include #include #include #include #include void sigHandler(int sig);void myMain()int A10;sigset_t sigset1,sigset2;sigemptyset(&sigset1);sigaddset(&sigset1,SIGUSR1);sigprocmask(SIG_SETMASK,&sigset1,&sigset2);signal(SIGILL,&sigHandler);signal(SIGBUS,&sigHandler);signal(SIGUSR1,&sigHandler);raise(SIGUSR1);A11=10;void sigHandler(int sig)if(sig=SIGUSR1)printf(SIGUSR);elseprintf( ERRORn);exit(0);输出结果:ERROR实例3:第一方案多参数处理程序#include #include #include #include #include void sigHandler(int sigNum,int code, struct sigcontext *pContext);void myMain()int A10;signal(SIGILL,&sigHandler);signal(SIGBUS,&sigHandler);signal(SIGUSR1,&sigHandler);raise(SIGUSR1);A11=10;void sigHandler(int sigNum,int code, struct sigcontext *pContext)if(sigNum=SIGUSR1)printf(SIGUSR);elseprintf( ERRORn);if(code=BUS_PAGE_FAULT)printf( PAGE_FAULTn);exit(0);输出结果为:SIGUSR ERROR PAGE_FAULT实例4:第二方案多参数处理程序#include #include #include #include #include void sigHandler(int sigNum,siginfo_t *pInfo,void *pContext);void myMain()int A10;struct sigaction act1,act2;act1.sa_sigaction=&sigHandler;act1.sa_flags=SA_SIGINFO;sigaction(SIGILL,&act1,&act2);sigaction(SIGBUS,&act1,&act2);sigaction(SIGUSR1,&act1,&act2);raise(SIGUSR1);A11=10;void sigHandler(int sigNum,siginfo_t *pInfo,void *pContext)if(sigNum=SIGUSR1)printf(SIGUSR);elseprintf( ERRORn);if(pInfo-si_value.sival_int=BUS_PAGE_FAULT)printf(PAGE_FAULTn);exit(0);输出结果为:SIGUSR ERRORPAGE_FAULT实例5:异常处理#include #include #include #include #include jmp_buf env;void sigHandler(int sig);void myMain

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论