📄 countingsemdemo.c
字号:
/* countingSemDemo.c - 利用计数信号量同步任务 */ /* * DESCRIPTION * 用二进制信号量同步任务时,如果事件发生 的过快, * 有可能会造成任务来不及处理. 使用计数器信号量可 * 以解决这个问题. * RETURNS: OK or ERROR * * EXAMPLE * */ /* include files */ #include "vxWorks.h" #include "wdLib.h" #include "stdio.h" #include "semLib.h" #include "taskLib.h" #include "usrLib.h" #include "sysLib.h" /* defines */ #define TASK_PRIORITY 101 #define TASK_STACK_SIZE 5000 #define TIME_BETWEEN_INTERRUPTS 1 /* 1 tick */ #define TASK_WORK_TIME 2 /* 2 ticks */ #define NUM_OF_GIVES 3 /* globals */ LOCAL SEM_ID semId = NULL; /* 信号量ID*/ LOCAL WDOG_ID wdId = NULL; /* 看门狗定时器ID */ LOCAL int syncTaskTid = 0; /*syncTask 的tid */ LOCAL int numToGive = NUM_OF_GIVES; /* semGive被调用的次数 */ /* forward declaratiuon */ void syncISR(int); void cleanUp (); void syncTask (); /***************************************************************************** * countingSemDemo - 主函数. 可以让用户选择信号量的类型 * * RETURNS: OK or ERROR * */ STATUS countingSemDemo (void ) { /*创建一个计数器 信号量,初始值为0,不可用*/ if ((semId = semCCreate (SEM_Q_PRIORITY, 0)) == NULL) { perror ("semCCreate"); return (ERROR); } /*创建一个看门狗定时器,模拟外部中断*/ 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() + ((TASK_WORK_TIME + 2) * numToGive)); cleanUp(); return (OK); } /***************************************************************************** * syncTask -运行的任务, 和模拟的外部中断同步 */ void syncTask (void) { int eventCount = 0; FOREVER { if (semTake (semId, WAIT_FOREVER) == ERROR) { perror ("syncTask semTake"); return; } taskDelay (TASK_WORK_TIME); semShow (semId,1); eventCount++; printf ("semaphore taken %d times\n", eventCount); } } /***************************************************************************** * syncISR - 模拟的外部中断,和运行中的任务同步 */ void syncISR ( int times ) { semGive (semId); times--; if (times > 0) wdStart (wdId, TIME_BETWEEN_INTERRUPTS, (FUNCPTR) syncISR, times); } /***************************************************************************** * cleanUP - 删除任务和模拟的中断,以及相关的资源,结束演示 */ void cleanUp () { if (syncTaskTid) taskDelete (syncTaskTid); if (semId) semDelete (semId); if (wdId) wdDelete (wdId); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -