ARMがCORTEX-M4コアに浮動小数点FPUを付けて供給すると発表したのが2010年の2月、NXPが同コアを使ったLPC4300シリーズを発表したのが同年の11月でした。
CORTEX-Mxリーズは、比較的省電力用途が多いのが特徴です。これはCORTEX-M4でも同じで、周波数が100MHz以下といった製品も多く見られます。多分小型組み込み機器がポータブル要求の強い市場で用いられているからでしょう。一時期組み込みもUIが必要な製品はGUIへと傾いていたように思えますが、Androidが普及した今、GUIは高機能プロセッサ/高機能OSに任せて、制御は制御と割り切った製品が増えているのかも知れません。あるいはコネクティビティを利用してGUI無しの製品が増えたのも一因かも知れません。UIはリモート接続のスマートホンやPCにまかせれば済みます。
そんな風潮の中で、LPC4330は異彩を放っていると言ってもいいでしょう。発表当時150MHz(現在204MHz)のクロックはCORTEX-M4マイコン最強であるだけではなく、CORTEX-M0とのデュアルコア、しかもM0コアまで150MHz(現在204MHz)という力押しの設計でした。明らかに低消費電力用途は捨てて、他社の市場の上を押さえる戦略です。
LPC4330は発表当時、このプロセッサは浮動小数点コプロセッサを活かして低速DSPとして遊べるかも知れないと考え、考察を練ったことがあります。ちょうどその頃、お試し版が配布されていたコミPo!を使い、懐かしい「フジワラヒロタツの現場検証」風の記事を書いたこともありました。早いですね。あれから2年です。あの後しばらく組み込みを題材にした漫画を描いていましたが、途中でほったらかしになっていました。久々に描いてみましたが、はい。サザエさん方式です。登場人物は年を取りません。
LPC4330に関しても、「TOPPERS/ASPを移植したら面白いんじゃないか」と考えていました。低消費電力を重視しないマイコンなら電源の心配はそれほど無いはずで、であれば野良カーネルにも出番がありそうです。が、なかなか現物が出ない上にFlash ROMを内蔵しないことが判明したりしてそのまま諦めてしまったのでした。
ところが、今年の9月になってNXPより、LPC4330搭載のボードが日本国内で販売されると通知され、俄然やる気が出てきました。発表されたLPC4330 XplorerはインドNXG社の基板で、
- LPC4330搭載。ピン互換のLPC1830版も同時発売
- ブート用SPIROM搭載
- ピンヘッダ配置は2.54mmピッチ DIP
- USB Bコネクタ
- Ethernet MAC
- I2Sコーデックおよびステレオミニジャック
を搭載する、なかなか豪華なボードです。
そんなわけで、LPC4330にTOPPERS/ASPを移植してみました。何かしたいことがあったかというと、既にそれほどはないのですが、CORTEX-M3からCORTEX-M4への移行については、RTOS側で浮動小数点コプロセッサのコンテキスト切り替えに対応する必要があります。あえて挙げるなら、ここが面白そうだから、と言うのが移植の理由ですね。普通はCPU依存部の移植となると、コンテキスト切り替えや割り込み出入り口のみならず、ペリフェラルのドライバやタイマーの処理、ツールへの対応を含めた一斉ポーティングになります。これらは段階を踏んで移植することができず、一気呵成にコードを書き上げて全体デバッグにかかる、かなりの力仕事になります。ところが、CORTEX-M4に関してはCORTEX-M3に追加されたレジスタと機能への対応だけでよく、おまけにLPC4330はCORTEX-M3マイコンであるLPC1830とペリフェラルが互換であるため、美味しいところだけつまめるだろうと考えたわけです。
結果的に新ツールへの対応に四苦八苦したわけですが、まぁ何とかなりました。ソースコードはTOPPERS/ASP for LPCプロジェクトからリリース済みファイルとしてダウンロード可能です。
開発環境
開発環境はUbuntu 12.04 LTSです。インストール・スクリプトをTOPPERS/ASP for LPCプロジェクトからリリースしています。いつものごとく私はUbuntu英語版を使っていますが、これは間に入るOSSをひとつでも減らしてユーザーでの再現性を高めたいからです。多分日本語版Ubuntuでも動きますが、スクリプトに日本語版固有の問題がある場合にはプロジェクトの掲示板でお知らせください。
インストール・スクリプトはGCC、Boostライブラリ、Perlライブラリと言ったTOPPERS/ASPコンフィギュレータをビルド・実行するために必要なツールをダウンロードするほか、Eclipse, CDT, egitのようなEclipse環境を整えます。なお、GDB Hardware Debugging プラグインについてはスクリプトからは設定していません。Eclipseからターゲットをデバッグしたい人は、手動でインストールしてください。
ツールチェーン
インストール・スクリプトは実行時にCodesourceryのツールチェーンをインストールしようと試みますが、そのためには arm-2012.03-56-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 をMentor GranphicsからLite Editionをダウンロードしてインストール・スクリプトと同じディレクトリに置いておく必要があります。
このバージョンはCORTEX-M3, M4, M0に対応しています。確認していませんが、M1にも対応しているでしょう。
JTAG-ICE
JTAG-ICEには、以前から使っているHJ-LINK/USBを使いました。なお、HJ-LINK/USBはARMの20pin 2.54mmピッチコネクタしか持っていませんが、LPC4330 Xplorerは高密度の10pinコネクタを使用しています。このため、shintaさんが紹介している変換コネクタをSoliton Waveから購入しました。
マルツパーツ館で販売されているLPC4330 XplorerにはULINKというJTAGアダプタが同梱されています。このアダプタには高密度のJTAGピンヘッダとケーブルが用意されていますが、OpenOCD 0.6.1からは使えません。また、手元にはLPCXpresso ボードがあり、この半分であるLPC-Linkは高密度ピンヘッダを持っていますが、こちらもOpenOCDからは使えません。
OpenOCD
OpenOCDは0.6.1を使いました。LPC1830を制御する分には公式のOpenOCDコンフィギュレーション・ファイルでOKです。LPC4330を制御するにあたっては相当に苦労しましたが、結局ねむいさんが公開しているコンフィギュレーション・ファイルを使用しました。苦労したのはLPC4330のエラッタが原因です。SPIFIのエラッタのため、SPIFIブートのときにコアの制御が効かなくなるのが原因でした。ねむいさん公開のコンフィギュレーション・ファイルはこの点の対策が施されています。なお、標準コンフィギュレーション・ファイルでもLPC4330 Xplorerのブートモードを変更すれば使えるのではないかと思いますが、試してはいません。
試験等
試験はsample1だけではなく、浮動小数点レジスタを使うプログラムを使って行っています。簡単な試験ですが、コンテキスト切り替えは実装されていると思います。