FreeRTOSのウェブサーバーが動いた
連休前から始めた、2年前の雑誌付録ARM(LPC2388)基板につけるLAN基板は、チップ(DP83848C)ひとつを誤操作で失いながら、何とか完成した。電源を入れるとモジュラージャックのリンクやアクセスLEDが点滅しているので、電気物理(PHY)層は動いているようだが、ソフトを何も用意していないので、正常に動いているかどうかはまだ確かめられない。
Eclipseを思い出すのに大変(5/13/2011)
前々記事にもあるように、手当たり次第にWebからソースを沢山集めすぎて何にするか迷ってしまった。このLAN基板(PHY層がDP83848)を動かすものだけでも5つ、OSなしのもの2つと、FreeRTOSというOSの元で動くソース3つである。
LAN基板の動作確認のために未経験のOSも入れるというのは、不確定要素が増えて嬉しくないのだけれど、この基板をカメラ制御のホストにするなど、先の開発のためには、OSが動いていて欲しい。面倒かもしれないが、あえてOSのついている方法を選ぶことにする。
「ねむい」さんが親切にインストール手順を残しておいてくれているのだが、情けないことにその意味がよくわからない。このソースをうまく入れられる見通しがない。迷ったあげく、結局、正規のサイトが公開している一番新しいV7のデモソースを入れることにした。FreeRTOSも勉強しなくてはならない。
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が動いた。
そうか、ねむいさんのところにはソースだけでなく、バイナリも入っていた。MakeFileが整備されていないのでビルドは通らないが、これをロードすれば、とりあえずLAN基板の動作確認が出来るのではないか。用心のため、このソースについているI2C LCDの実装までしてしまう。これでハードは全く同じになった。
動かなくて元々である。HEXファイルをFlash Magicで書き込む。200KB以上あるので時間がかかる。何とかエラーなしで書き込めた。いよいよ通電テストである。IPアドレスは何だっけ。ソースリストを確かめる(あとで、ねむいさんのブログの画面写真を拡大するとちゃんと出ていた。さすが、ぬかりがない)。
このソースはLCDもUARTも別のUSBからのUARTも盛りだくさんの出力が出る。まずは、USBにつながっているUART0から。USBコネクターを差し、TeraTERMを立ち上げる。おおお、字化けはしているが何かメッセージが出始めた。速度を調整して、Tickの回数を示す出力が出た。よし、FreeRTOSそのものはうまく動いているようだ。
さあ、本題のイーサネットだ。アクセスランプがついたりしてPHY層の部分は何か動いているようだが、上位プロトコルはまだ未検証である。緊張が走る。PCでDOS画面を出し、pingを打つ。
やりました。やりました。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のファイルサイズを確かめる。少し大きいがほぼ同じサイズだ。これで動くかもしれない。
ファームの書き込みも順調に済んだ。電源を入れる。よーし、ソースリストに自分が加えた変更どおりのメッセージがI2C LCDに出た。思わずガッツポーズが出る。すべて人さまのソースを借りてのビルドだけれど、これで一山越した。
ついでにSpeedを示すLEDが点かない不具合を検証する。LEDの方向を間違えていた。これを訂正し、100Mbpsを示す赤のLEDがついた状態を記念撮影する。写真でぼやけたように映っているのは、ハンダ面が表になる基板なのでアクリルの保護カバーをつけたものである。
次の課題は、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(2022.10.19)
- 生存証明(2022.01.23)
- パソコン連動テーブルタップの修理を諦めて自作(2021.02.16)
- 半年ぶりのブログ更新に漕ぎつけた(2019.09.19)
- 研究所活動は停滞したままでCCDカメラ顕微鏡導入など(2019.02.08)
「ARM」カテゴリの記事
- 心電計プロジェクト:スケールが出ると心電計らしくなる(2015.01.08)
- 心電計プロジェクト:TFT液晶に念願の心電波形が出た(2014.12.18)
- 心電計プロジェクト:STM32F103の心電波形表示で悪戦苦闘(2014.12.03)
- 心電計プロジェクト:CooCoxでARMの表示系ソフトを開発する(2014.10.16)
- 心電計プロジェクト:表示部のARM基板の開発環境を一新する(2014.09.19)
「FreeRTOS」カテゴリの記事
- WiFiモジュールESP32で画像付きサーバーの開発に成功(2017.09.28)
- FreeRTOSマルチタスク対応UARTとガイガーカウンターキット(2011.07.08)
- FreeRTOSのセマフォーの不具合がやっと解決(2011.06.25)
- FreeRTOSでバッファー付きUARTを動かす(2011.06.18)
- FreeRTOSでユーザー割り込み環境が動いた(2011.06.04)
コメント
はは、よく見ておられますねえ。これが本名だとしても
何も困りませんのでどうぞご心配なく。
投稿: がた老 | 2011年5月21日 (土) 15時56分
スクリーンショットのプロンプト部分に本名が出ているように
見えるのですが、大丈夫でしょうか?
(問題ないようでしたらすみません、メールアドレスはダミーです)
投稿: test | 2011年5月21日 (土) 00時50分