2011年2月23日水曜日

3千円で楽しめるARMマイコンとRTOSの世界 (TOPPERS/ASP on LPCXpresso LPC1768)

= 謝辞 =
TOPPERS/ASP for LPCは@suikan_blackfinさんによってポーティングされました。
氏は様々な鋭い洞察力で過去にも沢山の偉業を成し遂げている方です。
ここに過去の沢山の偉業を挙げることは出来ませんが、素晴らしいポーティングに感謝すると共に、厚くお礼を申し上げます。
ありがとうございます。

氏のウェブサイトはhttp://d.hatena.ne.jp/suikan+embedded/にあります。

また、LPCXpressoはNXPセミコンダクターズジャパンさんが積極的に国内市場への展開を行って下さっています。このような安価で優れたツールを手に入れることのできるのは、嬉しい限りです。
NXPセミコンダクターズジャパンさんが運営されている日本語サイト(LPCZone)はhttp://www.nxp-lpc.com/cgi-bin/linkv.htmlにあります。

いずれのサイトも沢山の面白い情報が盛り沢山ですので是非ご覧下さい。

= はじめに =
TOPPERS/ASP for LPCはTOPPERS/ASPをNXPセミコンダクターズのLPCシリーズ上で
動作するようにしたもので@suikan_blackfinさんがメインテナンスされています。
http://sourceforge.jp/projects/toppersasp4lpc/

公開当初から完成度が高く、私も簡単に動作させて楽しむことができました。

TOPPERS/ASPはプロジェクトの性質上、商用のツールを使う前提でソースコードや周辺ファイルが公開されている事が多いのですが、これが障壁となって沢山の人が挫折するような状況でした。


そこで、今回は沢山の方にTOPPERS/ASP for LPCを楽しんで頂くためにLPCXpressoさえあれば楽しめるようにしようと考えました。

従来は評価用ボードに加えて、JTAGデバッガ、環境構築など様々な準備が必要でしたが、TOPPERS/ASP on LPCXpressoを使えばLPCXpresso上で簡単に動作させることができるようになります。

そうです。
LPCXpresso LPC1768(あるいはLPC1769)さえあれば良いのです。
従来のように高価なデバッガやRTOSを購入する必要はありません。

= 対応環境について =
ホストOS環境はLPCXpressoが対応しているLinux環境に今回は限定しました。
TOPPERS/ASPのビルドシステムにはシェルとperlに依存する箇所があります。
Windowsでも様々な外部ツールを使って、依存する環境に近い状況を作り出す事が可能ですが、今回は作業負担を軽減させるために割愛しました。

最近ですとVMware Player上で簡単にLinux環境が構築できますし、WindowsとLinuxの両環境で対応できるように沢山の時間をかけるよりも、早く提供したいという思いが先行した結果でもあります。

参考までに動作を確認した環境を記します。

* Ubuntu 10.10
* LPCXpresso 3.8.2 [Build 129][31/01/2011]
* LPCXpresso LPC1768 REV A

今回公開するプロジェクトの源流になったものは、TOPPERS/ASP for LPCのリリースのうちMisc. / LEDBLINK LPCXPRESSO 1768 1.6.0です。

= オリジナルからの変更点 =
@suikan_blackfinさんがお作りになったオリジナルから行った変更について記します。
変更は
* デバッグをIDE上でできるようにすること。
* 極力TOPPERS/ASPのオリジナルとの差分を小さくすること。
* LPCXpressoのみで実現可能なこと。
を念頭に作業しました。

ソースコードとビルド用ファイルについては以下の変更を行っています。
* 元々あったlpc1768_sram.ldとlpc1768_rom.ldを削除しました。
* LPCXpressoが生成したDebugとReleaseのリンカスクリプトを使用しました。
-> ENTRY(ResetISR)をENTRY(_start)に変更しました。
-> STARTUP(start.o)を追加しました。
-> __bss_start, __bss_endを追加しました。
-> __idata_start, __idata_end, __data_startを追加しました。
-> init_hook関数をPROVIDEで追加しました。
-> .isr_vectorを.vectorに名称を変更しました。
* kernel/target/lpc1768_generic_gcc/Makefile.targetに以下を追加しました。
-> CDEFS=-DDEBUG -D__CODE_RED -D__REDLIB__
* Makefileで生成されるオブジェクトの名称を変更しました。
* Makefileで生成されるオブジェクトの拡張子を変更しました。

