SAKURAボードでお手軽マルチタスク環境
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 1,340 views

2013.5.18 第1回 FUJI-SAKURAぷろじぇくとMTG

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

Statistics

Views

Total Views
1,340
Views on SlideShare
1,105
Embed Views
235

Actions

Likes
0
Downloads
1
Comments
0

2 Embeds 235

http://d.hatena.ne.jp 234
http://s.deeeki.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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