現在Atmel SAM R21用の独自のブートローダを開発しようとしています。 私はブートローダを最初に実行することを考えています。そのため、アップデートを実行する必要があるのか、アプリケーションにジャンプするだけなのかを判断します。主な問題は、割り込みベクタテーブルが0x0000_0000アドレスに配置されているため、アプリケーションコードの直前に再配置する必要があるため、ブートローダにリンカファイルに8KBのスペースが設定されていて、その方法でBOOTPROTヒューズを使用するこのヒューズを設定すると、ヒューズを通して選択されたメモリの量にある程度の保護があると思われます)、ベクタテーブルは0x0000_2000アドレスから開始する必要があります。 ベクトルテーブルを再配置するために、元のテーブルアドレス(0x0000_0000)に適用されたオフセットであるVTORレジスタを使うふりをします。 アセンブリコードは以下の通りです: エラー[Og006]:インラインアセンブリの構文エラー: "エラー[401]:オペランド構文エラー"ブートローダ。 ARM CORTEX M0 +割り込みテーブルアセンブリの再配置エラー
何
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命令は私に次のエラーを与えます私は間違っている?たぶん私はThumbの代わりにARM命令を使用しようとしていますか?
私は非常に助言をいただきありがとうございます。
私は、一度Interrup Vector Tableを再配置すると、初期MSP値も考慮する必要がありますか?私は、割り込みベクタテーブルが再配置された後にアドレス0x0000_2000で開始すると、4(バイト)をカウントする必要があることを意味します。誰かがこれについて何かを知っていれば、それはいいだろう。私は近いと思いますが、その点を明確にする必要があります。
編集日27/06/16 13:04 この命令はLDR R0、[R1] で動作するので、レジスタに32ビットアドレスを受け取ることに関連すると思いますが、なぜこれについて不平を言っているのか分かりません。
SOLUTION:
私の質問への答えとして、誰かがいないすべてのアセンブリディレクティブはインライン使用することができることを掲示ので、私はアセンブラファイルを作成するために必要な、このファイルで 関数を作成する必要がありますmy_file.sこのようなもの、外部から呼ばれるように:
:これを実行した後#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
、関数prototipeはこのようなものを使用して、通常の関数として、プロジェクトの.hファイルに含まれなければなりません
お礼、
イヴァン。
これらの行のうちの1つは他のものと似ていません...これらのエラーコードを検索すると、IARツールチェーンを使用しているようです。 IAR ARMアセンブラマニュアルで、その構文の空白の重要性を確認してください。 – Notlikethat
こんにちは。問題は私がすべて同じフォーマットを試みたことです。たとえば、STRはLDR内でのみ発生するエラーを報告しません。とにかく、IAR ARMアセンブラマニュアルをチェックします。 – Fulgor3
私は無意味な命令「R1、= 0x00002000」の行について話していますが、_label_ "LDR"が発生します; – Notlikethat