ラベル Natural Tiny Shell の投稿を表示しています。 すべての投稿を表示
ラベル Natural Tiny Shell の投稿を表示しています。 すべての投稿を表示

2017年1月31日火曜日

ARM Cortex-M0でもラクラク使えるNT-Shellよりもコンパクトな端末入出力ミドルウェアMicroShellライブラリを開発しました (NXP LPC824用サンプルプロジェクト付き)

あらまし

昨年のこと、NXP LPC824を使ったサウンドモジュールMicroSoundModuleを開発していました。このサウンドモジュールは、コマンドを受け取って色々な再生を行うもので、当初はこのコマンド処理部分の実装にNT-Shellを用いる計画でした。しかし、最小10KBのROM、最小1KBのRAMを要求するNT-ShellはNXP LPC824の小さなリソースに対して厳しいものです。仮に入ったとしてもアプリケーション側に大きな制約を課すことになります。

よくよく見まわしてみると、様々な面白そうなマイクロコントローラがNXP LPC824と同クラスで存在します。ARM Cortex-M0のような小さなマイコンを使ったシステムにおいて、NT-Shellほどの機能は要らない、でも、きっちり入力は出来るようにしたい、といったニーズはありそうです。

そこで、NXP LPC824のような小さなサイズのマイコンにも導入可能な端末入出力ミドルウェアを開発することにしました。名付けてMicroShellです。



使い方

使い方はmicroshell_initという関数にハンドラの実体へのポインタと、ブロッキング型のシリアル送受信関数のポインタを渡すだけという至って単純なもの。このコードだけできっちり動作する入力系が得られます。とても簡単ですね。



内部構造

内部構造は、以下の図に示すようにcoreとutilの二つから成り立っています。本当に最小限の構成にしたい場合にはcore側のmicroshellを用い、この場合には1行の入力処理が得られます。これに加えてコマンドのパースなどを行いたい場合には、util側のmscmdを用います。



ダウンロード

ダウンロードは専用サイトからできます。

2015年8月12日水曜日

約3年ぶりとなるNatural Tiny Shell (NT-Shell)の新しいバージョン0.3.0をリリースしました

数ヶ月前からやろうやろうと思っているだけで進んでいなかったNatural Tiny Shell (NT-Shell)の新しいバージョン0.3.0のリリースを実施しました。今回のバージョンからライブラリとサンプルのディレクトリを分離し、何がライブラリで何がサンプルなのか一目で理解できるようにしました。現在のところ、ACB-BF592のベアメタルなプログラムがサンプルとして追加してあります。

また、これを機にA tiny MML parserのリリース活動で得たヒントも踏まえてウェブサイトも少し新しくしました。今までのサイトは、何と言うか一応公開してありますという雰囲気で、何が何だかさっぱり意味分かりませんでした。


このブログを通じて幾つか改良のヒントも頂いているので、今後の開発の中で何らかの回答が出せるようにしていければ良いなぁと考えています。

2015年8月10日月曜日

Micro MML Player LPC812のMaker Faire Tokyo 2015出展報告

Maker Faire Tokyo 2015にMicro MML Player LPC812を出展しました。

ちょっと愉快にMMLを再生しながら、音符まで表示しちゃうギミックを追加。
展示をご覧頂いた方からは「小さい!」とか「可愛い!」とか「音が聞こえない!」とか「何の曲を演奏しているのかわからん!」とか、大好評な御意見を様々に頂きました。



LPC812は、ROMが16KB、RAMが4KBと32ビットプロセッサとしては小さな部類に入りますが、今回はこのプロセッサにリアルタイム・オペレーティング・システム(UOS-LPC800)と、MMLパーサー(A tiny MML parser)を搭載。MMLのパースと音符の表示系の処理をそれぞれタスクに分離する事で、重い描画系の処理と時間軸がズレては困る音声系の処理の並列動作を実現しています。
 本当はシェル(Natural Tiny Shell : NT-Shell)も載せたかったのですが、これは入りきらずに断念しました。え?手段と目的が滅茶苦茶になってるって?そうです。手段と目的がごった煮になってま・・・。


ブースの左側は今回メインのMicro MML Player LPC812を展示しました。

準備段階では「音が煩過ぎたらどうしよう」とか考えていたのですが、「何言ってんだい」という感じ。
ブースでは全く音が聞こえませんでした。「あぁ、音も出てるんですね!」という声が続発!ついでに「あぁ、音符も表示してるんですね!」って。結局何を展示しているのかわからん!という話だったようです。なるほど。



ブース右側には今回のシステムで動作しているオペレーティング・システムを展示しました。
これがまた目的と・・・手段を・・・ぐるぐる鍋でかき回して・・・。



こーんな感じの展示で、次回の展示募集でこの内容は通らないだろうな・・・と思いました。
来年は違う路線で行こう!
最後に今回のファームウェアのコールグラフ!
こんな小さなマイコンで複数のタスクが動作するなんて素敵だなぁ!
だから・・・そうじゃなくて・・・。

2015年6月30日火曜日

Natural Tiny Shell (NT-Shell)の更新予定について

マイコンベースの小規模組み込みシステムでお手軽にシェルを実現するNatural Tiny Shell (NT-Shell)ですが、数ヶ月前から更新を予定していました。


というのも、数年前に公開したパッケージは、フラットにソースコードが格納されているのみで、正直言ってどうやって使うのかイメージできるようなものではありません。

