私は、ベアメタル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バイナリをアップロードリセット)
洞察力があれば幸いです!
これを「ローカライズすぎる」と回答した人は、受け入れられた回答で指摘された問題の家族全体の適用性に注意してください。 –