LPCXpressoのプロジェクトに対しては以下の変更を行っています。
* Debug ConfigurationsのDebuggerタブでStop on startup at: main_taskに変更しました。
* Debug ConfigurationsのDebuggerタブでVector catch: Trueに変更しました。
* PropertiesのC/C++ BuildでGenerate Makefiles automaticallyのチェックを外しました。これによりLPCXpressoは外部Makefileを参照するようになります。
* PropertiesのC/C++ BuildでBuild directoryからDebugとReleaseを削除しました。
これによりプロジェクトのルートディレクトリを参照する形になりMakefileとの整合性が確保されます。

= 使い方 =
Linux上のLPCXpressoで使用できます。
ダウンロードしたzipファイルは展開せずにLPCXpressoの「Import Example project(s)」で使用します。


Browseボタンを押してダウンロードしたzipファイルを選択します。


Nextボタンを押すとzipファイル内にあるプロジェクトが表示されます。


Finishボタンを押すとワークスペースにプロジェクトがインポートされます。


インポートができたらLPCXpresso上でビルドして下さい。


場合によって、コンフィギュレータのビルドが必要かもしれません。
展開したディレクトリのトップにconfigureがありますので、それを実行して下さい。

ビルドが完了したらDebug 'TOPPERS-ASP_LPCXpresso-LPC1768'でデバッグできます。


Debugを選択してOKボタンを押してください。
以下のようにmain_taskで実行が停止すると思います。


ここまで来れば色んな事がIDE上で楽しめるようになっています。

RunメニューからResumeを選択してみて下さい。
LPCXpresso上のLEDがチカチカ点滅すると思います。

次にRunメニューからSuspendを選択して下さい。
実行が停止し、停止した箇所のソースコードが表示されます。


Disassemblyパネルを見ればC言語のソースとアセンブラの両方を確認しながらデバッグできます。


また、RTOS関連では欠かせないCPUレジスタも以下のように簡単に確認することができます。


上記のようにLPCXpresso購入後、今回のTOPPERS/ASP on LPCXpresso LPC1768のzipファイルをダウンロードするだけで、TOPPERS/ASPのアプリケーション開発を体験することができます。
IDE上でソースコードを見ながらResume, Suspendなど便利な機能が使用できる点も見逃せません。

皆さんご存知のとおりLPCXpressoを購入することで使用できるLPCXpresso IDEはコードサイズ128KBの制限があります。
しかしながら、手軽にRTOSを楽しむことのできる環境を構築できることを考えると、なかなか優れた投資効果が得られると言えるのではないでしょうか。

= ダウンロード =
このファイルを使ったことによる如何なる結果も当方では責任を負えませんので、この点を御了承頂いた上で御利用下さい。
ファイルのダウンロード:こちらをクリック
(今後バージョン管理システムへの移行を考えています。)

= 最後に =
今回の対応は既存のTOPPERS/ASPのビルドの枠組みを超えない形で行ないました。
本来であれば、LPCXpresso上のプリビルドやポストビルドを駆使してカーネルに
対するコンフィギュレーションなどを行うのが筋ですが、先に述べたとおり早めの
公開を目指して割愛したものです。

もし、何かシンプルな方法でコンフィギュレータまでを包括的に処理させることが
できる方法を思いついた場合、是非ご一報頂ければと思います。

= お勧め書籍 =
今回の対応作業で参考にさせて頂いた書籍を紹介します。
* 起動プログラム ブート・ローダ入門
  邑中雅樹さんの「TOPPERSで学ぶuITRONのブート・シーケンス」は必携です。

