Hallo, ich brauch mal dringend Hilfe, quäle mich schon zwei Tage mit dem Problem: Ich möchte mit C (oder Inline-Assembler) Funktionen ausführen, die sich an einer bestimmten Adresse im Flash-Speicher befinden. Meine bisherigen Versuche hatten mindestens die Folge, dass die UART ihren Dienst versagt hat. Ich habe 0 Ahnung warum. asm volatile("push 16\n" "push 17\n" "call 0x2000\n" "call 0x2100\n" "call 0x2200\n" "call 0x2300\n" "call 0x2400\n" "call 0x2500\n" "call 0x2600\n" "call 0x2700\n" "call 0x2800\n" "call 0x2900\n" "pop 17\n" "pop 16\n"::); ist einer meiner Versuche. Wäre echt dankbar, wenn da jemand ne Idee hat :) Liebe grüße, enrico
> asm volatile("push 16\n"
Eine Adresse 16 auf den Stack zu pushen macht auch ziemlich viel Sinn ;)
holger wrote: >> asm volatile("push 16\n" > > Eine Adresse 16 auf den Stack zu pushen macht auch ziemlich viel Sinn ;) Da man eine Adresse sowieso nicht pushen kann beim AVR, sondern nur ein Register, so pusht diese Anweisung sehr wohl das Register 16.
Interessant wäre sicherlich noch die Architektur. Was für ein Prozessor? Warum stehen eigentlich die Funktionen an festen Adressen? In GCC kannst du Funktionen an einer bestimmten Adresse aufrufen mit:
1 | ((void(*)(void))0x2000)(); |
2 | ((void(*)(void))0x2100)(); |
3 | [C] |
4 | |
5 | Oder etwas übersichtlicher: |
6 | |
7 | [C] |
8 | typedef void (*funcptr)(void); |
9 | ((funcptr)0x2000)(); |
10 | ((funcptr)0x2100)(); |
Oder noch übersichtlicher:
1 | typedef void (*funcptr)(void); |
2 | funcptr func1 = (funcptr)0x2000; |
3 | funcptr func2 = (funcptr)0x2100; |
4 | func1(); |
5 | func2(); |
Danke erstmal für den Beispielcode, werde ihn mal ausprobieren. Mein MC ist ein AVR, genauer ein ATMEGA32. Die Funktionen stehen an festen Adressen, da sie währen des Betriebes von einem Computer aus geschrieben werden sollen, der bereits fertigen hex-Code sendet. "Weiß" C eig. automatisch, dass das Adressen im Flash sind?
> "Weiß" C eig. automatisch, dass das Adressen im Flash sind? Dem gcc bleibt auf AVR-Prozessoren nichts anderes übrig, als das anzunehmen, da Code sowieo nur aus dem Flash ausgeführt werden kann.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.