ラベル UOS-LPC800 の投稿を表示しています。 すべての投稿を表示
ラベル UOS-LPC800 の投稿を表示しています。 すべての投稿を表示

2017年2月28日火曜日

熱血!アセンブラ入門に感化されてARM Cortex-M0で動作する小さなオペレーティング・システムUOS-LPC800のパッケージを更新しました!

ARM Cortex-M0で動作する小さなオペレーティング・システムUOS-LPC800のパッケージを更新しました。今回はとても地味にコンパイル・オプションの更新を行っただけのパッケージです。


今回の更新は完全に「熱血!アセンブラ入門」に感化されたもので、今回のパッケージを展開してLPCXpressoでコンパイルすればアセンブラまで確認できるというものになっています。


ビルドすると.hexなどの他に.asmが出力されるようにしました。


中身を見るとソースコードとアセンブラを同時に確認できます。
熱血!アセンブラ入門と同時に活用できる便利なパッケージです。


ダウンロードは以下からどうぞ。
http://cubeatsystems.com/uos-lpc800/download.html

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年7月31日金曜日

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

Maker Faire Tokyo 2015に出展します。


今回はA tiny MML parserを使った小型ガジェットを出展します。


その小型ガジェットはオペレーティングシステムにUOS-LPC800を採用しています。


その名もMicro MML Player LPC812です。


ミュージック・サウンドのエリアで出展しています。

2015年5月31日日曜日

LPC810でも動作するリアルタイム・オペレーティング・システムのUOS-LPC800にタスク間通信機能を追加しました!

あらまし

約二年も前の話ですが、「割と適当に動作するOS「誰得OS」のCortex-M0+版であるUOS-LPC800を作りました」で 、LPC810でも動作するリアルタイム・オペレーティング・システムを作りました。LPC800シリーズの厳しい制約(ROM: 4KB、RAM: 1KB)の中でOSを動作させてみたいという欲求と、実際にこのような制約の中で何が出来るのか、単純に技術的な興味があったからです。

当初のバージョンにおいて、タスク側から操作可能なAPIはuos_task_yieldとuos_task_sleepのみで、OSと呼ぶならば欲しいであろうタスク間通信すら追加しませんでした。 サンプル・プログラムは、片方のタスクでLEDを点滅させ、もう片方のタスクでシリアル通信を扱うだけのものです。まさに「誰得OS」の名前に相応しいアプリケーション。


なかなか思い切った割り切りだと当時は考えましたが、先日から実アプリケーションにUOS-LPC800を適用してみようと考え始めた時点で、タスク間通信の必要性を改めて感じる事になりました。各タスクがそれぞれの仕事をこなしつつ、他のタスクと協調して動作させようと考えた場合、タスク間通信は必須とも言える機能です。 やっぱり欲しいよね・・・。

設計

タスク間通信を追加する前のUOS-LPC800におけるタスクの状態遷移は以下です。タスクは、基本的にRunningとReadyを行ったり来たりしており、uos_task_sleepによってスリープ状態に遷移するようにしました。非常にシンプルな作りです。


今回、タスク間通信を追加するにあたって、方針を「出来るだけ現状の設計には手を加えないで追加する」とし、スリープ処理に手を加えない形でタスク間通信を追加する事にしました。

今回のタスク間通信(メッセージ・パッシング)のモデルは以下のようなものです。 Task Aからuos_task_event_sendに対して「送信先タスクID番号」と「32ビットの値」を渡すと、あーら不思議、uos_task_event_recvを使って待ち状態に入っているTask Bに値が渡って実行状態に遷移するというものです。モデルは至って単純。


今回、上記の単純なモデルを実現するために、カーネル内部にブロック状態を管理するタスク・コンテキスト・ブロックのキューを新設し、送信待ちタスクと受信待ちタスクをブロック状態のキューに入れてから処理する事にしました。状態遷移は以下のようになります。


本当は、スリープ状態もブロック状態の一種として扱え、相当な理由が無い限り分離する意味はなさそうなのですが、今回は既存機能に手を加えない事にしたのでそのまま。もしかしたら次のアップデートではブロック状態をBlockedに変更して、現在のBlockとSleepと統合するかもしれません。

サンプル・アプリケーション

