20
SAKURAボードユーザ会 関西連絡会 西村備山 SAKURAボード で お手軽マルチタスク環境

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

SAKURAボードユーザ会

関西連絡会 西村備山

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

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

自己紹介

西村備山 (@lipoyang)

■組込み系のソフト屋

■おもにC/C++

■たまにC#やJava

■趣味でロボットなど製作

■ツンデレ萌え

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

GR-SAKURA 茶運び人形ロボ

Bluetoothで スマホから操作

・ステッピングモータ ×2 ・ラジコンサーボ ×6 ・ゆっくりチップ(音声)

過去の作例

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

GR-KURUMI ミニ四駆ラジコン

・マブチモータ制御 ・サーボでステアリング

Bluetoothで スマホから操縦

過去の作例

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

最近は戦車道

タミヤツインモーター ギアボックス改造

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

Arduinoへの不満

処理が終わるまで帰ってこない

→ その間、他のことができない

loopでポーリングなのに APIはブロッキング処理

ここから本題

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

具体例:ステッピングモータ

Stepper stepper( 一回転のステップ数,

ピン1,ピン2,ピン3,ピン4 );

stepper.setSpeed( 回転数[RPM] );

stepper.step( ステップ数 );

指定したステップ数回転するまで帰ってこない。 ( 一回転100ステップ、回転数1RPMで 100ステップを指定すると1分間ブロック )

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

ロボットに使う場合…

走行中、センシングも通信も中断されちゃう!

For better control, keep the speed high and only go a few steps with each call to step().

(Arduino Reference)

そうではなく、並行処理したい!

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

マイコンでの並行処理

・OSなし → ステートマシン設計

長所:特別な知識・費用いらない

スペック低くてもOK

短所:超巨大switch文

(処理の流れが非常に読みにくい)

・OSあり → マルチタスク

長所:並行処理をスッキリ記述できる

短所:スペック要求(RAM、ROM、処理能力)

OSの知識・有償のOSなら費用がいる

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

OSなしでの並行処理

メインループ{

処理1();

処理2();

処理3();

}

必ず短時間で関数を抜けること → ブロッキング処理は不可 → 複雑なステートマシンになる

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

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が関数をいったん中断して 他のタスクに処理を移してくれる

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

マルチタスクOSの課題

(1) マイコンのスペック要求(メモリ、処理能力)

→ ARM Cortex-M3クラスなら無問題!

(2) OSの知識が必要 & コンフィグがめんどくさい

→ Arduino文化には馴染まない

もっとお手軽にマルチタスクを!

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

むかし自作した簡易OS

AVRIL-TAN(あぶりるたん) … APIは9個だけ

API 説明

CreateTask タスクを生成する

StartTask 指定IDのタスクの開始(実行待ち状態へ)

ExitTask 自タスクの停止(休止状態へ)

SleepTask 自タスクを指定時間だけスリープ(待ち状態へ)

RotateTask 次のタスクへ処理を移す(自タスクは実行待ち状態へ)

WaitFlag 自タスクを指定IDのイベントフラグ待ちにする(待ち状態へ)

PollFlag 指定IDのイベントフラグのポーリング

SetFlag 指定IDのイベントフラグのセット

ClearFlag 指定IDのイベントフラグのクリア

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

簡易OSを用いた記述

#define ID_TASK_HOGE 0

void taskHoge() {

処理;

}

void setup() {

初期設定;

CreateTask( ID_TASK_HOGE, taskHoge );

StartTask( ID_TASK_HOGE );

}

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

OSをクラスで隠蔽

class : public Task {

public:

void run () {

処理;

}

} taskHoge;

void setup() {

初期設定;

taskHoge.start();

}

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

もっとシンプルに!

@task taskHoge() {

処理;

}

void setup() {

初期設定;

taskHoge.start();

}

簡潔な記法 ↓

プリプロセッサで展開

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

タスク制御のメソッド

@taskオブジェクトのメソッド

start() タスクを開始する (実行待ち状態へ)

startCycle(周期) 周期タスクを開始する (待ち状態へ)

startOneShot() ワンショットタスクを開始する (待ち状態へ)

exit() タスクを停止する (休止状態へ)

sleep() sleep(期間)

タスクを(指定時間だけ)スリープ (待ち状態へ)

wakeup() タスクをスリープから復帰させる (実行待ち状態へ)

waitFlag(フラグ) タスクをイベントフラグ待ちにする (待ち状態へ)

yield() タスクを強制中断する (実行待ち状態へ)

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

Easy Multitasking

RTOS

クラスライブラリ

プリプロセッサ

マルチタスク機能を提供

C++クラスで隠蔽

簡潔な@task記法

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

最後に…

ユーザー会の手でOSやライブラリなどを

開発していくなら…

オンボードJTAGデバッガ

ぜひ載せてほしい!

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

以上

ご清聴ありがとうございました

妄想乙でした