Forum: Compiler & IDEs Funktionen mit fester Adresse im Flash aufrufen


von Enrico (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>  asm volatile("push 16\n"

Eine Adresse 16 auf den Stack zu pushen macht auch ziemlich viel Sinn ;)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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();

von Enrico (Gast)


Lesenswert?

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?

von Rolf Magnus (Gast)


Lesenswert?

> "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
Noch kein Account? Hier anmelden.