2016-06-27 12 views
2

現在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ファイルに含まれなければなりません

お礼、

イヴァン。

+0

これらの行のうちの1つは他のものと似ていません...これらのエラーコードを検索すると、IARツールチェーンを使用しているようです。 IAR ARMアセンブラマニュアルで、その構文の空白の重要性を確認してください。 – Notlikethat

+0

こんにちは。問題は私がすべて同じフォーマットを試みたことです。たとえば、STRはLDR内でのみ発生するエラーを報告しません。とにかく、IAR ARMアセンブラマニュアルをチェックします。 – Fulgor3

+1

私は無意味な命令「R1、= 0x00002000」の行について話していますが、_label_ "LDR"が発生します; – Notlikethat

答えて

3

上記のアセンブリコードに構文上問題はありません。アセンブラコードをasmファイルに入れてアセンブルすると、ビルドされます(私がチェックしていないものが意図したものかどうかについて)。

何らかの理由でインラインアセンブラにLDR Rd, =exprが似ていません。

のIAR Embedded Workbenchのヘルプから次の引用を参照してください:ARMからも

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

を:

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

1

SOLUTION:

私の質問への答えとして、誰かが投稿すべてのアセンブリ指示文がインラインで使用できるわけではないので、アセンブラファイルmy_file.sを作成する必要がありました。このファイルにfu外部から呼び出されるnction、このような何か:

#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ファイルに含まれなければならない:

void jump_to_app(void); 

お礼、

イヴァン。

関連する問題