mikrocontroller.net

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


Autor: Franjo Rupcic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Franjo Rupcic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SWI

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.