* uITRON準拠 TOPPERSの実践活用
  邑中雅樹さんの「TOPPERS/JSPのよりどころとなっているuITRON4.0仕様」にある本文とコラムを楽しく拝見しました。
  高田広章さん(というか先生!)の「TOPPERSプロジェクトの概要と展開」にある本文とコラムを楽しく拝見しました。
  邑中雅樹さんの「XScaleへのデバイス・ドライバの移植とカーネル移植の完了」にある本文とコラムを楽しく拝見しました。
  中村健真さんの「Blackfin DSPへの移植」にある本文とコラムを楽しく拝見しました。

* ARM Cortex-M3 システム開発ガイド
  レジスタに関する詳細説明を日本語で楽しむことができます。

2011年2月20日日曜日

LPCXpressoを切り離さないで賢く使う方法

各所で話題の格安Cortex-M3開発用ボードLPCXpressoシリーズですが、著名なブロガーの方々がデバッガ(LPC-LINK)とターゲットをザクザク切り離しているものですから、皆さんも切り離したくなる衝動を抑えられないのではないでしょうか?

私も同じように切り離しては「あれがない」、「これがない」と騒いでいました。
http://shinta-main-jp.blogspot.com/2010/12/lpcxpresso-lpc1768.html
http://shinta-main-jp.blogspot.com/2010/12/lpcxpresso-lpc1768jtagkey2popenocd.html

先日の記事でもUARTを手軽に使いたかったのですが、やはり切り離しただけの基板では「UARTがない!」病になり、ちょっと異なるアプローチが良いのではないだろうか?との考えに至りました。

そもそもニーズとして
* デバッガは自分が使いたいものを使いたい。(でも、たまにLPC-LINK使うかも。)
* UARTをわざわざ接続しなくてもあるじゃん。(LPC-LINKの経路使えばさ・・・。)
* 1つの基板だったものが2つの基板になっちゃってポータビリティ落ちてない?(あ、切り離す人はLPC-LINKは捨てるのか?)
など、切り離したくないシチュエーションも考えられるわけです.

上記のような優柔不断な感じは開発環境を選択する過程では十分に起こり得る話です。
今回ご紹介するアプローチはこういった選択に迷っている段階で役立つものです。

まず、LPCXpressoのデバッガとターゲットの間にある半田をハンダゴテと半田吸い取り線を使って取り除きます。


取り除いたら念の為テスタで絶縁状態になっていることを確認して下さい。


次に2x8のピンヘッダを取り付けます。


LPC-LINKとターゲットを接続するには以下のようにジャンパを接続するだけで済みます。


接続しているジャンパを取り外せばLPC-LINKとターゲットを分離することができます。
例えば、ターゲットに自分の好きなデバッガを接続したり、LPC-LINKから別のターゲットに接続することも可能です。

切断することを考えた場合、この2.54mmの間隔を綺麗に切断するのは意外に手間がかかります。
切断することを考えて設計したのではなく、上記のようにピンヘッダを取り付けるための設計と考えるとなんとなく合点がいきそうだとも思いました。

真相は是非聴いてみたいところですね。

痛い思いをしたFPC用コネクタのハンダ付け

B063: BlackTankには有機EL液晶が搭載される予定です。
接続部分はFPCになっていて、例によってFPC用コネクタなのですが、最初の実装は思いっきり失敗してしまいました。

半田を載せ過ぎてしまったのと、不要な半田を除去しようにも除去しきれなくてフラックスを付けながらグシグシとハンダゴテをあててどうにもならない状況になってしまいました。
ピンが曲がってしまったようにも見えていましたし、パターンにダメージがあると思うと、取り外さざるを得ない様相です。

仕方なく、最初に実装したコネクタは破壊することを前提に取り除くことにしました。

作業対象箇所にフラックスを塗って作業します。

フラックスを塗布することでハンダゴテ接触部位の急激な加熱を防いでくれます。
パターンは加熱させた状態で無理な力をかけるとすぐに剥がれてしまいます。


