Hallo ich schon wieder ^^ Meine Frage diesmal kurz und bündig. Ich will mit meinem LPC2148 ein C-Projekt einspielen welches allerdings Assemblerroutinen Public zur verfügung stellt und das unter Keil AARM. Bsp. NO_INT EQU 0xC0 AREA FLASH, CODE, READONLY PUBLIC OS_CPU_SR_Save OS_CPU_SR_Save PROC CODE32 ; Set IRQ and FIQ bits in CPSR to disable all interrupts MRS R0,CPSR ORR R1,R0,#NO_INT MSR CPSR_c,R1 ; Confirm that CPSR contains the proper interrupt disable flags MRS R1,CPSR AND R1,R1,#NO_INT CMP R1,#NO_INT ; Not properly disabled (try again) BNE OS_CPU_SR_Save ; Disabled, return the original CPSR contents in R0 BX LR ENDP END Um diese Routine durchführen zu können muss ich davor eine Routine haben welche mich in den SVC Mode versetzt. Mein Ansatz währe folgender: AREA FLASH, CODE, READONLY PUBLIC SwitchToSVC SwitchToSVC PROC CODE32 MSR CPSR_cxsf, #0xD3 ENDP END in einer C Datei sag ich dem Linker bescheid das die Funktionen extern sind extern void OS_CPU_SR_Save(void); extern void SwitchToSVC(void); doch erhalte die Fehlermeldung: ***WARNING L23: UNRESOLVED EXTERNAL SYMBOLS ***ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: OS_CPU_SR_Save?T ADDRESS: 000003AAH keine Ahnung was ich nun tun soll ^^
Tip am Rande: Philips Application Note 10414. Meine Schlussfolgerung: IRQ und FIQ nicht mit einem einzelnen Befehl zusammen ausschalten, sondern nacheinander. Die Latenzzeit des FIQ und ggf. der IRQ Handler müssen sonst dafür büssen. Was hat es eigentlich mit dem Retry bei "Not properly disabled" auf sich?
Welcher Befehl wird deiner Ansicht nach direkt nach dem MSR in SwitchToSVC ausgeführt? PS: Ich weiss, dass all dies nicht mit deinem unmittelbaren Problem zu tun hat - Keil ist allerdings nicht mein Ding. Die AN10381 legt jedoch nahe, dass auch Keil mit Assembler-Code im C-Quelltext zurecht kommt. Meist der weit einfachere Ansatz als ein getrenntes ASM-File.
Vesuch mal rauszukriegen, ob das "?T" ein Ausdruck der Verwunderung des Linkers ist, oder Bestandteil vom Namen der gesuchten Funktion. In letzterem Fall könnte es erfolderlich sein, die Funktion in C so zu deklarieren, dass der Namen ohne diese Verzierung verwendet wird. Das wiederum könnte im Handbuch stehen.
Mein Tip wäre, dass das ?T für Thumb steht. Der Fehler tritt an Adresse 0x3AA auf - dort liegt also Thumb Code ("ungerade" Adresse, also nicht == 0 % 4). Da der aufrufende Code Thumb ist brauchst du Interworking, um die in ARM geschriebene Assembler-Routine aufrufen zu können. Bei C Funktionen dürfte das der Compiler selbst machen, bei Assembler-Routinen wirst du ihm das sagen müssen oder selbst machen müssen. Die Möglichkeit, die Assembler-Routine in Thumb zu codieren besteht nicht, da du dort keinen Zugriff auf CPSR hast. Gruss, Dominic
Hallo Leute. Danke zuerst mal an euren Postings. Es scheint ihr habt mich alle zusammen die richtige Richtung gewiesen. Also das mit dem "?T" deutet eindeutig auf den THUMB-Code hin. Der Sourcecode aus der AN10381 hat mit in sofern geholfen das mir an dieser Stelle was aufgefallen ist: PUBLIC isr_ext?A EXTERN CODE32 (ext?A) isr_ext?A PROC CODE32 Merkt ihr's ??? FUNC"?A" Ein paar versuche und eine genauere Untersuchung der Falsh Settings brachte mich darauf das der Keil defaultmässig THUMB Code erzeugt und man das entsprechende Häckchen einfach deaktiviert. Nun Folgende Veränderungen: AREA OSCPUSRSave, CODE PUBLIC __OSCPUSRSave?A __OSCPUSRSave?A PROC CODE32 ... im C-File: extern void OSCPUSRSave(void) __arm; es klappt. Allerdings wird der Modus noch nicht verändert. Es bleibt weiterhin der USER-Mode aktiv. Dominic hat ja was von SoftwareInterrupt in nem andern Thread geredet den aus dem USER-Mode sind ja nicht alle Befehle ausführbar. Ich lese dazu morgen noch ein paar Sachen doch vielleicht kann mir ja doch einer genau sagen wie ich die CPU immer in den SVC Modus bringe. Danke
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.