⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sigdemo.c

📁 2410/vxworks/tornado下的基本实验包括 serial,ramdrv,interrupt,multi-tasking,FTP,TCP,UDP
💻 C
字号:
/*sigDemo.c - 信号处理的例子
*/

/*include*/
#include "vxworks.h"
#include "stdio.h"
#include "sigLib.h"
#include "taskLib.h"
#include "wdLib.h"
 
 
 /*  * DESCRIPTION
  * 发起一个任务syncTask每隔一秒向终端打印"Hello",
  * 并设定了用户自定义信号SIGUSR1 处理函数,
  * 利用watchdog定时器模拟外部异常事件,每发生一次异常
  * 向syncTask 发送用户自定义信号SIGUSR1,调用处理函数
  * 信号处理函数运行完后,转回到syncTask任务的上下文继续执行
  *
  * EXAMPLE  *  *  -> sp sigDemo
  *
  *
  */  
 /* defines */  #define TASK_PRIORITY				101 #define TASK_STACK_SIZE				5000 #define TIME_BETWEEN_INTERRUPTS  sysClkRateGet()*2   /* 2 秒 */
 #define NUM_OF_GIVES				3   
  /* globals */  LOCAL WDOG_ID wdId = NULL;              /* 看门狗定时器ID */
 LOCAL int syncTaskTid = 0;              		/*syncTask 的tid */
 LOCAL int numToGive = NUM_OF_GIVES;     /* 信号被发送的次数 */
  /* forward declaratiuon */ LOCAL void syncISR(int);                      
 LOCAL void cleanUp ();                        
 LOCAL void syncTask ();                      
 
 /*****************************************************************************  * sigDemo - 主函数. 创建任务syncTaskTid,并创建和启动watchdog定时器
  *   模拟外部异常事件
  *
  *  RETURNS: OK or ERROR  *  */ STATUS sigDemo (void) 
     {		 
 	  /*创建一个看门狗定时器,模拟外部中断*/ 	
     if ((wdId = wdCreate()) == NULL)         {         perror ("wdCreate");         cleanUp ();         return (ERROR);         }  	  /*创建任务*/	
     if ((syncTaskTid = taskSpawn ("tsyncTask", TASK_PRIORITY, 0,TASK_STACK_SIZE,(FUNCPTR) syncTask, 0,0,0,0,0,0,0,0,0,0)) == ERROR)         {		 	perror ("taskSpawn");
		 	cleanUp();
		 	return (ERROR);
		 	}
      /* 启动开门狗定时器 */
     if (wdStart (wdId, TIME_BETWEEN_INTERRUPTS, (FUNCPTR) syncISR, numToGive)                    == ERROR)         {         perror ("wdStart");         cleanUp ();         return (ERROR);         }      /* 延时,然后结束演示*/
     taskDelay (sysClkRateGet()+TIME_BETWEEN_INTERRUPTS* numToGive);
 	     cleanUp();     return (OK);     } 	  
 /**************************************************************
  * sigHandler -- 信号处理函数
  *
  */
 
 LOCAL  void sigHandler 
      (
      int sig,     /* signal 值*/
      int code,    /* 附加值*/
      SIGCONTEXT *sigContext /* 任务上下文 */
      )
 {
 
      switch (sig)
      {
          case SIGUSR1: 
          printErr ("\nSignal SIGUSR1 received\n");
          break;

			default:
           printErr ("\nOther Signal received\n");
          break;
 		}
 
      }

 /*****************************************************************************  *  syncTask -运行的任务, 响应异常任务发出的信号
  */  LOCAL  void syncTask (void)
     {      int val = 0;

	  /*将信号处理函数与SIGUSR1信号绑定*/		 
     signal (SIGUSR1, (VOIDFUNCPTR)sigHandler);
     printf ("setup sigvec for SIGUSR1\n");

	 /*每隔一秒在终端上打印"Hello"*/
     FOREVER         {
			printf("Hello\n");			
 			taskDelay (sysClkRateGet());
	 	}
      }  /*****************************************************************************  * syncISR - 模拟的外部异常事件
  */ LOCAL  void syncISR 
     (     int times     )     {
	     /*向SIGUSR1发送信号SIGUSR1*/
		  kill(syncTaskTid,SIGUSR1);  	 
	     times--;
	     if (times > 0)
	         wdStart (wdId, TIME_BETWEEN_INTERRUPTS, (FUNCPTR) syncISR, times);

     }
  /*****************************************************************************  * cleanUP - 删除任务和定时器
  */ LOCAL  void cleanUp ()
     {     if (syncTaskTid)         taskDelete (syncTaskTid);     if (wdId)
         wdDelete (wdId);      }  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -