Forum: Compiler & IDEs CPU Register speichern vor Inline Assembler PPC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin S. (drunkenmunky)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

für eine Initialsierung eines RAM Bereiches muss ich Inline Assembler 
verwenden (wegen des 64-bit Schreibbefehls). Das Problem ist dass dafür 
CPU Register verwendet werden, diese aber nicht vom Compiler gespeichert 
bzw. wiederhergestellt werden und somit es danach zu Problemen kommt.

Gibt es eine Möglichkeit den Compiler anzuweisen dies zu tun für 
vor/nach dem Inline Assembler Code oder muss ich dies manuell machen?

Compiler: Greenhills 2017 für PPC
Target: ST SPC58

Vielen Dank im Voraus!

von A. K. (prx)


Bewertung
0 lesenswert
nicht lesenswert
Wenn man schon in Inline-Assembler programmiert, dann sollte es doch 
möglich sein, die Register darin selbst zu sichern.

Ausserdem solltest du erst einmal rausfinden, welche Register überhaupt 
gesichert werden müssen. Es gibt nämlich in Funktionen ein paar 
Register, die frei nutzbar sind - wenn dieses Inline-Asm Stück eine 
separate Funktion darstellt. Dieses ABI wird vom Compiler definiert und 
steht in dessen Handbuch.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Wenn man schon in Inline-Assembler programmiert, dann sollte es doch
> möglich sein, die Register darin selbst zu sichern.

Eigentlich sollte ein Compiler auch die Möglichkeit unterstützen, ihm zu 
sagen, dass man im Inline-Assembler Register braucht, und er kümmert 
sich dann selbst darum, die bereitzustellen. Geht das bei diesem nicht?

von Joerg W. (joergwolfram)


Bewertung
0 lesenswert
nicht lesenswert
Ich mache die Initialisierung für das ECC-RAM schon im Startup-Code, da 
ist eh noch alles in Assembler.
Was vielleicht ginge, Register über Aufrufparameter zu "reservieren". 
Dazu braucht man aber das Disassembly (wenn der Compiler das hergibt). 
Ich kann es jetzt nur so beschreiben, wie es mit dem GCC geht.

Wenn es nur darum geht, das ECC-RAM zu initialisieren, reichen zwei 
Register aus (Adresse und Zähler), das Überschreiben mit 0 kann man 
hinterher auch in C 32-Bit-weise machen.
Wenn Du deiner Funktion zwei Parameter übergibst (Pointer und Langwort) 
und das Disassembly anschaust , sollten sich die Parameter-Register 
herausfinden lassen.
void init_ram(unsigned long *ptr,unsigned long size)
{
        *ptr = size;                //Dummy-Funktionalität, um die Register zu bestimmen
        asm volatile ("se_or 2,2"); //verhindert Wegoptimierung, ist praktisch ein NOP
}

Jörg

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.

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