SlideShare une entreprise Scribd logo
1  sur  25
マイコンでマルチタスク
FreeRTOSの使い方
株式会社シーエー 寺脇勝彦
マルチタスクって必要?
• プログラム作成時間を劇的に削減
• プログラムの構造が簡素に
例えばこんなプログラム
• スイッチ1が押された時にはLED1を0.3秒周
期で点滅させる
• スイッチ2が押された時にはLED2を1秒周
期で点滅させる
SW1
SW2
LED1
LED2
マルチタスク無しプログラム
Void main() {
While(TRUE){
Sw1Led1();//何かやってすぐに戻る
Sw2Led2();//何かやってすぐに戻る
}
}
LED1プログラム
Int phase = 0;
Volatile int millisec = 0 ;//ミリ秒数:割り込みでカウントアップ
void Led1Sw1() {
switch( phase ) {
case 0 ://SW1 の確認フェーズ
if( SW1 == OFF ) {
phase=0; return;
}
LED1=ON; millisec=0; phase=1; return;
続き
case 1 :
if( milliSec <= 300 ) {
return ;//LED OFF にするタイミングになるまでは何もしな
い
}
LED1 = OFF ; millisec = 0 ; phase=2 ; return ;
case 2:
if( milliSec <= 300 ) {
return ;//1周期になるまでは、何もしない
}
phase=0 ; return ;
}
}
同様なプログラムを、SW2LED2についても作る
マルチタスクを使うとどうなる
か
Void main() {
Sw1Led1タスクを起動
Sw2Led2タスクを起動
while(1){//なんかの仕事
}
}
マルチタスクプログラム
Void Sw1Led1Task() {
while(TRUE) {
if( SW1 == OFF ) {
Sleep(1); continue ; //whileループ先頭へ
}
LED1 = ON ; Sleep(300);//LED2は、1000ms
LED1 = OFF ; Sleep(300);//LED2は、1000ms
}
}
同様なプログラムを SW2LED2についても作
る
プログラムが簡単になった!!!
• Sw1Led1関数と、Sw2Led2関数は、同時に
動く
• 正確に言うと、同時に動作するように振
る舞っている。
マルチタスクやるには
• FreeRTOS http://www.freertos.org/
• 対応しているマイコン ARM/H8/RX600
• Arduino UNO -> Duinos(FreeRTOS移植版)。
• お奨めは、 Stbee
http://strawberry-linux.com/stbee/ 3150円
RAM32K、ROM500K、72MHz
シリアル5チャネル GCC
書籍 STM32マイコン徹底入門 CQ出版
実際のプログラムは?
int main(void){
BoardInit();
xTaskCreate((TASK_FUNC)Sw1Led1
,"Sw1Led1", 192, NULL, 1, NULL) ;
xTaskCreate((TASK_FUNC)Sw2Led2
,"Sw2Led2", 192, NULL, 1, NULL) ;
vTaskStartScheduler(); // Start the scheduler
while(TRUE) {//スケジューラーがエラーを起こすとここに来る
}
}
続き
void Sw1Led1( void ){
while(TRUE) {
if( SW1() == OFF ) {
vTaskDelay(1);continue ;
}
LED1(ON);vTaskDelay(300);
LED1(OFF);vTaskDelay(300);
}
}
これだけ覚えれば大丈夫
(ノンプリエンプティブ)
• xTaskCreate タスク生成
• vTaskStartScheduler スケジューラー開
始
• vTaskDelay 時間待ち
• taskDISABLE_INTERRUPTS 割り込み禁止
• taskENABLE_INTERRUPTS 割り込み許可
• volatile 複数タスク変数
マルチタスクの種類
• プリエンプティブ
• ノンプリエンプティブ(コオペレーティブ)
プリエンプティブ
• 皆さんが使っているパソコンのOS
• タスクは、OSが勝手に切り替える
ノンプリエンプティブ
• Windows3.1、Mac system6
• プログラム上で、明示的なタスク切替が
必要
Sleep()
解放しないと、他のタスクに制御が行か
ない
• 少ないリソースで動く
• 過激な割り込みでも大丈夫
で、どっちのマルチタスクが良い
の?
• ライブラリが、マルチスレッド対応なら
ば、プリエンプティブが良い
• プリエンプティブの場合には、タスク間
で共有されるデータにアクセスする場合
には、同時に読み書きできないような
「ロック」の機構が必要
ノンプリエンプティブ
• vTaskDelay()を呼び出さなければタスクが
切り替わらないので、データの読み書き
に、ロック機構はいらないことも多い。
• ライブラリがマルチタスク対応でない場
合には、選択肢はノンプリエンプティブ
のみ。
• FreeRTOSには、ノンプリエンプティブのオ
プションがある。
マルチタスクの落とし穴
• アセンブラのイメージが必要(スタック、レ
ジスタ)
• コンパイラの最適化の問題
タスク間で共有される変数には
volatile (Java でも使用可能)
• スタック
巨大な配列は、関数の外に置く。
vApplicationStackOverflowHook()でチェック
• 割り込み
taskDISABLE_INTERRUPTS、taskENABLE_INTERRUPTS
困った点
• FreeRTOS、GCC、CPUメーカーライブラリ
で不整合が起き、うまく動かないことが
ある。
• 動いている人の環境を一式もらってくる
のが良い。
• Arm GCCは、バグがあるっぽい
関数の外で、static char v[100] ;とかやると
HardFault発生。static を外すと OK。
マルチタスクOSを作る
• 秋月 H8/3069 2000円
アセンブラが素直 RAM 16K ROM 512K
アセンブラは、コンパイラに教えてもら
おう
• GCC http://www.kanebebe.com/download/H8uClinux/index.html
• ソースコード http://www.computerartisan.com/miconlecture/index.html
ノンプリエンプティブ
計測器(デバッグログ)
• アナログ
• デジタル
100円ショップの便利グッズ
• 12V -> 5V シガーライター USB 変換器
• グルーガン
グルースティックは、DIYショップが良い
かも
• ミノムシクリップ
• ハンダ吸い取り器
• ドアや窓用の防犯ブザー(磁気センサー)
• クリスマスツリーLED
• 1.5V -> 5.0V LED懐中電灯
参考
• Arm 開発環境(内容が古いので注意)
http://miqn.net/
• FreeRTOS
http://www.freertos.org/
http://www.picfun.com/RTOS/FreeRTOS00.html
Duinos(Arduino + FreeRTOS)
http://www.computerartisan.com/company/work/bluev1/duinos.txt
• 一番簡単なマルチタスクOS
http://www.computerartisan.com/miconlecture/index.html
ご静聴ありがとうございました