当時はおそらく「まぁ、こんな感じでmain関数に組み込んでおけばわかるかな?」くらいにしか考えなかったのですが、今見てみると「これは考えていることが伝わらないよ・・・」という印象。

おまけに、詳しい説明は月刊Interfaceにしか掲載されておらず、そして、そのInterfaceの記事はNatural Tiny Monitor (NT-Monitor)がメインになっているような構成です。

現在、ライブラリのパッケージングを工夫して、コアライブラリファイルと、ユーティリティライブラリファイルを分離する方向で調整を進めています。(調整って言っても、ちょこちょこっとやるだけなんですが・・・)


加えて、幾つかのプラットフォーム向けのサンプルプログラムを同梱することで、具体的な活用イメージをお伝えしようとの考え。例えば、Blackfin向けのDSPのサンプルプログラムは、以下のような呼び出し関係を持ちます。


プラットフォームを初期化してNT-Shellを呼び出せば、もうばっちりシェルインターフェースを持つ立派な組み込みシステム!というパッケージにしようという考え。

やるやると言いながらなかなか公開していないNT-Shellですが、幾つかのバグフィックスも含める予定ですので、今しばらくお待ち頂ければ幸いです。

2015年1月5日月曜日

小規模組み込みシステム向けコマンド・インターフェース・ライブラリNT-Shellのフォローアップ


小規模組み込みシステムデバッグ用シェル - Natural Tiny Shell (NT-Shell)で紹介した小規模組み込みシステムデバッグ用シェルですが、現在は以下のように公開先の変更やフォローアップ記事の掲載などが行なわれています。特に、NT-Shellを使ったモニタ・プログラムNT-Monitorは実践的な活用事例として有効ですので是非ご覧下さい。

2017/4/1追記。

公開サイトを変更しています。以下から最新版をダウンロードできます。
https://www.cubeatsystems.com/ntshell/

CQ出版社の月刊誌インターフェース2013年1月号に記事を書きました。
http://www.kumikomi.net/interface/sample/201301/if01_174.pdf

インターフェース2013年1月号のソースコードは、CQ出版社のダウンロードサービスで入手できます。
http://www.cqpub.co.jp/interface/download/contents.htm

TOPPERS活用アイデア・アプリケーション開発コンテストでの資料はこちら。
https://www.toppers.jp/docs/contest/presen2011_NaturalTinyShellTask.pdf


2012年12月28日金曜日

ACB-BF592とUMB-SGTL5000を使ったTalk ThroughをTOPPERS/JSP上で実現する

オーディオ・プラットフォーム・プロジェクトであるBlueTankも、ベース基板が上がってきて半年が経とうとしています。その間にベア・メタルなアプリケーションは幾つか実装したのですが、そろそろ色々な不満が出てきました。


Blackfin BF592は、ARM Cortex-Mシリーズ等と比較しても有り余るプロセッサ能力を持っています。簡単なサンプル・プログラムならともかく、システムとして様々なサービスを提供するのにRTOSを使って楽をしたくなってきました。RTOSを使えばNatural Tiny Shell (NT-Shell)もシステム・シェルとして提供できます。「ビデオやオーディオのDMAバッファの管理手法 (動かして遊べるソースコード付き!)」をRTOS上で試してみたいというのもあります。

プロジェクトを始めた当初はフラッシュ・ロムへの書き込みも出来なかったため独立した組み込みシステムとして動作しませんでした。Blackfin BlueBootを実現した事で独立した組み込みシステムとしての道筋が見え、だんだんと欲も出てきました。

幸いにも、DSP空挺団の酔漢さんが「ACB-BF592とTLV320AICを使ったTalkthroughサンプル。TOPPERS/JSPベース。 (bf592_tlv320aic23b_talkthrough) 」というものを公開して下さっています。このプロジェクトは、TOPPERS/JSP for Blackfin上に、使いやすいI2C制御層が組み込まれた上、オーディオ・フレームワークUZUMEが実装されています。

BlueTankプロジェクトにおけるRTOS環境の出発点として、この酔漢さんの成果物をふんだんに活用させて頂く事にしました。これは本当に有難い話です。

TLV320AIC23BもI2Cインターフェースを持つデバイスですから、UMB-SGTL5000に搭載されているオーディオ・コーデックに対する処理も、少しの改造で可能だろうという算段。実際に酔漢さんの丁寧な設計実装のおかげで、ものの3分でBlueTankでもTalk Throughが動作するようになりました。ちなみに、オリジナルのコードは、レジスタ互換のSSM2603が搭載されたUMB-SSM2603でも動作します。

唯一変更したソースコード : uzume.c

対応は至って簡単で、init_codec関数の中身を少し変更しただけです。

今回のTalk Throughは、氏の進めているUZUMEフレームワーク上に構成された物です。
BlueTankプロジェクトも、UZUMEフレームワークを使って色々と実験を進めようと考えています。

素晴らしいプロジェクトを公開して頂いているDSP空挺団の酔漢さんには感謝感謝です。

2012年11月30日金曜日

CQ出版社Interfaceの2013年1月号にNatural Tiny Shell (NT-Shell)を使ったモニタ・プログラムの記事が掲載されました