サンプル・アプリケーションは、従来通り二つのタスクを用意しました。タスク間通信を使用する場合は、task_ttyからtask_ledに向かってタスク間通信機能を使ってLEDの点灯指令を発行します。外から見た動作は従来のサンプルと何ら変わらないのですが、タスク間通信で指令するようになったところが従来と異なります。

ちなみに、タスク間通信を使う場合、直接タスク間通信の関数を呼び出しても良いのですが、受信側タスクにサービス要求用のAPIを作って、送信側のタスクがそのサービス要求用のAPIを呼び出す方が筋が良い設計です。


巷に溢れる数多くのリアルタイム・オペレーティング・システムを使った実装例には、受信側タスクの内部事情を送信側タスクが知らなければ実装出来ないような記述が多く見られます。これではタスク間通信によって得られるはずの抽象化度を上げる事によるメリットの多くを享受出来ません。受信側タスクの事情を変更した場合(例えば、送信側に期待する送信内容を変更したとか)に、送信側タスクの実装を修正しなければならないとしたら、規模の大きな設計ではたちまちバグになります。

ダウンロード

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つのポイントかもしれません。
その辺りも後々触れていければと思います。

2013年11月2日土曜日

adafruitでUOS-LPC800が紹介されていました

adafruit(http://www.adafruit.com/)でUOS-LPC800が紹介されていました。


彼らが販売しているLPC810 Mini Starter Packに絡めた紹介になっています。
これだけの部品で、小さなオペレーティング・システムが楽しめます。


ビルトイン・シリアル・ブートローダのおかげで、ホスト・ターゲット間でシリアル通信さえできればプログラムを書き込めるのも嬉しいポイントです。

2013年10月12日土曜日

オペレーティング・システムのスケジューラを書く人の強い味方「レジスタ将棋」を考案しました

「青空の下でLPC800 Mini-KitとUOS-LPC800を楽しもう!」の説明資料を作っていて、レジスタの扱いについて面白く説明する方法はないかなぁ?と考えていました。

オペレーティング・システムを書くとなると、あのレジスタをこっちにやって、このレジスタをあっちにやって・・・とだんだん頭がわけわからなくなってきます。UOS-LPC800のスケジューラを書いている時も、Cortex-M0+の命令セットをどう使うのか頭を悩ませた気がします。もう忘れましたが。


で、それを他人に説明する時の面白い方法が欲しいと思いました。
で、考えたのが「レジスタ将棋」です。

どんなものになるのか自分でもよくわからなかったので試しに百円ショップで将棋セットを購入。


うーん。
この金将とか歩兵とか邪魔だな・・・。


「裏面を使えば良いか!」と考えていたが、よく考えたら彼らはシチュエーションによって色んな奴に化けるのを失念していました。おぉ、両面に文字がある。


「くそぉー」ということで、耐水ペーパーでゴシゴシ削ってレジスタ名を記入することに。
これで「レジスタ将棋」の完成です。


ちなみに、青い字はLow Registersで、Cortex-M0+のSTM、LDM命令でもアクセス可能なレジスタ。
赤い字はHigh Registersで、Cortex-M0+のSTM、LDM命令ではアクセスできないレジスタです。


「レジスタ将棋」の使い方は至って簡単。
スタックポインタを起点に積んでいくレジスタ駒を並べて行くだけ。


R13はMSPやPSP、R14はLR、R15はPCでもあるので、裏面にひっくり返すとPSP、LR、PCなどと書いてあります。


レジスタの退避、復旧、複写は、アドレス・インクリメント・モードが複数あったり、他人に説明する場合にややこしくなりがちです。駒を動かして一つずつ操作を理解する事で、楽しくレジスタ操作を把握できるという算段です。

この「レジスタ将棋」のアイデア、駒を動かしてゲーム感覚でレジスタ操作を整理できるので、我ながら気に入っています。みなさまもオペレーティング・システムのスケジューラを書く際の友として如何でしょうか?

「青空の下でLPC800 Mini-KitとUOS-LPC800を楽しもう!」を開催しました

訳のわからないタイトル「青空の下でLPC800 Mini-KitとUOS-LPC800を楽しもう!」で企画したLPC800 Mini-KitとUOS-LPC800を楽しむ会を開催しました。


基本的にユルユルな会と見せかけながら、実はリアルタイムシステムの評価手法に関するノウハウなども公開したりといった内容としました。


開催場所は横浜市営地下鉄のセンター北駅から徒歩10分ほどの閑静な住宅街の中にある公園。


私は到着早々、今朝思いついたばかりの「レジスタ将棋」の思案を開始。
その直後、落ち葉が降ってきて「おぉー、秋ですなぁ~。」と感じるなど。


基本的に公園の中でやる事ではないのですが、いつもと違う感じが気持ち良かったです。


振り返ればそこは池!
鴨みたいなのとか、そうじゃないやつとか沢山いました。


皆さん思い思いの環境でLPC800 Mini-KitとUOS-LPC800を楽しんで頂いて何より。


14:00から16:00の開催時間をとっくに過ぎて16:30に終了。
二次会の締めとして喫茶店で続きを・・・。


前回の茶室で楽しむKOZOS拡張基板に福島からいらしてくれた方からは、「こんな手軽な環境でデバッガが使えるなんて嬉しいです」とも。あぁ、やって良かった「青空の下でLPC800 Mini-KitとUOS-LPC800を楽しもう!」企画!タイトルが長い!

2013年9月30日月曜日

青空の下でLPC800 Mini-KitとUOS-LPC800を楽しもう!

UOS-LPC800: A real-time operating system for NXP LPC800
2013年10月12日に開催します。
http://atnd.org/events/44156

2013年10月13日追記:ここにレポートを追加しました。

2013年7月28日日曜日

Markdown記法を使ってプロジェクトの関連文書生成を効率的にする

Markdownって何ですか?

Markdownとは、John Gruberさんによって作られたマークアップ言語で、記述したテキストファイルをスクリプトで処理して二次生成物としてHTML出力する事ができます。
最近ではリポジトリに設置する文書にMarkdown記法を用いるケースを多く見るようになりました。
「README.mdって何だ?」っていうアレです。

今回はUOS-LPC800プロジェクトにおけるMarkdownの活用をご紹介します。

UOS-LPC800におけるMarkdownの活用



UOS-LPC800では、プロジェクト開始当初からMarkdownで一次文書を構成し、二次生成物としてウェブ用ファイルを作ることを考えていました。

Markdownのファイルをダウンロードすると変換用のPerlスクリプトが同梱されています。
Markdown.plを使用した事のある人にはわかるかもしれませんが、このスクリプトは単に書かれた事を書かれたように変換するだけのスクリプトです。

UOS-LPC800のウェブページを作るにあたって、Markfileやシェルスクリプトでラッパーを作りました。
これにより
  1. Markdown記法でテキストファイルを記述
  2. 端末でmake
するだけでウェブブラウザが開いて生成物の内容を確認できるようになります。

今回のラッパーでは以下を実現しています。
  • ページで使用する画像はimagesに置いておけば良い。
  • ページで使用するリソースはresourcesに置いておけば良い。
  • Markdown.plで処理されないヘッダの類はhead.htmlとtail.htmlで付与する。
とこんな感じです。

ダウンロード

今回のファイル一式をこちらからダウンロードできるようにしておきました。

2013年6月23日日曜日

割と適当に動作するOS「誰得OS」のCortex-M0+版であるUOS-LPC800を作りました

割と適当に動作するOS「誰得OS」のCortex-M0+版を作りました。

32ビットプロセッサとしては極めて小さいNXPセミコンダクターズ社のLPC810 (RAM=1KB、ROM=4KB) でもなんとか動作します。名付けてUOS-LPC800です。


以下の動画では、LED点滅タスクとUART送受信タスクが動作しているところを示しています。


LPC800 MiniBoardをお持ちの方はHEXファイルをダウンロードして試してみる事ができます。
「割と適当に動作する」などと言いながらも、スケジューリング・アルゴリズムはラウンド・ロビンと優先度ベースで選択できたりします。そして、カーネルの中核を成すコードはわずか300行で誰にも読み切れるサイズです。

今年中に「茶室で楽しむKOZOS拡張基板」のような企画をやりたいなぁ~と考えているところです。

AltStyle によって変換されたページ (->オリジナル) /