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!
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
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?
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.
1 | void init_ram(unsigned long *ptr,unsigned long size) |
2 | {
|
3 | *ptr = size; //Dummy-Funktionalität, um die Register zu bestimmen |
4 | asm volatile ("se_or 2,2"); //verhindert Wegoptimierung, ist praktisch ein NOP |
5 | }
|
Jörg
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.