/* 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 30 /* globals */ /* counting or binary semaphore ID */ LOCAL SEM_ID semId = NULL; /* watchdog ID */ LOCAL WDOG_ID wdId = NULL; /* tid of syncTask */ LOCAL int syncTaskTid = 0; /* Number of times semGive is called */ LOCAL int numToGive = NUM_OF_GIVES; /* forward declaratiuon */ void syncISR(int);/* ISR to unblock syncTask */ void cleanUp (); /* cleanup routine */ void syncTask (); /* task that needs to be synchronized * with external events */ /****************************************** * countingSemDemo - demonstrates task synchronization using counting * semaphores. User can also select to use binary semaphore instead of * counting semaphore in this demonstration, for comparision between the two * semaphores. * * RETURNS: OK or ERROR * */ STATUS countingSemDemo ( char semType /* counting semaphore type 'c' or binary semaphore * type 'b' */) { switch (semType) { case 'c': case 'C': if ((semId = semCCreate(SEM_Q_PRIORITY,0)) == NULL) { perror ("semCCreate"); return (ERROR); } break; case 'b': case 'B': if ((semId = semBCreate(SEM_Q_PRIORITY,SEM_EMPTY)) == NULL) { perror ("semBCreate"); return (ERROR); } break; default: printf ("Unknown semType-- must be 'c' or 'b'\n"); 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); } /* watchdog simulates hardware interrupts */ if (wdStart (wdId, TIME_BETWEEN_INTERRUPTS,(FUNCPTR) syncISR, numToGive)== ERROR) { perror ("wdStart"); cleanUp (); return (ERROR); } /* arbitrary delay to allow program to complete before clean up */ taskDelay (sysClkRateGet() +((TASK_WORK_TIME + 2) * numToGive)); cleanUp(); return (OK); } /************************************************* * syncTask - synchronizes with interrupts using * counting or binarysemaphores. */ void syncTask (void) { int eventCount = 0; FOREVER { if (semTake (semId, WAIT_FOREVER) == ERROR) { perror ("syncTask semTake"); return; } /* Do "work" */ taskDelay (TASK_WORK_TIME); semShow (semId,1); eventCount++; printf ("semaphore taken %d times\n", eventCount); } } /************************************************ * syncISR - simulates a hardware device which generates interrupts very * quickly and synchronizes with syncTask using semaphores. */ void syncISR(int times) { semGive (semId); times--; if (times > 0) wdStart (wdId, TIME_BETWEEN_INTERRUPTS,(FUNCPTR) syncISR, times); } /******************************************** * cleanUP - deletes the syncTask, deletes the * semaphore and the watchdog timer previously created * by countingSemDemo.*/ void cleanUp () { if (syncTaskTid) taskDelete (syncTaskTid); if (semId) semDelete (semId); if (wdId) wdDelete (wdId); }
运行结果:
->sp countingSemDemo,'c'
Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 2 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 1 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 3 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 2 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 4 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 3 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 5 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 4 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 6 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 5 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 7 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 6 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 8 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 7 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 9 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 8 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 10 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 9 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 11 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 10 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 12 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 11 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 13 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 12 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 14 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 13 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 15 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 14 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 15 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 15 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 14 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 16 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 13 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 17 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 12 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 18 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 11 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 19 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 10 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 20 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 9 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 21 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 8 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 22 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 7 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 23 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 6 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 24 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 5 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 25 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 4 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 26 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 3 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 27 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 2 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 28 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 1 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 29 times Semaphore Id : 0x23ce9d0 Semaphore Type : COUNTING Task Queuing : PRIORITY Pended Tasks : 0 Count : 0 Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 30 times->sp countingCountDemo ‘b’
Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 1 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 2 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 3 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 4 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 5 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 6 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 7 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 8 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 9 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 10 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 11 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 12 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 13 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 14 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : FULL Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 15 times Semaphore Id : 0x23ce9d0 Semaphore Type : BINARY Task Queuing : PRIORITY Pended Tasks : 0 State : EMPTY Options : 0x1 SEM_Q_PRIORITY VxWorks Events -------------- Registered Task : NONE Event(s) to Send : N/A Options : N/A semaphore taken 16 times