« 2011年5月8日 - 2011年5月14日 | トップページ | 2011年5月22日 - 2011年5月28日 »

2011年5月15日 - 2011年5月21日の1件の記事

2011年5月20日 (金)

FreeRTOSのウェブサーバーが動いた

 連休前から始めた、2年前の雑誌付録ARM(LPC2388)基板につけるLAN基板は、チップ(DP83848C)ひとつを誤操作で失いながら、何とか完成した。電源を入れるとモジュラージャックのリンクやアクセスLEDが点滅しているので、電気物理(PHY)層は動いているようだが、ソフトを何も用意していないので、正常に動いているかどうかはまだ確かめられない。

S_p5173912

Eclipseを思い出すのに大変(5/13/2011)
 前々記事にもあるように、手当たり次第にWebからソースを沢山集めすぎて何にするか迷ってしまった。このLAN基板(PHY層がDP83848)を動かすものだけでも5つ、OSなしのもの2つと、FreeRTOSというOSの元で動くソース3つである。

 LAN基板の動作確認のために未経験のOSも入れるというのは、不確定要素が増えて嬉しくないのだけれど、この基板をカメラ制御のホストにするなど、先の開発のためには、OSが動いていて欲しい。面倒かもしれないが、あえてOSのついている方法を選ぶことにする。

 「ねむい」さんが親切にインストール手順を残しておいてくれているのだが、情けないことにその意味がよくわからない。このソースをうまく入れられる見通しがない。迷ったあげく、結局、正規のサイトが公開している一番新しいV7のデモソースを入れることにした。FreeRTOSも勉強しなくてはならない。

Freertos_web

 FreeRTOSは軽い実装で、殆どの組み込みマイコンで動く移植性が評判のようだ。AVRならMega328クラスでも動くらしい。しかし、まだあまり詳しく調べていない。これからの開発にはUARTなどを使ったモニターコンソールのようなものが欲しいのだが見当たらない。これは自作するしかなさそうだ。

 久しぶりにEclipseを立ち上げて、ソフト開発に着手する。こちらの案内が具体的だったので、これを参考に、FreeRTOS V7のLPC2368のデモソースをプロジェクトにしようとするが(LPC2368と2388はピン数が違うだけで殆ど同じ)、これがうまくいかない。

 情けないことにEclipseの操作法をみんな忘れている。出来合いのソースを使ってEclipseで新しいプロジェクトを作るという作業が出来ない。ウェブに助けを求めるが、Eclipseの情報はあまりにも膨大で的確な回答を得るのは至難の業だ。情報の海に溺れそうになる。

 「import」を使って、所定のディレクトリの上でワークスペースを指定するということを理解するまで大分時間がかかった。 Makefileがあるところをカレントディレクトリにすることで、ソースの中の「unresolved」な変数は殆どなくなった。試しにビルドをしてみる。だめだ。あっという間にエラーで戻ってきた。

 MakeFileの内容とディレクトリーチェーンを何度も確認する。間違っていない。Eclipseには未定義変数を示すエラーは出ていないが、Makeが一瞬に終わってしまう。いろいろなサイト(ここや、ここ)を調べるうち、どうもコンパイラーが、こちらで使っているCodeSourceryと違うことに気がついた。

 MakeFileのコンパイラーの指定を、arm-elf-gccからarm-none-eabi-gccにかえる。よし、少し動いたが、またストップ。今度は何だ。前とエラーメッセージが違う。

error Please uncomment one of the two configPINSEL2_VALUE definitions above, depending on the revision of the LPC2000 device being used.

う、これは、どこかで見たぞ。何だ、何だ、さっき参考にしていたこのページのエラーと同じだ。ディバイスの識別番号を選ばせている。良くわからないが新しい方にして次へ。

no memory region specified for loadable section '.ARM.exidx'
あー、また同じエラーだ。対処法が書いてある。これは楽だ。「ねむい」さんがオリジナルのようだ。

次は?_sbrk,_write,_close,_fstat,_isatty,_lseek,_readのundefinedエラー
これは、今度のソースにはsycalls.cが入っているので出ないはずだ。

 よーし、ビルドが出来た。いやあ、このページのとおりでビルドが通ってしまった。「枯れ井戸Scope」さん、ねむいさんありがとう。 

