Forum: Compiler & IDEs Semaphoren Kurze Erklärung.


von PEte (Gast)


Lesenswert?

Hi,
Ich habe gerade so meine Probleme einen Atmel Code zu verstehen. Den 
Multitasking scheduler habe ich mittlerweile fast verstanden.

Jeoch wird nach jedem Task die Funktion Scheduler_call_next_task() 
ausgeführt, der Sinn dahinter ist mir noch nicht klargeworden.
1
bit   scheduler_tick_flag;
2
#define Wait_semaphore(a) while(!(a)) (a) = FALSE
3
#define Scheduler_call_next_task()    Wait_semaphore(scheduler_tick_flag)
4
5
         Scheduler_task_1();
6
         Scheduler_call_next_task();
Was genau treibt diese Semaphore? Aus wiki werde ich auch nicht wirklich 
schlau.

von Uwe .. (uwegw)


Lesenswert?

Wo wird scheduler_tick_flag denn mal auf true gesetzt?

von nocheinGast (Gast)


Lesenswert?

Es wäre wahrscheinlich leichter zu antworten, wenn du uns den kompletten 
Code zeigen würdest und nicht nur ein paar Zeilen hinklatschst, die 
wahrscheinlich so nicht im Code dastehen...

von PEte (Gast)


Angehängte Dateien:

Lesenswert?

Naja ich habe halt gedacht das die paar Zeilen einfacher zu überblicken 
sind als der gesamte Code der über 20 dateien verstreut ist. Die 
wichtigsten sind im Anhang.

Es handelt sich um das USB Generic HID Beispiel von Atmel

http://www.atmel.com/dyn/resources/prod_documents/AVR328.zip

von Oliver (Gast)


Lesenswert?

PEte schrieb:
> Was genau treibt diese Semaphore?

Stichworte zum nachschlagen in deinem C-Buch:

while-Schleife
define-Makro
!-Operator

Oliver

von PEte (Gast)


Lesenswert?

Oliver schrieb:
> PEte schrieb:
>> Was genau treibt diese Semaphore?
>
> Stichworte zum nachschlagen in deinem C-Buch:
>
> while-Schleife
> define-Makro
> !-Operator
>
> Oliver

Ja die while schleife wird solange ausgeführt bis a = True (bzw. 
scheduler_tick_flag = True). Aber was soll das?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

PEte schrieb:
> Aber was soll das?

Interprozess-Synchronisation.

Wobei der zweite Prozess vermutlich ein Interruptkontext ist.  Musst
du halt gucken, wo scheduler_tick_flag noch so benutzt wird (ist
vermutlich durch das wirre Makro-Gewurschtel nicht offensichtlich).

von PEte (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Wobei der zweite Prozess vermutlich ein Interruptkontext ist.  Musst
> du halt gucken, wo scheduler_tick_flag noch so benutzt wird (ist
> vermutlich durch das wirre Makro-Gewurschtel nicht offensichtlich).

Der Witz ist ja das es nirgendwo gesetzt wird?! Ich habe diese sinnlosen 
Funktionen einfach alle mal rausgeworfen und es scheint immer noch zu 
funktionieren. Also die Programmierung dieser Beispiele mit dem 
"Makro-Gewurschtel ©" ist irgendwie ziemlich bescheuert.
Das Problem hat sich damit wohl gelöst.

Vielen Dank :))

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

PEte schrieb:

> Der Witz ist ja das es nirgendwo gesetzt wird?!

Das wiederum halte ich für ein Gerücht.  Wenn es nie gesetzt würde,
würde der Code an dieser Stelle "stehenbleiben".  Macht er aber
wohl nicht.

> Ich habe diese sinnlosen
> Funktionen einfach alle mal rausgeworfen und es scheint immer noch zu
> funktionieren.

"Absense of evidence is no evidence of absence.", fällt mir da nur ein.

Du kannst dir ja angucken, ob du mit LUFA besser zurecht kommst.

von micha (Gast)


Lesenswert?

PEte schrieb:
> Der Witz ist ja das es nirgendwo gesetzt wird?!

Schau die mal alle Timer an; mit Sicherheit wird dort das Flag gesetzt, 
ggf. nicht offensichtlich sondern über einen Alias/direkten 
Speicherzugriff

von Oliver (Gast)


Lesenswert?

Jörg Wunsch schrieb:
>> Der Witz ist ja das es nirgendwo gesetzt wird?!
>
> Das wiederum halte ich für ein Gerücht.  Wenn es nie gesetzt würde,
> würde der Code an dieser Stelle "stehenbleiben".  Macht er aber
> wohl nicht.

Kann schon sein, mit SCHEDULER_TYPE = SCHEDULER_FREE

1
#if SCHEDULER_TYPE != SCHEDULER_FREE
2
//! When SCHEDULER_TYPE != SCHEDULER_FREE, this flag control task calls.
3
bit   scheduler_tick_flag;
4
#endif
1
00185 #ifndef SCHEDULER_TYPE
2
00186   #error You must define SCHEDULER_TYPE in config.h file
3
00187 #elif SCHEDULER_TYPE == SCHEDULER_FREE
4
00188   #define Scheduler_set_tick_flag()
5
00189   #define Scheduler_reset_tick_flag()
6
00190 #elif SCHEDULER_TYPE == SCHEDULER_TIMED
7
00191   #define Scheduler_new_schedule()      Wait_semaphore(scheduler_tick_flag)
8
00192   #define Scheduler_set_tick_flag()     (scheduler_tick_flag = TRUE)
9
00193   #define Scheduler_reset_tick_flag()   (scheduler_tick_flag = FALSE)
10
00194 #elif SCHEDULER_TYPE == SCHEDULER_TASK
11
00195   #define Scheduler_call_next_task()    Wait_semaphore(scheduler_tick_flag)
12
00196   #define Scheduler_set_tick_flag()     (scheduler_tick_flag = TRUE)
13
00197   #define Scheduler_reset_tick_flag()   (scheduler_tick_flag = FALSE)
14
00198 #elif SCHEDULER_TYPE == SCHEDULER_CUSTOM
15
00199   #error Make sure you have setup macro/fct Scheduler_new_schedule & Scheduler_call_next_task
16
00200   #define Scheduler_set_tick_flag()     (scheduler_tick_flag = TRUE)
17
00201   #define Scheduler_reset_tick_flag()   (scheduler_tick_flag = FALSE)
18
00202 #endif

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oliver schrieb:

> Kann schon sein, mit SCHEDULER_TYPE = SCHEDULER_FREE
>
>
>
1
> #if SCHEDULER_TYPE != SCHEDULER_FREE
2
> //! When SCHEDULER_TYPE != SCHEDULER_FREE, this flag control task calls.
3
> bit   scheduler_tick_flag;
4
> #endif
5
>

Dann wird der gezeigte Code aber vermutlich bei SCHEDULER_TYPE ==
SCHEDULER_FREE gar nicht erreicht.  Schau dir mal das Ergebnis des
Präprozessors an (Dateiname.i, wenn du --save-temps benutzt, oder
Compileroption -E).

von PEte (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Dann wird der gezeigte Code aber vermutlich bei SCHEDULER_TYPE ==
> SCHEDULER_FREE gar nicht erreicht.  Schau dir mal das Ergebnis des
> Präprozessors an (Dateiname.i, wenn du --save-temps benutzt, oder
> Compileroption -E).

Ja danke für den Tipp bin auch gerade zur selben Zeit drüber gestolpert. 
Aber mal im Ernst, zwei makros inneinander verschachtelt um eine normale 
Funktion aufzurufen das ist doch schon ein bisschen sinnfrei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.