www.mikrocontroller.net

Forum: Compiler & IDEs GCC für PowerPC 604, welche Register für ISR retten?


Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem. ich arbeite mit dem QNX Betriebssystem für 
einen embedded PowerPC (e300 Core). Nun muss ich eine Interrupt Routine 
für den UART machen. Mein Problem ist, dass ich nicht weiß welche 
Register der Compiler alle verwendet. Der Compiler basiert auf GCC 
2.95.3, ich weiß dass es irgendeine Festlegung geben muss welches 
Register wofür verwendet wird, leider finde ich aber keine Übersicht. r1 
wird wohl als Stackpointer missbraucht, aber über die anderen finde ich 
nichts. Vielleicht sinds ja nur 2 oder 3 Register die ich retten muss 
und nicht gleich alle...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  MasterFX (Gast)

>einen embedded PowerPC (e300 Core). Nun muss ich eine Interrupt Routine
>für den UART machen. Mein Problem ist, dass ich nicht weiß welche
>Register der Compiler alle verwendet. Der Compiler basiert auf GCC

Das geht dich als normalen C-Programmierer auch gar nichts an. Das macht 
der Compiler selber. Du hast nur Zugriff auf Variablen. Und das reicht 
auch, erst recht für den UART.

MFG
Falk

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann wüsste ich aber gerne wie ich eine InterruptRoutine programmiere. 
So wie es es nämlich sehe geht das weder mit Pragma noch mit 
__attribute__((interrupt("IRQ"))) wie es bei ARM der Fall ist. Zudem, 
wenn es mich nichts angehen würde, dann wüsste ich doch zu gerne woher 
ich hätte wissen sollen, dass r1 für den Stack verwendet wird. Außerdem 
muss ich am Anfang in Assembler programmieren.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Timmo H. (masterfx)

>Dann wüsste ich aber gerne wie ich eine InterruptRoutine programmiere.

Gibst da keine Doku oder Beispiele?

>Außerdem muss ich am Anfang in Assembler programmieren.

Warum?

MFG
Falk

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja weils wohl nicht anders geht. Mit C hat man nunmal keinen zugriff 
auf die DBATs und anderen CPU Register. Der e300 Core hat da so gewisse 
Eigenheiten. Zudem ist der Resetvektor nicht gerade groß und wie jeder 
weiß blähen Compiler gerne den Code auf. Auch die Leute die den Uboot 
für den Core Programmiert haben arbeiten anfangs mit Assembler.
Leider ist es nirgends dokumentiert, da QNX sich bei der Doku auf die 
QNX-Funktionen Bezieht, aber ich mache ja den Bootloader und da ist noch 
nichts mit QNX.

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerade in der GCC Newsgroup gefunden:

>>>>> Jeroen writes:

> I have a question regarding the interrupts on the PowerPC platform. Is it
> possible to let the compiler know some function is an interrupt handler? I
> read the documentation and saw things like __attribute((interrupt)) but
> these options only applied to certain platforms and where not for
> PowerPC.

  The PowerPC port of GCC does not provide any special features for
functions that will be used as interrupt handlers.  One can use the
generic features of GCC, but the PowerPC target of GCC does not adjust 
its
behavior specifically for interrupt handlers.

David

Tja, von wegen das macht alles der Compiler...

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab nochmal ein wenig rumdebuggt und da werden echt viele Register 
verwendet. Ist praktisch alles von r0-r10 und r20-r31 dabei. Das ist 
echt mist. sind ja dann quasi mindestens 96 Bytes die ich mir auf den 
Stack hauen muss. Zudem würde der Vektor nichtmal für das Retten und 
Wiederherstellen der Register reichen, zumindest nicht mit 
einzelbefehlen. Link Register und Control Register kommen ja auch noch 
dazu. Irgendwie speichert dieser blöde PowerPC noch nichtmal die 
Rücksprungadresse in der InterruptRoutine. Denn wenn ich dort nur rfi 
rein schreibe springt er scheinbar immer wieder zum resetvektor. Echt 
seltsam.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habs jetzt hinbekommen. Für diejenigen die es interessiert:
. = 0x500    #External Interrupt
#-----Register absichern-----
stwu  %r1, -32(%r1)  #Neuer Stack-Frame
stw   %r0, 0(%r1)    #r0 Register speichern
mfcr  %r0            #Condition Reg. auslesen
stw   %r0, 4(%r1)    #Condition Reg. speichern
mflr  %r0            #Link Register auslesen
stw   %r0, 8(%r1)    #Link Register speichern
stw   %r13,12(%r1)   #r13 sichern
    
  
#--Ende Register absichern---
  
bl  extern_interrupt_ISR  #Zur C-Funktion springen
  
#-----Register wiederherstellen-----
lwz   %r13, 12(%r1)
lwz   %r0, 8(%r1)
mtlr  %r0
lwz   %r0, 4(%r1)
mtcr  %r0
lwz   %r0, 0(%r1)
addi  %r1,%r1,32       #Stack wiederherstellen
#---Ende Register wiederherstellen--
rfi

Ob es reicht nur die obigen Register zu retten weiß ich nicht, aber 
abgeschmiert ist er bis jetzt noch nicht

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich habe gerade festgestellt, dass es scheinbar nicht reicht. r9,r11 
und r31 müssen auch noch gespeichert werden. Aber selbst das reicht 
wahrscheinlich nicht.
Es muss doch irgendwo beschrieben stehen welche Register alle zu retten 
sind. Ich meine die Leute die den Compiler basteln müssen doch irgendwo 
mal was festgelegt haben. Oder bin ich der einzige der Interrupts auf 
einem PowerPC verwendet?

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich denke ich habs jetzt gefunden. Da hier scheinbar niemand wusste 
wo es steht hier die Links:
http://refspecs.freestandards.org/elf/elfspec_ppc.pdf
http://www-01.ibm.com/chips/techlib/techlib.nsf/te...

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.