ねむいさんのバイナリでLAN基板動く!(5/17/2011)
 ビルドは通ったが、このソースにはUARTがついておらずLCDもKeilの評価用ボードについているLCD用ルーチンで、動作確認する術がない。これではもしLAN部分が動かなかった時、手がかりが全くない状態になる。

 迷った挙句、ねむいさんのソースもビルドしてみることにした。ディレクトリーチェーンの様子がわかってきてインストールできそうだ。このソースにはUARTがついているのでこちらを基本にしたい。ただRTOSのバージョンは6で、これがRTOS7.0.0で動くかどうかの不安要素はあるが、ストロベリーリナックスのI2C LCDも動くようになっているので心強い。

 たまたま、OSなしでも動くLPC2388の単独のUARTのバイナリコードが見つかったので、LPC系のシリアルライター、FlashMagicのテストを兼ねて、これを試しに書き込んでみた。よーし、USBを通したUARTが動いた。

S_p5173908

 そうか、ねむいさんのところにはソースだけでなく、バイナリも入っていた。MakeFileが整備されていないのでビルドは通らないが、これをロードすれば、とりあえずLAN基板の動作確認が出来るのではないか。用心のため、このソースについているI2C LCDの実装までしてしまう。これでハードは全く同じになった。

 動かなくて元々である。HEXファイルをFlash Magicで書き込む。200KB以上あるので時間がかかる。何とかエラーなしで書き込めた。いよいよ通電テストである。IPアドレスは何だっけ。ソースリストを確かめる(あとで、ねむいさんのブログの画面写真を拡大するとちゃんと出ていた。さすが、ぬかりがない)。

 このソースはLCDもUARTも別のUSBからのUARTも盛りだくさんの出力が出る。まずは、USBにつながっているUART0から。USBコネクターを差し、TeraTERMを立ち上げる。おおお、字化けはしているが何かメッセージが出始めた。速度を調整して、Tickの回数を示す出力が出た。よし、FreeRTOSそのものはうまく動いているようだ。

 さあ、本題のイーサネットだ。アクセスランプがついたりしてPHY層の部分は何か動いているようだが、上位プロトコルはまだ未検証である。緊張が走る。PCでDOS画面を出し、pingを打つ。

Ws000000

 やりました。やりました。1msでレスポンスが返ってきた。ICMPパケットは通った。さあ、次は、HTMLだ。はやる心を抑えてブラウザーにIPアドレスを打ち込む。おおおー、FreeRTOSのウェブ画面が出た!ひゃっほー、やったぞ。誤配線もなく完全試合だ。2秒ごとにタスクの統計を打ち出してくる。TCP/IPの画面も異常なし。

 いやあ、嬉しい。ねむいさんが折角作ってくれたストロベリーリナックスのI2C LCDは何故か全面LCD点灯(真っ黒)になってしまい調子が悪いが、それを除けばあとは問題ない。

 FreeRTOSの仕組みはまだ殆どわかっていない。まだ何をして良いのかわからない。しかし、とにかくDP83848を使ったLAN基板の100Mbpsのイーサネット・ハードは、これで完全に動いていることが確認された。

 I2C LCDが動かなかったのは別の原因だった。何と雑誌のピンアサインが間違っていたのだ。CN2の38ピンは3.3V、39ピンは5Vとの記載があるが(インターフェース2009年5月号ページ41)、実際はちょうど逆である。3.3Vのはずが、5Vもかかっている。電圧計で確認した。

 サイトには訂正記事が出ているが、こんなところまで調べきれない。電源の間違いは致命的だ。I2C LCDが始め全面点灯するのは過大電圧がかかっていたからだ。もう少しで壊すところだった。プンプン。 隣のピンに移して、I2C LCDも問題なく表示した。サーバーの入力ページから文字を入れてみたが、残念ながらこちらには反映されていないようだ。

ソースビルドに挑戦(5/18/2011)
 仕事から帰って、すぐ工作室にこもる。まだビルドがOKになっていない。動いたのはバイナリーファイルだ。これからこれをいじるのにソースから動かなければ意味がない。V7のソースはビルドできているが、こちらのソースはUARTなどがついておらず不便だ。

 バイナリで動いたねむいさんのソースをベースに開発を進めたいが、このソースはFreeRTOSのV6ベースのようで、V7で動くかどうかは定かではない。最初、試しにビルドしてみたが、makeで殆ど先に行かず門前払いだった。

 しかし、何故上手く行かないのか大分わかってきている。ねむいさんが注釈でFreeRTOSのデモディレクトリに入れるという意味が理解できて来た。要するに、FreeRTOSのソースのディレクトリの構成が、共通部分と機種依存に別れているので、MakeFileを環境に合わせれば良いのだ。バージョンの違いはなさそうだ。

 MakeFileを仔細に調べて、各所で参照しているディレクトリパスを修正していく。すこしづつディレクトリチェーンが合ってきてMakeの時間が増えてきた。おお、最後まで通ったようだ。HEXのファイルサイズを確かめる。少し大きいがほぼ同じサイズだ。これで動くかもしれない。

