Universal Multi Task Library

組み込み(Arduino)からLinux/Windowsまで様々な環境で汎用的に使える協調型マルチスタスク・ライブラリを作ってみた。最近似たような物ばかり作ってるような気がするが気にしないでほしい。(笑)

【過去の投稿】
1.シンプルすぎる汎用C++タスクスケジューラー(CScheduler)を作ってみた。
2.Micro Core Library for Arduino

前回投稿のMicro Core Library for Arduino はハードウェアのタイマー割り込みをサポートしたために少し複雑になってしまったがタスク同期のタイムアウト機能についてはタイマー割り込みで起床したとしてもカレントタスクの自発的なタスク切り替え(yield)がない限りそのタスクが実行されないことからタイムアウト判断はタスク切り替え毎のポーリング判定でも問題ないという結論に落ち着いた。但し、アラームクラスのタイマー割り込みハンドラの呼び出しタイミングについてはタスク切り替えタイミングに依存してかなりズレてしまうことや処理遅延に伴う時間系の破綻がないという前提ではあるが。

今回のライブラリはLinux/Windows にも対応しタイムアウトを含む全機能が使えるようになっている。少し不思議に思われるかもしれないのはOSスレッド対応している点かも。このライブラリではハードウェア割り込みからタスク起床が可能となっている。組み込み用途であればハードウェア割り込みが使えるがOSの場合は直接ハードウェア割り込みを利用することが出来ない。そのためハードウェア割り込みの代わりにスレッドを使えるようにしてみた。

OSのスレッド上でさらにマルチタスク(サブ・スレッド?)なんて意味があるのかどうか分からないが、組み込み環境と同じライブラリがPCでも動作するのでマルチタスク・アプリのクロス開発環境として利用するなんてのもありかも。PC環境のほうがデバッグが楽だしね。

ちなみに、MinGW32は問題ないがMinGW64はsetjmp/longjmpの実装の問題により誤動作することに注意。詳しいことはわからないがWIN64特有の特殊なスタッフレームに対応できないという致命的な問題があるらしい。

【サンプル・プログラム】
※STACK_SIZEは実行環境に合わせて適切な調整が必要。

【ダウンロード】
u-kernel.zip (Eclipse Project)
arduino-u-kernel.zip (Arduino Library)

【ライブラリ】

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください