マルチタスクプログラミング.pptx

Similar documents
SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)

SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)

IntroductionForGR-PEACH.pptx

改訂履歴 改訂日付 改訂内容 2014/11/01 初版発行 2017/01/16 Studuino web サイトリニューアルに伴う改訂 2017/04/14 Studuino web サイトリニューアルに伴うアクセス方法の説明変更 2018/01/22 Mac 版インストール手順変更に伴う改訂

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

Studuinoライブラリ環境設定Mac編

1 1 Arduino とは Arduino アルドゥイーノ は ワンボードマイコンの一種で オープンソースハードウェアであ り 組み立て済みの基板を購入することもできるほか 誰でも自分の手で Arduino を組み立てる ことができます USBコネクタでPCと接続して利用します デジタルポートとア

スライド 1

Arduino UNO IS Report No. Report Medical Information System Laboratory

Studuino ライブラリ環境設定Windows編

<4D F736F F F696E74202D20834A815B836C838B835C815B835882CC95E082AB95FB F4B2E B8CDD8AB B83685D>

講習会 Arduino

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

ETCB Manual

プログラマブル LED 制御モジュール アプリ操作説明書 プログラマブル LED 制御モジュール設定アプリ操作説明書 適用モジュール 改訂番号 エレラボドットコム 1

7th CodeGear Developer Camp

ReTRY HUB

AUTOSAR OS仕様とTOPPERS/ATK2の使い方

