2008年12月12日金曜日

AVRマイコンでハマってます。

新しくAVR Dragonが来ました。
これで快適なデバッグが出来る!と思ったら大間違い。
debugWireモードでロックしてしまってISPモードに戻せないAVRがすでに3個。
こりゃどうすればいいの?と悩んでいると、高電圧パラレルプログラミングモードで書けば良さそうだとわかりました。
が、あまり情報がないんですね。
でも、一ついいのを見つけました。
SatE-O マイコンによるビギナー電子工作
ドンぴしゃ!感謝です。
これを作ろうと思います。これでゴミ箱行きの予定だったAVR君は復活できることでしょう。
しかし、どこにこのやり方の技術資料が落ちているんだろう?見つからない。
それにしても、簡単にこのモードに陥ってしまう設計に疑問を感じるのは私だけでしょうか?

2008年12月8日月曜日

my Arduino OS計画 #4

AVR mkII Liteというデバッガですが、こいつがハングするとAVRマイコンもISPモードに出来なくなって、使い物にならなくなってしまいます。もう2つも潰しました・・・。
これではあまりにひどいので、ATMEL純正のAVR dragonというのをDigiKeyに発注しました。
これがくるまでは、ちょっと開発はストップしておこうと思います。
ついでにATmega168も発注してしまいました。

2008年12月2日火曜日

my Arduino OS計画 #3

#2で解説したイメージをビジュアル化しました。



あ、そうだ、OSの名前はとりあえず、"laos"(Lightweight AVR OS)としました。これじゃ、ミャンマーって意味になっちゃいますねぇ。あんまり自分的にはしっくりこないのですが、何か名前が欲しかったので、これで行きます。

このOSのキモは、メッセージドリブン+メッセージFIFOです。
ある意味、OSとすら言えないほどシンプルです。

実装について記そうと思ったのですが、ちょっと面倒くさいので、次回に回します。
どうもすみません。

2008年11月27日木曜日

my Arduino OS計画 #2

今、手に入れているAVRマイコンはArduinoと同じATmega168ではなく、ROM容量が半分の8kByteになったATmega88というマイコンです。メモリ容量以外はほぼコンパチですので、これに入れられればATmega168にもスムーズに入ることになります。
なぜ、ATmega88なのかというと、秋月電子で購入できたのがこれだけだったから、というそれだけの理由です。ちなみにクロックは20MHzにしてしまっていますが、Arduinoは16MHzでした。これはチェックし忘れたからです。CPUクロックの違いは主にタイマやUARTなどに影響が出ますが、これは#defineでクリアしようと思っています。

さて、今回はArduinoに入れるOSの基本設計思想(アーキテクチャ)を記したいと思います。このAVRマイコンのメモリリソースはとても十分とは言えないので、ある程度機能を割り切った設計が必要だと考えました。
Overviewは以下の感じです。
・タスク優先度のない疑似マルチタスク(ノンプリエンプティブ)
・多重割込はしない
・リアルタイム性は若干損なわれるが、事象発生順は保たれる
・タスク間のやりとりはメッセージによって通知する(メッセージドリブン)

擬似マルチタスク(ノンプリエンプティブ)とは、複数のタスクを定義することは出来るが、実行中のタスクからOSがタスク優先度的に(あるいは定期的に)CPUリソースを剥奪することはせずに、実行中のタスクが自発的にCPUを解放する、という方式です。
また、タスク優先度という概念も省いて、シンプルな設計にします。

多重割込とは、ある割込ハンドラの実行中に他の優先度の高い割込ハンドラの動作を許可する機能ですが、これも省いて、ある割込ハンドラは最後まで実行させてしまいます。基本的に割込ハンドラの処理はなるべく早く終わらせ、タスク側に複雑な処理を実行させるようにすれば、意外に狙い通りに動作するものです。また、多重割込にしなければ、割込ハンドラが使用するスタック容量も少なくなり、見積もりもし易くなるメリットがあります。さらに、事象発生順も保証することが出来ます。

リアルタイム性とは、ある処理イベントが発生してから、十分許容出来る時間内に必要な処理を実行できる、というものです。例えば、車のアンチロックブレーキシステムの場合は、タイヤがロックしてから数十msecでポンピングブレーキングを実行できなければ、重大な事故に繋がることになります。この許容時間内に処理を実行できる保証がリアルタイム性です。今回は擬似マルチタスクであることからも、タスクがCPUを解放するまで次のタスクには回ってきませんので、実装次第では、全然リアルタイム性が損なわれる可能性がありますが、そこはそれを意識して実装すれば、そこそこのリアルタイム性は保持できます。また、事象(イベント)発生順を保持する仕組みとしては、イベント(タイマ、AD変換、端子状態変化などの外部イベントや、あるタスクが他タスクに通知する内部イベント)をタスクに通知する際、共用のFIFOにその通知を入れていく仕組みにすることで、発生順番が保証されるようにします。

メッセージドリブンとは、タスク間の通知の方式としてメッセージという一意に決まった形をとることにより、タスク処理を起動する方式です。マルチタスクではタスク間通知の方式は、イベントフラグやセマフォ、メッセージプールなどを使うことが通例です。今回のOSではメッセージプールをFIFOで制御することにします。このようなアーキテクチャによって、タスクの構造は次のようになるはずです。

 1.メッセージを待つ。
 2.メッセージを処理する。必要なら他タスクにメッセージを発行する。
 3.上記1.に戻る。

このデザインパターンにより、タスク設計が見た目にもわかりやすく、バグが発生する可能性を下げるメリットがあります。
タスク優先度のない擬似マルチタスクを採用するので、タスク切り替えはタスクが次のメッセージを待つ時に発生します。

μitronなどのプリエンプティブなOSを利用する場合は、シンプルとは言え、それなりのメモリリソースが必要となりますが、今回のOSのようなアーキテクチャにすることで、メモリリソースはそんなに心配しなくて済みます。実際、基本的なメッセージFIFOによるタスク切替の実装は、ROMが8kByteの内5%程度、RAMが1kByteの内10数%で済む(FIFOの段数に依存)ことになりそうです。また、タスクスイッチの時間も、シンプルな設計なので、μitronに比べてかなり高速になります。

次回は、このアーキテクチャの実装を具体的に記したいと思います。

2008年11月18日火曜日

ジャジャ馬 AVR mkII Liteデバッガ

今回購入したAVR mkII Liteデバッガはかなりのジャジャ馬(それとも駄馬?)であることがわかりました。
無邪気に動かしても、AVRマイコンと接続できないでハマってしまいます。
これは備忘録に残しておかないと、しばらくすると忘れちゃうでしょうから、ちょっと記録しておきます。

まず、Mac上のWindows(Parallels Desktop for mac)から動かせるか?ですが、動かせます。
ていうか、私が動かした限り、ピュアWindowsマシンと振る舞いは変わらなく見えます。
つまり、Windowsマシンでもハマるということです。

では、動作させてみます。
まず、初めての書き込みは説明書通りに行えば、意外にあっさり行くと思います。
まぁ、説明書のPDFは、Ver4.14のAVRStudioの画面ではなく、もっと前のバージョンの画面で説明しているので(さすが安物、こんなところにも質の低さが露呈しています。)、なんとなく想像するしかありません。
ネットで調べてみると、このAVR mkII Liteの筐体が全然違うので、最近モデルチェンジしたのでしょう。なので、それらとは振る舞いが違う可能性があります。$45→$39にコストダウンしたからかもしれません。
書き込みは、"STK500 or AVRISP"を選択しないと動きません。間違っても、"JTAG mkII"を選択しないことです。まずはここでハマることでしょう。

さて、1度書き込みが終わると、デバッグモードにしたくなります。
ここで、キーポイントは、ターゲットの電源OFF/ONです。これをやらないと一生うまく繋がらないと思います。
まず、"Start Debugging"をアイコンからクリックします。
1回目はいきなり以下のダイアログが出ます。

これはマニュアルにはない、ダイアログです。ここではキャンセルを押します。OKを押してもFirmwareアップデートに失敗した、と言われるだけで終わってしまいます。
で、このダイアログをキャンセルすると、右下のステータスバーで以下の表示が6回ほどトグルするので、灰色の表示になるまで放っておきます(15秒くらいかな)。


で、もう1回"Start Debugging"を選択します。
次は、以下のようなダイアログが出ます。"JTAG mkII"と、使うAVRマイコンを選択し、"Finish"を選択します。

この後、1回目で出たダイアログをキャンセルすれば、うまくいけば、これでデバッグモード状態になるはずです。
ここでうまくいかないときは、一旦ターゲット電源をOFF/ONして、同じ操作を繰り返します

途中で、以下のダイアログが出ることがあります。

この時は、"Use SPI to enable debugWire interface"を選択します。すると、次のダイアログが出ると思うので、再試行ボタンを押す前に、ターゲット電源をOFF/ONします。

これで、たぶん接続できます。あー、面倒くさい!
デバッグでソースを修正したときは、上記操作を繰り返すことになります。

再び書き込みモード(ISPモード)にするときは、メニューの"Debug"から、"JTAG mkII Options"を選んで、出てきたダイアログで"disable debugWire"を選びましょう。これを忘れるとISPモードで通信エラーとなって、書き込みが出来ないです。当然、接続すら出来ません。
その次に、ターゲット電源を必ずOFF/ONしてください。


どうですか?使いこなせますか?
ちなみに私はここまで押さえるのに丸一日かかりました。トホホ。
こんなに使いづらいデバッガは初めてです。
このデバッガを使う人は覚悟した方がいいです。
一応、お断りしておきますが、このやり方は私の環境で、ということですので、他の人はもっとスムーズに動くかも知れないし、もっと動かないかも知れません。

これからこんなデバッガを使うのかと思うと、気が重いです。orz

2008年11月16日日曜日

AVRの命令セットはどんなもの?

まずは、AVRマイコンを初めて触るので、どんな命令セットがあるのかを知らないと話になりません。
ATMELサイトのここからPDFをダウンロードしました。
どんなマイコンも最近の開発言語はもっぱらC言語が多いですよね。(C++を使えるのも出てきていますが。)
ところが、Cで書いたコードがアセンブルコードで見てみると、自分の想定していたコードに落ちていないことがたまにあって、これでハマるんですよ、実際。どれだけ泣かされてきたことか・・・。

なので、Cで開発している限り、命令セットのマニュアルは普段はあまり使わないのですが、実際にどんな命令コード(アセンブルコード)に落ちているのかを確認するなど、いざというときにないと困るという訳なんです。
今回のOSもメインはCになると思いますので(やっぱCが便利)、探し出しておきました。

これは、マイコン開発をしたかったら押さえておくべき項目ですよ。

2008年11月14日金曜日

my Arduino OS計画 #1

当面、このハックOSをなんて呼べばよいか?
まぁ、もうしばらく掛かるでしょうから、ちょっと放っておきますか。

で、まずは何はともあれ、開発環境を整えます。
AVRマイコンでは、GCCコンパイラベースのWinAVRというのが一般的なようですので、これをインストールします。AVRStudioというのが統合開発環境ですね。インストールしたのはVer4.14というやつです。

で、デバッグはどうするか?
よくある手は2つです。
1つはUARTからデバッグプリントをひたすら出す方法。これは、あまりたくさん入れると、ROMメモリも食いますし、UART割込みを使うとタイミングにも影響が出る場合もあるので、注意が必要ですが、ある程度デバッグが進んでくると、非常に便利なツールになります。要はこのプログラムを実装しておくと言うことです。
もう1つは、ちゃんとしたデバッガを使用する方法。AVRの場合、JTAGですね。debugWireというRESET端子だけを使った非常に変わった手法を使うんですね。こんなの初めて。

実は、この2番目の方法を使うことにしました。
何故か?
理由は2つ。
1つは、きちんとデバッグが出来るのでとても完成度が上がること。
1つは、なんと$39という超破格値でデバッガが手に入ったので。普通あり得ませんよ、こんな価格。
ネットで調べたら、$45でKee ElectronicsというところからATMELデバッガのクローンが出ていてそれがキャンペーン中らしく、$39ということで。円高だしね、えへへへ。すぐにPaypal払いの通販で購入、アメリカはカリフォルニア州から郵送です。なんと3日で到着。