CQ出版社Interfaceの2013年1月号にNatural Tiny Shell (NT-Shell)を使ったモニタ・プログラムの記事が掲載されました。
「わずかROM 10Kバイト!コマンド入力ライブラリ」と銘打って、NT-Shellの簡単な紹介と、応用事例としてモニタ・プログラムを実装した事例を紹介しています。


対応するプログラムは以下からダウンロードできます。
記事の中ではFM3マイコンに対する実装を紹介していますが、他のマイコンでの実行も可能です。
マイコンのコマンド入力インターフェースでお悩みの方は是非お試し下さい。


また、CQ出版社さんのページでは、IAR Embedded Workbench for ARMで使用可能なFM3付属基板用プロジェクトファイル一式のダウンロードが可能です。
2013年1月号の「ROM 10Kバイト/RAM 1Kバイトでヒストリ機能付き! コマンド入力ライブラリNT-Shell」の項目を御参照下さい。

2012年11月4日日曜日

Natural Tiny Shell (NT-Shell)の更新

小規模組み込みシステム向けシェルモジュールNatural Tiny Shell (NT-Shell)の更新情報です。
最新バージョンは今日現在でVersion 0.2.0です。

変更点は以下の通りです。
  • 初期化と実行の関数を分離しました。
  • ユーザがプロンプトを変更できるようになりました。
  • その他、細かい修正。
最新版はhttp://shinta.main.jp/firmware/ntshell/ntshell_ja.htmlからダウンロードできます。

NT-Shellユーザとして一番嬉しいのはプロンプトの変更が可能になった事ではないでしょうか?
ntshell_set_promptという新しい関数を使うと、動的にプロンプトの変更が可能です。


FATファイルシステムと組み合わせて使用する場合など、パス名をプロンプトにしたりできます。
コマンドモードによってプロンプトを変更するなどの利便性を提供する事が可能になりました。

内部実装も初版から大幅に整理して変更を加えています。
初版をご利用の方も是非一度ダウンロードしてお試し頂ければと思います。

2012年9月23日日曜日

小規模組み込みシステムで使えるBASICインタプリタをKOZOSと同時に楽しむ! (NT-Basic on KOZOS)

先の記事「NT-Basic on KOZOSのために・・・ (NT-Basicの改良)」では、小規模組み込みシステムで使用可能なBASICインタプリタであるNT-Basicの改良を行ないました。

やっとこさ使えそうな物になってきたので、NT-Shellと組み合わせてKOZOS上で動作させてみました。



デモの中で流れている音楽は、KOZOS EXPBRD上に搭載されたマイクロSDカードから再生しています。
と同時に、シリアルコンソールからBASICインタプリタを楽しむ事ができるというのが今回のデモです。

何かオペレーティングシステムを使っているからこその動作が欲しかったので作ってみました。

端末の処理はNatural Tiny Shell (NT-Shell)の処理系を使用しています。
自然な入力が可能で、入力処理が破綻せずスムーズにプログラムの編集ができます。

KOZOS EXPBRDには、グラフィックLCDや入力スイッチが搭載されています。
NT-Basicに命令を追加してグラフィック制御などもできるようにするとゲームも作れそう。

NT-Basicの拡張でKOZOSも使うからKZ-Basicなんていうのも洒落ています。
KZ-Basic (拡張NT-Basic)という名称で拡張していく事を考えています。

今回のソースコードは「茶室で楽しむKOZOS拡張基板」でもお渡しする予定です。

2012年7月27日金曜日

組み込みシステムの全体挙動を簡単に確認できるロギングツール - Natural Tiny Logger (NT-Logger)

先のツールとの関係

「KOZOSのタスク間通信を可視化するツールを作ってみた (ipcrvt.sh : KOZOS IPC Relationship Visualization Tool)」でも取り上げたように、リアルタイムシステムでは、ある作業単位を設計し、タスクに落とし込んでいく形でシステムを実現するのが通例です。

先の記事では、タスク間通信の関係を実装から簡単に明らかにする方法を紹介しました。
タスク間通信の関係が明らかになることで、システムの中の複数のモジュールの依存関係が明確になり、システムに与える刺激(入力)とシステムから得られる反応(出力)を推測できるようになります。


先のタスク間通信の関係を明らかにするツールは、あくまでもソースコードから得られる静的な情報を基にしたものでした。
実際のリアルタイムシステムの場合、複数のタスクの相互関係性が常に変化するため、ソースコードから得られる静的な情報だけでは、見て取れない動作が膨大に存在します。

そこで、今回は上記の可視化ツールに加えて、実際のシステムの挙動を観察する事のできるロギングツールを設計実装しました。

Natural Tiny Logger (NT-Logger)の特徴

本ツールの特徴を挙げます。
  • シリアルポートのある組み込みシステムなら、どんなシステムでも使用可能。
  • 組み込みシステム側に巨大なメモリが不要。
  • 記録時間はホスト側のストレージの容量に依存。長時間の記録が可能。
  • シンプルな設計で移植や改造が容易。
  • ホスト側プログラムはWindows, Mac OS, Linuxと3つのプラットフォームに対応。
Natural Tiny Logger (NT-Logger)による最終出力はブラウザ上で確認する事ができます。
マウスホイールで時間軸を伸ばしたり縮めたりしながら、システムの全体挙動を確認できます。




