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

📄 countingsemdemo.c

📁 2410/vxworks/tornado下的基本实验包括 serial,ramdrv,interrupt,multi-tasking,FTP,TCP,UDP
💻 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 + -