www.mikrocontroller.net

Forum: Compiler & IDEs Addressierung section-Grenzen


Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich passe hier gerade den gcc fuer ein Controllerboard mit einem 68k 
Prozessor an. Der vom Compiler erzeugte Code soll mal im Speicherbereich 
0x200000 laufen und der Linker erzeugt dafuer auch seinen Code. Soweit 
alles gut und richtig.

Nach einem Reset befindet sich das Programm aber an der Adresse 0x00000. 
Das ist notwendig weil die CPU sich dort ihren Resetvektor herholt.

Mit anderen Worten der Code laeuft also auf einer Adresse fuer die er 
nicht uebersetzt wurde. Das ist erstmal kein Problem! Allerdings sollte 
das so schnell wie moeglich geaendert werden. Dazu kopiere ich etwas 
Assemblercode aus meinem Flashrom in das Ram des Prozessor und starte 
das dort.
Damit werden dann CS-Leitungen an dem Prozessor umgeschaltet und das 
Flashrom befindet sich danach an seiner richtigen Stelle. Jetzt muss ich 
aber noch vom Ram wieder zurueck in das Flashrom springen.

Das sieht so aus:

  asm("jmp _to_rom");

Der Compiler weiss aber leider nicht das der Code in ein Ram kopiert 
werden soll das ganz woanders liegt. Als Folge erzeugt er mir immer 
einen PC-relativen Sprung und kein jmp mit einer absoluten Adresse.

Ich koennte jetzt mit Attribute section dem Compiler sagen das dieser
Code fuer eine bestimmte Section uebersetzt werden soll und dann erzeugt 
er den richtigen Sprung. Leider liegt der Code dann aber nicht mehr in 
meinem Flashrom an der richtigen Stelle und meine Kopierfunktion bekommt 
keine Adresse um die Funktion zu kopieren.

Hat einer eine Idee wie man das am elegantesten loesen kann?

Meine aktuelle Loesung sieht so aus das ich statt obiger Zeile einfach 
dies hier schreibe:

  asm("jmp %c0" : : "g" (0x2201c0)  );

Allerdings muss ich mir dann die Adresse aus dem Assembleroutput des 
Compilers selber besorgen und in mein Programm eintragen. Und natuerlich 
jedesmal neu wenn sich etwas an der Laenge des PRogramms geaendert hat.
Mit anderen Worten inakzeptabler Pfusch.

Olaf

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.