Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

マイコンでマルチタスク

3,392 views

Published on

  • Dating direct: ♥♥♥ http://bit.ly/2u6xbL5 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ❶❶❶ http://bit.ly/2u6xbL5 ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

マイコンでマルチタスク

  1. 1. マイコンでマルチタスク FreeRTOSの使い方 株式会社シーエー 寺脇勝彦
  2. 2. マルチタスクって必要? • プログラム作成時間を劇的に削減 • プログラムの構造が簡素に
  3. 3. 例えばこんなプログラム • スイッチ1が押された時にはLED1を0.3秒周 期で点滅させる • スイッチ2が押された時にはLED2を1秒周 期で点滅させる SW1 SW2 LED1 LED2
  4. 4. マルチタスク無しプログラム Void main() { While(TRUE){ Sw1Led1();//何かやってすぐに戻る Sw2Led2();//何かやってすぐに戻る } }
  5. 5. 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;
  6. 6. 続き 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についても作る
  7. 7. マルチタスクを使うとどうなる か Void main() { Sw1Led1タスクを起動 Sw2Led2タスクを起動 while(1){//なんかの仕事 } }
  8. 8. マルチタスクプログラム Void Sw1Led1Task() { while(TRUE) { if( SW1 == OFF ) { Sleep(1); continue ; //whileループ先頭へ } LED1 = ON ; Sleep(300);//LED2は、1000ms LED1 = OFF ; Sleep(300);//LED2は、1000ms } } 同様なプログラムを SW2LED2についても作 る
  9. 9. プログラムが簡単になった!!! • Sw1Led1関数と、Sw2Led2関数は、同時に 動く • 正確に言うと、同時に動作するように振 る舞っている。
  10. 10. マルチタスクやるには • 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出版
  11. 11. 実際のプログラムは? 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) {//スケジューラーがエラーを起こすとここに来る } }
  12. 12. 続き void Sw1Led1( void ){ while(TRUE) { if( SW1() == OFF ) { vTaskDelay(1);continue ; } LED1(ON);vTaskDelay(300); LED1(OFF);vTaskDelay(300); } }
  13. 13. これだけ覚えれば大丈夫 (ノンプリエンプティブ) • xTaskCreate タスク生成 • vTaskStartScheduler スケジューラー開 始 • vTaskDelay 時間待ち • taskDISABLE_INTERRUPTS 割り込み禁止 • taskENABLE_INTERRUPTS 割り込み許可 • volatile 複数タスク変数
  14. 14. マルチタスクの種類 • プリエンプティブ • ノンプリエンプティブ(コオペレーティブ)
  15. 15. プリエンプティブ • 皆さんが使っているパソコンのOS • タスクは、OSが勝手に切り替える
  16. 16. ノンプリエンプティブ • Windows3.1、Mac system6 • プログラム上で、明示的なタスク切替が 必要 Sleep() 解放しないと、他のタスクに制御が行か ない • 少ないリソースで動く • 過激な割り込みでも大丈夫
  17. 17. で、どっちのマルチタスクが良い の? • ライブラリが、マルチスレッド対応なら ば、プリエンプティブが良い • プリエンプティブの場合には、タスク間 で共有されるデータにアクセスする場合 には、同時に読み書きできないような 「ロック」の機構が必要
  18. 18. ノンプリエンプティブ • vTaskDelay()を呼び出さなければタスクが 切り替わらないので、データの読み書き に、ロック機構はいらないことも多い。 • ライブラリがマルチタスク対応でない場 合には、選択肢はノンプリエンプティブ のみ。 • FreeRTOSには、ノンプリエンプティブのオ プションがある。
  19. 19. マルチタスクの落とし穴 • アセンブラのイメージが必要(スタック、レ ジスタ) • コンパイラの最適化の問題 タスク間で共有される変数には volatile (Java でも使用可能) • スタック 巨大な配列は、関数の外に置く。 vApplicationStackOverflowHook()でチェック • 割り込み taskDISABLE_INTERRUPTS、taskENABLE_INTERRUPTS
  20. 20. 困った点 • FreeRTOS、GCC、CPUメーカーライブラリ で不整合が起き、うまく動かないことが ある。 • 動いている人の環境を一式もらってくる のが良い。 • Arm GCCは、バグがあるっぽい 関数の外で、static char v[100] ;とかやると HardFault発生。static を外すと OK。
  21. 21. マルチタスクOSを作る • 秋月 H8/3069 2000円 アセンブラが素直 RAM 16K ROM 512K アセンブラは、コンパイラに教えてもら おう • GCC http://www.kanebebe.com/download/H8uClinux/index.html • ソースコード http://www.computerartisan.com/miconlecture/index.html ノンプリエンプティブ
  22. 22. 計測器(デバッグログ) • アナログ • デジタル
  23. 23. 100円ショップの便利グッズ • 12V -> 5V シガーライター USB 変換器 • グルーガン グルースティックは、DIYショップが良い かも • ミノムシクリップ • ハンダ吸い取り器 • ドアや窓用の防犯ブザー(磁気センサー) • クリスマスツリーLED • 1.5V -> 5.0V LED懐中電灯
  24. 24. 参考 • 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
  25. 25. ご静聴ありがとうございました

×