2013-06-15 10 views
5

私は、ベアメタルARM Cortex M4開発用のコードを生成するためにLLVMを使用しようとしています。 IRの作成は順調に進んでおり、LLVMは(私の意見では)正しいARM Thumb ASMを生成しています。アトメルSAM4L-EK http://www.atmel.com/tools/SAM4L-EK.aspxベアメタルARMアプリケーションを起動する際の問題

私は黄色のdevのボード上のLEDをオンにするアプリケーションを作成しました:

私はいくつかのテストを行うために腕の開発キットを購入しています。 (私はちょうどボードの何かを取得したい) 私はAtmelスタジオとLEDが付属のアプリを実行し、LEDが正常に動作します。 LEDはATSAM4LC4C MCUのデータシートではPC10 に接続されているマニュアルた内容に応じて、 しかし、私のアプリケーションは、何もしないようだ...

それはGPIOポートのアドレスは 1つのポートが0x0200不戦勝をとり、0x400E1000であると述べていますポートCは0x400E1000 + 0x0400にあります。

だからこれは私は(LLVM出力)を有するプログラムの出力である:

.syntax unified 
.eabi_attribute 6, 10 
.eabi_attribute 9, 2 
.eabi_attribute 20, 1 
.eabi_attribute 21, 1 
.eabi_attribute 23, 3 
.eabi_attribute 24, 1 
.eabi_attribute 25, 1 
.eabi_attribute 44, 1 
.file "" 
.text 
.globl main 
.align 2 
.type main,%function 
.code 16 
.thumb_func 
main: 
movw r0, #5120 
movw r2, #5184 
movw r3, #5200 
mov.w r1, #1024 
movt r0, #16398 
movt r2, #16398 
movt r3, #16398 
.LBB0_1: 
str r1, [r0] 
str r1, [r2] 
str r1, [r3] 
b .LBB0_1 
.Ltmp0: 
.size main, .Ltmp0-main 

このコードセットは、1

にGPIOEnableRegister 10ビットは、ビットを1

にOutputDriverEnableRegister 10ビット10 in OutputValueRegister to 1

その時点でLEDが点灯するはずです...

0123これは、リンカスクリプトIである

as -mcpu=cortex-m4 -g startup.s -o startup.o 

GNU ARMアセンブラ

を使用する:

.section INTERRUPT_VECTOR, "x" 
.global _Reset 
_Reset: 
B Reset_Handler /* Reset */ 
B . /* Undefined */ 
B . /* SWI */ 
B . /* Prefetch Abort */ 
B . /* Data Abort */ 
B . /* reserved */ 
B . /* IRQ */ 
B . /* FIQ */ 

Reset_Handler: 
#mov r0, stack_top 
MOV sp,r0 
BL main 
B . 

どちらのアセンブラファイルは、次のようにオブジェクトファイルにコンパイルされた:

これは私が使用したスタートアップコードであります使用:

ENTRY(_Reset) 
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 
OUTPUT_ARCH(arm) 
SEARCH_DIR(.) 

/* Memory Spaces Definitions */ 
MEMORY 
{ 
    rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 /* flash, 256K */ 
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 /* sram, 32K */ 
} 

SECTIONS 
{ 
. = 0x0; 
.text : { 
startup.o (INTERRUPT_VECTOR) 
*(.text) 
} 
.data : { *(.data) } 
.bss : { *(.bss COMMON) } 
. = ALIGN(8);0 
. = . + 0x1000; /* 4kB of stack memory */ 
stack_top = .; 
} 

次に、obj ECTファイルは、このようなELFバイナリにリンクされた:

ld -T linkerscript.ld armtest.o startup.o -o armtest.elf 

GNUアームリンカに

を使用して、私はその後、ボットは何もありませんした後も(起こりませんアトメルメーカー

を使用してボードにELFバイナリをアップロードリセット)

洞察力があれば幸いです!

+0

これを「ローカライズすぎる」と回答した人は、受け入れられた回答で指摘された問題の家族全体の適用性に注意してください。 –

答えて

5

cortex-mシリーズは、非皮質mシリーズアームのように起動しません。 cortex-mには、フルサイズのアームのような命令の表ではなく、(非アーム)従来の割り込みベクタテーブルのアプローチがあります。

/* vectors.s */ 
.thumb 

.word 0x20020000 /* stack top address */ 
.word _start  /* 1 Reset */ 
.word hang  /* 2 NMI */ 
.word hang  /* 3 HardFault */ 
.word hang  /* 4 MemManage */ 
.word hang  /* 5 BusFault */ 
.word hang  /* 6 UsageFault */ 
.word hang  /* 7 RESERVED */ 
.word hang  /* 8 RESERVED */ 
.word hang  /* 9 RESERVED*/ 
.word hang  /* 10 RESERVED */ 
.word hang  /* 11 SVCall */ 
.word hang  /* 12 Debug Monitor */ 
.word hang  /* 13 RESERVED */ 
.word hang  /* 14 PendSV */ 
.word hang  /* 15 SysTick */ 
.word hang  /* 16 External Interrupt(0) */ 
.word hang  /* 17 External Interrupt(1) */ 
.word hang  /* 18 External Interrupt(2) */ 
.word hang  /* 19 ... */ 

.thumb_func 
.global _start 
_start: 
    /*ldr r0,stacktop */ 
    /*mov sp,r0*/ 
    bl notmain 
    b hang 

.thumb_func 
hang: b . 

プロセッサに固有の最初の項目としてスタックトップアドレスを設定する必要があります。 llvmを使用すると、ここでいくつかのディレクティブを調整する必要があるかもしれません。上記はgnuのためのものです。

+0

私はhttp://github.com/dwelch67でこれらのような多くの簡単な例を持っています –

+0

それは仕事をした!どうもありがとうございました! – JeroenVandezande

関連する問題