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ベースなら色々な実験も楽!というわけです。
あぁ、楽しいなぁ!
さっそく私も、金子システムの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なんかも楽しそうですが、まずはチマチマやろうと考えています。
ラベル:
W5300,
WIZ200WEB-EVB,
WIZnet,
レジスタ
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を追加しました。
全然地味すぎです。
ラベル:
Blackfin BlueBoot
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上にオーディオ処理アプリケーションを書いていますが、まさに今回の実装をそのまま使用して遊んでいます。
今回の設計は特定のチャネルのみを想定していますが、この一連のモデルを拡張するだけで複数のチャネルを対象に処理する事ができるようになります。以下のように入出力チャネル数に応じて入力遅延器、出力キューを増やせばよい事になります。
DMAを使用した転送を行なう場合、当たり前ですがDMAエンジンに対して転送指令を行なう必要があります。先の実装は抽象化した処理モデルに対する実装のみを提示したもので、実際にどこでDMAの設定を施して良いのかについては特に明示していませんでした。また、処理対象バッファの実装のヒントも示しておらず、実際の実装との距離を感じた方もいるかもしれません。
そこで、今回はframe.hにバッファの追加場所を、main.cにはDMAの設定箇所を@todoで記載したものを今回御紹介します。
無保証です。使用した結果の責任は一切負いません。
DMAの設定後、完了するまでそのバッファの内容に触れてはいけませんが、これは抽象化した処理モデルによって保証されています。実デバイスの処理に依存する箇所は、主にバッファとDMAに対する設定のみですので、実際には抽象化されたコードから実装までの距離は殆どありません。実際に私もこのモデルを使用してDSP上にオーディオ処理アプリケーションを書いていますが、まさに今回の実装をそのまま使用して遊んでいます。
今回の設計は特定のチャネルのみを想定していますが、この一連のモデルを拡張するだけで複数のチャネルを対象に処理する事ができるようになります。以下のように入出力チャネル数に応じて入力遅延器、出力キューを増やせばよい事になります。
冒頭の概念図に示したように、システム側で準備すべきバッファは、チャネル数に依存しない一連のバッファが一つあれば済むのもポイント。上位層のコードは、抽象化によって処理内容が一目でわかるようになるほか、将来の変更に対する柔軟性が高まりますので、遅延器やキューに対する処理によるオーバーヘッドを許容できるシステムにおいては、十分に検討のある方法です。
こんな感じで、2014年のCuBeatSystemsのブログは、ビデオやオーディオのDMAバッファ管理手法は続編の続編の続編から始まる事になりました。
今年もよろしくお願い申し上げます。
ラベル:
Break time,
DMA,
viomodel
2013年12月30日月曜日
M25PX16をフルコントロール! (M25P16とM25PX16を比較してみる)
あらまし
2012年の10月にM25P16をフルコントロール!と題してM25P16の制御コードを公開しました。今年に入ってM25PX16を使用する機会があり、それじゃあM25P16と何が違うの?というのを簡単に調べた結果をまとめてみました。一番下にはソースコードも示しましたのでご覧下さい。
M25P16とM25PX16
ブロック・ダイアグラムを見る限り、基本的な構成は変わりませんが、「64 OTP bytes」という何かが追加されています。ここで言うOTPとは、one-time programmableの略で、64バイトのワンタイム・ロムが存在するという事がわかります。なるほど、これは装置物に仕立てる時のアレコレに使えます。次にメモリ・マップを確認してみると、M25PX16ではサブ・セクタが導入されている事がわかります。
M25PX16のコマンドがどうなっているのかというと、M25P16のコマンド・セットに加えて、幾つかの新しいコマンドが追加された形になっています。
M25PX16では、ロックレジスタが新設され、不用意なライトからメモリを保護できるように機能強化されています。また、DQ0とDQ1の二線を使って入出力ができる機能が追加されており、M25P16よりも高速にR/W可能なコマンドも用意されました。消去コマンドも、M25PX16ではサブ・セクタ単位での消去も可能となっています。
ざっと見た結果、M25P16を機能強化したのがM25PX16という感じで、M25P16を使用していた基板にM25PX16を使用する事もソフトウェアの変更のみで可能という事がわかりました。READ IDENTIFICATIONコマンドを発行すれば基板にどちらのフラッシュ・ロムが搭載されているのか検知可能ですから、下層でうまく実装する事で自動的に切り替える事も可能です。
ということで、M25P16とM25PX16に対する制御コードを記述し、実機動作確認済みのソースコード公開します。
ソースコード
- 実機で動作確認済みのソースコードからターゲット依存箇所を取り除いたソースコードです。
- 無保証です。一切の責任を負いません。
登録:
コメント (Atom)