Contenu connexe

Tendances

フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編abend_cve_9999_0001
 
実装して理解するLINE LoginとOpenID Connect入門
実装して理解するLINE LoginとOpenID Connect入門実装して理解するLINE LoginとOpenID Connect入門
実装して理解するLINE LoginとOpenID Connect入門Naohiro Fujie
 
FIWARE Connecting to IoT
FIWARE Connecting to IoTFIWARE Connecting to IoT
FIWARE Connecting to IoTfisuda
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについてmoai kids
 
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...CODE BLUE
 
コンテキストデータの永続化のための戦略
コンテキストデータの永続化のための戦略コンテキストデータの永続化のための戦略
コンテキストデータの永続化のための戦略fisuda
 
とある診断員とAWS
とある診断員とAWSとある診断員とAWS
とある診断員とAWSzaki4649
 
DockerでCoq インストール
DockerでCoq インストールDockerでCoq インストール
DockerでCoq インストールYoshihiro Mizoguchi
 
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)Kenichi Yamada
 
ID連携のあるとき~、ないとき~ #エンプラ編
ID連携のあるとき~、ないとき~ #エンプラ編ID連携のあるとき~、ないとき~ #エンプラ編
ID連携のあるとき~、ないとき~ #エンプラ編Takashi Yahata
 
React Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうReact Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうYoichi Toyota
 
【Swift】ローカル通知のバックグラウンド対応
【Swift】ローカル通知のバックグラウンド対応【Swift】ローカル通知のバックグラウンド対応
【Swift】ローカル通知のバックグラウンド対応Nekokichi
 
パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~
パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~
パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~Tatsuo Kudo
 
