Hallo, ich hab ein mehr oder minder schweres Problem. Ich versuch so weit wie es geht ein OS für ein Arduino-Due oder allgemein für den Atmel SAM3X8E zu programmieren. Deshalb benutze ich den gleich als Entwicklungsplattform. Das komplette Projekt kann man hier einsehen: https://github.com/CsharpLassi/DueOS So mein Problem ist wenn ich nur eine bestimmte Zeile (makierte Zeile) aus einer Funktion entferne macht meine Funktion was sie soll.
1 | irqstate* HandleSysCall(irqstate* state) |
2 | {
|
3 | uint32_t* addr = (uint32_t*)(state->pc -2); |
4 | uint8_t value = (*addr) & 0xFF; |
5 | |
6 | switch (value) |
7 | {
|
8 | case 0: |
9 | state = closecurrenttask(); |
10 | break; |
11 | case 1: |
12 | state->r0=(uint32_t)pmm_malloc(state->r0); // <<---- makierte Zeile |
13 | break; |
14 | default:
|
15 | break; |
16 | }
|
17 | |
18 | return state; |
19 | }
|
20 | |
21 | irqstate* handle_irq(irqstate* state) |
22 | {
|
23 | IPSR_Type type; |
24 | type.w = __get_IPSR(); |
25 | |
26 | switch (type.b.ISR) |
27 | {
|
28 | case 0: |
29 | case 1: |
30 | case 2: |
31 | break; |
32 | case 3: |
33 | case 4: |
34 | case 5: |
35 | case 6: |
36 | handle_fault_irq(type.b.ISR,state); |
37 | break; |
38 | case 15: |
39 | state = nexttask(state); |
40 | break; |
41 | case 16: |
42 | state = HandleSysCall(state); |
43 | break; |
44 | default : |
45 | break; |
46 | }
|
47 | |
48 | return state; |
49 | }
|
1 | asm_handle_irq: |
2 | mov r0, sp |
3 | add r0, #32 |
4 | push {r0}
|
5 | |
6 | push {r4-r11,lr}
|
7 | mov r3,lr |
8 | mov r0,sp |
9 | |
10 | bl handle_irq |
11 | |
12 | mov sp, r0 |
13 | mov lr, r3 |
14 | |
15 | pop {r4-r11}
|
16 | pop {r1} // altes lr
|
17 | pop {r0}
|
18 | sub r0, #32 |
19 | mov sp,r0 |
20 | |
21 | bx lr |
Zur Erklärung die Funktion asm_handle_irq wird bei einem Interrupt aufgerufen, um alle Register zu speichern. Die C-Funktionen übernehmen dann das speichern und viele andere Aufgaben. Damit hab ich jetzt schon Multithreading implementiert was auch ohne Probleme funktioniert. Aber wenn ich mein SysCall einbauen will für malloc kommt es beim ersten SystemTick zu einer Excetion und ich weiß nicht warum, weil der Code auch nicht ausgeführt wird. Wenn die Zeile drinnen ist bekomme ich eine Usage-Exception. Ich weiß das der Compiliere die beiden Funktionen zusammen nimmt, aber kennt jemand eine Limitierung der CPU was die Länge von Interrupts oder ähnlichem Angeht Ach Ja, wenn ich das Problem behoben hab kommt eine große Aufräumaktion was Namen von Funktionen angeht. viele dank und viele grüße Lassi