Zynq-Qemu上で動作するARMコードを書いてみた

ZynqLinuxとかToppers/FMPとかに頼らずに、ZynqQemu上でシリアル通信に文字を出力するプログラムを書いてみた。
要は、プログラム開始後すぐにシリアルデバイスを初期化して出力するだけのプログラム。

以下、プログラムの主要部分。
xuartps_initとかxuartps_putcharとかシリアルのデバドラ部分(?)はToppers/FMPのtarget/zynq_gcc/target_serial.cからお借り(コピペ)しました(・・・FMPに頼ってる!?笑)。
最初のインラインアセンブラは必要?

[hello_serial.c]

int main(void)
{
    asm("msr cpsr_cxsf, #(0x13 | 0x40 | 0x80)");
    xuartps_init();
    xuartps_putchar('C');
    while(1){}
}

そして、コンパイルからの実行。fmpだと、gccで出力されたELFファイルをqemuの-kernelオプションで読み込ませれば動いたような気がするんだけど、今回はべたのバイナリに変換してからじゃないと動作しなかった。
ビルドオプションはFMPのものを参考にしました。-Nの効能は不明。

>arm-none-eabi-gcc -c -mlittle-endian -mcpu=cortex-a9 -g -Wall -O2 
-DBASE_ADDR=0x0 -DCA9_PRIVATE_TIMER -D__TARGET_ARCH_ARM=7 -nostdlib 
-N hello_serial.c
>arm-none-eabi-objcopy -O binary hello_serial.o hello_serial.bin
>qemu-system-arm -M xilinx-zynq-a9 -m 1024 -smp 2 -serial null -serial stdio 
-kernel hello_serial.bin -nographic -monitor telnet::4444,server,nowait