コメントビュアーを作った話
コメントビュアーを作った話コメントビュアーを作った話
コメントビュアーを作った話健人 辻
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
Spring Social でソーシャルログインを実装する
Spring Social でソーシャルログインを実装するSpring Social でソーシャルログインを実装する
Spring Social でソーシャルログインを実装するRakuten Group, Inc.
 
なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景Tatsuo Kudo
 

Tendances (20)

フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編
 
実装して理解するLINE LoginとOpenID Connect入門
実装して理解するLINE LoginとOpenID Connect入門実装して理解するLINE LoginとOpenID Connect入門
実装して理解するLINE LoginとOpenID Connect入門
 
FIWARE Connecting to IoT
FIWARE Connecting to IoTFIWARE Connecting to IoT
FIWARE Connecting to IoT
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
 
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
 
コンテキストデータの永続化のための戦略
コンテキストデータの永続化のための戦略コンテキストデータの永続化のための戦略
コンテキストデータの永続化のための戦略
 
とある診断員とAWS
とある診断員とAWSとある診断員とAWS
とある診断員とAWS
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門
 
DockerでCoq インストール
DockerでCoq インストールDockerでCoq インストール
DockerでCoq インストール
 
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
 
ID連携のあるとき~、ないとき~ #エンプラ編
ID連携のあるとき~、ないとき~ #エンプラ編ID連携のあるとき~、ないとき~ #エンプラ編
ID連携のあるとき~、ないとき~ #エンプラ編
 
React Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうReact Hooksでカスタムフックをつくろう
React Hooksでカスタムフックをつくろう
 
【Swift】ローカル通知のバックグラウンド対応
【Swift】ローカル通知のバックグラウンド対応【Swift】ローカル通知のバックグラウンド対応
【Swift】ローカル通知のバックグラウンド対応
 
パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~
パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~
パスワード氾濫時代のID管理とは? ~最新のOpenIDが目指すユーザー認証の効率的な強化~
 
コメントビュアーを作った話
コメントビュアーを作った話コメントビュアーを作った話
コメントビュアーを作った話
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
Spring Social でソーシャルログインを実装する
Spring Social でソーシャルログインを実装するSpring Social でソーシャルログインを実装する
Spring Social でソーシャルログインを実装する
 
ZynqMPのQEMU
ZynqMPのQEMUZynqMPのQEMU
ZynqMPのQEMU
 
なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景
 

En vedette

LEDやモーターをArduinoで制御しよう
LEDやモーターをArduinoで制御しようLEDやモーターをArduinoで制御しよう
LEDやモーターをArduinoで制御しようTakashi Kanamaru
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介NSaitoNmiri
 
NiosII と RTOS について
NiosII と RTOS についてNiosII と RTOS について
NiosII と RTOS についてryos36
 
REAL TIME OPERATING SYSTEM
REAL TIME OPERATING SYSTEMREAL TIME OPERATING SYSTEM
REAL TIME OPERATING SYSTEMprakrutijsh
 
Real Time OS For Embedded Systems
Real Time OS For Embedded SystemsReal Time OS For Embedded Systems
Real Time OS For Embedded SystemsHimanshu Ghetia
 
Real time Operating System
Real time Operating SystemReal time Operating System
Real time Operating SystemTech_MX
 

En vedette (7)

LEDやモーターをArduinoで制御しよう
LEDやモーターをArduinoで制御しようLEDやモーターをArduinoで制御しよう
LEDやモーターをArduinoで制御しよう
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
 
G7プレゼンrtos自作
G7プレゼンrtos自作G7プレゼンrtos自作
G7プレゼンrtos自作
 
NiosII と RTOS について
NiosII と RTOS についてNiosII と RTOS について
NiosII と RTOS について
 
REAL TIME OPERATING SYSTEM
REAL TIME OPERATING SYSTEMREAL TIME OPERATING SYSTEM
REAL TIME OPERATING SYSTEM
 
Real Time OS For Embedded Systems
Real Time OS For Embedded SystemsReal Time OS For Embedded Systems
Real Time OS For Embedded Systems
 
Real time Operating System
Real time Operating SystemReal time Operating System
Real time Operating System
 

マイコンでマルチタスク