Windows インタフェースモジュール (ver1.451) の更新方法 2017 年 12 月 21 日 株式会社ハイバーテック 本メール添付インストーラを使用して,Windows インタフェースモジュールを更新 ( インストール ) する方法を記載します. 本メール添付ファイル (ver145

Windows2000/XPインストール手順

24th Embarcadero Developer Camp

Microsoft Word - DTX7LM.doc

WLAR-L11G-L/WLS-L11GS-L/WLS-L11GSU-L セットアップガイド

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

第3部:プログラミング実習

アジェンダ Renesas Synergy TM プラットフォーム構成 ThreadX とは ThreadX の状態遷移 ThreadX とμITRONの機能比較 まとめ ページ 2

TOPPERS 活用アイデア アプリケーション開発 コンテスト 部門 : 活用アイデア部門アプリケーション開発部門 作品のタイトル : Toppers_JSP と Scicos_lab / (Scilab でも可 ) による 組込みメカトロニクス制御シミュレーション 作成者 : 塩出武 ( シオデタ

Windows2000/XPインストール手順

スライド 1

RW-5100 導入説明書 Windows7 用 2017 年 7 月 シャープ株式会社


Maple 12 Windows版シングルユーザ/ネットワークライセンス

TRQerS - Introduction

AN1526 RX開発環境の使用方法(CS+、Renesas Flash Programmer)

著作権および商標 この文書には が所有権を持つ機密事項が含まれます この資料のいかなる部分も許 可無く複製 使用 公開することを固く禁じます 本書は の従業員および許可された 取引先だけに使用が認められています 本書で提供されたデータは正確で信頼性の高いものですが このデータの使用について株式会社

変更履歴 日付 バージョン 内容 2017/3/ ver.2.x.x.x を WHQL 対応版とする初版リリース ( ベースバージョン統合の為 2004 からとする ) 2017/3/ x64 とx86 の区別など誤記修正 目次修正 i

PowerPoint Presentation

LANカード(PG-2871) 取扱説明書

Windows Embedded Community Day 第 5 回 - IoT がもたらす新しい社会と変化 - ドライバ開発から Azure 接続まで - Windows Embedded Community Day 株式会社デバイスドライバーズ日高亜友

Arduino をドリトルから 制御する教材の試行 鈴木裕貴 1

ADempiere (3.5)

User Support Tool 操作ガイド

Microsoft PowerPoint _2.プログラミングの基礎_final.pptx

ファームウェア書き換え説明書 目次 はじめに... 2 書き換え前に... 2 接続図... 2 書き換え手順... 3 (1) ファームウェアファイルの準備... 3 (2) 接続準備... 3 (3) ファームウェア書き換え準備 (4) ファームウェア書き換え準備 (

AUTOSAR OS仕様とTOPPERS/ATK2の使い方

1 Atollic TrueSTUDIO( GR-PEACH TOPPERS/ASP ASP GR-PEACH mbed ( git

プリンタドライバのインストール. Windows で使用する場合 Windows プリンタドライバのインストール方法は 接続方法や使用するプリンタドライバによって異なります また コンピュータの OS によってインストール方法が異なります お使いのコンピュータの OS に合わせて 以下の参照ページを

目次 第 1 章概要....1 第 2 章インストールの前に... 2 第 3 章 Windows OS でのインストール...2 第 4 章 Windows OS でのアプリケーション設定 TP-LINK USB プリンターコントローラーを起動 / 終了するには

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

ST-LINK/V2-1 への Upgrade V /10/07 ST-LINK/V2-1 USB driver のインストールおよび ST-LINK/V2-1 の Upgrade について説明します ST-LINK/V2-1 USB driver をインストールしてから ST-LIN

開発環境構築ガイド

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

MS104-SH2 USBドライバ(仮想COMポートドライバ)の不具合について


! 2 Download software をクリックし, インストーラを保存します コードサイズ制限版も 30 日間期間限定版も共通のインストーラです EWARM コードサイズ限定版 (32KB 制限 ) コードサイズはテキストファイルのボリュームではなく, デバイスに書き込むマシン語のサイズが対

2. WiFi 接続 1.1 GuruPlug Server 初期設定情報 記載の SSID が設定されているアクセスポイントが GuruPlug Server です PC を操作して GuruPlug Server のアクセスポイントに接続して WiFi 接続してください 接続に成功すると PC

TOPPERS活用アイデア・アプリケーション開発

バーコードハンディターミナル BT-1000 シリーズセットアップガイド ( 第 1 版 ) CE ***

第 7.0 版 利用履歴管理 ETCPRO5 セットアップマニュアル (Ver5.002) カードリーダモデル変更 ( 表示付き 表示なし ) に伴い 改訂 Windows10 対応に伴い 改訂 参考ホームページサイト :

INS メイト V30Slim を Windows Vista がプレインストールされたパソコンでご使用になるお客様へ < ご案内 > 2007 年 4 月 このたびは INS メイト V30Slim をお買い求めいただき 誠にありがとうございます 本紙は INS メイト V30Slim を Win

現行のICカードリーダRW4040インストーラの課題

Microsoft PowerPoint - RL78G1E_スタータキットデモ手順_2012_1119修正版.pptx

AN424 Modbus/TCP クイックスタートガイド CIE-H14

RW-4040 導入説明書 Windows 7 用 2017 年 7 月 シャープ株式会社

<4D F736F F F696E74202D F4B87555F A838B B F5F91E63189F12E >

3 無線 / 有線接続で制御 メガローバー Ver2.0 は Wi-Fi / BLE / Bluetooth Classic の 3 種の無線通信と 有線の USB シリアル通信に対応しています 指定のコマンドを用いることで PC やタブレットなど 様々なデバイスからメガローバー Ver2.0 を制

 

Microsoft PowerPoint _2.プログラミングの基礎_final

目次 USBドライバダウンロードの手順...2 USBドライバインストールの手順...3 インストール結果を確認する...19 USBドライバアンインストール / 再インストールの手順...21 USB ドライバダウンロードの手順 1. SHL21 のダウンロードページからダウンロードしてください

文書番号 :XIA001 Revision :1.00 XIMEA 社カメラ付属ソフトウェア XIMEA API Software Package インストールマニュアル 株式会社アプロリンク

POSIXプログラミング Pthreads編

Windows AIKを使用したPE2

目次 初めに... 3 実習用 PC... 3 USB ケーブル... 4 Visual Studio 2015 のインストール... 4.NET Micro Framework SDK のインストール... 6 Azure SDK のインストール... 9 補足 NET Micro F

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

RICOH Device Manager Pro バックアップ/バージョンアップ作業手順書

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

! 2. CCS のインストール CCS をインストールする前に, パソコンのアカウントは, 必ず 管理者 にしてください ログイン中のアカウントの個人用フォルダ (C:\Users\ ログイン名 ) に全角や半角カタカナなどが含まれているとインストールが完了しません 新規で半角英数字名のローカルア

AN178 USB仮想シリアルドライバ インストールガイド

Microsoft Word - RefApp7インストールガイド.doc

「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」

ソフトウェアガイド (Windows, Mac) このたびは LG モニター製品をお買い求め頂きまして 誠にありがとうございます ご使用前にこの取扱説明書をよくお読みになり ご理解のうえ正しくお使いください お読みになったあとは保証書と共に大切に保管してください

リファレンスアプリケーション RefApp7

Microsoft Word - Python利用環境構築ガイド_ docx

2 Soliton SmartOn Solo Ver (USB2-NFC NFC-ST NFC-RW 対応 ) ここでは Soliton SmartOn Solo Ver のリリース概要について説明します 機能の詳細およびインストール方法については 体験版に含まれてい

鳥取県物品電子入札システムセキュリティ ポリシー設定マニュアル IC カードを利用しない応札者向け 第 1.7 版 平成 31 年 2 月鳥取県物品契約課 鳥取県物品電子入札システムセキュリティ ポリシー設定マニュアル Ver.01-07

Maple 12 Windows版シングルユーザ/ネットワークライセンス

Microsoft Word - toppers-contest-2014_NTB.doc

PowerPoint プレゼンテーション

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

Drv Guidebook

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

FTDI USB-Serial Converter デバイスドライバのインストール(Rev.1.01)

Maple 18 ネットワーク版インストール手順

Taro-テキスト.jtd

Microsoft Word - Training10_プリプロセッサ.docx

Steinberg 社 - VST3 対応シンセサイザービルド環境テンプレート (Windows 版 ) Quick 説明書 はじめにこの度は Steinberg 社 - VST3 対応シンセサイザービルド環境テンプレートをダウンロードして下さり 誠にありがとうございます 本説明書はビルド環境テンプ

PC-NJ70A 用 SHARP 液晶パッドアプリケーションアップデート手順 本アップデート手順には 以下のアップデートが含まれています 手順に従って実施してください 尚 SHARP Fn キードライバ へのアップデート は SHARP 液晶パッドアプリケーション へ

GettingStartedTK2

Transcription:

マルチタスクプログラミング 本 晋也 名古屋 学 学院情報科学研究科 honda@ertl.jp 最終更新 2016 年 6 20 1

概要 アジェンダ シングルタスクプログラミングの問題を解決する マルチタスクプログラミングについて学ぶ マルチタスクプログラミング環境 R2CA のインストール マルチタスクプログラミング 2

マルチタスクプログラミング環境 R2CA のインストール 3

TOPPERS/R2CA (RTE/RTOS compatible with Arduino libraries) ASP カーネルと Arduino ライブラリを組み合わせた環境 マルチタスク環境で Arduino ライブラリを使 可能 GUI ベースのデバッガを使 可能 TOPPERS の問題点の解決 開発環境の導 や使 の敷居が い Arduino IDE をインストールするだけでビルド可能 バッチファイルによるビルドが可能 安価で 性の良い Arduino ボードで実 可能 マクロの定義によるタスクの 成 ライブラリ ミドルウェアが少ない 多くの Arduino ライブラリが使 可能 Task1 Task2 Task3 Arduino 準拠ライブラリ Arduinoコアライブラリ ASP カーネル Arduino ボード 4

R2CA の使 法 インストール ビルド 実 デバッグ プログラミングモデルについて説明 Qiita にもチュートリアル記事がある (R2CA で検索すると出てくる ) 基本的な使い 通信 インストールとサンプルの実, マルチタスク, 優先度 スケジューリング, デバッグ Wifi 通信,Wifi 通信 ( マルチタスク ),CAN 通信 IoT Milkcocoa への接続,ThingSpeak への接続 Shield Zumo,NCES IoT Base Shield MacOSX での使 法 TOPPERS/R2CA を MacOSX で動かす 5

必要な機材 ホスト PC Windows or Mac OS 本チュートリアルでは Windows で説明 Linux でも動作するはず NCES Arduino M0 Pro 6000 円程度 秋,Amazon, Switch Science, マルツパーツ等で購 可能 Cortex-M0+ 48MHz/ROM 256KB/RAM 32KB デバッガ機能あり (EDBG(Atmelʼs Embedded Debugger)) デバッガ機能なしの Arduino M0 もあるが推奨しない ü Arduino UNO との互換性が低いためプログラムの書き換えが必要 般的な Arduino ボード (Arduino UNO) との違い ARM(Cortex-M0) を搭載 (UNO 等は AVR) IO が 3.3V (UNO 等は 5V) Nagoya Univ. 6

ツールのインストール Arduino IDE Arduino.org(http://www.arduino.org/downloads) からダウンロード 動作確認済みバージョン : 1.7.10!!Arduino.cc ではないため注意!! インストーラによりインストール GCC/Make/GDB/OpenOCD がインストールされる ターミナルエミュレータ Teraterm 等をインストール 以下のツールはオプション Atmal Studio GUI によるデバッグ 7.0 で確認済み 7

R2CA パッケージのダウンロード TOPPERS の Contributed Software から公開 trac svn http://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino http://dev.toppers.jp/trac_user/contrib/browser/rtos_arduino/trunk http://dev.toppers.jp/svn_user/contrib/rtos_arduino/trunk ダウンロード 法 ZIP ファイルをダウンロード http://dev.toppers.jp/trac_user/contrib/browser/rtos_arduino/trunk? rev=245&format=zip SVN クライアントをインストールしてチェックアウト TortoiseSVN, Cygwin の SVN クライアント パッケージの更新頻度が いのでこの 法を推奨 8

フォルダ構成 パッケージのフォルダ 覧./arduino_lib : Arduino ライブラリ hardware : コアライブラリ libraries : Arduino 準拠ライブラリ./asp_1.9.2 : Arduino M0 依存部を含む ASP 1.9.2 ソースコード./examples./lib : サンプルプロジェクト : R2CA ライブラリ Arduino ライブラリについて Arduino IDE に付属のライブラリがベース バグフィックスやマルチタスク対応のための排他制御を れている ライセンスは GPL や MIT libraries には Arduino IDE 付属以外のライブラリも含まれている ESP8266_Arudino_AT, Milkcocoa_Arduino_SDK, ZumoShield, NcesCan 9

セットアップ Arduino IDE のインストールパスの設定 以下のファイルの C:\Program Files (x86)\arduino の箇所を書き換える example/do_path.bat ü SET ARDUINO_DIR=C:\Program Files (x86)\arduino asp_1.9.1/target/arduino_m0_gcc/makefile.target ボードの接続 ü ARDUINO_BASE_DIR_WIN = C:\Program Files (x86)\arduino M0 の PROGRAMMING ポートと PC を USB ケーブルで接続 ドライバがインストールされ,COM ポートと EDBG が認識される COM ポートの番号を確認して,Teraterm 等で 115200bps で接続 10

プログラムの 覧 フォルダ : \examples\multitasktext シングルタスクプログラム (SingleTask) プログラム 1,2,3,4 をマクロで選択して実 可能 プログラム 5R(LEDBlink_CLEDBlink) プログラム 5 をマルチタスクで実現 プログラム 8R(Interrupt) プログラム 8 をマルチタスクで実現 ( タスク起動を使 ) プログラム 9(Exclusion) プログラム 8 にカウンタをクリアする処理を追加 11

プログラムの実 シングルタスクプログラムをビルド & 実 する フォルダ : \examples\multitasktext\singletask ユーザープログラム等 Makefile rca_app.h : ライブラリやファイルの指定 : ユーザープログラムヘッダーファイル rca_app.cpp : ユーザープログラムプログラムファイル rca_app.cfg : コンフィギュレーションファイル ( 静的 API を記述 ) pitches.h バッチファイル do_make.bat : ビルド do_run.bat : プログラムで使 するヘッダファイル : ビルド & 書き込み & 実 do_clean.bat : ファイルのクリーン do_debug.bat : ビルド & 書き込み & デバッグ AtmelStudio ファイル rca.atsln,rca.componentinfo.xml,rca.cproj 12

サンプルの実 : プログラムの選択 \examples\multitasktext\singletask\rca_app.cpp には, シングルタスクプログラミングのプログラム 1,2,3,4 のいずれかを選択可能 有効にするプログラムのマクロのコメントアウトを外す 同時に有効可能なプログラムは 1 個まで #define LED_BLINK プログラム 1 : 1000m 周期で LED を点滅 #define CLED_BLINK プログラム 2 : 250ms 周期で Change LED の を変更 #define TOUCH_SENSE プログラム 3 : Touch センサの検知による LED の ON/OFF 切り替え #define LUX_SENSE プログラム 4 : 光センサの値の OLED への出 13

サンプルの実 : プログラムの内容 R2CA ヘッダ (rca.h) のインクルード以外は Arduino と同等のプログラムを実 可能 setup() : 起動時に 度だけ実 される関数 loop() : 繰り返し実 される関数 #include "rca.h #define LED_PIN 4 void setup() { pinmode(led_pin, OUTPUT); void loop() { digitalwrite(led_pin, HIGH); delay(1000); digitalwrite(led_pin, LOW); delay(1000); 14

サンプルの実 : ビルド do_make.bat をダブルクリックするとビルドが開始される ASP カーネル &Arduino ライブラリ & ユーザープログラムがビルドされてダウンロードファイルが 成される check complete が出ればビルドは成功 rca.elf が出来ている 15

サンプルの実 : 実 do_run.bat をダブルクリックすると書き込みが われる OpenOCD による書き込み 書き込み後に実 される 書き込み 16

マルチタスクプログラミング 17

プログラム 5R(LEDBlink_CLEDBlink) プログラム 5 をマルチタスクで実現 1000m 周期で LED を点滅させる 250m 周期で Change LED の を変更 LED 1000ms 1000ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms CLED LED タスク 1000ms 1000ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms CLED タスク 18

プログラム 5R : プログラミング タスク構成 setup()/loop() を実 するタスクをメインタスクと呼ぶ task1_setup()/task1_loop() はタスク 1 と呼ばれるタスクにより実 される 起動時は両 のタスク共に実 可能状態 優先度は等しい 起動時の優先順位はメインタスクが い 両タスク共にシングルタスクと同じコードを実 タスクの実 メインタスク実 状態になり delay() により待ち状態となると, タスク 1 を実 状態として再び delay() により待ち状態となる その後は待ち状態がタイムアウトしたタスクを起床させ, 実 可能状態として処理を継続する #define LED_PIN 4 void setup() { pinmode(led_pin, OUTPUT); void loop() { digitalwrite(led_pin, HIGH); delay(1000); digitalwrite(led_pin, LOW); delay(1000); #define NUM_LEDS 1 ChainableLED leds(8, 9, NUM_LEDS); void task1_setup() { leds.init(); void task1_loop() { int i; for(i = 0; i < 25; i++){ leds.setcolorrgb(0, i*10, 0, 0); delay(10);. 19

プログラム 8R(Interrupt) プログラム 8 をマルチタスクで実現 ( タスク起動を使 ) LED タスクは起動後, 起床待ち API を呼び出して待ち状態へ Touch センサが OFF-ON-OFF すると割込みハンドラから起床 API を呼び出して起床させ, 実 可能状態へ LEDタスクはLEDを点灯させた後, 時間経過待ちAPIにより,2 秒間の待ち状態となる ON Touchセンサ OFF OFF OFF 検出状況 割込みハンドラ LED LED タスク OFF ON 起床待ち 起床 OFF 点灯処理 2000ms 時間経過待ち 消灯処理 NCES センサタスク Nagoya Univ. 20

プログラム 8R(Interrupt): プログラム タスク構成 メインタスク : センサタスク タスク 1 : LED タスク タスク起床待ち API : slp_tsk(); タスク起動 API : iwup_tsk() タスク 1 の ID(RCA_TASK1) を指定 void CheckTouch(){ int TouchValue = digitalread(touch_pin); if ((PreTouchValue == 0) && (TouchValue == 1) && (TouchState = 0)) { TouchState = 1; if ((PreTouchValue == 1) && (TouchValue == 0) && (TouchState = 1)) { TouchState = 0; iwup_tsk(rca_task1); PreTouchValue = TouchValue; 起床 void setup() { Wire.begin(); attachinterrupt(touch_pin, CheckTouch, CHANGE); void loop() { int lux; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putNumber(OLEDCount++); SeeedOled.putString(" "); void task1_setup() { void task1_loop() { slp_tsk(); digitalwrite(led_pin, HIGH); dly_tsk(2000); digitalwrite(led_pin, LOW); 21

プログラム 9 プログラム 8 に光センサ表 カウンタ (OLEDCount) をクリアする処理を追加 センサタスク : OLEDに表 する毎にインクリメント LEDタスク : 割込みハンドラから起動されたら0クリアする NCES Touch センサ 検出状況 割込みハンドラ LED LED タスク OLEDCount センサタスク OFF OFF Nagoya Univ. 3 ON ON 起床待ち 起床 OFF OFF 点灯処理 2000ms 時間経過待ち OFF 消灯処理 4 0 1 2 3 0クリア 22

プログラム 9 : プログラム センサタスク OLCD への表 前にローカル変数に読み込み, 表 後にインクリメントして書き戻す LED タスク 起床した後 (slp_tsk() からリターン )OLEDCount を 0 にする void setup() { Wire.begin(); attachinterrupt(touch_pin, CheckTouch, CHANGE); void loop() { int lux; int lcount; lcount = OLEDCount; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putNumber(lcount++); SeeedOled.putString(" "); OLEDCount = lcount; void task1_setup() { void task1_loop() { slp_tsk(); OLEDCount = 0; digitalwrite(led_pin, HIGH); dly_tsk(2000); digitalwrite(led_pin, LOW); 23

プログラム 9 : 問題 カウンタがクリアされない場合がある センサタスクが値をローカル変数に保持している間に LED タスクが OLEDCount を更新した場合, その結果がセンサタスクによって上書きされる 割込みハンドラ LED タスク 起床待ち 時間経過待ち OLEDCount 3 4 0 クリア 0 5 lcount 3 4 5 センサタスク 24

プログラム 9 : 問題の解決 ローカル変数を使わず C 語 1 で記述する 発 頻度は下がるが本質的な解決にならない プロセッサレベルでは複数の処理となるためその間で割り込まれる可能性がある (1) メモリのレジスタへの読みこみ, (2) 計算, (3) レジスタのメモリへの書き戻し void loop() { int lux; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putNumber(OLEDCount++); SeeedOled.putString(" "); (1) ldr r2, [r, #0] (2) adds r2, #1 (3) str r2, [r3,#0] OLEDCount レジスタ 3 (1) (2) (3) 4 3 4 25

プログラム 9 : 問題の解決 排他制御機構を いる OLEDCount を更新する場合には排他制御を い, 他の処理がアクセスしないようにする 割込みハンドラ LED タスク OLEDCount 3 起床待ち 4 排他待ち 5 0 クリア 0 1 センサタスク 26

プログラム 9 : 問題の解決 使 する排他制御機構を選択する 割込み禁 I2C 通信が割込みを使 するため今回は使 出来ない ディスパッチ禁 I2C 通信が時間待ちを伴うため今回は使 出来ない 優先度を上げる 使 可能だが動的な優先度変更は可能な限り使わない がよい セマフォ 今回はこれを使 する 27

セマフォ (Semaphore) 使 されていない資源の有無や数量をセマフォの資源数として管理することにより排他制御を実現 資源を使 する前にセマフォ資源を獲得し, 資源を使 した後にセマフォ資源を返却する. 資源が全て使 されていれば, セマフォ資源獲得の時点で待ち状態になる プログラムの実 複数のタスクで使 する セマフォの獲得 資源の使 セマフォの返却 クリティカルセクション 競合するタスク間で 排他制御が必要な区間 28

セマフォ (Semaphore): サービスコール サービスコール CRE_SEM sig_sem, isig_sem wai_sem, pol_sem, twai_sem セマフォの 成 セマフォ資源の返却 セマフォ資源の獲得 語源 鉄道の単線区間で進 制御に いていた 輪. 単線区間に る場合は, この輪 ( セマフォ ) を取る 輪 : セマフォ 列 : タスク 単線区間 : 資源 29

セマフォ (Semaphore): セマフォ操作 セマフォ獲得 : セマフォ資源があれば獲得して実 を継続. なければ, 資源が解放されるまで待つ セマフォ返却 : セマフォ資源を返却し, その時点で待っているタスク があれば, そのタスクに資源を渡し待ちを解除する タスク1 セマフォ タスク2 ( 優先度 : 低 ) (SID1) ( 優先度 : ) 時間 共有資源の操作 ディスパッチ wai_sem(sid1) セマフォ獲得要求 セマフォ獲得 sig_sem(sid1) セマフォ返却 資源数 =1 資源数 =0 wai_sem(sid1) セマフォ獲得要求 セマフォ獲得 起動 共有資源の操作 待ち状態 ( セマフォ獲得待ち ) 待ち解除, ディスパッチ 30

プログラム 9 : セマフォの使 OLEDCount のアクセスの前にセマフォを取得 OLEDCount の更新後セマフォを返却 センサタスク ( ローカル変数版 ) センサタスク ( グローバル変数版 ) LED タスク ) void loop() { int lux; int lcount; wai_setm(count_sem); lcount = OLEDCount; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putNumber(lcount++); SeeedOled.putString(" "); OLEDCount = lcount; sig_setm(count_sem); セマフォの宣 (rca_app.cfg) void loop() { int lux; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); wai_setm(count_sem); SeeedOled.putNumber(OLEDCount++); sig_setm(count_sem); SeeedOled.putString(" "); CRE_SEM(COUNT_SEM, { TA_TPRI, 1, 1 ); void task1_loop() { slp_tsk(); wai_setm(count_sem); OLEDCount = 0; sig_setm(count_sem); digitalwrite(led_pin, HIGH); dly_tsk(2000); digitalwrite(led_pin, LOW); 31

まとめ 32

まとめ シングルタスクプログラミングの問題を解決する マルチタスクプログラミングについて学ぶ 独 した処理の並列実 時間的な処理順序は OS が決定して実 処理内容を独 させることが出来る 割込みからのタスクの起動 割込み発 後に待ち状態を伴う処理を実 可能 排他制御 共有する変数の更新で不整合の発 を抑制 排他の状況により使 する機構を選択する 33