📄 sigdemo.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 + -