mikrocontroller.net

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


Autor: Enrico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  asm volatile("push 16\n"

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
((void(*)(void))0x2000)();
((void(*)(void))0x2100)();
[C]

Oder etwas übersichtlicher:

[C]
typedef void (*funcptr)(void);
((funcptr)0x2000)();
((funcptr)0x2100)();

Oder noch übersichtlicher:
typedef void (*funcptr)(void);
funcptr func1 = (funcptr)0x2000;
funcptr func2 = (funcptr)0x2100;
func1();
func2();

Autor: Enrico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.