Semaphoren Kurze Erklärung.

Gast #2206013
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.
Gast #2206071
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?
Gast #2206085
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 :))
Moderator Persönliche Seite #2206092
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.
Gast #2206173
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
Moderator Persönliche Seite #2206193
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).
Gast #2206417
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren