2014年7月27日日曜日

KOZOS for Blackfin "BlacKOZOS"の設計方針

UOS-LPC800

UOS-LPC800を公開してから早くも一年が経ちました。
思いっきり遊びでしか使えない感じのOSが一部の方に好評で、ここでも述べたようにadafruitでも紹介されたりもしています。


本当は公開後に色々機能追加する事を考えていましたが、LPC-810と組み合わせて紹介されているので、彼に入りきらなくなるのは可哀想です。どうしようかな?と考えていたら1年が経過していました。あらら。

KOZOS

UOS-LPC800は、坂井さんがお作りになったKOZOSが制作のきっかけになっています。


KOZOSは、完全ホビー向けOSでありながらソフトウェア割り込みを使ったシステムコールによる操作を実現するなど、とても興味深い作り込みになっています。坂井さんによるユニークなキャラクタであるニジマス君も見逃せません。

坂井さんの書籍が販売されてから私も早速購入して色々な活動に取り組みました。

"BlacKOZOS" - KOZOS for Blackfin

あれから二年ほど経ち、現在は主にBlackfinを使って色々遊んでいます。
私の場合、新しいプロセッサをいじる場合には、クラスの中で小さいものを選んで使う事にしています。現在はBF592というプロセッサで離散的に遊んでいるのですが、この小さなプロセッサでキビキビ動作するOSを書いてみたくなりました。

名前も決めてあって、BlackfinとKOZOSをかけて、BlacKOZOSです。
とてもブラックな感じ。「ブラッコゾス」です。「ブッコロス」ではありません。

本体OSは何もないのに、キャラクタはもうあります。
完全に順番を間違っています。


"BlacKOZOS"の設計方針

設計は以下のように進める事にしました。

①普通に動作するだけのプログラム

普通に動作するだけのプログラムが、どうしてOSに発展するのか理解できないかもしれませんが、最初のタスクしか実行できないところから"BlacKOZOS"の開発をスタートさせる事にしました。これは、まさにOSを使うことで解決したい問題を提示した形です。ざっくり言うと、複数の仕事を並行し、かつ効率的に処理させたい、複数の仕事を協調動作させたい、という課題。


②割り込み関数でレジスタの退避と復旧

次に、①で動作している仕事を一切阻害する事なく、割り込み処理の中で①で使っているレジスタを退避、復旧させます。ここでは、コンテキストスイッチ、つまりタスクの切り替えは行わず、退避したレジスタをそのまま復旧させます。レジスタ周辺の操作は少しでも間違えると動作しません。このコンテキストスイッチなしのレジスタ退避復旧処理は、正しく実装できた時点で、みかけ上①と同じ処理を提供する事になります。つまり、レジスタの退避と復旧を正しく行いながら、依然としてかなり単純な実行モデルを維持できます。


③コンテキストスイッチを追加する

レジスタの退避復旧が実現できたら、コンテキストスイッチを追加します。②を先行させる事にはもうひとつ別の理由があり、②が実現できた時点でコンテキストスイッチは基本的にC言語で記述できるようになっています。どういうことかと言うと、レジスタ退避作業によって実行中のコンテキストを復旧するためのレジスタは保存されているので、それらをかなり自由に使うC言語を使ってレジスタを汚しても、レジスタ復旧で必要な値へ復旧できるわけです。リンクリストを辿ったりする作業をアセンブラで書くのも面倒なのでうってつけというわけです。


まとめ

今回は大雑把な設計方針について明らかにし、作業の道筋を立てました。
Blackfinの場合、割り込みマスクの取り扱いが1つのポイントかもしれません。
その辺りも後々触れていければと思います。

2014年6月30日月曜日

Windows、Mac OS、Linuxで動作可能なChaNさんのFM音源モジュールの簡易シミュレーター

http://elm-chan.org/junk/32bit/nxpdip.html#fmに掲載されたFM音源の実験で掲載されたコードは、移植性が高く小規模なマイコンでも動作する上、極めて素直に実装されていて「これは凄い!」と驚くばかりです。あぁ、優秀な人はこうやって設計実装できるんだなぁと実装の各所を見て感じました。


さっそく私も、金子システムのTUNA-CANなどに移植してFM音源の動作を楽しんでいるのですが、ここで移植の過程で最初に作ったシミュレーターのコードを掲載する事にしました。


ここからダウンロード


このコードはWindows、Mac OS、Linux上でコンパイル可能。出来上がったバイナリに出力WAVファイル名を与えると、エレピが単音で発音されるWAVファイルが出来上がります。Audacityで開いた時の様子は以下。


シミュレーターというにはお粗末な感じですが、これにChaN氏が作ったようなフロントエンドを被せれば立派なFM音源ソフトになります。マイコンをベースにしていると、あちこちに持ち歩くのも面倒ですが、PCベースなら色々な実験も楽!というわけです。

あぁ、楽しいなぁ!

2014年5月11日日曜日

WIZnet W5300始めました

今年の初めに、私にとって神様のように色々できちゃう方から「それなら、これをあげるよ。」と頂いてしまったW5300の評価キット(WIZ200WEB-EVB)をようやく触り始めました。


最近興味がもくもく湧いているjQueryとかBootstrap等と組み合わせて、色々なオモチャが作れるのではないだろうかと考えているところです。Node.jsなんかも楽しそうですが、まずはチマチマやろうと考えています。

2014年4月30日水曜日

Graphviz dotを使ってプロジェクトの関係図を作る

ちょっと思うことがあって、ここ数年のプロジェクトの関係をGraphviz dotを使って整理してみました。
青がハードウェア、黄はミドルウェア、緑はソフトウェアです。

ざっくり言うとmbedがここ数年の活動の起源になっていたのかな?と思います。


NXPのプロセッサが搭載されたBlackTankなるものを設計し、ツールやミドルウェアを整備したくなって、ここから「車輪の再開発沼」に突入しました。そして、Blackfinで「高価なツールを買わないとフラッシュに書けないですって!」と、フラッシュライターの開発が始まりました。まさに「ツール開発大好き」な人の典型的な感じです。しまいには、取扱説明書の作成に便利なLCD Toolとか、「誰が使うんだ!」と思わずツッコミを入れたくなります。

こんな感じで振り返ったのも、そろそろ違うことをやりたくなってきたからなのですが、一体何をやるのかは・・・まだ考えていません。

この関係図は以下のコードから生成しました。

digraph projects {

  graph [label = "Projects"];

  // Hardware Platform
  "mbed" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "LPCXpresso" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "LPCXpresso Clock" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "BlackTank" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "BlueTank" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "ACB-BF592" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "TUNA-CAN" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "KOZOS EXPBRD" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];
  "LPC800 Mini Board" [shape=circle, style=filled, color="#feeeee", fillcolor=blue, fontcolor=white];

  // Firmware Solution
  "NT-Shell" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];
  "NT-Monitor" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];
  "NT-Logger" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];
  "NT-Basic" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];
  "tinybmpio" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];
  "tinywavio" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];
  "UOS-LPC800" [shape=hexagon, style=filled, color="#feeeee", fillcolor=yellow, fontcolor=black];

  // Software Solution
  "Blackfin BlueBoot" [shape=box, style=filled, color="#feeeee", fillcolor=green, fontcolor=black];
  "Blackfin FastFlash" [shape=box, style=filled, color="#feeeee", fillcolor=green, fontcolor=black];
  "Blackfin MiniConfig" [shape=box, style=filled, color="#feeeee", fillcolor=green, fontcolor=black];
  "LCD Tool" [shape=box, style=filled, color="#feeeee", fillcolor=green, fontcolor=black];
  "kz_h8write" [shape=box, style=filled, color="#feeeee", fillcolor=green, fontcolor=black];
  "kz_xmodem" [shape=box, style=filled, color="#feeeee", fillcolor=green, fontcolor=black];

  // The relationship
  "mbed" -> "LPCXpresso" -> "LPCXpresso Clock";
  "mbed" -> "LPC800 Mini Board" -> "UOS-LPC800";
  "BlackTank" -> "BlueTank";
  "BlackTank" -> "NT-Shell";
  "BlackTank" -> "tinybmpio";
  "LPCXpresso" -> "BlackTank";
  "tinybmpio" -> "tinywavio";
  "NT-Shell" -> "NT-Monitor";
  "NT-Shell" -> "NT-Logger";
  "NT-Shell" -> "NT-Basic";
  "NT-Shell" -> "Blackfin BlueBoot";
  "NT-Shell" -> "KOZOS EXPBRD";
  "NT-Shell" -> "BlueTank";
  "BlueTank" -> "LCD Tool";
  "ACB-BF592" -> "BlueTank";
  "ACB-BF592" -> "Blackfin BlueBoot";
  "Blackfin BlueBoot" -> "Blackfin MiniConfig";
  "Blackfin BlueBoot" -> "BlueTank";
  "Blackfin BlueBoot" -> "ACB-BF592";
  "Blackfin BlueBoot" -> "TUNA-CAN";
  "Blackfin MiniConfig" -> "Blackfin FastFlash";
  "kz_h8write" -> "kz_xmodem";
  "NT-Basic" -> "KOZOS EXPBRD";
  "kz_h8write" -> "KOZOS EXPBRD";
  "kz_xmodem" -> "KOZOS EXPBRD";
}

