前にARMのbare metal programmingでタスクスイッチっぽいところまで作ったけど、また似たようなことをやりたくなった。 とりあえず、もう一回初めからメモ。
参照記事
Emulating ARM PL011 serial ports | Freedom Embedded
ソースコード
ほぼ参照記事の流用だけど。
arm_bare_metal_programming/00_hello_world at main · yenshan/arm_bare_metal_programming · GitHub
Mac OSでarmのクロスコンパイラのインストール
$ brew install arm-none-eabi-gcc $ brew install arm-none-eabi-gdb
ビルド&実行
$ make /opt/homebrew/bin/arm-none-eabi-gcc -c -Wall -nostdinc -nostdlib -fno-builtin -I. test.c /opt/homebrew/bin/arm-none-eabi-gcc -c -Wall -nostdinc -nostdlib -fno-builtin -I. startup.s /opt/homebrew/bin/arm-none-eabi-gcc -c -Wall -nostdinc -nostdlib -fno-builtin -I. serial.c /opt/homebrew/bin/arm-none-eabi-gcc test.o startup.o serial.o -o test -Wall -nostdinc -nostdlib -fno-builtin -I. -static -T ld.scr -L. /opt/homebrew/opt/arm-none-eabi-binutils/bin/arm-none-eabi-ld: warning: test has a LOAD segment with RWX permissions cp test test.elf /opt/homebrew/bin/arm-none-eabi-strip test /opt/homebrew/bin/arm-none-eabi-objcopy -O binary test test.bin $ ./run.sh Hello, World!!!
表示されたのはいいが、QEMUから抜けるにはどうすれば良いのか。 とりあえず、ps ID調べてkillした。
QEMUと実機の違い
この記事によると、 Hello world for bare metal ARM using QEMU | Freedom Embedded
QEMUはLinuxのブートに特化していて、本来のARMのブートシーケンスのエミュレーションを端折っている。 0x00010000 にカーネルイメージをロードして実行する仕様。 なので自作のプログラムも0x00010000にロードされる前提で作る必要がある。 主に ld.scr の内容が影響される。 あと、割り込みベクターテーブルの設定もできないっぽい。
そこらへんも bare metalしたいととなると、実機しかないよな。