数年前(2010年前半頃)にTOPPERSプロジェクトのTrace Log Visualizerを使用したのですが、その時からNT-Loggerのプロジェクトがスタートしました。 Trace Log Visualizerは、ターゲット側のメモリにイベント情報を記録し、あるタイミングでホスト側に記録したデータを出力するという仕組みでした。この場合、ターゲット側に巨大なメモリが存在していなくてはならず、TOPPERSのように小規模組み込みシステムで使用したいOSのロギングツールとして魅力をあまり感じませんでした。

Natural Tiny Logger (NT-Logger)の原型は当時にあったのですが、先にNatural Tiny Shell (NT-Shell)の設計実装を開始したのでなかなか手が回りませんでした。

Natural Tiny Logger (NT-Logger)の対象外

NT-Loggerは、上記に記した特徴示すと同時に、幾つかのトレードオフについてユーザに説明する必要があります。
  • ターゲットとホスト間の通信経路においてのバッファリング等による遅延などの影響は考えない。
  • ターゲットとホスト間の通信経路に存在するであろうバッファリング等による遅延やジッタの影響は、測定対象単位時間に対して十分に小さく無視できるものとして扱う。
  • 絶対時間情報を必要とするようなデバッグには使用できないが、メッセージパッシングで駆動するリアルタイムシステムにおいて、通常は因果関係が明らかであるので問題ないものとして扱う。
  • 非同期システムのデバッグに使用できない事を意味するが、因果関係のはっきりしないような不確定要素を含むリアルタイムシステムは、そもそも設計してはならないものとして、これを無視する。
  • ロギングのためのオーバーヘッドは無視できるほどに小さいものとして扱う。
中には少し過激なトレードオフに見えるものもあるかもしれません。
これはNT-Loggerが「無いより遥かに便利!」、「しかも無償で使える!」というところを念頭に置いているからです。

「そんなロギング意味がない!使い物にならない!」というケースでは、こんな中途半端なツールは使うべきではないでしょう。それは、NT-Loggerがとったトレードオフに含まれる種々の問題を解決したツールを使うべきです。というのが、NT-Loggerの立場です。

どんな組み込みシステムでも使える

組み込みシステムの全体挙動を確認するためのツールは、市販品を中心に星の数ほど存在します。
多く見られる実現形態の一つが、ターゲットとホストの間に専用のハードウェアを介入させて、忠実にイベントをロギングする形態です。
確かに忠実なイベントのロギングには、これが一番信頼性の高い方法でしょう。
中間装置が正確な時刻情報を付与すると共に、データをバッファリングし、ホストコンピュータの処理能力に影響されずに正確にロギングする事ができます。

これらの中間装置を必要とするロギングツールの場合、導入コストがかなりかかる事が多いです。
実際の開発では、システムの全体挙動の概要を確認するだけで、どんな問題があるのかわかる事も多々あります。少し調べたいだけの時に高価なロギングツールを購入できるかどうかは状況によります。


先のトレードオフでも述べたとおり、組み込みシステムの場合はイベント駆動型で設計するのが普通のアプローチです。あるイベントがある動作を引き起こすという因果関係を明らかにするのと同時に、 原因と結果の依存関係を緩い依存関係で留める事ができるわけです。


NT-Loggerは、多くの組み込みシステムに搭載されているシリアルポートを有効に活用し、必要最低限のロギング機能で最大限の効果を挙げることを目的に設計されています。因果関係が明らかになっている組み込みシステムの場合、簡単なロギングメカニズムを追加するだけでも十分な効果が得られるというわけです。

設計と概念など

ここで、設計や概念などを記しておきます。

基本設計と概念

  • イベントは、「イベント発生源」から発生する。
  • イベントは、イベント情報で表現される。
  • イベント情報には、「始まり」と「終わり」を示す「タイプ番号」がある。
  • イベント情報には、「イベント発生源」を示す「トラック番号」がある。
  • イベント情報には、イベント内容を示す「イベント番号」がある。
  • ターゲットから送られるイベント情報には、「トラック番号」と「イベント番号」と「タイプ番号」が含まれる。
  • ホストは、ターゲットから送られるイベント情報に時間情報を付与して記録する。
  • ホストは、記録されたデータを基にした可視化データを生成する事ができる。

NT-Loggerの使用手順

  • ターゲット側プログラムにロギング用APIを埋め込み動作させる。
  • ホスト側でキャプチャプログラムを実行する。
  • キャプチャされたデータからHTMLを生成するジェネレータを実行する。
  • ブラウザで結果を確認する。

仕様

  • 最大トラック数は16トラック。
  • 1トラックあたり8つのイベントを記録可能。(単純計算で16x8=128事象が扱える事になる。)
  • 記録イベントの分解能はマイクロ秒単位。
  • RAMが1KBを切るようなシステムでも使用可能。
  • ターゲット側は最小限のAPIの実装のみで移植可能。 
  • データはブラウザで閲覧可能。

今後の計画

現在初版のリリースに向けて作業を開始しています。
暫くこのブログもNT-Loggerまみれにしようと考えています。

2012年5月6日日曜日

Natural Tiny Shell (NT-Shell) をLX9で使ってみる

Natural Tiny Shell (NT-Shell)の次のリリースに向けて「Eating your own dog food」を実践しているわけですが、今回はLX9で試してみることにしました。


と言っても、NT-Shellはもともと「UARTのReadとWriteさえ用意してくれればうまく行くよ。」という設計なのであまり苦労する事はありません。

