QEMU に LPC1768 を追加してみた

NXP の Cortex-M3 搭載マイコンである、LPC1768 のエミュレーションを QEMU に追加してみました。

ゲストバイナリとして、TOPPERS ASP for LPC1768 のサンプルプログラム(sample1)が動作することを目標にしており、LPC1768 の周辺デバイスとしては、現状、シリアルコントローラのみサポートしています。

ベースとした QEMU のバージョンは v1.1.0 です。
尚、ホスト環境は Ubuntu 11.10 で確認を行っています。

QEMU LPC1768 をビルド

まず、QEMU をビルドするためのパッケージの導入します。必要に応じてインストールしてください。

# apt-get install glib2.0-dev

次いで、QEMU LPC1768 をビルドします。

% git clone https://github.com/myokota/qemu-cortex-m3.git
% cd qemu-cortex-m3
% ./configure --target-list=arm-softmmu
% make

TOPPERS ASP for LPC1768 をビルド

まず、コンフィグレータをビルドするためのパッケージを導入します。必要に応じてインストールしてください。

% sudo apt-get install libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev 

次に、TOPPERS/ASP をビルドするためのツールチェインの導入します。ここではホームディレクトリの opt ディレクトリにインストールしています(どこでもOK)。

% wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6493/public/arm-none-eabi/arm-2010q1-188-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
% tar xf arm-2010q1-188-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 -C ~/opt

そして、TOPPERS/ASP for LPC1768 をビルドします。

% wget "http://sourceforge.jp/frs/redir.php?m=iij&f=%2Ftoppersasp4lpc%2F53185%2Fasp_lpc1768_generic_gcc-20110910.tar.gz" -O asp_lpc1768_generic_gcc-20110910.tar.gz
% tar xf asp_lpc1768_generic_gcc-20110910.tar.gz
% cd asp/cfg
% ./configure
% make 
% cd ..
% mkdir obj
% cd obj
% ../configure -T lpc1768_generic_gcc
% make GCC_TARGET=~/opt/arm-2010q1/bin/arm-none-eabi depend
(環境によっては、Use of "do" to call というメッセージが大量に表示されますが、無視してください)

% make GCC_TARGET=~/opt/arm-2010q1/bin/arm-none-eabi

TOPPERS/ASP for LPC1768 をビルドしたディレクトリ内の obj/asp がバイナリイメージ(ELF) になります。

QEMU LPC1768 の実行

QEMU LPC1768 をビルドしたディレクトリに移動し、

% ./arm-softmmu/qemu-system-arm \
  -M lpc1768_generic \
  -serial stdio \
  -kernel 'TOPPERS/ASPをビルドしたディレクトリへのパス'/obj/asp 

として QEMU を起動します。

すると、以下のようにシリアルポートへの出力が標準出力上に表示されます。

TOPPERS/ASP Kernel Release 1.7.0 for LPC1768 Generic (Aug 19 2012, 12:10:59)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN
Copyright (C) 2010 by TOPPERS/ASP for LPC project
            http://sourceforge.jp/projects/toppersasp4lpc/

System logging task is started on port 1.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |

シリアルポートの入力も標準入力から行います。

制約事項など

LPC1768 周辺デバイス

冒頭でも少し触れましたが、LPC1768 のデバイスでサポートしているものは、

  • UART0

のみです。
また、LPC1768 のクロックは、クロックソースが内部CR発振器に設定(CLKSRCSEL.CLKSRC が 0)されている場合のみ、

の設定内容から、 SysTick エミュレーションの動作周波数を決定するようにしています。
クロックソースが内部CR発振器以外で設定された場合は、 SysTick エミュレーションの動作周波数は100MHz 固定としています。

Cortex-M3

多くの制約があり枚挙に暇がないですが、例として例外関連では、

  • 後着
  • テール・チェーン
  • 優先度グループ

は未対応です。

おわりに

実機の代替にはなりませんが、TOPPERS/ASP for LPC1768 のちょっとした確認に使えるのではと思います。
尚、ソースコードは下記のリンク先の github 上に公開しています。

8/23 追記

リポジトリ名を変更しました。すでにcloneしている場合は、.git/config を修正してください。
旧: qemu-cortexm3
新: qemu-cortex-m3