SAKURAボードでお手軽マルチタスク環境

2,091 views
1,974 views

Published on

2013.5.18 第1回 FUJI-SAKURAぷろじぇくとMTG
次期SAKURAボードへの提案というか妄想です。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,091
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

SAKURAボードでお手軽マルチタスク環境

  1. 1. SAKURAボードユーザ会関西連絡会 西村備山SAKURAボード でお手軽マルチタスク環境
  2. 2. 自己紹介西村備山 (@lipoyang)■組込み系のソフト屋■おもにC/C++■たまにC#やJava■趣味でロボットなど製作■ツンデレ萌え
  3. 3. GR-SAKURA 茶運び人形ロボBluetoothでスマホから操作・ステッピングモータ ×2・ラジコンサーボ ×6・ゆっくりチップ(音声)過去の作例
  4. 4. GR-KURUMI ミニ四駆ラジコン・マブチモータ制御・サーボでステアリングBluetoothでスマホから操縦過去の作例
  5. 5. 最近は戦車道タミヤツインモーターギアボックス改造
  6. 6. Arduinoへの不満処理が終わるまで帰ってこない→ その間、他のことができないloopでポーリングなのにAPIはブロッキング処理ここから本題
  7. 7. 具体例:ステッピングモータStepper stepper( 一回転のステップ数,ピン1,ピン2,ピン3,ピン4 );stepper.setSpeed( 回転数[RPM] );stepper.step( ステップ数 );指定したステップ数回転するまで帰ってこない。( 一回転100ステップ、回転数1RPMで100ステップを指定すると1分間ブロック )
  8. 8. ロボットに使う場合…走行中、センシングも通信も中断されちゃう!For better control, keep the speed high andonly go a few steps with each call to step().(Arduino Reference)そうではなく、並行処理したい!
  9. 9. マイコンでの並行処理・OSなし → ステートマシン設計長所:特別な知識・費用いらないスペック低くてもOK短所:超巨大switch文(処理の流れが非常に読みにくい)・OSあり → マルチタスク長所:並行処理をスッキリ記述できる短所:スペック要求(RAM、ROM、処理能力)OSの知識・有償のOSなら費用がいる
  10. 10. OSなしでの並行処理メインループ{処理1();処理2();処理3();} 必ず短時間で関数を抜けること→ ブロッキング処理は不可→ 複雑なステートマシンになる
  11. 11. OSをつかった並行処理// OSがないときswitch(state){case READY:if( command == STEP100 ){stepper.start();state = MOVING;}break;case MOVING:if(stepper.count() >= 100){stepper.stop();state = READY;}break;}// OSがあるときwhile (true){if( command == STEP100 ){stepper.start();while(stepper.count() < 100){SleepTask(10);}stepper.stop();}}OSが関数をいったん中断して他のタスクに処理を移してくれる
  12. 12. マルチタスクOSの課題(1) マイコンのスペック要求(メモリ、処理能力)→ ARM Cortex-M3クラスなら無問題!(2) OSの知識が必要 & コンフィグがめんどくさい→ Arduino文化には馴染まないもっとお手軽にマルチタスクを!
  13. 13. むかし自作した簡易OSAVRIL-TAN(あぶりるたん) … APIは9個だけAPI 説明CreateTask タスクを生成するStartTask 指定IDのタスクの開始(実行待ち状態へ)ExitTask 自タスクの停止(休止状態へ)SleepTask 自タスクを指定時間だけスリープ(待ち状態へ)RotateTask 次のタスクへ処理を移す(自タスクは実行待ち状態へ)WaitFlag 自タスクを指定IDのイベントフラグ待ちにする(待ち状態へ)PollFlag 指定IDのイベントフラグのポーリングSetFlag 指定IDのイベントフラグのセットClearFlag 指定IDのイベントフラグのクリア
  14. 14. 簡易OSを用いた記述#define ID_TASK_HOGE 0void taskHoge() {処理;}void setup() {初期設定;CreateTask( ID_TASK_HOGE, taskHoge );StartTask( ID_TASK_HOGE );}
  15. 15. OSをクラスで隠蔽class : public Task {public:void run () {処理;}} taskHoge;void setup() {初期設定;taskHoge.start();}
  16. 16. もっとシンプルに!@task taskHoge() {処理;}void setup() {初期設定;taskHoge.start();}簡潔な記法↓プリプロセッサで展開
  17. 17. タスク制御のメソッド@taskオブジェクトのメソッドstart() タスクを開始する (実行待ち状態へ)startCycle(周期) 周期タスクを開始する (待ち状態へ)startOneShot() ワンショットタスクを開始する (待ち状態へ)exit() タスクを停止する (休止状態へ)sleep()sleep(期間)タスクを(指定時間だけ)スリープ (待ち状態へ)wakeup() タスクをスリープから復帰させる (実行待ち状態へ)waitFlag(フラグ) タスクをイベントフラグ待ちにする (待ち状態へ)yield() タスクを強制中断する (実行待ち状態へ)
  18. 18. Easy MultitaskingRTOSクラスライブラリプリプロセッサマルチタスク機能を提供C++クラスで隠蔽簡潔な@task記法
  19. 19. 最後に…ユーザー会の手でOSやライブラリなどを開発していくなら…オンボードJTAGデバッガぜひ載せてほしい!
  20. 20. 以上ご清聴ありがとうございました妄想乙でした

×