UARTの付いたHardware Platformを使ってHello Worldプロジェクトを新規作成します。


次にNT-Shellのソースコードを持ってきてプロジェクトに追加します。


後はhelloworld.cにNT-Shell用の記述を追加するだけ。
以下のようにシンプルな実装で直ぐにNT-Shellを試す事ができます。

簡単です。

#include "platform.h"
#include "ntshell.h"
#include "xuartlite.h"

XUartLite xu;
ntshell_t ntshell;

static int func_read(char *buf, int cnt)
{
 int i;
 for (i = 0; i < cnt; i++) {
  u8 c;
  while (XUartLite_Recv(&xu, &c, 1) != 1) {
  }
  buf[i] = c;
 }
    return 0;
}

static int func_write(const char *buf, int cnt)
{
 int i;
 for (i = 0; i < cnt; i++) {
  u8 c = buf[i];
  while (XUartLite_Send(&xu, &c, 1) != 1) {
  }
 }
    return 0;
}

static int func_callback(const char *text, void *extobj)
{
    fprintf(stdout, "The user input text is '%s'\n", text);
    return 0;
}

int main()
{
    init_platform();

    u16 UartDeviceId = 1;
    XUartLite_Initialize(&xu, UartDeviceId);
    ntshell_execute(&ntshell, func_read, func_write, func_callback, NULL);

    cleanup_platform();

    return 0;
}

BSPに含まれるライブラリのインターフェースを見て、stdinとstdoutが使えそうかと思う方もいるかもしれません。 実際にやってみるとわかるのですが、stdoutは通常のlibcと同様バッファリングされているのでNT-Shellで使うのには向きません。fflush(stdout)してもバッファはフラッシュされませんでした。そこで上記のようにXUartLiteのAPIをそのまま呼んでいます。


同様にしてXilkernel上での実装も可能ですので、履歴編集機能を持つシェル(風味)インターフェースを気軽に追加する事ができます。

ちなみに、ハードウェアプラットフォーム211に対してのBSPを合わせて以下の容量になりました。

   text    data     bss     dec     hex filename
  69044    1428    8780   79252   13594 hello_world_0.elf

2011年11月24日木曜日

ET2011でNatural Tiny Shell (NT-Shell)のデモ・キットを展示しました

御報告が遅くなりましたが、ET2011でNatural Tiny Shell (NT-Shell)のデモ・キットを展示しました。
以下の写真が展示の様子です。


物凄く地味なデモですし、内容も内容ですから、本当に興味を持った人しか立ち止まらない感じで、逆にそれが個人的に面白かったです。

私のプレゼンテーションを聞いてくれた人からも「実は私も同じようにシェルに不満を持っていました。」と声をかけてくれた人もいました。


さて、肝心の成果物ですが、本日Version 0.0.8をリリースしました。
http://sourceforge.jp/projects/ntshell/releases/ からダウンロードできます。

以前はシェル用ライブラリだけでしたが、今回から「ライブラリ」と「サンプル」の二本立て構成にしました。今のところ「サンプル」にはTOPPERS用の実装のみ追加しています。

今回プレゼンテーションを作成するにあたって設計を振り返ったところ、まだまだ改良できる点が多くある事に気付きました。

今後も継続的に改善を行ない、よりコンパクトで使いやすいシェルライブラリにする予定です。


2011年11月9日水曜日

小規模組み込みシステム向けシェル・タスク『Natural Tiny Shell Task』のデモ・キットをET2011のTOPPERSブースで展示します。

小規模組み込みシステム向けシェル・タスク『Natural Tiny Shell Task』のデモ・キットをEmbedded Technology 2011TOPPERSブースで展示します。

先日から「Natural Tiny Shell Taskがどうのこうの。」と煩いわけですが、実際に触っていない人にとっては「何がそんなに嬉しいんだ?」という感じです。


そこで、今回は実際に動作を体験して頂けるようにしようと考えました。
下の写真がデモ・キットの外観です。


NXPセミコンダクターズ社のARM Cortex-M3が搭載されたLPCXpresso LPC1768にUSB-UART変換基板が接続されたものです。今回はシェルのデモなのでこれだけでも良いのですが、あまり面白いデモと言えなかったので、カラーLEDを付けてシェルから操作できるようにしてみました。


組み込みシステムのデバッグでは、コマンドをシステムに与えてデバッグする事がよくあります。今回はcolorコマンドに表示色を与えることで、カラーLEDの色が変化するというデモを用意しました。システムに対する要求が視覚的に判断できるので、楽しんでいただけるのではないでしょうか。


また、TOPPERSを触った事のない人にとって「きちんと動いているシェルっぽいもの」を見ても「何がそんなに良いわけ?」となります。そこで、このデモ・キットは、「適当に実装したシェル」と「Natural Tiny Shell」の二つを同時に体験できるように設計してあります。


「適当に実装したシェル」は、それこそ本当に適当で文字の入力を誤ると酷い事になるような実装になっています。「そんなのあるわけ?」と思うかもしれませんが、残念ながら小規模組み込みシステムでは実際によくある話です。

当日は2つの端末を並べて実際に操作しながら比較する事ができるようにする予定です。

ET2011の最終日である18日(金)の15時過ぎから「TOPPERS活用アイデア・アプリケーション開発コンテスト表彰式」と「コンテスト受賞作品の紹介」も行われる予定です。紹介のプレゼンテーションは私自身が担当する予定ですので皆様是非お越し下さい。

