vxWorksの2値信号量の例
4253 ワード
semLibバージョンvxWorks 6.8のソースコードの場所は\WindRiver 3.8\vxworks-6.8\target\usr\src\wind\semLib.c
テストの例を次に示します.
テストの例を次に示します.
#include "vxWorks.h"
#include "taskLib.h"
#include "semLib.h"
#include "stdio.h"
#include "sysLib.h"
SEM_ID semId;
LOCAL SEM_ID semId1; /* semaphore id of binary semaphore 1 */
LOCAL SEM_ID semId2; /* semaphore id of binary semaphore 2 */
LOCAL BOOL notDone; /* flag to indicate completion */
LOCAL STATUS taskA ();
LOCAL STATUS taskB ();
//
STATUS TestBSem()
{
notDone = TRUE;
/* semaphore semId1 is availble after creation*/
if ((semId1 = semBCreate (SEM_Q_PRIORITY, SEM_FULL)) == NULL)
{
perror ("synchronizeDemo: Error in creating semId1 semaphore");
return (ERROR);
}
/* semaphore semId2 is not available after creation*/
if ((semId2 = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY)) == NULL)
{
perror ("synchronizeDemo: Error in creating semId2 semaphore");
return (ERROR);
}
/* Spwan taskA*/
if (taskSpawn ("tTaskA", 98, 0, 5000, (FUNCPTR) taskA, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR)
{
perror ("synchronizeDemo: Error in spawning taskA");
return (ERROR);
}
/* Spwan taskB*/
if (taskSpawn ("tTaskB", 98, 0, 5000, (FUNCPTR) taskB, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR)
{
perror ("synchronizeDemo: Error in spawning taskB");
return (ERROR);
}
/* Polling is not recommended. But used for simple demonstration purpose */
while (notDone)
{
taskDelay (sysClkRateGet()); /* wait here until done */
}
/* Delete the created semaphores */
if (semDelete (semId1) == ERROR)
{
perror ("syncronizeDemo: Error in deleting semId1 semaphore");
return (ERROR);
}
if (semDelete (semId2) == ERROR)
{
perror ("syncronizeDemo: Error in deleting semId1 semaphore");
return (ERROR);
}
printf ("
synchronizeDemo now completed
");
return (OK);
}
/*****************************************************************************
* taskA - executes event A first and wakes up taskB to excute event B next
* using binary semaphores for synchronization.
*
* RETURNS: OK or ERROR
*
*/
LOCAL STATUS taskA ()
{
int count;
for (count = 0; count < 3; count++)
{
if (semTake (semId1, WAIT_FOREVER) == ERROR)
{
perror ("taskA: Error in semTake");
return (ERROR);
}
printf ("taskA: Started first by taking the semId1 semaphore - %d times
",
(count + 1));
printf("This is task <%s> : Event A now done
", taskName(taskIdSelf()));
printf("taskA: I'm done, taskB can now proceed; Releasing semId2 semaphore
");
if (semGive (semId2) == ERROR)
{
perror ("taskA: Error in semGive");
return (ERROR);
}
}
return (OK);
}
/*****************************************************************************
* taskB - executes event B first and wakes up taskA to excute event A next
* using binary semaphores for synchronization.
*
* RETURNS: OK or ERROR
*
*/
LOCAL STATUS taskB()
{
int count;
for (count = 0; count < 3; count++)
{
if (semTake (semId2,WAIT_FOREVER) == ERROR)
{
perror ("taskB: Error in semTake");
return (ERROR);
}
printf ("taskB: Synchronized with taskA's release of semId2 - %d times
",
(count + 1 ));
printf("This is task <%s> : Event B now done
", taskName (taskIdSelf()));
printf("taskB: I'm done, taskA can now proceed; Releasing semId1 semaphore
");
if (semGive (semId1) == ERROR)
{
perror ("taskB: Error in semGive");
return (ERROR);
}
}
notDone = FALSE;
return (OK);
}