首页 VxWorks实时操作系统SIGNAL机制的应用

VxWorks实时操作系统SIGNAL机制的应用

举报
开通vip

VxWorks实时操作系统SIGNAL机制的应用[摘要]介绍VXWORKS实时操作系统的信号机制以及各种处理方法,特别是利用该机制实现异常情况的恢复和处理。概述信号可用来在同一任务内部或不同任务之间实现异步通信,从而改变对多个任务的控制流程。所有任务或中断服务程序均能向指定的任务发送信号,该信号的接收任务将立刻挂起当前的执行线程,而激活任务指定的信号处理程序。信号处理程序是由用户定义的,它关联与特定的信号,而且任务接收到该指定信号时的所有必要处理都在该程序中实现。信号的这种机制使得它特别适合于用来实现差错和异常处理。信号屏蔽在信号处理时,可通过信号屏蔽来选择需要...

VxWorks实时操作系统SIGNAL机制的应用
[摘要]介绍VXWORKS实时操作系统的信号 机制 综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图 以及各种处理方法,特别是利用该机制实现异常情况的恢复和处理。概述信号可用来在同一任务内部或不同任务之间实现异步通信,从而改变对多个任务的控制 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 。所有任务或中断服务程序均能向指定的任务发送信号,该信号的接收任务将立刻挂起当前的执行线程,而激活任务指定的信号处理程序。信号处理程序是由用户定义的,它关联与特定的信号,而且任务接收到该指定信号时的所有必要处理都在该程序中实现。信号的这种机制使得它特别适合于用来实现差错和异常处理。信号屏蔽在信号处理时,可通过信号屏蔽来选择需要进行处理的信号,接收到被屏蔽的信号,即使指定了相应的处理程序,也不作任何处理。为了实现对信号的屏蔽,需要定义数据类型为sigset.t的变量,同时必须包含头文件"signal.h”。下面介绍实现这一功能的函数:intsigemptyset(sigset_t*pSet)该函数初始化信号集,使得该信号集不包含任何信号;intsigfillset(sigset_t*pSet)该函数初始化有号集,使得该信号集包含所有信号;intsigaddset(sigset_t*pSet,intsigno)该函数向信号藁中增加新的信号;intsigdelset(sigset_t*pSet,intsigno)该函数删除信号集中的信号;intsigismembef(sigset_t*pSet,intsigno)该函数用来判断信号集是否包含某信号;intsigpiocmask(mthow,constsigset_t*pSet,sigset_t*pOset)该函数用来设置信号屏蔽;这重,pSet为新的信号集,pOset为当前的信号集,而how则指示处理方式,其取值与处理方式对应关系如下:SIG_BLOCK结果信号集为当前信号集和指定信号集二者的并集,通过这种方式,可向当前信号集增添指定的元素;SIG_UNBLOCK结果信号集为指定信号集的补集和当前信号集二者的交集;通过这种方式,可从当前信号集删除指定的元素;SIG_SETMASK结果信号集为指定信号集;信号发送intraise(iiitsigno)任务调用该函数来向自己发送指定的信号;intkill(inttid,mtsigno)该函数可向任何任务发送指定的信号;信号处理程序如果一个任务指定了对于某个信号的处理程序,不管该任务是否被挂起时,接收到该信号将立刻调用信号处理程序,信号处理程序执行完毕后,任务恢复到先前的状态,比如:任务在挂起状态接收到该信号,那么处理程序执行完毕后任务将返回到挂起状态。由于信号处理函数由操作系统调用,所以其函数形式有着严格的要求,包括下面的两种形式:第一 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 :利用signal函数实现信号与处理函数的关联void*signal(intsigno,void*pHandler0)0该函数建立信号signo§处理函数pHandler之间的联系;同时,其返回当前信号处理函数的指针;voidsigHandler(mtsigno);单参数信号处理程序,这里sigHandler为用户自己定义的函数名(下同),该函数只提供了不同的信号编号signo,进一步的信号代码信息无法获取。voidsigHandler(mtsigno,intcode,stnictsigcontext*pContext);多参数信号处理程序,该函数只提供了不同的信号编号signo和信号代码code信息,可对信号接收所更加详细的处理。第二方案:利用sigaction函数实现信号与处理函数的关联mtsigaction(mtsigno,conststructsigaction*pAct,structsigaction*pOact);该函数建立信号signo与pAct结构中指定的处理函数之间的联系;同时,当前信号处理函数的有关信息将保存在结构pOact中;另外,为了调用多参数处理程序,pAct结构中的成员sa.flags必须设置SA_SIGINFO;voidsigHandler(mtsigno);单参数信号处理程序,这里sigHandler为用户自己定义的函数名(下同),该函数只提供了不同的信号编号signo,进一步的信号代码信息无法获取。voidsigHandler(intsigno,siginfb_t*plnfb,void*pContext);多参数信号处理程序,该函曷(只提供了不同的信号编号signo和信号代码code信息,可对信号接收所更加详细的处理。这里有必要介绍一下几个数据结构:typedefstnictsiguifo(intsi_signo;/*信号的编号信息*/intsi_code;/*信号的来源信息*/unionsigvalsi_value;/*信号的代码信息*/}sigmfb_t;unionsigval{nitsival_mt;/*信号的代码*/void*sival_ptr;};stnictsigaction{union(void(*—sa_handleij(int);void(*—sa_sigaction)(int,siginfb_t七void*);}sa_u;#deflnesa_handlersa_u.—sa_handler/*单参数处理程序*/#definesa_sigactionsa_u.—sa_sigaction/*多参数处理程序*/sigset_tsa_mask;/*信号屏蔽集*/mtsa_flags;/*处理方式*/};下面以Intel1386/1486为例进行进一步的解释:列出信号定义如下:SignalCodeExceptionSIGILLILL_DIVIDE_ERRORDivideenoiSIGEMTEMT_DEBUGDebuggercallSIGILLILL_NON_MASKABLENMIintemiptSIGEMTEMT_BREAKPOINTBreakpouitSIGILLILL_OVERFLOWINTO-detectedoverflowSIGILLILL_BOUNDBoundrangeexceededSIGILLILL_INVALID_OPCODEInvalidopcodeSIGFPEFPE_NO_DEVICEDevicenotavailableSIGILLILL_DOUBLE_FAULTDoublefaultSIGFPEFPE_CP_OVERRUNCopiocessorsegmentoveminSIGILLILL_INVALID_TSSInvalidtaskstatesegmentSIGBUSBUS_NO_SEGMENTSegmentnotpresentSIGBUSBUS_STACK_FAULTStackexceptionSIGILLILL_PROTECTION_FAULTGeneralprotectionSIGBUSBUS_PAGE_FAULTPagefaultSIGILLILL_RESERVED(mtelreseived)SIGFPEFPE_CP_ERRORCopiocessorEnoiSIGBUSBUS.ALIGNMENTAligmnentcheck对应于Signal的列也就是前面函数中的signo或第二方案中结构plnfo的成员si_signo,对应于Code的列也就是第一方案中的code和第二方案中结构plnfo的成员si_value.sival_into具体实现参见后面的例子程序。另外,VXWORKS操作系统定义了两个用户自定义信号,其对应的Signal列项为SIGUSR1和S1GUSR2,没有对应的Code列项。异常嬷当任务在执行过程中出现硬件异常时,将自动的发送相应的信号,用户可以利用这种机制来实现异常处理。利用setjmp和longjmp的相互配合可实现对异常情况的处理。为了利用这两个函数必须包含头文件“setjmp.h”,同时定义类型为jmp_buf公共变量。intsetjmp(jmp_bufenv)该函数用宇保存任务的运行环境;正常情况下,其返回值为0,出现异常时,其返回值为非0,具体值由函数longjmp的第二个参数确定。另外,保存的运行环境不包括公共变量。voidlongjmp(jmp_bufenv,mtval)该函数恢复由海存的setjmp运行环境,并将控制转交给setjmpo该机制的具体运用见后面的实例程序。程序实例实例1:单参数信号处理程序以及信号的发送#include#include#include#includevoidsigHandlei(intsig);voidmyMainO{-intA[10];signal(SIGILL,&myHandler);signal(SIGBUS,&myHandleij;signal(SIGUSRL&myHandlei);raise(SIGUSRl);A[ll]=l;/*人为设置的下标越界差错*/)voidmyHandlei(intsig)if(sig==SIGUSRl)prmtf("SIGUSRn);else(pnntf(HERROR"”);exit(O);))输出结果为:SIGUSRERROR实例2:信号屏蔽#include#include#include#include#includevoidsigHandlei(intsig);voidmyMainO{,intA[10];sigset_tsigsetl,sigset2;sigemptyset(&sigsetl);sigaddset(&sigsetLSIGUSRl);sigprocmask(SIG_SETMASK.&sigsetl,&sigset2);signal(SIGILL,&sigHandleij;signal(SIGBUS,&sigHandler);signal(SIGUSRL&sigHandlei);raise(SIGUSRl);A[ll]=10;)voidsigHandlei(intsig){if(sig==SIGUSRl)prmtf("SIGUSRn);else(piintf(nERROR\iiu);exit(O);))输出结果:ERROR实例3:第一方案多参数处理程序#include#include#include#include#includevoidsigHandlei(intsigNumantcode,stnictsigcontext*pContext);voidmyMainO{intA[10];signal(SIGILL,&sigHandler);signal(SIGBUS,&sigHandler);signal(SIGUSRl,&sigHandler);raise(SIGUSRl);A[ll]=10;)voidsigHandlei(intsigNumantcode,stnictsigcontext*pContext){if(sigNum==SIGUSRl)printfCSIGUSR1');else(printf(nERRORS”);if(code=BUS_PAGE_FAULT)priiitf("PAGE_FAULT\iiH);exit(O);))输出结果为:SIGUSRERRORPAGE_FAULT实例4:第二方案多参数处理程序#include#include#include#include#includevoidsigHandlei(intsigNum,sigmfd_t*plnfb,void*pContext);voidmyMaiiiQ{-intA[10];stnictsigactionactl,act2;actl.sa_sigaction=&sigHandler;actl.sa_flags=SA_SIGINFO;sigaction(SIGILL,&actl,&act2);sigaction(SIGBUS,&actl,&act2);sigaction(SIGUSRl,&actl,&act2);raise(SIGUSRl);A[ll]=10;)voidsigHandlei(intsigNum,siginfd_t*plnfb,void*pContext){if(sigNum==SIGUSRl)priiitf("SIGUSRn);else{pnntf("ERROR");if(pInfo->si_value.sival_int==BUS_PAGE_FAULT)pimtf(',PAGE_FAULT\iiH);exit(O);)}输出结果为:SIGUSRERRORPAGE_FAULT实例5:异常处理#include#include#include#include#includejmp_bufenv;voidsigHandlei(intsig);voidmyMainO{,inti,x,A[10];signal(SIGILL,&sigHandlei);signal(SIGBUS,&sigHandler);signal(SIGEMT.&sigHandlei);signal(SIGFPE.&sigHandlei);x=10;i=setjmp(env);if(i==0)(x=12;A[ll]=10;)else(pnntf(Hx=%d\n\x);exit(O);))voidsigHandlei(intsig){pimt町LongJump!”);longjmp(env,l00);printf(nCompiete!n);)输出结果:LongJump!x=10如果把变量x定义为全局变量,输出的结果为:LongJump!x=10上面的现象说明,当x定义为全局变量时,保存运行环境并没有保存变量X,否则在进行运行环境恢复时应该恢复x=10o另外,信号处理函数sigHandler中位于longjmp后面的操作pnntf("Complete!”)并没有执行,而执行了任务中的pnntf("x=%d\nH,x)操作,说明longjmp己经将操作控制转交到了setjmp的位置。利用这种机制,在主程序的必要位置调用日保存正常的运行环境,再在信号处理程序中调用longjmp以从异常中恢复到先前由setjmp保存的正常运行环境,同时通过setjmp的不同返回值判断是否发生异常以及作异常情况下程序的内部处理。
本文档为【VxWorks实时操作系统SIGNAL机制的应用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_704284
暂无简介~
格式:doc
大小:16KB
软件:Word
页数:9
分类:
上传时间:2018-09-18
浏览量:0