2016-06-27 33 views
2

Ich versuche gerade, meinen eigenen Bootloader für einen Atmel SAM R21 zu entwickeln. Meine Idee ist, den Bootloader zuerst zu starten, also wird es entscheiden, ob ein Update durchgeführt werden muss oder einfach nur zur Anwendung springen muss. Das Hauptproblem besteht darin, dass sich die Interrupt-Vektortabelle an der Adresse 0x0000_0000 befindet. Daher muss sie direkt vor dem Anwendungscode verschoben werden. Wenn der Bootloader in der Linker-Datei einen 8KB-Platz hat und die BOOTPROT-Sicherung verwendet (Wenn diese Sicherung gesetzt wird, wird angenommen, dass ein gewisser Schutz für die durch die Sicherung ausgewählte Speichermenge gegeben ist), die Vektortabelle sollte bei der Adresse 0x0000_2000 beginnen. Um die Vektortabelle zu verschieben, gebe ich vor, das VTOR-Register zu verwenden, das ein Offset ist, der auf die ursprüngliche Tabellenadresse (0x0000_0000) angewendet wird. Der Assembler-Code ist der folgende:Bootloader. ARM CORTEX M0 + Verschieben der Interrupt-Tabellen-Baugruppe ERROR

asm(" LDR R0,=0xE000ED08 "); //VTOR ADDRESS 
    asm("LDR R1,=0x00002000"); //OFFSET 
    asm(" STR R1, [R0]"); 
    asm(" LDR R0,[R1] "); 
    asm(" MOV SP, R0"); 
    asm(" LDR R0,[R1, #4]"); 
    asm(" BX R0"); 

LDR-Befehl gibt mir die folgende Fehlermeldung: Fehler [Og006]: Syntaxfehler in Inline-Assembly: "Fehler [401]: Operand Syntaxfehler"

Was mache ich falsch? Vielleicht versuche ich ARM-Anweisungen anstelle von Thumb zu verwenden?

Ich werde jede Beratung sehr schätzen.

Ich bezweifle auch, wenn ich einmal die Interrup Vector Tabelle verlagert habe, sollte ich mit dem Initial MSP Wert auch zählen? Ich will damit meinen, wenn die Interrupt Vektortabelle nach dem Verschieben an der Adresse 0x0000_2000 startet, sollte ich 4 (Bytes) * Interrupt zählen, um zu wissen, welche die erste Anwendungsadresse sein sollte, oder? Wenn jemand etwas darüber weiß, wäre es nett. Ich weiß, dass ich in der Nähe bin (oder ich denke schon), aber ich muss diese Punkte klären.

Bearbeitet 27/06/16 um 13:04. Dieser Befehl funktioniert LDR R0, [R1] Also ich denke, es ist etwas im Zusammenhang mit dem 32-Bit-Adresse in das Register zu erhalten, aber ich verstehe nicht, warum es sich darüber beschweren.

LÖSUNG:

Als Antwort auf meine Frage, jemand gepostet, dass nicht alle Montagerichtlinien inlined verwendet werden kann, so dass ich brauchte eine Assembler-Datei zu erstellen, my_file.s In dieser Datei sollte eine Funktion erstellt werden sollte

#define _PORT_ASM_ARM_SRC 
#define __ASSEMBLY__ 

;/**************************************************************************** 
;**                   ** 
;**       ASSEMBLY FUNCTIONS       ** 
;**                   ** 
;****************************************************************************/ 

    NAME start_app 

    RSEG CODE:CODE(2) 
    THUMB 

    PUBLIC jump_to_app 

;/***************************************************************************/ 
;/***************************************************************************/ 
;/* jump_to_app() 
; * Jump to application function. 
; */ 

jump_to_app: 
    LDR R0,=0xE000ED08 ; Set R0 to VTOR address 
    LDR R1,=0x00010000 ; User’s flash memory based address 
    STR R1, [R0] ; Define beginning of user’s flash memory as vector table 
    LDR R0,[R1] ; Load initial MSP value 
    MOV SP, R0 ; Set SP value (assume MSP is selected) 
    LDR R0,[R1, #4] ; Load reset vector 
    BX R0 ; Branch to reset handler in user’s flash 


    END 

Nachdem diese Weise die Funktion Prototipe in eine .h-Datei Ihres Projektes als eine normale Funktion enthalten sein, so etwas wie dies mit: zu von außen, so etwas wie dies genannt zu werden

void jump_to_app(void); 

Mit freundlichen Grüßen,

Iván.

+0

Eine dieser Zeilen ist nicht wie die anderen ... Beim Suchen dieser Fehlercodes scheint es, als ob Sie die IAR-Toolchain verwenden; Überprüfen Sie das IAR ARM-Assembler-Handbuch auf die Bedeutung von Leerzeichen in seiner Syntax. – Notlikethat

+0

Hallo Notlikethat. Das Problem ist, dass ich das gleiche Format in allen versucht habe. Die STR zum Beispiel meldet keinen Fehler, der nur im LDR auftritt. Wie auch immer, ich werde das IAR ARM Assembler Manual überprüfen. – Fulgor3

+1

Ich spreche über die Zeile mit der unsinnigen Anweisung 'R1, = 0x00002000', die zufällig das _label_" LDR "hat;) – Notlikethat

Antwort

3

Es gibt nichts syntaktisch falsch mit dem obigen Assembly-Code. Wenn Sie den Assembler-Code in eine asm-Datei schreiben und zusammensetzen, wird er erstellt (ob er das tut, was Sie beabsichtigten, habe ich nicht überprüft).

Aus irgendeinem Grund mag der Inline-Assembler nicht LDR Rd, =expr.

Siehe folgende Zitat aus der IAR Embedded Workbench Help:

The pseudo-instruction LDR Rd, =expr is not available from inline assembler

Auch von ARM:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html

1

LÖSUNG:

Als Antwort auf meine Frage, jemand gepostet Da nicht alle Assembly-Anweisungen inline verwendet werden können, musste ich eine Assembler-Datei erstellen, my_file.s In dieser Datei sollte ein fu erstellt werden nction von außen, so etwas wie dies heißt:

#define _PORT_ASM_ARM_SRC 
#define __ASSEMBLY__ 

;/**************************************************************************** 
;**                   ** 
;**       ASSEMBLY FUNCTIONS       ** 
;**                   ** 
;****************************************************************************/ 

    NAME start_app 

    RSEG CODE:CODE(2) 
    THUMB 

    PUBLIC jump_to_app 

;/***************************************************************************/ 
;/***************************************************************************/ 
;/* jump_to_app() 
; * Jump to application function. 
; */ 

jump_to_app: 
    LDR R0,=0xE000ED08 ; Set R0 to VTOR address 
    LDR R1,=0x00010000 ; User’s flash memory based address 
    STR R1, [R0] ; Define beginning of user’s flash memory as vector table 
    LDR R0,[R1] ; Load initial MSP value 
    MOV SP, R0 ; Set SP value (assume MSP is selected) 
    LDR R0,[R1, #4] ; Load reset vector 
    BX R0 ; Branch to reset handler in user’s flash 


    END 

Nachdem dies zu tun, sollte die Funktion Prototipe in eine .h-Datei Ihres Projektes als eine normale Funktion enthalten sein, so etwas wie dies mit:

void jump_to_app(void); 

Mit freundlichen Grüßen,

Iván.