2014年3月29日土曜日

Blackfin BlueBoot Version 0.4.0

Blackfin BlueBootのVersion 0.4.0をリリースしました。

  • ホスト/ターゲット間プロトコルを一部変更し、アクセス情報、ボード情報、CPU情報をそれぞれターゲットから取得して処理するように変更しました。
  • 新しいターゲットとして、金子システム社製のUCB-BF512とTUNA-CANを追加しました。
http://www.cubeatsystems.com/software/bfin-blueboot/bfin-blueboot_ja.html

全然地味すぎです。

2014年2月28日金曜日

「TOPPERS活用アイデア・アプリケーション開発コンテスト」のプレゼンテーション資料

TOPPERS活用アイデア・アプリケーション開発コンテスト」のプレゼンテーション資料が公開されました。2011年、2012年、2013年と3年分のプレゼンテーションをそれぞれダウンロードできます。

2011年は、Natural Tiny Shell Taskと題して、小規模組み込みシステムでVT100プロトコルを正しく扱う事ができるミドルウェアを発表しました。シリアル通信関数を用意するだけで、ホストとターゲット間の通信を取り持ってくれるようになっています。きちんと動作するシェルタスクが欲しいという用途に最適になるように設計しました。コマンドパーサーも用意してありますので、簡単に使い始める事ができます。


2012年は、NT-Loggerと題して、小規模組み込みシステムでも手軽にシステムの状態を観察できるロガーを発表しました。これも、NT-Shellと同様にシリアル通信関数を用意するだけで、ホスト側でシステム動作状態を確認できるというものでした。これは後々改良しようと思って、まだ手を付けていない感じになっています。


2013年は、以前から気になっていた「sample1って何なの?」という疑問に対して問題提起すべく、簡単なアプリケーションサンプルを提案しました。私はFreeRTOSからRTOSに入った人間ですので、TOPPERSのsample1には、正直びっくりしました。「何のサンプルなんだろう?」という素朴な疑問は、今も私の中にあります。


プレゼンテーション資料と一部のソースコードは、 http://www.toppers.jp/contest.html からダウンロードできます。

2014年1月26日日曜日

ビデオやオーディオのDMAバッファ管理手法(の続編の続編)

2012年の投稿「ビデオやオーディオのDMAバッファの管理手法 (動かして遊べるソースコード付き!)」や、2013年の投稿「DMAバッファ管理手法の続編」で触れたDMAバッファの管理手法は、以下の図に示すような簡単な概念を使って、実入出力処理を抽象化する手法について説明したものでした。


DMAを使用した転送を行なう場合、当たり前ですがDMAエンジンに対して転送指令を行なう必要があります。先の実装は抽象化した処理モデルに対する実装のみを提示したもので、実際にどこでDMAの設定を施して良いのかについては特に明示していませんでした。また、処理対象バッファの実装のヒントも示しておらず、実際の実装との距離を感じた方もいるかもしれません。

そこで、今回はframe.hにバッファの追加場所を、main.cにはDMAの設定箇所を@todoで記載したものを今回御紹介します。

無保証です。使用した結果の責任は一切負いません。

DMAの設定後、完了するまでそのバッファの内容に触れてはいけませんが、これは抽象化した処理モデルによって保証されています。実デバイスの処理に依存する箇所は、主にバッファとDMAに対する設定のみですので、実際には抽象化されたコードから実装までの距離は殆どありません。実際に私もこのモデルを使用してDSP上にオーディオ処理アプリケーションを書いていますが、まさに今回の実装をそのまま使用して遊んでいます。

今回の設計は特定のチャネルのみを想定していますが、この一連のモデルを拡張するだけで複数のチャネルを対象に処理する事ができるようになります。以下のように入出力チャネル数に応じて入力遅延器、出力キューを増やせばよい事になります。


冒頭の概念図に示したように、システム側で準備すべきバッファは、チャネル数に依存しない一連のバッファが一つあれば済むのもポイント。上位層のコードは、抽象化によって処理内容が一目でわかるようになるほか、将来の変更に対する柔軟性が高まりますので、遅延器やキューに対する処理によるオーバーヘッドを許容できるシステムにおいては、十分に検討のある方法です。

こんな感じで、2014年のCuBeatSystemsのブログは、ビデオやオーディオのDMAバッファ管理手法は続編の続編の続編から始まる事になりました。

今年もよろしくお願い申し上げます。