2011-01-06 10 views
0

Für eine gewöhnliche Binärsemaphore, eine Aufgabe einem externes Ereignis zu synchronisieren versuchen, erstellt eine leere Semaphore .... Eine zweite Aufgabe, die steuert das Synchronisationsereignis die Semaphore gibt, wenn es nicht mehr benötigt wird .Welche Aufgabe soll in diesem Beispiel erstellt werden?

#include "vxWorks.h" 
#include "semLib.h" 

#define T_PRIORITY 50 


SEM_ID syncExampleSem; // named semaphore object 

void initialize (void) 
{ 

    // set up FIFO queue with emtpy binary semaphore 

syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY); 

    // create task1 
    taskSpawn ("task1", T_PRIORITY, 0, 10000, task1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 

    // create task2 
    taskSpawn ("task2", T_PRIORITY, 0, 10000, task2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 

} 

void task1 (void) 
{ 
    // stay here until semaphore becomes available 
    semTake (syncExampleSem, WAIT_FOREVER); 


    // do something 

} 



void task2 (void) 
{ 
    // do something 



    // now let task1 execute 
    semGive (synExampleSem); 

} 

Meine Frage ist, warum ich nicht die erste Aufgabe sehe die leeren Semaphore erstellen, wie beschrieben? (Es sieht so aus, als wäre es nur "generisch" in der Hauptfunktion?) "eine Aufgabe, die versucht, mit einem externen Ereignis zu synchronisieren, erstellt einen leeren Semaphor".

Auch ich sehe nicht wirklich, wie die zweite Aufgabe ist, die Synchronisation zu "kontrollieren"?

Vielen Dank.

Siehe: Beispiel für die Synchronisation über binäre Semaphore
http://www.cross-comp.com/instr/pages/embedded/VxWorksTutorial.aspx#VxWorks%20Programming

Antwort

3

Es ist ein Fehler im Beispiel. Die erste Zeile in initialize sollte syncExampleSem zuweisen.

Die zweite Task "steuert" die Synchronisation, da Task 1 erst dann ausgeführt werden kann, wenn Task 2 den Semaphor "gibt". Es spielt keine Rolle, wo der Semaphor erstellt wird, solange er garantiert erstellt wird, bevor eine der beiden Aufgaben versucht, sie entweder zu geben oder zu übernehmen.

Da diese speziellen Tasks parallel ausgeführt werden, wird sie in initialize erstellt, denn wenn sie von Task 2 erstellt wurde, besteht das Risiko, dass Task 1 auf den Semaphor wartet, bevor er existiert, und umgekehrt, wenn er von Task erstellt wird 1 Sie riskieren, dass Task 2 den Semaphor gibt, bevor er existiert.

+0

Ich fragte mich auch über diese erste Linie danke. Bezüglich des Semaphors, der in Aufgabe 1 oder 2 erstellt wird, sehe ich das Problem, das Sie beschrieben haben. Bedeutet dies, dass der Wortlaut in diesem Beispiel falsch ist, oder sehe ich es falsch an? –

+0

Das Beispiel ist im Vergleich zum Code schlecht formuliert. Nach meiner Erfahrung werden Semaphoren fast immer außerhalb der Aufgaben initialisiert, die sie verwenden, es sei denn, Sie haben eine spezielle Situation, bei der eine Aufgabe aus einer anderen hervorgeht. –

1

SemTake und SemGive geben Fehler zurück (da das Semaphor nicht existiert). Es ist nützlich, die Rückkehrcodes bei Systemaufrufen zu überprüfen.