2011年10月29日土曜日

小規模組み込みシステム向けシェル・タスク『Natural Tiny Shell Task』が、TOPPERS活用アイデア・アプリケーション開発コンテストのアプリケーション開発部門で銀賞を受賞

小規模組み込みシステム向けシェル・タスク『Natural Tiny Shell Task』が、2011年度のTOPPERS活用アイデア・アプリケーション開発コンテストのアプリケーション開発部門で銀賞を受賞しました。




関連してET2011のTOPPERS/SESSAMEパビリオンにおいて、アプリケーションについてのショート・プレゼンテーションとデモンストレーションも予定しています。TOPPERS(や、その他RTOS)を使った小規模組み込みシステムでシェルのようなものが欲しいけど、あまり良い物が見つからないとお困りの方は是非御来場下さい。

詳しくはTOPPERSプロジェクト/ET2011のページを御覧下さい。

2011年5月28日土曜日

野良管理していたソフトウェアをsourceforgeでホスティングする事にしました。

先日まで野良管理していたソフトウェアですが、sourceforgeで正式に(?)ホスティングすることにしました。バージョン管理はgitを採用しています。


Natural Tiny Shell (NT-Shell)

以下のウェブページからアクセス可能です。


H8/3069F writer for KOZOS (kz_h8write)

以下のウェブページからアクセス可能です。


ドキュメントなどもこれから充実させていく予定です。

2011年5月22日日曜日

Natural Tiny Shell (NT-Shell)をmbedで使ってみる (Eating your own dog food)

「自分のドッグフードを喰う(Eating your own dog food)」はソフトウェア開発の世界で有名な台詞です。


自身で作ったソフトウェアを自身で使うことで、それがどのように有用か(あるいはそうでないか)を知る事ができるというわけです。

例にならってNatural Tiny Shell (NT-Shell)をmbedで使ってみることにしました。
目論見は簡単に移植できるというところです。

しかし、実際に移植してみると幾つか気になる点がありました。
これは興味のある方のために後述。

移植した結果はmbed.orgにアップロードしました。
興味がございましたら、ご自由にお使い下さい。

http://mbed.org/users/shintamainjp/notebook/ntshell_ja/

2011年5月19日木曜日

Natural Tiny Shell (NT-Shell) ライブラリを更新しました。

Natural Tiny Shell (NT-Shell) ライブラリは小規模組み込みシステムの為のシェルライブラリです。
本日新しい機能(入力補完機能)を加えて更新しました。

入力補完と1口で言っても色々な種類の補完が考えられます。
今回の入力補完機能は過去に入力した文字列の中から候補をTABキーで選出する事ができるというものです。

デモ映像を用意しましたのでご覧下さい。


ソースコード : Natural Tiny Shell (NT-Shell) Version 0.0.6

インターフェースはかなりシンプルです。
ntshell.hのntshell_executeインターフェースのみ知っているだけで使用することができます。
このため、様々なシステムに簡単にポーティングする事ができます。
是非みなさんの小規模組み込みシステムでお楽しみ下さい。

Natural Tiny Shell (NT-Shell) library was updated.

Natural Tiny Shell (NT-Shell) library is a tiny shell library for a small embedded system.
Today, I just updated the library.
The new feature is historical input.

Please see the demo movie.


The source codes : Natural Tiny Shell (NT-Shell) Version 0.0.6

The interface is really simple.
You should only know ntshell_execute in ntshell.h.
So you can port it to any embedded system easily.
Please enjoy your small embedded system with it. :)

2011年3月2日水曜日

Natural Tiny Shell(NT-Shell)のポーティング事例。LPCXpressoとTOPPERS/ASPで小規模組み込みシステムの開発をもっと便利に!

はじめに

前回の記事でVT100仮想端末を小規模組み込みシステムで実現するためのライブラリを公開しました。
中には「これが何の役に立つのだろう?」と疑問に思われた方も少なくないでしょう。

この手のツールは実際の開発作業が進むにつれて利便性を再認識することが少なくありません。
(逆に言うと実際に開発作業で相当に困らないと不便な事に気付かない事が多いのです。)

今回はLPCXpresso上でTOPPERS/ASPを動作させるシステムを実際に開発するシステムと見立てて、Natural Tiny Shell(NT-Shell)をポーティングして活用した時のメリットについて御紹介します。


TOPPERS/ASPでNatural Tiny Shell(NT-Shell)を使う

今回はRTOS上にシェルを実装することでシステム開発をもっと便利にしてみましょう。
題して「LPCXpressoとTOPPERS/ASPで小規模組み込みシステムの開発をもっと便利に!」です。
小規模組み込みシステムでありがちな「この程度の規模だからいいや。」と諦めている方におすすめです。
きちんと動作するデバッグ用シェルがあるだけでシステムが見違えるように良くなったように感じます。
デバッグも楽しくなって作業効率が向上すること間違いなし!
是非皆さんも挑戦してみませんか?

エコーバックを行わないようにする

受信した文字列をエコーバックする設定を取り除く。

TOPPERS/ASPでは受信した文字列をエコーバックすることができるようになっています。
Natural Tiny Shell(NT-Shell)を使用する時、エコーバックは都合が悪いので設定を外します。
これはシリアルインターフェースドライバで行うことができます。

