Forum: Mikrocontroller und Digitale Elektronik KEIL ARM LPC2148 & Assembler Subroutinen


von Franjo Rupcic (Gast)


Lesenswert?

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 ^^

von A.K. (Gast)


Lesenswert?

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?

von A.K. (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

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.

von Dominic R. (dominic)


Lesenswert?

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

von Franjo Rupcic (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

SWI

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
Noch kein Account? Hier anmelden.