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.
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
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
Ich spreche über die Zeile mit der unsinnigen Anweisung 'R1, = 0x00002000', die zufällig das _label_" LDR "hat;) – Notlikethat