syssvc/serial.c の serial_opn_por 関数でIOCTL_ECHOの指定を取り除きます。
serial.cの240行目付近です。


/*
 *  変数の初期化
 *  エコーバックさせたい時にはIOCTL_ECHOを追加すると良い。
 */
p_spcb->ioctl = (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);


なぜ受信した文字列をそのまま返してはいけないかという話です。

システムに接続されたシリアル端末が送信してくるコードの中には制御コードが含まれる事があります。
今回のシェルを設計実装した目的の1つは「制御コードをうまく処理してシリアル端末ユーザに便利な機能を提供しよう」です。
受信したコードをそのまま送信した結果、シリアル端末上で制御コードが解釈されてしまっては従来と何も変わらない事になってしまいます。
これを避ける為にエコーバックをしないようにします。

例えば、「おっ。上方向キーだな。じゃあ、過去のコマンドを表示してあげよう。」といった具合です。

システム

今回のシステムは以下のようになっています。
実際に開発するシステムに見立てていると考えてみて下さい。


システムと開発用ホストは2つのUSBで接続されています。

1つはLPCXpresso用でこれはLPCXpresso上のデバッガに接続されています。
実際に開発するシステムによってはここは他のデバッガに置き換わる事もあるでしょう。

もう1つは開発対象システムのUARTをUSBで入出力するための変換器との接続です。
今回は秋月電子通商で販売されているFT2232Dを使った変換器を使用しました。

実際の接続した状態は以下のようになっています。


内部タスクの構成

今回の内部タスク構成を以下のようにしました。
  • task_ledblink: LEDを一定間隔でトグルするLED点滅タスク
  • task_ntshll: Natural Tiny Shellをフロントエンドとするシェルタスク

LED点滅タスクを作る

LED点滅タスクは一定時間間隔で動作しLEDの状態をトグルさせるタスクです。
点滅の間隔は100[ms]ですが、データキューから値を受け取って変化させることができるようにしてあります。
外部からデータキュー経由で点滅の速度(正確にいうとタスクの動作間隔)を変化させることができるようにしてあります。


void task_ledblink(intptr_t exinf)
{
    syslog(LOG_NOTICE, "task_ledblink: Started.");

    int ledspd = 100;
    while(1)
    {
        uint_t value;
        while (prcv_dtq(DTQ_LEDSPD, (intptr_t *)&value) == E_OK) {
            if (value > 0) {
                ledspd = value;
                // syslog(LOG_NOTICE, "new value is %d.", value);
            }
        }
        LPC_GPIO0->FIOPIN ^= ACTLED;
        tslp_tsk(ledspd);
    }
}


シェルタスクを作る

次にNatural Tiny Shell(NT-Shell)を組み込んだシェルタスクを立てます。
シェルタスクはUARTに対する入出力を管理しながら、ユーザの要求をシステムに伝達する役目を果たします。


void task_ntshell(intptr_t exinf)
{
    syslog(LOG_NOTICE, "task_ntshell: Started.");
    serial_opn_por(SIO_PORTID);

    ntshell_execute(&parser,
            &editor, &history,
            func_read, func_write, func_cb);
}


ntshell_executeは処理を戻さない関数です。
UARTからの入出力関数を受け取って処理を行ないます。

今回の例ではfunc_readは以下のようになっています。


int func_read(void *buf, int cnt)
{
    return serial_rea_dat(SIO_PORTID, buf, cnt);
}


同様にfunc_writeは以下のようになっています。


int func_write(const void *buf, int cnt)
{
    return serial_wri_dat(SIO_PORTID, buf, cnt);
}


ユーザが操作を決定するとコールバック関数(上記ではfunc_cb)が呼ばれるようになっています。
ユーザが入力を完了後、エンターキーを押した時の入力文字列が渡されるようになっています。

ここでユーザの要求に応じて処理を行えば良い事になります。


int func_cb(const unsigned char *text)
{
    // TODO 入力されたコマンドに応じて処理を行う。
}


ちなみに、この関数内部の実行スレッドはシェルタスクのスレッドです。
今回のアプリケーションでは以下のように実装してみました。
ntop_compareはNatural Tiny Shellに含まれるユティリティ関数で、文字列の比較を行うものです。


int func_cb(const unsigned char *text)
{
    static int ledspd = 100;
    if (ntopt_compare(text, "INTERVAL UP") == 0) {
        if (ledspd < 500) {
            ledspd++;
            snd_dtq(DTQ_LEDSPD, (intptr_t)ledspd);
        }
    } else if (ntopt_compare(text, "INTERVAL DOWN") == 0) {
        if (ledspd > 1) {
            ledspd--;
            snd_dtq(DTQ_LEDSPD, (intptr_t)ledspd);
        }
    } else if ((ntopt_compare(text, "HELP") == 0)
            || (ntopt_compare(text, "?") == 0)) {
        text_puts("\r\nINTERVAL UP   : Task interval time increase.");
        text_puts("\r\nINTERVAL DOWN : Task interval time decrease.");
    } else {
        if (ntopt_get_count(text) > 0) {
            text_puts("\r\nUnknown command found. (HELP: display help.)");
        }
    }

    return 0;
}


実際に使ってみる

実際に使用している様子を動画で御紹介します。


リソース

