Upload
bizan-nishimura
View
1.381
Download
1
Embed Size (px)
DESCRIPTION
2013.5.18 第1回 FUJI-SAKURAぷろじぇくとMTG 次期SAKURAボードへの提案というか妄想です。
Citation preview
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 and only 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文化には馴染まない
もっとお手軽にマルチタスクを!
むかし自作した簡易OS
AVRIL-TAN(あぶりるたん) … APIは9個だけ
API 説明
CreateTask タスクを生成する
StartTask 指定IDのタスクの開始(実行待ち状態へ)
ExitTask 自タスクの停止(休止状態へ)
SleepTask 自タスクを指定時間だけスリープ(待ち状態へ)
RotateTask 次のタスクへ処理を移す(自タスクは実行待ち状態へ)
WaitFlag 自タスクを指定IDのイベントフラグ待ちにする(待ち状態へ)
PollFlag 指定IDのイベントフラグのポーリング
SetFlag 指定IDのイベントフラグのセット
ClearFlag 指定IDのイベントフラグのクリア
簡易OSを用いた記述
#define ID_TASK_HOGE 0
void 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 Multitasking
RTOS
クラスライブラリ
プリプロセッサ
マルチタスク機能を提供
C++クラスで隠蔽
簡潔な@task記法
最後に…
ユーザー会の手でOSやライブラリなどを
開発していくなら…
オンボードJTAGデバッガ
ぜひ載せてほしい!
以上
ご清聴ありがとうございました
妄想乙でした