Hallo
ich habe diesen Code gefunden und einmal ausgeführt. Ich kann hier
irgendwie nicht wirklich nachvollziehen was gemacht wird.
1)Der Task4 wurde als letzter kreiert aber als erster ausgeführt und
danach wurde er nicht mehr ausgeführt.
2) Danach wurde Task 1 ausgeführt usw....
Mir ist irgendwie unklar wie da vorgegangen wurde.
3) Wieso wurde der Interrupt nie ausgeführt.
4)Wie läuft das genau mit dem System Tick ab. 3 Tasks wurden während
einem System Tick ausgeführt. Ich habe gedacht dass immer bei einem
System Tick ein Task ausgeführt wird. Kann das nicht ganz nachvollziehen
was alles während einem System Tick passiert.
Hoffe ihr könnte mir bisschen helfen. C ist irgendwie verständlicher
nachzuvollziehen.
OSler schrieb:> C ist irgendwie verständlicher> nachzuvollziehen.
Komisch, für mich sieht das nach lupenreinem C aus.
Ansonsten: RTFM
Zur Beantwortung deiner Fragen wird dir nichts anderes übrig blieben,
als die Doku zu uCOS durchzuarbeiten. Da steht garantiert drin, was uCOS
im generellen und die benutzten Funktionen im einzelnen so tun.
Oliver
Und vor allen Dingen nicht davon ausgehen, dass es irgendeine bevorzugte
Task Reihenfolge (ausser diejenige die man selbst durch Task-Prioritäten
festlegt) gibt.
> 1)Der Task4 wurde als letzter kreiert aber als erster ausgeführt
Dafür gibt es sicherlich irgendeine Erklärung, wenn man sich den uCOS
Code ansieht. Aber im Allgemeinen ist diese Information nutzlos, weil
man sich in der Multitasking-Programmierung sowieso nicht darauf
verlassen kann/darf/soll
> und danach wurde er nicht mehr ausgeführt.
Doch ausgeführt wird er eigentlich schon. Der Task hat sich nur selber
suspendet. Technisch gesehn existiert er noch, nur schläft er die ganze
Zeit und wartet wie Dornröschen darauf, dass jemand kommt und ihn
aufweckt (resumed)
> 2) Danach wurde Task 1 ausgeführt usw....
Nicht danach.
Mehr oder weniger zeitgleich.
Wie gesagt: Geh nicht von fixen Reihenfolgen aus. Damit erleidet man in
der Multitasking Programmierung maximal Schiffbruch.
> 4)Wie läuft das genau mit dem System Tick ab. 3 Tasks wurden> während einem System Tick ausgeführt. Ich habe gedacht dass immer> bei einem System Tick ein Task ausgeführt wird.
Nö. Dieser 'System Tick' ist nichts anderes als die Systemuhr. Ein
{ printf("%4u: ***** Test Task 11 *****\n", OSTime);
ist ja wohl kaum miszuverstehen.
Und das alle Tasks in 1 Zeiteinheit nur 1 mal drann kommen, sollte auch
nicht verwundern, da sich jeder einzelne dieser Tasks offenbar mittels
OSTimeDly(1);
für 1 Zeiteinheit schlafen legt.
Das sind aber eigentlich alles ziemlich offensichtliche Dinge, die klar
und deutlich im Code stehen, wenn man ihn nur genau genug und aufmerksam
liest.
irqGenerator ist enweder ein Hinweis auf einen Funktionsaufruf oder
überhaupt ein eigenständiges Programm, mit dem man so einen Interrupt
auslösen kann, so dass dieses Programm dann darauf reagiert.
Hallo
mich würden noch zwei Sachen interessieren.
1) Wenn uberall die gleiche Priorität ist wieso wird immer nur der erste
Task ausgelöst obwohl es den längsten Delay hat.
2) Beim System Clock 0 werden da immer alle Tasks ausgelöst in
Abhängigkeit von der Priorität.
Danke!
MfG
Ich habe mich vor längerer Zeit (ca. 4 Jahren) intensiv mit ucos
beschäftigt. Daher das nachfolgende aus der Erinnerung.
1. Bei ucos muss jedem Task eine Priorität vergeben werden. Diese darf
nicht identisch mit den anderen sein. ucos unterstützt nicht
round-robin. Dies steht alles in dem Buch über ucos. War zwar nicht
preisgünstig aber lohnt sich auf jeden Fall. Hat mir auch unheimlich bei
der Portierung geholfen.
2. Ich habe Deinen Code jetzt nicht getestet. Kann es sein, dass Dein
Programm hierdurch
1
OSSemPend(Sem1,0,&err2);
hängen bleibt. Soweit ich weiss wird mit OSSemPend die Semaphore
angefordert. Das geschieht im selben Task 2mal. Wenn jetzt zufällig ein-
und derselbe Task 2mal hintereinander die Semaphore anfordert und sich
selber blockiert. Ich kann mich aber nicht daran erinnern, ob ucos das
abfängt wenn derselbe Task die Semaphore 2mal anfordert.
3. Eine andere Möglichkeit wäre wenn printf über Interrupt ausgeführt
wird. Genau dieses Problem hatte ich auch. In eigenen Interrupt-Routinen
müssen noch besondere Verriegelungen erfolgen. Steht aber auch alles in
dem Buch.
Ucos finde ich hochinteressant. Aber ohne diese Buch ist man meiner
Meinung nach aufgeschmissen.
Viele Grüße
Andreas
Ich habe mir gerade nochmal Deine Interrupt-Routine angesehen. Das kann
nicht funktionieren. Ucos legt für jeden Task einen eigenen Stack an.
Dahin müssen alle Register gesichert werden. Bei mir sieht das so wie
unten aus und funtkioniert auch:
1
UCOSISR(SIG_INTERRUPT0)
2
{
3
PushRS();
4
OSIntEnter();
5
if(OSIntNesting==1)
6
OSTCBCur->OSTCBStkPtr=(OS_STK*)SP;
7
sei();
8
OSSemPost(Task1Sem);// Notify Task1
9
OSIntExit();
10
PopRS();
11
}
12
13
#define UCOSISR(signame) \
14
void signame (void) __attribute__ ((naked)); \
15
void signame (void)
16
17
/*
18
* Macros for pushing and popping registers in application ISRs.
19
*
20
* Do not use pushregs(), pushrampz(), pushsreg() directly.
21
*
22
* Use PushRS() and PopRS() in application programs.