今回は3千円で楽しめるARMマイコンとRTOSの世界 (TOPPERS/ASP on LPCXpresso LPC1768)のプロジェクトに小規模組み込みシステムデバッグ用シェル - Natural Tiny Shell (NT-Shell)を追加する形で作業しました。
プロジェクトはここからダウンロードできます。

2011/03/08追記。
公開当初のサンプルプロジェクトが使用しているNT-Shellにはバックスペース処理にバグがありました。
修正したライブラリに差し替えました

まとめ

ターゲットに対して対話型で操作要求ができるとちょっとした確認をする時に非常に便利です。
今回はLPCXpresso(Cortex-M3搭載)でRTOS(TOPPERS/ASP)を動作させるという比較的小さな組み込みシステムでの応用例を示しました。

システム内部の値を外部から変更することは当然デバッガなどでも可能です。
しかし、ちょっとしたパラメータを変更したい場合や複数のパラメータを同時に変更したい時には不便です。

対話型のシェルインターフェースがあれば、開発ホスト並の利便性を確保することも可能になります。

補足

念の為補足しておくと、LEDの点灯間隔を変化させるという行為が主眼ではありません。
おそらく点灯間隔を変えるための実装にはもっと相応しいものがあるでしょう。

今回はあくまでシステム内部の挙動をシェルを介して変化させるというところに視点をおいてあります。
今回の実装では点灯間隔が狭くなるにつれてプロセッサの使用率も相当上がります。
システムがどの程度の負荷を許容するのかを外部でパラメータを変更させながら見ることもできるでしょう。

2011年3月1日火曜日

小規模組み込みシステムデバッグ用シェル - Natural Tiny Shell (NT-Shell)

2014/11/02追記。
公開サイトを変更しています。以下から最新版をダウンロードできます。
http://www.cubeatsystems.com/firmware/ntshell/ntshell_ja.html
CQ出版社の月刊誌インターフェース2013年1月号に記事を書きました。
http://www.kumikomi.net/interface/sample/201301/if01_174.pdf
インターフェース2013年1月号のソースコードは、CQ出版社のダウンロードサービスで入手できます。
http://www.cqpub.co.jp/interface/download/contents.htm
TOPPERS活用アイデア・アプリケーション開発コンテストでの資料はこちら。
https://www.toppers.jp/docs/contest/presen2011_NaturalTinyShellTask.pdf
2012/10/18追記。
公開サイトを変更しています。以下から最新版をダウンロードできます。
http://shinta.main.jp/firmware/ntshell/ntshell_ja.html

小規模組込み機器を設計している時に必ずと言っていいほど欲しくなるのが、シェル端末のようなインターフェースです。
シェル端末があれば、対話形式でシステムの状態制御や状態取得を行うことが可能になります。

最近のプロセッサは小規模組み込み用途でも20年前のパソコンを超える性能を持っているのが現状です。
また、シェルのような動作を実現するのに高性能なプロセッサが必要というわけではありません。

しかしながらきちんとシェルの動作を実現しようとするとVT100のような端末をエミュレーションする必要がでてきます。
シェル端末が送信する多くの制御コードの解釈を正しく行うコードを実装するのは意外に面倒な作業です。
このため、多くの小規模組み込み機器の開発においてなかなか実現されることが少ないのが現状でした。

そこで、今回は小規模組み込みシステム向けのデバッグ用シェルNatural Tiny Shell (NT-Shell)を設計実装してみました。


このシェルを使えば、キー入力でおかしな制御コードが入ったりすることはありません。
コマンドの入力時に左右にカーソルを移動させてスムーズに編集できるのも特徴です。
また、上下方向キーによるヒストリ機能も搭載しています。
デバッグ時のキー入力で慎重になる必要がなくなりますので、スムーズな作業ができるようになります。

ソースコードはCランタイムライブラリに非依存で、小規模リアルタイムシステムなどへのポーティングも容易です。
ポーティング時にはソースコードを変更する必要はありません。
シェルの実行関数にシリアル通信ポートのI/O関数のポインタを渡すだけで済むようにしてあります。

詳しくは付属のドキュメントを参照して下さい。
ダウンロードはこちら:ntshell-0.0.4.tar.gz

2011/03/08追記。
公開当初のVersion 0.0.1にはバックスペース処理にバグがありました。
修正したVersion 0.0.3に差し替えました。

2011/04/30追記。
Version 0.0.3にはntoptとntlibcが含まれていませんでした。
また、vtparseのテーブルがRAMに配置されるようなになっていたので、static const属性に変更した上でvtpraseの実装を一部修正しました。
以上の修正を行ったVersion 0.0.4に差し替えました。

2011/05/20追記。
その後、入力補完機能を追加し、インターフェースをシンプルにしたバージョンを公開しました。
http://shinta-main-jp.blogspot.com/2011/05/natural-tiny-shell-nt-shell.htmlをご覧下さい。
動作の様子を記した動画もご覧頂けます。

2011/05/22追記。
mbedでも使えるようにしました。
http://shinta-main-jp.blogspot.com/2011/05/natural-tiny-shell-nt-shellmbed.htmlNatural Tiny Shell (NT-Shell)をmbedで使ってみる (Eating your own dog food)をご覧下さい。

2012/10/18追記。
公開サイトを変更しています。
以下から最新版をダウンロードできます。
http://shinta.main.jp/firmware/ntshell/ntshell_ja.html