今回は幸いにもフラックスを塗りたくっているお陰・・・かどうかわかりませんが大丈夫でした。
フラックスリムーバーを使って綺麗にします。


当初付いていたコネクタには半田を盛りまくって取り外しました。


初めに付いていたコネクタと同じ型の物を付けようかとも思いましたが、ネガティブな感情になっていて挑戦することができませんでした。少し形状の異なるものを付けました。


フラックスを使うからといって、実装時に半田を山盛りにしても大丈夫というわけではありません。
今回はそんなことを痛感した体験でした。

ハンダ付けはこういった痛い思いをして上手になっていくものなのでしょう。

2011年2月18日金曜日

LPC1769搭載オーディオ基板のハンダ付けを始めました

LPC1769搭載オーディオ基板のハンダ付けを始めました。

方針は、プロセッサ周辺回路を搭載して基本動作を確認し、徐々にペリフェラルを実装するという方向で行こうと思っています。


一気に実装してしまいたい気持ちもあるのですが、今回は搭載する部品もそれぞれ結構な単価ですので、慎重モードです。


フラックスも当然ながら必須アイテム。

2011年2月14日月曜日

PCBCARTから4層基板が到着しました。

先日PCBCARTに発注した4層基板が到着しました。
気になる品質などについてレポートを。

FedExの包装の中にこんな感じでくるまれていました。


中身のパッキングは以下のような感じです。


オーダー情報などが記載されたレッテルが貼られています。


ちょっと見た限り良さそうな感じではあります・・・。


が・・・見つけてしまいました中国品質。
品質の均一さ加減をお伝えしようとスキャナで撮った映像を見た時に思わず笑ってしまいました。

皆さんも間違い探ししてみませんか?

こちらは部品面。


こちらは半田面。




わかりましたか?



答えは・・・。



デートコードを間違ったのでしょう。
手で削ってます。(笑)


そして、極めつけはこれ。
もう本当にこういうの好き。(笑)
現場の人の人間臭さが出ています。


あー、本当に4層なのかも気になってきました。
ちゃんとショートチェックと導通チェックもやらなくちゃ・・・。

一応サポートには軽いクレームを入れる予定。
でも、中国と言うバイタリティに溢れた国を俄然気に入ってしまいました。

2011年2月13日日曜日

eLuaをLPC1768で手軽に試してみる。mbedとLPCXpressoでお手軽eLuaライフ。

eLuaとはLuaプログラミング言語のフル実装版を組み込みの世界に持ち込むというもの。
Embedded Luaを略してeLuaと呼ばれています。


従来、スクリプト言語をマイコンに移植する場合、機能を削減した仕様で実装されることが多いのですが、eLuaは「フル実装」が一つの特徴になっています。
これによって例えば、パソコン上である程度の機能を実装した後で、ターゲットデバイス上で最終的なデバッグをするなど、様々な開発スタイルをとることもできます。

今回はeLuaをソースコードからコンパイルして実行させてみることにしました。
ホストの環境はUbuntu 10.10を使用しました。

まずはソースコードをSubversionリポジトリから取り出します。

svn checkout svn://svn.berlios.de/elua/trunk

ビルドにはmakeではなく、sconsを使います。
Ubuntu 10.10でsudo apt-get install sconsを試みましたが、私の環境ではパッケージのインストールができませんでした。
そこでhttps://launchpad.net/ubuntu/maverick/+source/scons/2.0.0-1からscons_2.0.0.orig.tar.gzをダウンロードしてインストールします。

sudo python setup.py install

sconsはツールチェインを自動的に見つけてコンパイルしてくれるので楽ちんです。
(うまく行くときは。)

ちなみにcpu=lpc1768とした場合、ターゲットボードはmbedが選択されるようになっています。

scons cpu=lpc1768

上記でビルドが完了すると思います。
elfができますので、binに変換します。

arm-none-eabi-objcopy -O binary elua_lua_lpc1768.elf elua_lua_lpc1768.bin