S_p5193931 ファームの書き込みも順調に済んだ。電源を入れる。よーし、ソースリストに自分が加えた変更どおりのメッセージがI2C LCDに出た。思わずガッツポーズが出る。すべて人さまのソースを借りてのビルドだけれど、これで一山越した。

  ついでにSpeedを示すLEDが点かない不具合を検証する。LEDの方向を間違えていた。これを訂正し、100Mbpsを示す赤のLEDがついた状態を記念撮影する。写真でぼやけたように映っているのは、ハンダ面が表になる基板なのでアクリルの保護カバーをつけたものである。

S_p5173900

 次の課題は、ChaNさんのFatFSの導入とWebからのI/O制御である。ただ、ちょっとみただけでは、FreeRTOSにコードを加える見当は全くつかない。WebServerのソースもファイルシステムを内部的に実現していて難しそうだ。RTCを動かしたいのだが、これもソースリストが余りにも簡単すぎて良くわからない。

 まだまだわからないことだらけだが、これでこのマイコンは、当研究所の4つめのネット対応のマイコンとなった。H8と違ってpingも1msで返って来るし、SDカードのファイルシステムが入れば、今度こそ本格的なWebサーバーに出来る。楽しみである。

FreeRTOSのUARTはいくつもあって(5/19/2011)
 興奮が納まって反省した。人のソースを頂いてそのままビルドし、動いた動いたと喜んでいるだけでは情けない(動くのは当たり前だ)。自分で喜んでいるだけならともかく、ブログで自慢するのも芸のない話だ。少しは創意工夫をした結果を載せるべきだろう。

 と、言うことで、UARTコンソールのための開発を始めることにした。ねむいさんのUARTはprintfを使っているが、入力はない。printfは、syscalls.cにUARTに出す自前の関数を入れて、あとはgccの標準入出力を使っているようだが、このあたりは一番わからないところで、scanfなどは敬遠したいところだ。

 他のサイトの情報によると、FreeRTOSにはUARTの実装にはいくつもの種類があるようで、難しそうだ。NXP社のサンプルソースにはUART関係だけでもserial.c と uart.c がある。バッファーが付いているUARTや、直にデータをとるUARTもある。OSのメッセージキューを使っている方法もある。良くわからない。後閑さんのFreeRTOSのガイドはとてもわかりやすいが、まだFreeRTOSの仕組みが理解できていないので、先に進めない。

 それでも、よくわからないまま、見よう見まねでサンプルソースのuart.cの中のUARTGetchを使って、コマンドプロンプトを出してみる。よーし、データの読み込みのためUARTが止まった。キーボードから一文字入れる。うむ、エコーバックされた。おやあ、ウェブの更新が止まったぞ。おかしい。何のためのOSだ。FreeRTOSはプリエンティティブなOSのはずだ。UARTタスクのループウエイトで他が止まったら困る。

 タスクの優先度が同じなのかもしれない。順位をuIPとUARTで大きく変えてみる(最初から同じではなかった)。しかし、状況は同じだ。OSがプリエンティティブに動いていないのかもしれない。でも調べ方がまだわからない。軽いOSとはいえ、設定するところは山ほどある。

 仕方がないので、これまでAVRでやっていたと同様に、バッファーにデータがあるかどうか調べる自前のUARTGetchar関数をでっち上げ、UARTでは止まらないようにした。

 これで、Webサーバーも動き、LEDも点滅し、UARTもデータを受け取るマルチタスク状態に戻った。しかし、これはUARTが必ず一定時間、vTaskDelay()というCPUを返す待ち時間があるためで、本来のUARTの動きではない。本当は、UARTの受信バッファーにデータの入ることをトリガーに待ち時間が解ける割り込み処理が必要なのだが、FreeRTOSではこれをどうやって実現するかはまだわからない。

 まあ、わからないことは沢山あるが、気ばかりあせっても仕方がない。少しづつ調べていくことにしよう。調べることが沢山あるということは幸せなことなのだ。

| | コメント (2) | トラックバック (0)

« 2011年5月8日 - 2011年5月14日 | トップページ | 2011年5月22日 - 2011年5月28日 »