Servus zusammen,
ich sitze an folgendem Problem:
Der Linker meldet mir eine "Undefined reference", er kann also ein Symbol nicht auflösen.
Ich benötige die Adresse eines Labels, die ich einer Variablen zuweisen möchte. Und genau dieses
Label moniert er an, daß er es nicht findet.
SW: GCC 4.2.8 für Coldfire CPU
Genauer gesagt geht es um folgendes: Ich möchte uCos-II (ein embedded OS) für unsere Embedded Hardware
(Coldfire 5307) anpassen. Das läuft soweit, leider bin ich gezwungen meine ISRs in Assembler zu schreiben,
was ich umgehen möchte - C ist mir da lieber.
Wenn ich allerdings eine ISR in C schreibe:
dann erzeugt GCC folgenden Assembler-Code:
Er rettet also vier Register auf den Stack und kurz vor dem Rücksprung (rte) restauriert er sie wieder.
Das wäre so okay, wenn uCos damit nicht ein Problem hätte. Ich MUSS nämlich als erstes die Interrupts ausschalten,
bin also gezwungen bevor der Compiler zum Zug kommt ein "move.w #0x2700,sr" zu machen. Ich benötige also die volle Kontrolle.
Jetzt habe ich gesehen, daß eine Firma, die uCos mit ihrer Hardware verkauft da ein Macro gebastelt hat, dessen Aufruf
so aussieht: INTERRUPT(meineFunktion, meinStatusRegister).
Also z.B.
Jetzt weiß ich aber nicht, wie das Macro aussieht, habe mich mit dem Preprozessor etwas weiter beschäftigt und folgendes konstruiert:
Wenn ich mir das Disassemblat in unserem Lauterbach ICD anschaue, sieht das prima aus. Er zeigt mir auch das Label OSManagerTimerTick (das mein Einsprungpunkt in die ISR sein soll) an.
Im Headerfile definiere ich dann in 'OSManager.h':
Die Funktion sieht dann so aus in 'OSManager.c':
In dem File, in dem auch mein main() liegt mach ich dann:
Andere Funktionen aus OSManager werden gefunden, kann also kein Datei-ist-nicht-im-Suchpfad Problem sein.
Da das ganze wohl nicht auf den ersten Blick verständlich ist, habe ich halt etwas weiter ausgeholt.
Any idea?
Thanx, Arne
ich sitze an folgendem Problem:
Der Linker meldet mir eine "Undefined reference", er kann also ein Symbol nicht auflösen.
Ich benötige die Adresse eines Labels, die ich einer Variablen zuweisen möchte. Und genau dieses
Label moniert er an, daß er es nicht findet.
SW: GCC 4.2.8 für Coldfire CPU
Genauer gesagt geht es um folgendes: Ich möchte uCos-II (ein embedded OS) für unsere Embedded Hardware
(Coldfire 5307) anpassen. Das läuft soweit, leider bin ich gezwungen meine ISRs in Assembler zu schreiben,
was ich umgehen möchte - C ist mir da lieber.
Wenn ich allerdings eine ISR in C schreibe:
dann erzeugt GCC folgenden Assembler-Code:
Er rettet also vier Register auf den Stack und kurz vor dem Rücksprung (rte) restauriert er sie wieder.
Das wäre so okay, wenn uCos damit nicht ein Problem hätte. Ich MUSS nämlich als erstes die Interrupts ausschalten,
bin also gezwungen bevor der Compiler zum Zug kommt ein "move.w #0x2700,sr" zu machen. Ich benötige also die volle Kontrolle.
Jetzt habe ich gesehen, daß eine Firma, die uCos mit ihrer Hardware verkauft da ein Macro gebastelt hat, dessen Aufruf
so aussieht: INTERRUPT(meineFunktion, meinStatusRegister).
Also z.B.
Jetzt weiß ich aber nicht, wie das Macro aussieht, habe mich mit dem Preprozessor etwas weiter beschäftigt und folgendes konstruiert:
Wenn ich mir das Disassemblat in unserem Lauterbach ICD anschaue, sieht das prima aus. Er zeigt mir auch das Label OSManagerTimerTick (das mein Einsprungpunkt in die ISR sein soll) an.
Im Headerfile definiere ich dann in 'OSManager.h':
Die Funktion sieht dann so aus in 'OSManager.c':
In dem File, in dem auch mein main() liegt mach ich dann:
Andere Funktionen aus OSManager werden gefunden, kann also kein Datei-ist-nicht-im-Suchpfad Problem sein.
Da das ganze wohl nicht auf den ersten Blick verständlich ist, habe ich halt etwas weiter ausgeholt.
Any idea?
Thanx, Arne