moin,
möchte ein einfaches Multitasking Programm für den msp430 schreiben,
welches per Interrupt zwischen den Tasks wechselt. Es geht hier eher um
erlernen von Dingen als um möglichst praktisch und effizient zu fahren.
Ich weiss ungefähr was ich machen muss, nur die Assembler Kenntnisse
sind kaum bis garnicht vorhanden.
Ich bin jetzt soweit, dass ich während ich Tasks a la
1 | void tBlink ()
|
2 | {
|
3 | while (1)
|
4 | {
|
5 | P1OUT ^= LEDrt;
|
6 | wait_ms(1000);
|
7 | }
|
8 | }
|
habe und eine "Stack Struktur"
1 | struct stack
|
2 | {
|
3 | unsigned short reg[16];
|
4 | }stack[5];
|
5 | [/c
|
6 |
|
7 | des weiteren habe ich ein Functionpointer-array dass mir die Adressen der Funktionen zeigt
|
8 | [c]
|
9 | typedef void (* fnt_ptr) (void);
|
10 | fnt_ptr task_list[5];
|
mit
1 | task_list[0] = tBlink;
|
2 | task_list[1] = tBlink2;
|
3 | task_list[2] = tPWM;
|
Ich bin jetzt soweit, dass ich zumindest den Task wechseln kann, aber
eben immer am Anfang beginne, nicht dort wo ich rausgesprungen bin. Auch
das Löschen des stacks bekomm ich nicht so ganz hin
1 | asm(" mov.w r0, reg_buff\n"); // Program Counter
|
2 | stack[task_nr].reg[0] = reg_buff;
|
3 | asm(" mov.w r1, reg_buff\n"); // Stack Pointer
|
4 | stack[task_nr].reg[1] = reg_buff;
|
5 | asm(" mov.w r2, reg_buff\n"); // Status Register
|
6 | stack[task_nr].reg[2] = reg_buff;
|
7 | asm(" mov.w r3, reg_buff\n"); // CG Register
|
8 | stack[task_nr].reg[3] = reg_buff;
|
9 | asm(" mov.w r4, reg_buff\n"); // GP Register
|
10 | stack[task_nr].reg[4] = reg_buff;
|
11 | //... usw bis r15
|
12 |
|
13 | /*
|
14 | * Stackeinträge löschen wegen überlauf undso
|
15 | */
|
16 |
|
17 | reg_buffer = (unsigned short) task_list[task_nr];
|
18 | reg_buff = stack[task_nr].reg[2];
|
19 | asm (" push.w reg_buff\n");
|
20 | asm (" reti\n");
|
Er speichert mir eben die Register die er gerade hat, nicht die die auf
dem Stack liegen (denke ich mal), denn beim Debuggen springt er mir,
wenn ich
1 | reg_buff = stack[task_nr].reg[0];
|
2 | asm (" push.w reg_buff\n");
|
schreibe, in die ISR zurück, was schwachsinn ist.
Mir fehlt also eine Funktion "read_stack()" die mir wirklich die auf dem
Stack befindlichen PC und SR liest.
Und noch eine art "pop()" die mir PC und SR vom Stack entfernt.
Die Register SP, R4 bis R15 interargieren im Interrupt ja nicht wirklich
mit dem Stack oder? hörte sich im Datenblatt mal so an.
Danke im Voraus für jede Hilfe :)