ちょっと話はそれますが、こういうツールの場合、普通はちゃんとしたパッケージに入って、保証書の1つもあるはずなのですが、そこはさすがクローン。無邪気にパッキン封筒の中に箱にすら入らず、保証書もなく、あとはソフトウェアCD(しかもCD-Rでラベルもなし!)のみ。すごすぎる〜!!なんておおざっぱなんだぁ・・・。驚きのあまり、開いた口がふさがりませんでした。こういう商売を成立させるのが、ネットなんだなぁ、と痛感した次第です。動くのかぁ〜???

話がそれちゃいました。
で、まずはデバッガを動かしてみることにしました。
見事にハマリました。AVRStudioから接続してみるのですが、コマンドエラー多発で繋がらない・・・。
えー、やっぱ安物だったからかぁ?とガッカリしばし。
と、それでもめげずに色々試していたら、わかりましたよ、ISPコネクタの接続が逆でした。トホホ。
人を疑っちゃぁダメですね。反省しています。


まぁ、そんなこんなで、とりあえず動きそうな感じです。まだROMに焼いてデバッガは動かしていませんので、もう少しハマリそうな予感はしますが、こんなのはこの仕事ではいつものことなので、覚悟はしてます。

今回はここまで。保育園に子供を迎えに行かないと。
休日は子供対応で進捗はないので、また来週になっちゃうかも知れませんが、次回は、開発環境(回路構成)第2弾ですかね。
ではまた。

2008年11月12日水曜日

まずは得意分野の省電力OSのことから。

私の本業は、今のところ、とあるメーカーで、電池で動かすような端末のソフトウェアを開発することです。
今のところ、というのは、そろそろサラリーマンを止めたいと思っているからなのですが。
優遇退社の時期があと1年ちょっとに迫っていますので、そこを狙っている状態です。

さて、自分の話はそのくらいにして、電池で動かすような端末(携帯電話やPDAなどはその代表ですね。)に必要な要素と言えば、ずばり「省電力」です。
省電力にするにはどうすればいいのかと言えば、とにかくヒマになったら、CPUに演算をさせずに休んでもらい、周辺ハードウェアにも電流を流さない、というのが、基本的なマイコンソフトウェアエンジニアの仕事です。
今、Arduinoに興味があるのですが、このシステムはとにかく全開でCPUをブン回しています。
まぁ、趣味の世界ではそんなことはどうでもいいかもしれませんが。
でも、趣味の世界を超えて、実用の世界に入ってくるとそんな甘いことは言ってられないのが現実です。
別にArduinoを実用に持って行くつもりはないのですが、ちょっとその当たりが気になって、このハードウェアを自分のOSでハックしてみたくなりました。実は省電力だけが狙いではないのですが、そこはまた別途書こうと思います。
でも、電池で長時間動くArduinoもいいもんじゃないですか?

これから何回かに分けて、ArduinoにOSを入れていくブログをアップしていくことになると思います。
ArduinoのCPUはATMELのATmega168です。ROMは16kByte(うちブートローダに2kByte使っちゃっています)、RAMは1kByteという非常にタイトなメモリ環境です。
ちゃんと狙ったOSを入れられるかどうか、やってみなければわからないのですが、とにかくやってみます。

2008年11月11日火曜日

ようこそDigital*Maker = デジタル屋へ。

このサイトは、Digital*Makerすなわちデジタル屋という名前で立ち上げました。
デジタルとメーカーの相乗効果という意味にしてみました。
Ouch!Ouch!Ouch!のブログから、技術的な内容を分岐して書いていこうと思います。
さて今、興味ある技術は、

1.iPhone
2.Arduino、Gainerなどフィジカルコンピューティング系
3.マイコン関連技術

と言った感じです。
色々とアウトプットを載せていく予定です。
お楽しみに。