これで準備完了。
まずはmbed LPC1768にコピーして試してみます。
ターミナルにはminicomを使用しました。
eLua側の通信速度設定はデフォルトで115200になっています。
minicomもこれに合わせます。


mbedのリセットボタンを押して以下のような表示が出てくれば動作しています。

eLua v0.8  Copyright (C) 2007-2011 www.eluaproject.net                          
eLua# 

試しにlsと打ってみてください。


eLua# ls /rom Total on /rom: 0 bytes /semi MBED.HTM 340 bytes ELUA_L~1.BIN 189860 bytes LIFE.LUA 2684 bytes Total on /semi: 192884 bytes eLua#

/romと/semiというディレクトリが見えます。
/semiはmbedのローカルファイルシステムです。

LIFE.LUAはライフゲームのスクリプトです。
試しに実行してみます。

eLua# lua /semi/LIFE.LUA

テキストベースのライフゲームが実行されます。
このライフゲームは2000世代までになると終了するようになっています。


それではこれをLPCXpresso LPC1768上で実行してみます。

LPCXpresso LPC1768上には外付けのフラッシュストレージは存在しません。
先程の/semiに該当する部分です。
そこでプラットフォーム設定からこれを除外します。
trunk/src/platform/lpc17xx/platform_conf.hの#define BUILD_SEMIFSをコメントアウトします。


// #define BUILD_SEMIFS

実行したいファイルはtrunk/romfsに予めコピーしておきます。
再度コンパイルを実行して書き込みます。
出来上がったバイナリはLPCXpressoの128KB制限を超えてしまいます。
そこでここではJTAGKey2P + OpenOCDで書き込みます。



shinta@greenpad:~$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> halt
> flash probe 0
flash 'lpc2000' found at 0x00000000
> flash write_image erase /home/shinta/Projects/elua/trunk/elua_lua_lpc1768.bin
auto erase enabled
wrote 196608 bytes from file /home/shinta/Projects/elua/trunk/elua_lua_lpc1768.bin in 28.987883s (6.623 KiB/s)


それでは確認してみましょう。
と思いましたが・・・
LPCXpressoのデバッガとターゲットを切り離してJTAGKey2Pを接続したのでシリアルが使えません。

あ、なるほど。

LPCXpressoのデバッガとターゲット間が切り離し辛いにも関わらず2.54mmピッチの間隔しかあいていません。
かといって、安易に切り離してしまうと、シリアル経由で何かやりたい時に不便です。
これを考えると、半田ジャンパを取り除いた後で2列ピンヘッダを立てると良いかもしれません。
書き込み時はジャンパを取り除いて他のツールでできるし、デバッグはジャンパを付けてシリアル経由でできます。

それでもジャンパを付けたり取ったりするのは面倒ですね。
やっぱりシリアルインターフェースを付けますかね。

2011年2月9日水曜日

ソースコードから「asm」という文字を探す(だけの)スクリプト

RTOS関係でゴニョゴニョしているとアセンブラで記述された箇所のみを抜き出したくなることがあります。
今日はショートブレイクということで、ソースコードから「asm」という文字を探す(だけの)スクリプトを作ってみました。

#!/bin/sh
FILELIST=`find . -name "*.[c|h]"`
KEYWORD="asm"
for FILE in $FILELIST
do
    OUT=`grep $KEYWORD $FILE`
    if [ ! "$OUT" = "" ]
    then
        echo "=== [$FILE] ======================="
        grep -i -n $KEYWORD $FILE
    fi
done

これを使うと例えば以下のような出力が得られます。

=== [./FreeRTOS_Library/portable/port.c] =======================
134:    __asm volatile (
153:    __asm volatile(
222:    __asm volatile
=== [./FreeRTOS_Library/portable/portmacro.h] =======================
113:    __asm volatile                                                                          \
125:    __asm volatile                                                  \
=== [./SimpleDemo/cr_startup_lpc17.c] =======================
217:    __asm("    ldr     r0, =_bss\n"

findを使ってCソースとヘッダを探してgrepするだけのシェルスクリプトですが、意外に便利です。