μITRON入門
T-Engine Forum
T-Engineフォーラム
(C) 2014 T-Engine Forum, All Rights Reserved.
2
1 組込みシステムとマルチタスク・
リアルタイム処理
2 トロンと組込みシステム
3 μITRON入門
4 μITRON開発手順
5 μITRONプログラミング
6 参考資料・付録など
(C) 2014 T-Engine Forum, All Rights Reserved.
3
組込みシステムとは
▶
組込みシステム=センサやアクチュエータ、他の機械システム等と協
調して動作するコンピュータシステム
▶
(例)
 家電製品の制御システム
 ファックスやコピー機の制御
 自動車の制御システム
 携帯電話、スマートフォン
 など…
(C) 2014 T-Engine Forum, All Rights Reserved.
4
どのようなものが
組込みシステムか?
ロボット制御分野
NC/FA制御分野
組込みシステム
OA機器分野
計測機器分野
通信制御分野
音声認識
車両 / 車載機器分野
AV機器分野
マイコン内蔵炊飯器、洗濯機、コピー機、FAX、
携帯情報端末、電子楽器、自動車、ロボットなど
(C) 2014 T-Engine Forum, All Rights Reserved.
5
組込みシステムこそメジャー
▶
パソコン・ワークステーション等の出荷数
 約2億台/年
▶
組込みコンピュータの出荷数
 200億個/年以上と言われる
▶
⇒ビックデータ/オープンデータ化が進むとともに、ウエアラブル端末
の普及などで、組込みコンピュータは今後も増えていくだろう。
(C) 2014 T-Engine Forum, All Rights Reserved.
6
組込みシステムの特徴(1)
▶
▶
計算処理よりも、入出力処理、通信処理が中心

イベント処理プログラム

実時間(リアルタイム)処理プログラム
必要最小限のハードウェア資源にチューニングする⇒コストを極力下
げる
(C) 2014 T-Engine Forum, All Rights Reserved.
7
組込みシステムの特徴(2)
▶
専用化されたシステム
▶
厳しいリソース制約
▶
高い信頼性

パソコンがフリーズしてもお客は怒らないが、カメラがフリーズしたら、大
クレーム!
▶
システムの改修に多大なコスト
▶
リアルタイム性
(C) 2014 T-Engine Forum, All Rights Reserved.
8
リアルタイム処理とは
(コピー・プリンタ・ファックス複合機の例)
コピー
原稿セット
コピー
ボタン
押下
紙詰まり
印刷
データ
着信
ファックス
着信
(C) 2014 T-Engine Forum, All Rights Reserved.
9
リアルタイム処理とは
(主婦兼母親の朝)
7:00 太郎(5歳)を
起こす
7:05 湯が沸く
→紅茶を入れる
7:15 花子(0歳)
おしっこで泣く
→オムツ交換
7:15 トースターが終了→
トーストを皿に
8:10 田中さんから電話
→夕方の買物の約束
8:15 太郎スクール
バスに送る
8:28 クリーニング屋
→受け取りと支払い
(C) 2014 T-Engine Forum, All Rights Reserved.
10
リアルタイムシステムとは
「リアルタイムシステム」では、計算結果があっていることだけでなく、
決められた時間内に計算が終わることも保証しなければならない
(例)
▶ システムへの要求=「127+382の答えを求めなさい。答えは3分後
までに出しなさい(12時23分)」
▶
(12時30分) ⇒リアルタイムシステムでは計算
失敗の例となる
 (答)509 (12時24分) ⇒リアルタイムシステムでも計算
成功の例
 (答)509
(C) 2014 T-Engine Forum, All Rights Reserved.
11
続き・・・リアルタイムシステムとは
リアルタイム=要求された時間内に決められた処理を行うこと
つまり、Windowsなどのパソコン用OSにリアルタイム性が無いため
車が衝突してエアバックが開く際、
画面に砂時計が出るなんてことに・・・、
洒落にならないっ!
(C) 2014 T-Engine Forum, All Rights Reserved.
12
リアルタイムシステムは複雑
▶
実世界とのかかわり


▶
ランダムに起きる事象への対応
実時間を扱う必要性
複雑な処理が要求されるため、処理するための技術が必要となる




並行処理(タスク、スケジューリング)
同期・通信
実時間処理
記憶管理
(C) 2014 T-Engine Forum, All Rights Reserved.
13
組込み機器制御
(シングルタスク)
シングルタスク
処理1
関数
DVD
Play
DVD
処理2
関数
GPS
Information
Get
プログラムが複雑
→ 規模が大きくなると管理出来ない!
(C) 2014 T-Engine Forum, All Rights Reserved.
GPS
14
リアルタイムとマルチタスク
前方30m以内に
歩行者を発見したら
ブレーキを踏む
<0.1秒以内>
・車の運転の例
スピードが50km/h
以下になったら
アクセルを踏む
<2秒以内>
前方30m以内に
赤信号を発見したら
ブレーキを踏む
<1秒以内>
スピードが50km/h
以上になったら
アクセルを離す
<3秒以内>
燃料計の針が“E“
を指したらガソリン
スタンドに入る
<15分以内>
制限時間内に複数の処理を行う
リアルタイムシステム
は、
という
マルチタスクシステム
(C) 2014 T-Engine Forum, All Rights Reserved.
になる場合が多い!
15
マルチタスクとは
▶
複数の処理を同時に実行すること=マルチタスク処理
マルチタスク
シングルタスク
(C) 2014 T-Engine Forum, All Rights Reserved.
16
マルチタスクとは
プログラムはタスク(Task)単位で実行
※タスクとはプログラム実行の最小単位、意味のある1つの仕事のくくり(モジュールや関数のこと)
各種入力
入力
処理
タスク
起動指示
計算
処理
タス
ク
起動指示
表示
処理
タス
ク
表示データ
出力
LCD
表示器
マイコン内部プログラムの流れ→
タスクスケジューリング
※タスク間起動指示はシステム(サービス)コールをOSに発行
※タスク分割には一般的に構造化設計手法を利用
WindowsなどのOSはスケジューリング機能が無いため、ユーザがWord
やExcelを起動するが、マイコンプログラムでは、あらかじめタスクに優
先度をつけておき、OSはその優先度に従いタスクを実行する。よって、
リアルタイムOSのことをタスクスケジューラと呼ぶことがある。
(C) 2014 T-Engine Forum, All Rights Reserved.
17
マルチタスクとは
見通しの良いプログラム
設計が可能となる。タスク
(モジュール)再利用率が
向上する(ミドルウェア等
の利用可能)。
複数のタスクを動作させる
ことから、リアルタイムOS
のことをマルチタスクOSと
呼ぶことがある。
不具合発生しにくい
開発効率の向上
独立性/信頼性の高いタスクの取捨選択で、
各種製品展開が短期間で可能となる。
タスク削除
で対応
ローエンド機
HDD外
部接続
機能
全CH
同時録
画機能
Blu-ray レコーダ
(C) 2014 T-Engine Forum, All Rights Reserved.
タスク追加
で対応
ハイエンド機
18
タスクスケジューリング
▶
同時に複数の処理をさせる(マルチタスク)
▶
しかしCPUは一つしかない…
▶
CPUを使う時間帯を複数のタスクに割り振る
▶
タスクスケジューリング
(C) 2014 T-Engine Forum, All Rights Reserved.
19
RTOS導入のメリット
▶
リアルタイム処理の基本処理を扱ってくれる=プログラム作成が容易に
 並行処理・スケジューリングのサポート

タスク分割設計が容易に、効率的なI/Oも簡単に実現
 同期処理のサポート

タスク間の通信・同期の実現が容易に
 記憶管理のサポート

▶
▶
記憶管理の細部に関らないでもすむ。
プログラムの再利用性の向上
保守性・拡張性の向上
(C) 2014 T-Engine Forum, All Rights Reserved.
20
RTOS導入のメリット
ソフトウェア
ソフトウェアが直接
ハードウェアを制御
するため、マイコンが
変わるとソフトウェア
は大幅変更を余儀な
くされる(再利用不
可)
(C) 2014 T-Engine Forum, All Rights Reserved.
ソフトウェア
OS
OSを介してハード
ウェアを制御する
ため、マイコンが
変わっても、ソフト
ウェアの大幅な変
更は必要無い(再
利用可)
RTOS導入のメリット
~例えばこんなことができる~
21
壁があることで、ソフト
ウエアの流用や検証など
のノウハウ共有が難しい
壁
壁
アプリケーション・
ソフトウエア
アプリケーション・
ソフトウエア
アプリケーション・
ソフトウエア
ミドルウエア
ミドルウエア
ミドルウエア
リアルタイムOS
リアルタイムOS
リアルタイムOS
ハードウエア
ハードウエア
ハードウエア
(C) 2014 T-Engine Forum, All Rights Reserved.
RTOS導入のメリット
~例えばこんなことができる~
アプリケーション・
ソフトウエア
22
壁を取り払うことで、ソフ
トウエアの流用や検証など
のノウハウ共有が容易に
アプリケーション・
ソフトウエア
ミドルウエア
アプリケーション・
ソフトウエア
ミドルウエア
リアルタイムOS
ハードウエア
(C) 2014 T-Engine Forum, All Rights Reserved.
23
1 組込みシステムとマルチタスク・リアルタイム処理
2 トロンと組込みシステム
3 μITRON入門
4 μITRON開発手順
5 μITRONプログラミング
6 参考資料・付録など
(C) 2014 T-Engine Forum, All Rights Reserved.
24
トロンプロジェクトとITRON
▶
TRON Project since 1984

▶
トロン(TRON)

▶
トロンプロジェクトはUbiquitous Computing研究開発の先駆け
The Real-time Operating system Nucleus
組込みシステム向けに、ITRON(Industrial TRON) Specification を公開
(1989)

現在のバージョンはμITRON 4.0仕様
(C) 2014 T-Engine Forum, All Rights Reserved.
25
トロンの有効性
▶
トロン(The Real-time Operating system Nucleus)の特長
 仕様が公開されている(オープン)
 実装が自由(ライセンス料がかからない)
 国内各社で利用されている(ITRON/T-Kernel)
▶
なぜ各社で利用されているのか?
 ソフトウェアの流通性・再利用性の確保
 企業内のソフトウェア開発の標準化
 技術者教育の標準化
(C) 2014 T-Engine Forum, All Rights Reserved.
26
ITRONの歴史
ITRON(Industrial TRON)
機器組込み制御システム用の
ソフトウェア部品
オペレーティングシステム
ITRON/
FILE
・リアルタイム性、コンパクト
・オープンアーキテクチャ
・弱い標準化による柔軟な
ハードウェア適応化
カーネル仕様
ITRON1仕様
・最初の標準化仕様
・8、16bit MPU対象
・標準化仕様の
草分け的存在
ITRON2仕様
・大規模システム用
・主に32bit MPU対象
・ITRON1仕様に対し、
大幅に機能拡張
・中大規模システム用
・8、16、32bit MPU包含
・RTOSとして豊富な
機能をサポート
・ITRON仕様の集大成
μITRON4.0/PX仕様
・標準化仕様の強化
・スケーラビリティーの向上
・構築方法の標準化
・保護機能拡張
【効果】
・ソフトウェア部品
(ミドルウェア)の流通
促進
・応用分野の拡大
・アプリケーション
開発効率の向上
【拡張された機能】
・オブジェクトの動的生成
・メッセージバッファ機能
・周期/アラームハンドラ
・CPUロック/アンロック 他
・小規模組込み機器用
・8、16bit MPU対象
・RTOSとして基本的な
機能のみサポート
1989
μITRON4.0仕様
【効果】
・メモリへのアクセス保護
(信頼性・安全性)
・カーネルオブジェクトへの
アクセス保護(セキュリティ)
(第2フェーズ)
(第1フェーズ)
1984
JTRON
2.1
μITRON3.0仕様
μITRON2.0仕様
トロンプロジェクト発足
ITRON
TCP/IP API
1993
1996 1999
(C) 2014 T-Engine Forum, All Rights Reserved.
2002 2003
27
ITRONとT-Kernel
ITRONの成果を生かしつつ、標準化の範囲を拡大し、
高度な技術を取り入れることで、短期間で高度な組
込みシステムを作るためのソリューションの整備。
強い標準化
に基づく展開
T-Engineプロジェクト
ユビキタスコンピューティング環境構築を目指し
て、オープンなリアルタイム標準開発環境を整備
するプロジェクト。 ハードウェア、OS、ミドルウェ
ア、開発環境について、強い標準化が進められ
ている。
T-Kernel2.0
uT-Kernel2.0
ITRON4.0仕様
ITRON4.0/PX仕様
ITRON
弱い標準化と
プロファイル
に基づく展開
ITRONの成果をベースとして、互換性や厳密性
の向上を図り、生産性向上や再利用性、移植性
を高めることを目的に仕様を整理。
・同一プロファイル規定のOS間で互換性を保証
(スタンダードプロファイル、自動車プロファイル)
・保護機能拡張(ITRON4.0/PX仕様)によるMMU
サポート(メモリ保護を主目的としている)
(C) 2014 T-Engine Forum, All Rights Reserved.
28
μITRON 4.0とT-Kernelの
機能比較
機 能
タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能
拡張同期・通信機能
メモリ・プール機能
時間管理機能
システム状態管理機能
割込み管理機能
サービスコール管理機能
システム構成管理機能
サブシステム管理機能
システム・メモリ管理機能
アドレス空間管理機能
デバイス管理機能
I/Oポート・アクセスサポート機能
省電力機能
μITRON 4.0
○
○
○
○
○
○
○
○
○
○
○
×
×
×
×
×
×
(C) 2014 T-Engine Forum, All Rights Reserved.
T-Kernel
○
○
○
△
○
○
△
○
○
×
○
○
○
○
○
○
○
機能差
TKはデータキュー無
TKはオーバランH無
TKはサブシステムが同等
29
uITRON適用範囲
●8-32ビットRISC/CISC系マイコンに適用可能
●各メーカリリースのオリジナルマイコンに合わせた製品を準備
・ルネサス(旧日立/旧三菱/旧NEC)用OS
・富士通
・東芝
・他(あくまで一例です)
●各マイコンメーカをターゲットにした製品を準備(3rd Party)
・グレープシステム
・イーソル
・イーフォース
・エーアイコーポレーション
・ミスポ
・他(あくまで一例です)
(C) 2014 T-Engine Forum, All Rights Reserved.
30
T-Kernel適用範囲(ARM core)
(C) 2014 T-Engine Forum, All Rights Reserved.
31
参考:その他の組込み向けOS
▶
組込みLinux

▶
OSEK/VDX

▶
車載向け、欧州
Symbian OS/Android OS/iOS

▶
UnixクローンOS Linuxの組込み版
携帯電話/スマートフォン向け
VxWORKS

ソフトウェアベンダ系
(C) 2014 T-Engine Forum, All Rights Reserved.
32
1 組込みシステムとマルチタスク・リアルタイム処理
2 トロンと組込みシステム
3 μITRON入門
4 μITRON開発手順
5 μITRONプログラミング
6 参考資料・付録など
(C) 2014 T-Engine Forum, All Rights Reserved.
33
uITRON4.0仕様の概念と共通定義
uITRON仕様では、基本的な用語の意味やタスク状態、タスク
スケジューリング、割込み処理モデルなどが共通の定義として
仕様書に記載されています。
ここでは最低限の事項について記載します。
(C) 2014 T-Engine Forum, All Rights Reserved.
34
タスクとは
▶
RTOS上で最小実行単位となるサブルーチン(関数)
▶
各タスクには優先度を指定
▶
タスクには以下の状態があり、順次切り替えて並行動作を行う(タス
クスケジューリング)
 実行可能状態、実行状態、待ち状態、強制待ち状態、
二重待ち状態、休止状態、未登録状態
(C) 2014 T-Engine Forum, All Rights Reserved.
35
タスク状態遷移図
ディスパッチ
READY
RUN
プリエンプト
実行可能状態
実行状態
待ち条件
待ち解除
WAIT
強制終了
待ち状態
ter_tsk
中断
再開
rsm_tsk
frsm_tsk
sus_tsk
WAIT-SUSPEND
強制終了
二重待ち状態
ter_tsk
待ち解除
中断 sus_tsk
再開
SUSPEND
強制終了
強制待ち状態
ter_tsk
rsm_tsk
frsm_tsk
起動
sta_tsk
強制終了 ter_tsk
DORMANT
休止状態
強制終了
終了 ext_tsk
(C) 2014 T-Engine Forum, All Rights Reserved.
タスクはOSによっ
て管理されますが、
そのための情報と
してタスク状態があ
ります。μITRON仕
様では状態を図の
ような6つのタスク
の状態遷移を考え
ています。
36
タスクの状態(1)
▶
▶
▶
▶
実行状態(RUNNING)
 現在タスクが実行中の状態
 実行可能状態のタスクの中で最も優先順位の高いタスクの状態
実行可能状態(READY)
 sta_tsk等により実行可能になった状態
待ち状態(WAITING)
 待ち解除の条件が満たされるのを待っている状態
 条件が満たされると実行可能状態に移行
強制待ち状態(SUSPENDED)
 他タスクから強制的に中断された状態
 スケジューリングの対象から強制的にはずされたタスクの状態
(C) 2014 T-Engine Forum, All Rights Reserved.
37
タスクの状態(2)
▶
▶
▶
二重待ち状態(WAITING-SUSPENDED)

待ち状態と強制待ち状態の2つの待ち状態が重なった状態

待ち状態のタスクに対して、sus_tskが発行された状態
休止状態(DORMANT)

タスクが起動されるのを待っている状態

タスクの起動前、および タスク終了後の状態
未登録状態(NON-EXISTENT)

タスクが登録されていない状態

システムから削除された状態
(C) 2014 T-Engine Forum, All Rights Reserved.
38
タスクの状態(アイコン)
実行状態
RUNNING
強制待ち状態
SUSPEND
実行可能状態
READY
二重待ち状態
WAIT-SUSPEND
(C) 2014 T-Engine Forum, All Rights Reserved.
待ち状態
WAIT
休止状態
DORMANT
39
タスク遷移の様子
dispatch
preempt
実行可能状態
READY
待ち条件
待ち解除
実行状態
強制終了 RUNNING
待ち状態
WAIT
中断
再開
二重待ち状態
WAIT-SUSPEND
中断
再開
終了と削除
待ち解除
強制待ち状態
SUSPEND
起動
強制終了
強制終了
強制終了
終了
休止状態
DORMANT
削除
(C) 2014 T-Engine Forum, All Rights Reserved.
生成
未登録状態
NON-EXISTENT
40
レディーキュー
レディキュー(優先度 : 1)
TASK1
TASK2
TASK4
TASK5
TASK3
レディキュー(優先度 : 2)
レディキュー(優先度 : 3)
TASK6
・実行可能状態にあるタスクのつながる行列
・最も優先順位の高いタスクが実行状態になる
(C) 2014 T-Engine Forum, All Rights Reserved.
41
タスクの実行順序
レディキュー(優先度 : 1)
TASK1
TASK2
TASK4
TASK5
TASK3
レディキュー(優先度 : 2)
レディキュー(優先度 : 3)
TASK6
・優先順(優先度の数字が小さい順)
・同じ優先度なら先にレディーキューに並んだ順(FIFO順)
(C) 2014 T-Engine Forum, All Rights Reserved.
42
タスク動作以外の規定
▶
用語、ID番号、優先度、エラーコード等
▶
ITRON共通規定として用意されている
▶
正の数で値が小さいほ
ど優先度が高い、など

ソフトウェア部品仕様にも共通に適用可能

規定を理解しておくことで、仕様全体も理解しやすい(プログラム可読性
も向上)
μITRON3.0/4.0/T-Kernelにおいて、基本的な概念や扱いは共通
(C) 2014 T-Engine Forum, All Rights Reserved.
43
タスクの動きを勉強したい方は・・・
T-Engineフォーラムの
サイト[イベント・セミ
ナー]→[TTVタスクシ
ミュレータ]を選択
(C) 2014 T-Engine Forum, All Rights Reserved.
44
API名称の決まり
サービスコールで使用されている略語
ITRON仕様、T-Kernel仕様のカーネルのサービスコールの名称は,xxx_yyy の形を基
本としており、xxxで操作の方法,yyyで操作の対象をあらわしています。xxx,yyyの識別名
は2~4文字程度の略語が使用されています。以下に代表的なものを示します。
略語 元になった英語
can
cancel
chg
change
clr
clear
cre
create
del
delete
slp
sleep
dtq
data queue
sem semaphore
tsk
task
その他の略語と元になった英語については、μITRON 4.0仕様書の「2.2 APIの名称に
関する原則」にありますので、くわしくは仕様書を参照してください。
(C) 2014 T-Engine Forum, All Rights Reserved.
45
μITRON4.0仕様の機能(サービスコール)
▶
▶
▶
▶
タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能




▶
セマフォ
イベントフラグ
メールボックス
データキュー
▶


▶
▶


ミューテックス
メッセージバッファ
ランデブポート



▶
▶
▶
固定長メモリプール
可変長メモリプール
割り込み管理機能
時間管理機能

拡張同期・通信機能

メモリプール管理機能
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
※赤字を中心に記載。
(C) 2014 T-Engine Forum, All Rights Reserved.
46
μITRON4.0仕様の機能(サービスコール)
▶ タスク管理機能
▶
▶
▶
タスク付属同期機能
タスク例外処理機能
同期・通信機能




▶


ミューテックス
メッセージバッファ
ランデブポート
メモリプール管理機能


▶
▶
セマフォ
イベントフラグ
メールボックス
データキュー
拡張同期・通信機能

▶
割り込み管理機能
時間管理機能




▶
▶
▶
固定長メモリプール
可変長メモリプール
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
47
タスク管理機能
タスクの状態を直接的に操作/参照する機能
cre_tsk()
タスク生成
del_tsk()
タスク削除
sta_tsk()
タスク起動
ext_tsk()
自タスク終了
exd_tsk()
自タスク終了と削除
ter_tsk()
他タスク強制終了
ref_tsk()
タスク状態参照
(C) 2014 T-Engine Forum, All Rights Reserved.
48
初期化タスクでの処理例
{
ER
ercd;
T_CTSK
ctsk_A, ctsk_B;
/* タスク生成情報 */
ID
tskid_A, tskid_B;
/* タスクID
*/
ここでタスク構造体 ctsk_A, ctsk_B を設定
tskid_A = cre_tsk(&ctsk_A);
/* タスク生成
*/
/* タスク起動
*/
tskid_B = cre_tsk(&ctsk_B);
ercd
= sta_tsk(tskid_A, mbxId);
ercd
= sta_tsk(tskid_B, mbxId);
ercd
= slp_tsk(TMO_FEVR);
/* タスクスリープ */
}
※エラー処理は入っていません。
(C) 2014 T-Engine Forum, All Rights Reserved.
49
初期化タスクの流れ
初期化タスク
initialization task
優先度:高
(Priority: High)
実行状態
(RUN)
cre_tsk A
cre_tsk B
Task A
優先度:中
(Priority: Middle)
休止状態
(DORMANT)
Task B
優先度:低
(Priority: Low)
休止状態
(DORMANT)
sta_tsk A
実行可能状態
(READY)
sta_tsk B
実行可能状態
(READY)
slp_tsk
待ち状態
(WAIT)
実行状態
(RUN)
(C) 2014 T-Engine Forum, All Rights Reserved.
50
タスク管理機能
{
sta_tsk(TaskA);
ext_tsk(Initial);
/* タスク起動
*/
/* タスクスリープ */
}
※エラー処理は入っていません。
初期化タスク
initialization task
優先度:高
(Priority: High)
実行状態
(RUN)
sta_tsk A
ext_tsk
休止状態
(DORMANT)
ユーザが作成したタスクを実行するには、まずタス
クを起動し、READY(実行可能)状態にします。具体
Task A
的には、起動したい対象タスクに対してsta_tskを発
優先度:低
行し、DORMANT(休止)状態のタスクをREADY状態
(Priority: Middle)
にします。そして、READY状態になったタスクは、
RTOSによりスケジューリングされ、ディスパッチとプ
休止状態
(DORMANT) リエンプトを行います。
実行中(RUN状態)のタスクを終了、つまり
実行可能状態
DORMANT状態にするには実行中のタスクの中で
(READY)
ext_tskを発行します。
次はタスクを強制終了させる場合です。タスク実行
実行状態
中に異常が発生し、タスクの実行を中断しなければ
(RUN)
ならないとき、ter_tskを発行して、他のタスクを強制
的に終了させることができます。これは、READY、
WAIT、WAIT-SUSPENDまたはSUSPEND状態のタ
スクをDORMANT状態にします。
(C) 2014 T-Engine Forum, All Rights Reserved.
51
タスク管理機能(ご参考)
優
先
エラーや特定のイベント発生に従って、あら 高
かじめ決めておいたタスクの実行順序を変更し
←
実
たい場合、次の2つの方法があります。
chg_priは、対象タスクに対して、システム起動
時に指定されているタスクの優先度を一時的
に変更するとき発行します。変更された優先度
は、そのタスクが終了するまで有効となります。
rot_rdqシステムコールを発行すると、指定さ
れた優先度のタスクのレディキューを回転させ
ることができます。レディキューが回転すると、
先頭のタスクが最後尾につなぎ変えられます。低 実
また、このシステムコールで、自タスクの優先
度を指定した場合には、自タスク自身がレディ
キューの最後尾につながれます。
①
度
②
③行
可
実
能
状
実行
態
行中実
可
で
最
行
能
F
可
能
C
F
S
R
行
実
可
行
能
高
待
可
E
A
ち
,
D
Y
休
止
能
R
E
待
ち
A
,
D
Y
休
止
指定したタスク(他タスク)の現在の優先度とタスク状態を知りたい場合には、ref_tskを使用します。このシステムコー
ルを発行すると、指定タスクの優先度とタスク状態がリターンパラメータとして返却されます。
(C) 2014 T-Engine Forum, All Rights Reserved.
52
μITRON4.0仕様の機能(サービスコール)
▶
タスク管理機能
▶

▶ タスク付属同期機能
▶
▶
タスク例外処理機能
同期・通信機能




▶




▶
▶
セマフォ
イベントフラグ
メールボックス
データキュー
拡張同期・通信機能
ミューテックス
メッセージバッファ
ランデブポート
メモリプール管理機能
割り込み管理機能
時間管理機能




▶
▶
▶
固定長メモリプール
可変長メモリプール
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
53
タスク付属同期機能
タスク状態を直接操作して同期を行う機能
slp_tsk()
自タスクを起床待ち状態へ移行
wup_tsk()
他タスクの起床
dly_tsk()
タスク遅延
(C) 2014 T-Engine Forum, All Rights Reserved.
54
タスク付属同期機能
slp_tskはタスクの仕事が一段落して、実行中の自タスクを停止させWAIT状態にするときに発行します。
wup_tskはWAIT状態にあるタスクをREADY状態に、つまり、起床要求を出すときに発行します。
dly_tskは実行中の自タスクを一定時間WAIT状態に、つまり、一定時間止めたい場合に使用します。指定した時
間が経過すると自動的にWAIT状態が解除されます。
例:Sleep task
Task A
優先度:高
(Priority = High)
実行状態
(RUN)
Task B
優先度:低
(Priority = Low)
例:Delay task
Task A
実行可能状態
(READY)
dly_tsk
slp_tsk
待ち状態
(WAIT)
実行状態
(RUN)
wup_tsk A
実行状態
(RUN)
実行可能状態
(READY)
(C) 2014 T-Engine Forum, All Rights Reserved.
実行状
態
(RUN)
待ち状
態
(WAIT
)
実行状
態
(RUN)
指定した時間が経過
Specified time has
past.
55
μITRON4.0仕様の機能(サービスコール)
▶
▶
▶
タスク管理機能
タスク付属同期機能
タスク例外処理機能
▶


▶ 同期・通信機能




▶



▶
▶
セマフォ
イベントフラグ
メールボックス
データキュー
拡張同期・通信機能
ミューテックス
メッセージバッファ
ランデブポート
メモリプール管理機能
割り込み管理機能
時間管理機能




▶
▶
▶
固定長メモリプール
可変長メモリプール
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
56
同期・通信機能
マルチタスク処理を行っていると、タスク間の情報交換や同期を取ることが必要になることがあります。これを実
現するのがタスク間通信・同期機能です。このために、セマフォ機能、メイルボックス機能、イベントフラグ機能など
を備えています。
ユーザはこの機能を使って、タスク間において、信号やデータの送受信、同期を取るといったことを簡単に実現し
ます。
▶
セマフォ(Semaphore)

▶
メールボックス(Mail Box)

▶
共有メモリ上に置かれたメッセージを受け渡しして、同期通信を
行うオブジェクト
イベントフラグ(Event Flag)

▶
利用可能な共有資源の数をカウンタで表し、共有資源の排他制御
を行うオブジェクト
イベントの有無をビット毎のフラグで表現することにより同期す
るオブジェクト
データキュー(Data queues)

1ワードのメッセージを受け渡しすることにより、同期と通信を行
うためのオブジェクト
(C) 2014 T-Engine Forum, All Rights Reserved.
57
排他制御とは
タスクA
タスクAが資源に対し
て”123456”と書こうとして
いる
タスクB
操作しようとしている資源
(I/Oポートや変数など)
タスクA
タスクAが資源に対し
て”123”と書いている途中
でタスクBに切替わると…
タスクB
操作しようとしている資源
(I/Oポートや変数など)
タスクA
タスクBが資源に対し
て”ABC”と書いてしまう場
合がある
タスクB
操作しようとしている資源
(I/Oポートや変数など)
結果として、資源には”123ABC”と書いてしまうことになり、意図した結果に
なりません。このような場合は排他制御が必要になります。
(C) 2014 T-Engine Forum, All Rights Reserved.
同期・通信機能(セマフォ)
腕木式信号機、この辺
だと新橋のSL広場で
見ることができます。
58
セマフォの語源は、その昔、線路の脇にあった腕木式信号機のことです。これは線路のポイントのところにあ
り、列車の入線を管理していました。つまり1番線しかホームのない駅があったとすると、資源は1つ、ここに列
車が入線していればセマフォのカウンタはデクリメントされ0となります。新規に到着した列車はカウンタ値が
0(つまり資源の数が0)なので、セマフォのところで待たされます。
そして、すでに入線している列車が発車したら、セマフォのカウントはインクリメントされて、セマフォのところ
で待っていた列車は1番線に入線できる、つまり資源を使うことができる、ということになります。こうして使える
資源カウントをすることがセマフォの基本的動作です。
(C) 2014 T-Engine Forum, All Rights Reserved.
59
同期・通信機能(セマフォ)
セマフォは、利用可能な共有資源の数をカウンタで表し、共有資源の
排他制御を行うオブジェクトです。
CRE_SEM()
セマフォ生成(静的API)
cre_sem()
セマフォ生成
acre_sem()
セマフォ生成(ID番号自動割付け)
del_sem()
セマフォ削除
sig_sem()/isig_sem()
セマフォ資源返却
wai_sem()/pol_sem()/twai_sem()
セマフォ資源獲得
(使い方)資源を利用する前に、利用する資源の数だけセマフォのカ
ウンタから獲得し、終わると返却します。カウンタが必要な数を持っ
てない場合、他タスクから返却されるのを待つことで、共有資源の排
他制御を実現します。
(C) 2014 T-Engine Forum, All Rights Reserved.
60
セマフォ(Semaphore)の実行例
Task A
優先度:高
(Priority = High)
Task B
優先度:低
(Priority = Low)
実行状態
(RUN)
実行可能状態
(READY)
wai_sem
(共有資源を要求)
待ち状態
(WAIT)
共有資源操作
実行状態
(RUN)
Task Aは共通資源を獲得で
きない
(Operating
shared resources)
sig_sem
(共有資源を解放)
共有資源操作
Semaphore S
(ex. S = 0)
実行状態
(RUN)
S = 01
実行可能状態
(READY)
(Operating
shared resources)
(C) 2014 T-Engine Forum, All Rights Reserved.
S=10
セマフォを使った排他制御のサンプル
#include "kernel.h"
#include "kernel_id.h"
/*************************************************************************/
/* ポートP0へアクセスするタスク1
*/
/*************************************************************************/
void task1(VP_INT exinf)
{
ER ercd;
char num;
while(1)
{
ercd = wai_sem(ID_SEM1); /* セマフォを獲得 */
/* ここに排他制御が必要な処理を記述します */
num = P0;
P0 = num + 1;
ercd = sig_sem(ID_SEM1); /* セマフォを返却 */
/* ここに記述される処理は排他制御されません */
ercd = dly_tsk(100);
}
}
/*************************************************************************/
/* ポートP0へアクセスするタスク2
*/
/*************************************************************************/
void task2(VP_INT exinf)
{
ER ercd;
while(1)
{
ercd = wai_sem(ID_SEM1); /* セマフォを獲得 */
/* ここに排他制御が必要な処理を記述します */
P0 = 0x00;
ercd = sig_sem(ID_SEM1); /* セマフォを返却 */
/* ここに記述される処理は排他制御されません */
ercd = dly_tsk(100);
}
(C) 2014 T-Engine Forum, All Rights Reserved.
}
61
同期・通信機能(メールボックス)
RAM
送信側
受信側
タスクA
メッセージA
タスクC
メッセージAを作成
snd_mbx
メッセージB
rcv_mbx
メッセージA
ポインタ
メッセージA
ポインタ
メールボックス
タスクB
ヘッダ
メッセージB
を作成
snd_mbx
62
メッセージキュー
メッセージA
ポインタ
メッセージB
ポインタ
受信データに
応じた処理
メッセージB
ポインタ
メッセージB
ポインタ
これは普段みなさんが使っている電子メールのメールボックスと同じ意味です。つまり、送信相手がタスクで、
メール内容(メッセージ)がメイルボックスに入って送信相手に送られる、と書けばわかりやすいと思います。
マイコンをご存知であれば、タスク間でやり取りするメッセージとはひょっとしてデータではないかな? と、気
付くと思いますが、半分は正解です。
メイルボックスには、実はデータでなく、そのデータが格納されているアドレスが入ります。
もう少し掘り下げますと、メールボックスを使うと、任意のサイズのメッセージをタスク間でやりとりすること
ができます。メールボックスはメッセージのポインタのみが受け渡されるため、メッセージサイズが大きくなっ
ても処理速度が低下しないという特長があります。
(C) 2014 T-Engine Forum, All Rights Reserved.
63
同期・通信機能(メールボックス)
メールボックスは、共有メモリ上に置かれたメッセージを受け渡
しして、同期通信を行うオブジェクト
CRE_MBX()
メールボックス生成(静的API)
cre_mbx()
メールボックス生成
acre_mbx()
メールボックス生成(ID番号自動割付け)
del_mbx()
メールボックス削除
snd_mbx()
メールボックスへ送信
rcv_mbx()/prcv_mbx()/trcv_mbx()
メールボックスから受信
(C) 2014 T-Engine Forum, All Rights Reserved.
64
補足:メールボックス(システムコール)
メッセージを送信するタスクはsnd_msgを発行して、特定のメールボックスにメッセージを送り
ます。この場合、メールボックスに送られるのはメッセージを格納したメモリ領域のアドレスだ
けで、メッセージそのものがコピーされて送信されるわけではありません。
一方、メッセージを受信するタスクはrcv_msgを発行して、指定したメールボックスからメッ
セージを受け取ります。すなわち、メールボックスからメッセージの格納アドレスを受け取り、
メッセージの内容を読み出します。
このように、メイルボックスでは実際に受け渡しする情報はアドレスだけのため、少ないオー
バーヘッドでメッセージの伝達を可能にしています。
メールボックスに送られてきたメッセージはメールボックス内でFIFO順の待ち行列につなが
れます。これをメッセージキューと呼びます。
タスクはメッセージの受信要求をした時に、メールボックスにメッセージがない場合は、それ
が到着するまで実行が中断されWAIT状態になり、到着待ちの待ち行列につながれます。こ
のメールボックスに対するタスクの待ち行列もFIFO順で処理されます。
メールボックスを使用したメッセージの交換は、タスクではなくメールボックスを指定して行
なわれるので、複数のタスク間でのメッセージの交換を容易に行うことができます。
また、メールボックスを使用することによって、相手のタスクを指定することなく、互いの同期
が達成できます。
(C) 2014 T-Engine Forum, All Rights Reserved.
65
メールボックス(Mailbox)の実行例
Task A
優先度:高
(Priority = High)
Task B
優先度:低
(Priority = Low)
実行状態
(RUN)
実行可能状態
(READY)
cre_mbx
rcv_mbx
最初は待つ
待ち状態(WAIT)
(for message)
実行状態
(RUN)
メッセージを受信
実行状態
(RUN)
snd_mbx
実行可能状態
(READY)
次に、メッセージを
送る
(C) 2014 T-Engine Forum, All Rights Reserved.
mailbox
mailboxキューには、
メッセージはない
メッセージがキューに
入れられる
メッセージをキューか
ら取り出す
メールボックスを使ったサンプルプログラム
66
#include "kernel.2h"
#include "kernel_id.h"
#include "sample_task.h"
/*************************************************************************/
/* メッセージ形式
*/
/*************************************************************************/
typedef struct
{
T_MSG header;
/* メッセージヘッダ領域 */
UB buf[20];
/* メッセージ本体 */
} USER_MSG;
/*************************************************************************/
/* メッセージを送信するタスク
*/
/*************************************************************************/
void task1(VP_INT exinf)
{
ER
ercd;
USER_MSG user_msg;
/* メッセージ実体 */
USER_MSG *pk_msg;
/* 受信メッセージ */
while(1)
{
/* user_msgに送信メッセージを作成 */
ercd = snd_mbx(ID_MBX2, (T_MSG *)&user_msg);
/* ID_MBX2へ送信 */
/* この間は、user_msgをアクセスしてはならない */
/* 送信側のメッセージ処理の完了を待つ */
ercd = rcv_mbx(ID_MBX1, (T_MSG **)&pk_msg);
/* ID_MBX1から受信 */
/* 本例では、受信するpk_msgは必ずuser_msgと同じになります */
}
}
/*************************************************************************/
/* メッセージを受信するタスク
*/
/*************************************************************************/
void task2(VP_INT exinf)
{
ER
ercd;
USER_MSG *pk_msg;
/* 受信メッセージ */
while(1)
{
ercd = rcv_mbx(ID_MBX2, (T_MSG **)&pk_msg);
/* ID_MBX2から受信 */
/* ここに、受信メッセージに応じた処理を記述します */
/* 返答メッセージを、受信したメッセージ領域に作成 */
ercd = snd_mbx(ID_MBX1, (T_MSG *)pk_msg);
/* ID_MBX1へ送信 */
}
}
(C) 2014 T-Engine Forum, All Rights Reserved.
同期・通信機能(イベントフラグ)
67
イベントフラグは、タスクからタスクへイベントの発生を知らせるために使用します。
例えば重役会議があったとします。4人揃ったら会議開始と主催者は考えています。つまり主催者は4ビット分のイベ
ントフラグが立てば会議を開始します。そして4人揃った、つまりフラグが4ビット立ったことを認識して、主催者は会議
を開始します。このとき、4人目の人が主催者に会議開始というシステムコールを発行すればいいような気もしますが、
4人目の人は会議室に到着した時点で自分が最後とは思っていないため、システムコールを発行することが出来ない
のです。これがイベントフラグの基本的な動作です。
このように、4人揃ったらという考え方でイベントフラグを待つことをAND(論理積)待ち(左図)、4人のうち1人(社長)だ
けくれば会議開始という待ち方をOR(論理和)待ち(右図)とします。
タスク1
wai_flg
フラグの イベントフラ
セット待ち グ
(C) 2014 T-Engine Forum, All Rights Reserved.
フラグの
セット
タスク2
set_flg
68
同期・通信機能(イベントフラグ)
イベントフラグは、イベントの有無をビット毎のフラグで表現す
ることにより同期するオブジェクト
CRE_FLG()
イベントフラグ生成(静的API)
cre_flg()
イベントフラグ生成
acre_flg()
イベントフラグ生成(ID番号自動割付け)
del_flg()
イベントフラグ削除
set_flg()/iset_flg()
イベントフラグセット
clr_flg()
イベントフラグクリア
wai_flg()/pol_flg()/twai_flg()
イベントフラグ待ち
(C) 2014 T-Engine Forum, All Rights Reserved.
69
イベントフラグ(Event Flag)の実行例
Task B
優先度:低
(Priority = Low)
Tasks A
優先度:高
(Priority = High)
実行可能状態(READY)
cre_flg
wai_flg
実行状態
(RUN)
待ち状態
(WAIT)
イベント
(Event)
実行可能状態
(READY)
実行状態(RUN)
イベントを処理する
Event Flag Fを作る
0
Event flagの状態が
0
1でない
Event flagの状態が
1になった
set_flg
実行状態
(RUN)
Event Flag F
実行可能状態
(READY)
(C) 2014 T-Engine Forum, All Rights Reserved.
Event flagによって
起動される
1
1
イベントフラグを使ったサンプルプログラム
#include "kernel.h"
#include "kernel_id.h"
void task1(VP_INT exinf)
{
ER ercd;
FLGPTN data;
/* 処理A */
ercd = wai_flg(ID_FLG1, (FLGPTN)1, TWF_ORW, &data);
/* 処理C */
}
void task2(VP_INT exinf)
{
ER ercd;
/* 処理B */
ercd = set_flg(ID_FLG1, (FLGPTN)1);
}
(C) 2014 T-Engine Forum, All Rights Reserved.
70
71
同期・通信機能(データキュー)
データキューは、1ワードのメッセージを受渡しすることにより、
同期と通信を行うためのオブジェクト
CRE_DTQ()
データキュー生成(静的API)
cre_dtq()
データキュー生成
acre_dtq()
データキュー生成(ID番号自動割付け)
del_dtq()
データキュー削除
snd_dtq()/psnd_dtq()/ipsnd_dtq()/tsnd_dtq()
データキューへの送信
fsnd_dtq()/ifsnd_dtq()
データキューへの強制送信
rcv_dtq()/prcv_dtq()/trcv_dtq()
データキューからの受信
(C) 2014 T-Engine Forum, All Rights Reserved.
72
データキュー(Dataqueues)の実行例
Task A
優先度:高
(Priority = High)
Task B
優先度:低
(Priority = Low)
実行状態
(RUN)
実行可能状態
(READY)
cre_dtq
rcv_dtq
最初は待つ
待ち状態(WAIT)
(for message)
実行状態
(RUN)
メッセージを受信
実行状態
(RUN)
snd_dtq
実行可能状態
(READY)
次に、メッセージを
送る
(C) 2014 T-Engine Forum, All Rights Reserved.
dataqueues
データキューには、
メッセージはない
メッセージがキューに
入れられる
メッセージをキューか
ら取り出す
73
μITRON4.0仕様の機能(サービスコール)
▶
▶
▶
▶
タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能




▶


▶
▶
セマフォ
イベントフラグ
メールボックス
データキュー




ミューテックス
メッセージバッファ
ランデブポート

▶
▶
▶
固定長メモリプール
可変長メモリプール
割り込み管理機能
時間管理機能

▶ 拡張同期・通信機能

メモリプール管理機能
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
74
拡張同期・通信機能
▶
▶
▶
ミューテックス(Mutex)

共有資源に関するタスク間の排他制御を実現

優先度逆転を防ぐために、優先度継承プロトコル、優先度上限プ
ロトコルをサポートしている。
メッセージバッファ(Message Buffer)

可変長のメッセージをコピーしてやりとりする同期通信オブジェ
クト

メッセージバッファの領域サイズを調整することで、同期メッ
セージ、非同期メッセージの両方を実現可能
ランデブポート(Rendezvous Port)

タスク間で同期通信を行うためのオブジェクト

ビットパターンによるランデブ条件によって、通常のクライアン
トサーバーモデルよりも柔軟な同期通信を実現できる。
(C) 2014 T-Engine Forum, All Rights Reserved.
75
拡張同期・通信機能(ミューテックス)
ミューテックスは、優先度逆転現象を防ぐための機構をサポート
した、排他制御を実現するためのオブジェクト。
優先度逆転を防ぐために、優先度継承プロトコル、優先度上限プ
ロトコルをサポートしています。
CRE_MTX()
ミューテックス生成(静的API)
cre_mtx()
ミューテックス生成
acre_mtx()
ミューテックス生成(ID番号自動割付け)
del_mtx()
ミューテックス削除
loc_mtx()/ploc_mtx()/tloc_mtx()
ミューテックスのロック
unl_mtx()
ミューテックスのロック解除
(C) 2014 T-Engine Forum, All Rights Reserved.
76
ミューテックス(Mutex)の実行例
Task A
優先度:高
(Priority = High)
Task B
優先度:低
(Priority = Low)
実行状態
(RUN)
実行可能状態
(READY)
loc_mtx
待ち状態
(WAIT)
TaskBがミューテックスをロック
(Operating
shared resources)
loc_mtx
共有資源操作
(Operating
shared resources)
ミューテックスはロック
されていない
実行状態
(RUN)
共有資源操作
待ち状態
(WAIT)
Mutex
TaskBはミューテックスのロックを
解除
unl_mtx
TaskAがミューテックスをロック
実行状態
(RUN)
実行可能状態
(READY)
(C) 2014 T-Engine Forum, All Rights Reserved.
77
拡張同期・通信機能(メッセージバッファ)
可変長のメッセージをコピーしてやりとりする同期通信オブジェクト
CRE_MBF()
メッセージバッファ生成(静的API)
cre_mbf()
メッセージバッファ生成
acre_mbf()
メッセージバッファ生成(ID番号自動割付け)
del_mbf()
メッセージバッファ削除
snd_mbf()/psnd_mbf()/tsnd_mbf()
メッセージバッファへの送信
rcv_mbf()/prcv_mbf()/trcv_mbf()
メッセージバッファからの受信
(C) 2014 T-Engine Forum, All Rights Reserved.
78
メッセージバッファ(Message Buffer)の実行例
Task A
優先度:高
(Priority = High)
Task B
優先度:低
(Priority = Low)
実行状態
(RUN)
実行可能状態
(READY)
cre_mbf
rcv_mbf
最初は待つ
待ち状態(WAIT)
(for message)
実行状態
(RUN)
メッセージを受信
実行状態
(RUN)
snd_mbf
実行可能状態
(READY)
次に、メッセージを
送る
(C) 2014 T-Engine Forum, All Rights Reserved.
Message buffer
メッセージバッファには、
メッセージはない
メッセージがバッファに
入れられる
メッセージをバッファから
取り出す
79
拡張同期・通信機能(ランデブ)
タスク間で同期通信を行うためのオブジェクト。ランデブポートと呼ばれる
窓口を介して、呼び出しタスクと受付タスクが待ち合わせを行い、待ち合わ
せ(ランデブ)が成立するとお互いのメッセージを交換する。
CRE_POR()
ランデブポート生成(静的API)
cre_por()
ランデブポート生成
acre_por()
ランデブポート生成(ID番号自動割付け)
del_por()
ランデブポート削除
cal_por()/tcal_por()
ランデブの呼び出し
acp_por()/pacp_por()/tacp_por()
ランデブの受け付け
fwd_por()
ランデブの回送
rpl_rdv()
ランデブの終了
(C) 2014 T-Engine Forum, All Rights Reserved.
80
ランデブ(Rendezvous)の実行例
Task A
優先度:高
(Priority = High)
Task B
優先度:低
(Priority = Low)
実行状態
(RUN)
Rendezvous
実行可能状態
(READY)
cre_por
ランデブポートには、
メッセージはない
呼び出しメッセージが
キューに入れられる
cal_por
待ち状態(WAIT)
(for message)
呼び出しメッセージ
を送る
acp_por
実行状態
(RUN)
応答メッセージをランデブ
番号に送る
rpl_rdv
応答メッセージを受信
実行状態
(RUN)
ランデブ
番号
実行可能状態
(READY)
(C) 2014 T-Engine Forum, All Rights Reserved.
ランデブ
番号
呼び出しメッセージが受
け付け側バッファにコ
ピーされると同時に、成
立したランデブ番号が渡
される
応答メッセージをバッファ
にコピーする
81
μITRON4.0仕様の機能(サービスコール)
▶
▶
▶
▶
タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能




▶
セマフォ
イベントフラグ
メールボックス
データキュー
▶ メモリプール管理機能


▶
▶



ミューテックス
メッセージバッファ
ランデブポート
割り込み管理機能
時間管理機能



拡張同期・通信機能

▶
▶
▶
固定長メモリプール
可変長メモリプール
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
82
メモリプール管理機能(固定長)
固定長メモリプールは、固定サイズのメモリブロックを動的に管理する
機能です。
cre_mpf()
固定長メモリプール生成
del_mpf()
固定長メモリプール削除
get_mpf()
固定長メモリブロック獲得
pget_mpf()
固定長メモリブロック獲得(ポーリングあり)
tget_mpf()
固定長メモリブロック獲得(タイムアウトあり)
rel_mpf()
固定長メモリブロック返却
ref_mpf()
固定長メモリプール状態参照
(C) 2014 T-Engine Forum, All Rights Reserved.
83
固定長メモリプール機能の動作
uITRON
固定長メモリプール
①
メモリ
返却
ID=1
①
③
②
④
③
メモリ
取得
④
②
メモリ
取得
メモリ
返却
取得時のメモリブロックサイズが固定サイズ
可変長メモリプールよりは柔軟性に欠けますが、
分断の心配はなく、かつ高速です。
(C) 2014 T-Engine Forum, All Rights Reserved.
84
メモリプール管理機能(可変長)
可変長メモリプールは、任意サイズのメモリブロックを動的に管理する
機能です。
cre_mpl()
可変長メモリプール生成
del_mpl()
可変長メモリプール削除
get_mpl()
可変長メモリブロック獲得
pget_mpl()
可変長メモリブロック獲得(ポーリングあり)
tget_mpl()
可変長メモリブロック獲得(タイムアウトあり)
rel_mpl()
可変長メモリブロック返却
ref_mpl()
可変長メモリプール状態参照
(C) 2014 T-Engine Forum, All Rights Reserved.
85
可変長メモリプール機能の動作
uITRON
メモリ
返却
①
可変長メモリプール
ID=1
①
③
メモリ
取得
③
②
メモリ
返却
④
メモリ
取得
④
②
取得時のメモリブロックサイズが任意サイズ
手軽ですが、獲得・解放を繰り返すうちにプール内部が分断され、
大きなサイズが獲得できなくなる可能性があります。
(T-Kernelは、分断されたメモリ領域を統合する機能までは持っていませ
ん)。
(C) 2014 T-Engine Forum, All Rights Reserved.
86
μITRON4.0仕様の機能(サービスコール)
▶
▶
▶
▶
タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能




▶
セマフォ
イベントフラグ
メールボックス
データキュー
▶




ミューテックス
メッセージバッファ
ランデブポート
固定長メモリプール
可変長メモリプール
▶ 割り込み管理機能
▶
時間管理機能



拡張同期・通信機能

メモリプール管理機能

▶
▶
▶
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
87
割込み管理機能
外部割込みによって起動される割込みハンドらおよび割込みサービス
ルーチンを管理するための機能です。
def_inh()
割込みハンドラ定義
cre_isr()
割込みサービスルーチンの生成
del_isr()
割込みサービスルーチンの削除
ref_isr()
割込みサービスルーチンの状態参照
dis_int()
割込みの禁止
ena_int()
割込みの許可
chg_ixx()
割込みマスクの変更
get_ixx()
割込みマスクの参照
リアルタイム処理では、割り込みに対する応答速度が重要です。割り込みは緊急度が高いため、通常RTOSは
タスク実行を取りやめて、割り込みハンドラを起動します。これを管理するのが割り込み管理機能です。
この機能によって、割り込みハンドラを登録し、割り込みハンドラからタスクを制御することで、外部イベント要求
に対し、素早いリアルタイム性を提供できます。
(C) 2014 T-Engine Forum, All Rights Reserved.
88
割込み処理動作(例)
割込み発生
Task A
タスク切り替えが無い場
合には割込み発生元に
戻ります。
①
Task B
割込み
ハンドラ
T-Kernel
tk_ret_int ()
割込み処理
④
④
②
③
タスクスケジューリング
スケジューリング
(C) 2014 T-Engine Forum, All Rights Reserved.
89
割込み管理機能(注意点)
項目
タスク
割込みハンドラ
実行管理
OSにより5つの状態で管理さ
OSは実行管理を行いません。
れます。
(READY、WAIT等)
実行スケジュー
READY状態のタスクの中で
OSでは管理されず外部割込み処
ル
最高の優先度を持つタスクが実
理で直接起動されます。
行されます。
実行の切替え
システムコール
優先度の高いタスクの実行要
1・タスクにより処理は中断さ
求、実行タスクの状態変化によ
れません。
り、タスク実行が切り替えられ
2・割込みハンドラ同士では割込
ます。
みレベルの高い方を優先します。
割込みハンドラ専用システムコ
制限があります。
ール以外の全システムコールが
使用可能です。
割込みハンドラを作成する場合には、次の2点について注意する必要があります。
・処理時間は極力短くする。
割込みハンドラ実行中は、タスクは動作できません。ハンドラでの割込み処理は必要最低限にしてください。
・使用できるシステムコールには制限があります。
(C) 2014 T-Engine Forum, All Rights Reserved.
90
μITRON4.0仕様の機能(サービスコール)
▶
▶
▶
▶
タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能




▶
セマフォ
イベントフラグ
メールボックス
データキュー
▶


▶


ミューテックス
メッセージバッファ
ランデブポート
固定長メモリプール
可変長メモリプール
割り込み管理機能
▶ 時間管理機能



拡張同期・通信機能

メモリプール管理機能

▶
▶
▶
システム時刻管理
周期ハンドラ
アラームハンドラ
オーバランハンドラ
システム状態管理機能
サービスコール管理機能
システム構成管理機能
(C) 2014 T-Engine Forum, All Rights Reserved.
91
時間管理機能
時間管理機能は、時間に依存した処理を行う機能です。μITRON仕様では、周期ハンドラ/アラームハンドラの2
つのタイムイベントハンドラがあります。
タイムイベントハンドラはタスクとしてではなく、タスク独立部として実行されます。つまり、ハードウェアタイマから
のタイマ割り込み処理の延長として、周期起動ハンドラが呼び出されます。これにより、タイマハンドラの起動時間
がより正確になり、処理のオーバヘッドを減少させることが出来ます。
システム時刻管理

システム時刻を操作するための機能。システム時刻を設定/参照する機能、
タイムティックを供給してシステム時刻を更新する機能が含まれます。
周期ハンドラ

一定周期で起動されるタイムイベントハンドラ。周期ハンドラ機能には、
周期ハンドラを生成/削除する機能、周期起動ハンドラの動作を開始/停止
する機能、周期起動ハンドラの状態を参照する機能が含まれます。
アラームハンドラ

指定した時刻に起動されるタイムイベントハンドラ。アラームハンドラ
機能には、アラームハンドラを生成/削除する機能、アラームハンドラ動
作を開始/停止する機能、アラームハンドラの状態を参照する機能が含ま
れます。
(C) 2014 T-Engine Forum, All Rights Reserved.
92
時間管理機能(システム時刻管理)
システム時刻を操作する機能
set_tim()
システム時間設定
get_tim()
システム時間参照
isig_tim()
タイムティックの供給
(C) 2014 T-Engine Forum, All Rights Reserved.
93
時間管理機能(周期ハンドラ)
周期ハンドラは、一定周期で起動されるタイムイベントハンドラ。非タス
クコンテキストで動作します。
cre_cyc()
周期ハンドラの生成
del_cyc()
周期ハンドラの削除
sta_cyc()
周期ハンドラの動作開始
stp_cyc()
周期ハンドラの動作停止
ref_Cyc()
周期ハンドラの状態参照
!周期ハンドラは、非タスクコンテキスト(タスク独立部)で動作します。
(C) 2014 T-Engine Forum, All Rights Reserved.
94
周期起動ハンドラ(Cyclic Handler)の実行例
Task A
Cyclic Handler
実行状態(RUN)
cre_cyc
sta_cyc
タイマー開始
指定時刻
Cyclic handler
実行状態(RUN)
指定時刻
Cyclic handler
実行状態(RUN)
stp_cyc
タイマー停止
cre_cyc():
周期ハンドラの生成
sta_cyc():
周期ハンドラの動作開始
stp_cyc():
周期ハンドラの動作停止
(C) 2014 T-Engine Forum, All Rights Reserved.
95
時間管理機能(アラームハンドラ)
アラームハンドラは、指定した時間に起動されるタイムイベントハンドラ
cre_alm()
アラームハンドラの生成
del_alm()
アラームハンドラの削除
sta_alm()
アラームハンドラの起動
stp_alm()
アラームハンドラの動作停止
ref_aim()
アラームハンドラの状態参照
!アラームハンドラは、非タスクコンテキスト(タスク独立部)で動作しま
す。
(C) 2014 T-Engine Forum, All Rights Reserved.
96
アラームハンドラ(Alarm Handler)の実現例
Task A
Alarm Handler
cre_alm
sta_alm
タイマー開始
指定時刻
Alarm Handler
del_alm
(C) 2014 T-Engine Forum, All Rights Reserved.
97
1 組込みシステムとマルチタスク・リアルタイム処理
2 トロンと組込みシステム
3 μITRON入門
4 μITRON開発手順
5 μITRONプログラミング
6 参考資料・付録など
(C) 2014 T-Engine Forum, All Rights Reserved.
98
コンフィギュレーション
▶
▶
RTOSの動作環境をコンフィグレーションファイルに記述
静的APIによってオブジェクトを生成
 ID番号の指定
 最大オブジェクト数の指定など
▶
▶
割込みハンドラを指定
コンフィギュレータを使用してヘッダファイルとカーネル情報ファイルの
出力
•コンフィギュレーション方法はOSによって方法などが異なる場合があります
•詳しくは各OSベンダの資料をご覧ください
(C) 2014 T-Engine Forum, All Rights Reserved.
99
コンフィギュレーションファイルの例
/***********************************************/
/* Sample configuration file for uITRON 4.0
*/
/***********************************************/
INCLUDE("demo.h");
#define STACK_SIZE 2048
CRE_TSK(TASK1, {TA_HLNG|TA_ACT, TASK1, task1, 15, STACK_SIZE, NULL});
CRE_TSK(TASK2, {TA_HLNG|TA_ACT, TASK2, task2, 15, STACK_SIZE, NULL});
CRE_FLG(ID_FLG1, {TA_TFIFO|TA_CLR|TA_WMUL, 0});
CRE_SEM(SEM1, {TA_TFIFO, 0, 10});
CRE_DTQ(DTQ1, {TA_TPRI, 10, NULL});
CRE_CYC(ID_CYC1, {TA_HLNG|TA_STA, ID_CYC1, cyc_func, 4000, 2000});
(C) 2014 T-Engine Forum, All Rights Reserved.
100
コンフィギュレーションファイルの例(GUI)
(C) 2014 T-Engine Forum, All Rights Reserved.
101
コンフィギュレーションの流れ
システムコンフィギュ
レーションファイル
C言語プリプロセッサ
system.cfg
ソフトウェア部品
www_cfg.c
構成・初期化ファイル
ソフトウェア部品のコン
フィギュレータ
ID自動割付け結果
www_id.h
ヘッダファイル
カーネル
kernel_cfg.c
構成・初期化ファイル
カーネルのコンフィギュ
レータ
ID自動割付け結果
ヘッダファイル
(C) 2014 T-Engine Forum, All Rights Reserved.
kernel_id.h
開発環境の例
ライブラリ
102
c/c++ソース RTOSソース
評価
コンパイラ/
アセンブラ/リンカ
シミュレータ
モニタデバッガ
USB/RS232C
エミュレータデバッガ
ICE
ロードモジュール
ターゲット
ボード
フォーマット
変換
ROMデータ
量産
(C) 2014 T-Engine Forum, All Rights Reserved.
103
1 組込みシステムとマルチタスク・リアルタイム処理
2 トロンと組込みシステム
3 μITRON入門
4 μITRON開発手順
5 μITRONプログラミング
6 参考資料・付録など
(C) 2014 T-Engine Forum, All Rights Reserved.
104
一般的なC言語プログラミングと違う点(1)
▶
μITRONでは、タスクはmain()から起動するとは限らない
 最初に動作させるタスクは設定されているタスクの情
報に基づいて決まる
 最初に動作させるタスクからユーザのプログラムが始
まるという規則になっている
▶
イベントが発生しないと、タスクは切替らない
 割込みやサービスコールの呼出し等のイベントが発生
し、動作中のタスクが待ち状態に入った時に、他のタス
クに切替る
(C) 2014 T-Engine Forum, All Rights Reserved.
105
一般的なC言語プログラミングと違う点(2)
▶
イベントが発生し、タスクが切り替え可能状態であれば、優先度が高
いタスクに切替る(プリエンプション)
 プリエンプション動作により、高い優先度のタスクが動
作するので、高速な応答を行う必要があるタスクには、
高い優先度を設定できる
 意識的に切り替え(ディスパッチ)を禁止することも可能
▶
リアルタイム性の確保はアプリケーションの作り方も重要
(C) 2014 T-Engine Forum, All Rights Reserved.
106
イベントドリブン型プログラミング
▶
リアルタイムOSでは、何か要求(イベント)がきたら動作する、というイ
ベントドリブン型プログラミングが基本
 受動型プログラムとも呼ばれる
 発生したイベントに対する高速応答が可能
▶
自ら動作を行う、能動的なプログラミングも可能
 すべて能動的な動作では、リアルタイム性を確保する
のは難しい場合が多い
▶
どのような形式にするかはアプリケーションによる
(C) 2014 T-Engine Forum, All Rights Reserved.
アプリケーション・プログラム開発の流れ(参考)
107
アプリケーションプログラムの開発手順は大別して次の7段階で構成されます。
(1)処理をタスク/ハンドラに分割
(2)各タスクの優先度を決定
(3)各タスクで使用するシステムコールを選択
(4)アプリケーションプログラムの記述
(5)コンフィグレーション
(6)リロケータブルオブジェクトファイルの作成
(7)RTOSライブラリとアプリケーションとのリンク
以上により作成した実行オブジェトファイルをデバッグすることにより、アプリケーションプログラムの動作検証を行
います。
上記の各開発手順における概要の説明を以下に示します。
(1) 処理をタスク及びハンドラに分割
開発する製品の仕様に基づいて、プロセッサで実行したい処理をタスク/ハンドラに分割します。状況変化をとらえ
て動作する処理を「ハンドラ」とし、主な処理を「タスク」とします。「タスク」と「ハンドラ」の2種類の要素を組み合わせ
て設計します。
タスク/ハンドラ分割における設計が、リアルタイム処理性能を大きく左右します。
タスク分割を決定する際には、下記の項目を考慮してください。
(1)順次処理は同一タスク、並行処理は別タスクとする
(2)機能的な関連性が深い処理をグルーピングしてタスクとする
(3)適度な大きさおよび適度な数の処理に分割してタスクとする
(4)複数のタスク間にまたがるデータはできるだけ少なくする
※タスク分割についての一例を参考までに付録に紹介してあります。
(C) 2014 T-Engine Forum, All Rights Reserved.
108
(2) 各タスクの優先度を決定
(1)で決定したタスクにおける処理の内容を比較して、各タスクの優先度を決定します。他のタスクに実行権を奪わ
れたくないタスクは、優先度を高くする必要があります。
(3) 各タスクで使用するシステムコールを選択
各タスク間の同期、通信を考慮して、各タスクの処理において使用するシステムコールを決定します。
(4) アプリケーションプログラムの記述
サービスコールを使って、アプリケーションプログラム(1で決定したハンドラとタスク)を記述します。通常、C言語を
使用して、アプリケーションプログラムを記述します。
(5) コンフィグレーション
設計、記述したタスクに合わせて、RTOSを使用するためのコンフィグレーションを行い、システム環境定義ファイル
を作成します。
コンフィグレーションの手段として、GUIコンフィグレーションツールを使うと便利です(OSベンダ提供)。GUIより入力さ
れたコンフィグレーション情報から、システム環境定義ファイルを自動生成します。
(6) リロケータブルオブジェクトファイルの作成
(4)で作成したアプリケーションプログラムと、(5)で作成したシステム環境定義ファイルをコンパイル/アセンブルして、
リロケータブルオブジェクトファイルを作成します。アプリケーションプログラムファイル一つに対して、一つのリロケー
タブルオブジェクトファイルが作成されます。システム環境定義ファイルも一つのリロケータブルオブジェクトファイル
として作成されます。
(7) RTOSのライブラリとアプリケーションのリンク
リンケージエディタを使用して、RTOSのライブラリと、(6)で作成したリロケータブルオブジェクトファイルをリンクして、
一つの実行オブジェクトファイルに変換します。
(C) 2014 T-Engine Forum, All Rights Reserved.
109
1 組込みシステムとマルチタスク・リアルタイム処理
2 トロンと組込みシステム
3 μITRON入門
4 μITRON開発手順
5 μITRONプログラミング
6 参考資料・付録など
(C) 2014 T-Engine Forum, All Rights Reserved.
110
おまけ(デッドロック)
マルチタスク処理で注意する必要があるのは、デッドロックやプライオリティ・インバージョン(同一優先順位のスケジューリング)です。
デッドロックは複雑な排他制御(組込みシステム上のあるハードウェア資源を、複数のタスクで共有する必要がある場合に使用)を
行おうとする場合に発生します。代表的な例は「5人の哲学者」です。デッドロックを回避するには別のタスクのことも意識してプログラ
ミングしなければならないことを示しています。
5人の哲学者は、それぞれスパゲッティ が入った皿があるテーブルの回りに座ります。それぞれの皿の間に1本ずつ、合計5本の
フォークがあります。
不特定の時刻に各哲学者はスパゲッティを食べようとします。食べるためには、まず自分の皿の横にある2本のフォークを取らなけ
ればなりません。フォークが取れるとスパゲッティを食べることかできます。一定時間後に食べ終わると、2本のフォークをテーブルに
戻します。
哲学者をタスク、フォークを資源と考えます。問題はフォークが使えない結果と
して餓死してしまう哲学者がでないようにタスクを設計することです。
設計上、気をつけなければならないことが二つあります。
・まず、デッドロック状態を回避することです。この問題でのデッドロック状態とは、
個々の哲学者がフォークを1本ずつ持ち、もう1本のフォークが開放されるのを永遠
に待つことです。
・もう一つ気をつけなければならないのは2人以上の哲学者が、残りの哲学者の
フォーク獲得を永遠に妨げるように共謀することがあってはならないということです。
http://creativecommons.org/licenses/by-sa/3.0/deed.ja
Illustrated by Benjamin D. Esham.
from http://en.wikipedia.org/wiki/File:Dining_philosophers.png
(C) 2014 T-Engine Forum, All Rights Reserved.
111
おまけ(デッドロック)
タスク1
タスク2
セマフォ1を獲得
セマフォ2を獲得
セマフォ2を獲得しようとしたがすで
にタスク2が獲得してるために待ち
状態へ移行
セマフォ1を獲得しようとしたがすで
にタスク1が獲得してるために待ち
状態へ移行
task1とtask2は待ち状態の
まま、動作できない!
(C) 2014 T-Engine Forum, All Rights Reserved.
実際のプログラムでは複数の排他制御対
象を同時に操作する場合もありますが、セ
マフォなどを複数使用して排他制御を行う
場合、タイミングなどによってはデッドロック
という現象を引き起こす場合がありますので、
注意が必要です。デッドロックとは、すべて
のタスクが自分以外のいずれかのタスクが
何かをやってくれることを待っている状態で
あり、正常な動作を行うことができなくなりま
す。
デッドロックを回避するためには、獲得し
たカーネルオブジェクトとは逆の順序で開
放するというルールを守ることが重要です。
実際の開発では、設計段階ではデッドロッ
クが発生しないように考慮する必要がありま
すが、デバック作業などで処理を追加した
時に、デッドロックが発生してしまう場合も多
くあります。タスク数が増え、同期関係が複
雑化してくると発生しやすくなりますので、
注意が必要です。
112
おまけ(タスク分割)
リアルタイム・システムを構築する際、タスク分割が必要です。ここではその一例と
注意すべき点を記載します。
▶
▶
▶
留守番電話機のキー入力処理にて
キーマトリクス走査処理(10ms毎)
短縮メモリへ格納処理(30ms)
キー
キーマトリク
ス走査処理
(10ms毎)
入力値
短縮メモ
リへの格
納処理
キー有効性
判定処理
キーデータ
デコード処理
短縮メモリの
クリア処理
(C) 2014 T-Engine Forum, All Rights Reserved.
短縮メモリ
113
おまけ(タスク分割)
▶
▶
キー関連処理(順次処理)をグルーピングし、1つの(キー入力)タ
スクとした。
その結果、キーマトリクス走査ができなくなるというトラブルが発
生した。
キー
キー入力タスク
キーマトリク
ス走査処理
(10ms毎)
入力値
キー有効性
判定処理
キーデータ
デコード処理
(C) 2014 T-Engine Forum, All Rights Reserved.
短縮メモ
リへの格
納処理
短縮メモリの
クリア処理
短縮メモリ
114
おまけ(タスク分割)
▶
▶
問題点は・・・キーマトリクス走査は10ms毎に行う必要があるが、
短縮メモリへの格納に30ms掛かるため、この間、キーマトリクス
走査ができなくなってしまった。
改善のポイントは・・・順次処理とはいえ、処理時間の異なる処理
は別タスクにする。
(C) 2014 T-Engine Forum, All Rights Reserved.
115
おまけ(タスク分割)
▶
キーマトリクス走査処理とデコード処理で1つ、キー有効性判定
処理と短縮メモリ関連処理で1つ、それぞれタスク分割した。
キー入力タスク
キー
キーマトリク
ス走査処理
(10ms毎)
入力値
モード移行タスク
キー有効性
判定処理
キーデータ
デコード処理
(C) 2014 T-Engine Forum, All Rights Reserved.
短縮メモ
リへの格
納処理
短縮メモリの
クリア処理
短縮メモリ
116
おまけ(タスク分割)
▶
▶
▶
異なる時間(タイミング)で行われる処理は別タスクにし、リアルタ
イム性が損なわれないよう設計する必要がある。
順次処理をグルーピングすると、またがるデータを少なくできるな
どのメリットがある。
しかし、実は並行処理が潜んでいることは良くあり、注意深くタス
ク分割する必要がある。
なお、一つのシステムでどのくらいのタスク数になるのか、これも一概には言えませ
ん。あるRTOSは32767個のタスク登録が可能ですが、そこまでタスクを増やすと管理
が大変です。ということで、結局、どのような規模のシステムでも、大体30~50個ぐら
いのタスク数に落ち着くようです。
(C) 2014 T-Engine Forum, All Rights Reserved.
117
参考:各仕様の比較
▶
▶
本資料は、μITRON3.0/μITRON4.0/T-Kernelの各仕様の
うち、代表的な機能とAPIの違いについて比較したものです
各機能の分類等については、μITRON4.0仕様に基づいて
ます
出典元
文書名:『μITRON仕様とT-Kernel仕様の違いについて』 第一版
著者名:エルミック・ウェスコム株式会社
(C) 2014 T-Engine Forum, All Rights Reserved.
118
用語
μITRON3.0仕様
μITRON4.0仕様
T-Kernel
仕様の準拠レベル
レベルR(Required)
レベルS(Standerd)
レベルE(Extended)
仕様の準拠レベル
自動車制御用プロファイル
スタンダードプロファイル
システムコール
サービスコール
システムコール
「タスク」を「タスク部」
タスクのコンテキストをタスクコン
テキスト、それ以外を非タスクコン
テキスト
「タスク」を「タスク部」
「過渡的な状態」、「タスク独立
部」、「準タスク部」を合わせて
「非タスク部」
仕様上は過渡的な状態という用語は
用いていない
準タスク部の概念は定義していない
「過渡的な状態」、「タスク独立
部」、「準タスク部」を合わせて
「非タスク部」
システムクロック
システム時刻
システム時刻
周期起動ハンドラ
周期ハンドラ
周期ハンドラ
周期起動ハンドラ/アラームハンドラ
を総称して、タイマハンドラと呼ぶ
周期起ハンドラ/アラームハンドラ/
オーバーランハンドラを総称して、
タイムイベントハンドラと呼ぶ
周期起動ハンドラ/アラームハンドラ
を総称して、タイムイベントハンド
ラと呼ぶ
メイルボックス
メールボックス
メールボックス
(C) 2014 T-Engine Forum, All Rights Reserved.
119
仕様
μITRON3.0仕様
μITRON4.0仕様
T-Kernel
オブジェクトの生成はシステムコールで
要求
オブジェクトの生成は静的APIで記述す
る(スタンダードプロファイル)
サービスコールで生成することも可能
オブジェクトの生成はシステムコールで
要求
静的APIの規定
コンフィギュレータに関する規定
オブジェクトのID番号は利用者が指定
する
オブジェクトのID番号はコンフィギュ
レータによる自動割付、もしくはサー
ビスコールにより利用者が指定するか
自動割付
オブジェクトのID番号は自動割付
カーネルが管理するオブジェクトには拡
張情報を設定する
拡張情報を設定するのは、タスク/周期
ハンドラ/アラームハンドラのみ
カーネルが管理するオブジェクトには拡
張情報を設定する
(C) 2014 T-Engine Forum, All Rights Reserved.
120
タスク管理機能
μITRON3.0仕様
μITRON4.0仕様
T-Kernel
C言語記述形式
C言語記述形式
C言語記述形式
void task(INT stacd)
{
;
}
void task(VP_INT exinf)
{
;
}
void task(INT stacd, VP exinf)
{
;
}
exinf:
sta_tskで起動した場合stacd
act_tskで起動した場合exinf
タスクの起動方法
システムコールsta_tsk
タスクの起動方法
タスク生成時の属性で起動指定
サービスコールact_tsk/sta_tsk
タスクの起動方法
システムコールsta_tsk
タスクのメインルーチンからリター
ンした場合は、動作は保障されない
タスクのメインルーチンからリター
ンした場合は、サービスコール
ext_tskを呼び出した場合と同じ振る
舞いをする
関数からの単純なリターン(return)で
タスクを終了することはできない(し
てはいけない)
ラウンドロビンスケジューリングを
サポート
(C) 2014 T-Engine Forum, All Rights Reserved.
121
タスク管理機能(API)
μITRON3.0
機能
タスクの生成
cre_tsk
タスクの生成(ID番号自動割付)
タスクの削除
del_tsk
μITRON4.0
T-Kernel
cre_tsk
acre_tsk
tk_cre_tsk
del_tsk
tk_del_tsk
タスクの起動
act_tsk
タスク起動要求のキャンセル
can_act
タスクの起動(起動コード指定)
sta_tsk
sta_tsk
tk_sta_tsk
自タスクの終了
ext_tsk
ext_tsk
tk_ext_tsk
タスクの強制終了
ter_tsk
ter_tsk
tk_ter_tsk
タスク優先度の変更
chg_pri
chg_pri
tk_chg_pri
タスクスライスタイム変更
tk_chg_slt
タスク優先度の参照
タスクの状態参照
タスクの状態参照(簡易版)
get_pri
ref_tsk
ref_tsk
ref_tst
(C) 2014 T-Engine Forum, All Rights Reserved.
tk_ref_tsk
122
タスク付属同期機能
μITRON3.0仕様
μITRON4.0仕様
T-Kernel
自タスクに対し起床要求はできない
自タスクに対し起床要求ができる
自タスクに対し起床要求はできない
自タスクを強制待ちにできない
自タスクを強制待ちにできる
自タスクを強制待ちにできない
自タスクを起床待ちにする要求は永
久待ち、タイムアウトありの別々の
システムコールがある
自タスクを起床待ちにする要求は永
久待ち、タイムアウトありの別々の
サービスコールがある
自タスクを起床待ちにするシステム
コールは一つで、永久待ちまたはタ
イムアウトの指定を行う
待ち状態の許可/禁止を行う機能があ
る
(C) 2014 T-Engine Forum, All Rights Reserved.
123
タスク付属同期機能(API)
μITRON3.0
機能
μITRON4.0
T-Kernel
起床待ち
slp_tsk
slp_tsk
tk_slp_tsk
(tmout=-1)
起床待ち(タイムアウトあり)
tslp_tsk
tslp_tsk
tk_slp_tsk
(tmout)
タスクの起床
wup_tsk
wup_tsk
tk_wup_tsk
タスク起床要求のキャンセル
can_wup
can_wup
tk_can_wup
強制待ち状態への移行
sus_tsk
sus_tsk
tk_sus_tsk
強制待ち状態からの再開
rsm_tsk
rsm_tsk
tk_rsm_tsk
強制待ち状態からの再開
frsm_tsk
frsm_tsk
tk_frsm_tsk
自タスクの遅延
dly_tsk
dly_tsk
tk_dly_tsk
タスクイベントの送信
tk_sig_tev
タスクイベント待ち
tk_wai_tev
タスク待ち状態の禁止
tk_dis_wai
タスク待ち状態の解除
tk_ena_wai
(C) 2014 T-Engine Forum, All Rights Reserved.
124
同期・通信機能
μITRON3.0仕様
セマフォの獲得/返却の資源数は1
μITRON4.0仕様
T-Kernel
セマフォの獲得/返却の資源数は1
セマフォの獲得/返却の資源数は要求
時に指定
スタンダードプロファイルでは、セ
マフォの最大資源数として65535以上
の値が指定できなければならない
セマフォの最大値として少なくとも
65535が指定できなければならない
セマフォの獲得待ちにする要求は永
久待ち、タイムアウトありの別々の
システムコールがある
セマフォの獲得待ちにする要求は永
久待ち、タイムアウトありの別々の
システムコールがある
セマフォの獲得待ちにするシステム
コールは一つで、永久待ちまたはタ
イムアウトの指定を行う
イベントフラグ待ち時のクリア指定
は待ち要求時に指定
イベントフラグ待ち時のクリア指定
はイベントフラグの属性で指定
イベントフラグ待ち時のクリア指定
は待ち要求時に指定
イベントフラグ待ち解除時のクリア
は全ビット0
イベントフラグ待ち解除時のクリア
は全ビット0
イベントフラグ待ち解除時のクリア
は全ビット0か待ち条件クリアかを要
求時に指定
スタンダードプロファイルではデー
タキューをサポートすることを規定
メイルボックスのメッセージ管理が
リングバッファ形式かリンク形式か
は実装依存
メールボックスのメッセージ管理は
リンク形式
(C) 2014 T-Engine Forum, All Rights Reserved.
メールボックスのメッセージ管理は
リンク形式
125
同期・通信機能(API)
セマフォ
μITRON3.0
機能
セマフォの生成
cre_sem
セマフォの生成(ID番号自動割付)
μITRON4.0
T-Kernel
cre_sem
acre_sem
tk_cre_sem
セマフォの削除
del_sem
del_sem
tk_del_sem
セマフォ資源の返却
sig_sem
sig_sem
tk_sig_sem
セマフォ資源の獲得
wai_sem
wai_sem
tk_wai_sem
(tmout=-1)
セマフォ資源の獲得(ポーリング)
preq_sem
pol_sem
tk_wai_sem
(tmout=0)
セマフォ資源の獲得(タイムアウトあり)
twai_sem
twai_sem
tk_wai_sem
(tmout)
セマフォの状態参照
ref_sem
ref_sem
tk_ref_sem
(C) 2014 T-Engine Forum, All Rights Reserved.
126
同期・通信機能(API)
イベントフラグ
μITRON3.0
機能
イベントフラグの生成
cre_flg
イベントフラグの生成(ID番号自動割付)
μITRON4.0
T-Kernel
cre_flg
acre_flg
tk_cre_flg
イベントフラグの削除
del_flg
del_flg
tk_del_flg
イベントフラグのセット
set_flg
set_flg
tk_set_flg
イベントフラグのクリア
clr_flg
clr_flg
tk_clr_flg
イベントフラグ待ち
wai_flg
wai_flg
tk_wai_flg
(tmout=-1)
イベントフラグ待ち(ポーリング)
pol_flg
pol_flg
tk_wai_flg
(tmout=0)
イベントフラグ待ち(タイムアウトあり)
twai_flg
twai_flg
tk_wai_flg
(tmout)
イベントフラグの状態参照
ref_flg
ref_flg
tk_ref_flg
(C) 2014 T-Engine Forum, All Rights Reserved.
127
同期・通信機能(API)
データキュー
μITRON3.0
機能
μITRON4.0
データキューの生成
cre_dtq
データキューの生成(ID番号自動割付)
acre_dtq
データキューの削除
del_dtq
データキューへの送信
snd_dtq
データキューへの送信(ポーリング)
psnd_dtq
データキューへの送信(タイムアウトあり)
tsnd_dtq
データキューへの強制送信
fsnd_dtq
データキューからの受信
rcv_dtq
データキューからの受信(ポーリング)
prcv_dtq
データキューからの受信(タイムアウトあり)
trcv_dtq
データキューの状態参照
ref_dtq
(C) 2014 T-Engine Forum, All Rights Reserved.
T-Kernel
128
同期・通信機能(API)
メールボックス
μITRON3.0
機能
メールボックスの生成
cre_mbx
メールボックスの生成(ID番号自動割付)
μITRON4.0
T-Kernel
cre_mbx
acre_mbx
tk_cre_mbx
メールボックスの削除
del_mbx
del_mbx
tk_del_mbx
メールボックスへの送信
snd_msg
snd_mbx
tk_snd_mbx
メールボックスからの受信
rcv_msg
rcv_mbx
tk_rcv_mbx
(tmout=-1)
メールボックスからの受信(ポーリング)
prcv_msg
prcv_mbx
tk_rcv_mbx
(tmout=0)
メールボックスからの受信(タイムアウトあ
り)
trcv_msg
trcv_mbx
tk_rcv_mbx
(tmout)
メールボックスの状態参照
ref_mbx
ref_mbx
tk_ref_mbx
(C) 2014 T-Engine Forum, All Rights Reserved.
129
時間管理機能
μITRON3.0仕様
μITRON4.0仕様
T-Kernel
システムクロックは1985年1月1日を0
とした1ミリ秒数のカウンタ
システム時刻はシステム初期化時に0
に初期化したカウンタ
システムクロックは1985年1月1日を0
とした1ミリ秒数のカウンタ
システムクロックを変更した場合に、
それまで時間待ちしていたタスクや
起動を待っていたハンドラの動作タ
イミングが狂う可能性がある
システム時刻を変更した場合にも、
相対時間を用いて指定されたイベン
トの発生する実時刻は変化しない
システム時刻を変更した場合にも、
相対時刻は変化しない
システムクロックのビット数を48
ビットと推奨する
システム時刻のビット数に関する推
奨値を定めない
システム時刻は64ビット符号付整数
周期起動ハンドラとアラームハンド
ラは定義する
周期ハンドラとアラームハンドラは
生成する(ID番号で管理)
周期ハンドラとアラームハンドラは
生成する(ID番号で管理)
周期ハンドラに起動位相という概念
を導入
周期ハンドラに起動位相という概念
を導入
(C) 2014 T-Engine Forum, All Rights Reserved.
130
時間管理機能(API)
μITRON3.0
機能
μITRON4.0
T-Kernel
システム時刻の設定(実際の時間)
set_tim
tk_set_tim
システム時刻の参照(実際の時間)
get_tim
tk_get_tim
システム時刻の設定
set_tim
システム稼働時間の参照
get_tim
周期ハンドラの生成
cre_cyc
周期ハンドラの生成(ID番号自動割付)
acre_cyc
tk_cre_cyc
del_cyc
tk_del_cyc
周期ハンドラの動作開始
sta_cyc
tk_sta_cyc
周期ハンドラの動作停止
stp_cyc
tk_stp_cyc
ref_cyc
tk_ref_cyc
周期ハンドラの定義
def_cyc
周期ハンドラの削除
周期起動ハンドラの活性制御
周期ハンドラの状態参照
tk_get_otm
act_cyc
ref_cyc
(C) 2014 T-Engine Forum, All Rights Reserved.
131
システム状態管理機能(API)
機能
μITRON3.0
μITRON4.0
T-Kernel
タスク優先順位の回転
rot_rdq
rot_rdq
tk_rot_rdq
実行状態のタスクIDの参照
get_tid
get_tid
tk_get_tid
CPUロック状態への移行
loc_cpu
loc_cpu
CPUロック状態の解除
unl_cpu
unl_cpu
ディスパッチ禁止
dis_dsp
dis_dsp
tk_dis_dsp
ディスパッチ許可
ena_dsp
ena_dsp
tk_ena_dsp
コンテキストの参照
sns_ctx
CPUロック状態の参照
sns_loc
ディスパッチ禁止状態の参照
sns_dsp
ディスパッチ保留状態の参照
sns_dpn
システムの状態参照
ref_sys
省電力モード設定
ref_sys
tk_ref_sys
tk_set_pow
(C) 2014 T-Engine Forum, All Rights Reserved.
132
非タスクコンテキスト
μITRON3.0仕様
μITRON4.0仕様
タスク独立部用のシステムコールの名称
は、ixxx_yyyとする
非タスクコンテキスト用のサービス
コールの名称は、ixxx_yyyとする
タスク独立部用のシステムコールの種類
は実装依存
(C) 2014 T-Engine Forum, All Rights Reserved.
T-Kernel
タスク独立部用のシステムコールは、タ
スク用のシステムコールと同じ名称
133
非タスクコンテキスト(API)/1
μITRON3.0
機能
タスクの起動
μITRON4.0
T-Kernel
iact_tsk
タスクの起動
tk_sta_tsk
タスク優先度の変更
ichg_pri
タスクの起床
iwup_tsk
iwup_tsk
tk_wup_tsk
待ち状態の強制解除
irel_wai
irel_wai
tk_rel_wai
強制待ち状態への移行
isus_tsk
強制待ち状態からの再開
irsm_tsk
強制待ち状態からの強制再開
ifrsm_tsk
タスク例外処理の要求
iras_tex
セマフォ資源の返却
isig_sem
isig_sem
tk_sig_sem
イベントフラグのセット
iset_flg
iset_flg
tk_set_flg
データキューへの送信(ポーリング)
ipsnd_dtq
データキューへの強制送信
ifsnd_dtq
メールボックスへの送信
isnd_msg
(C) 2014 T-Engine Forum, All Rights Reserved.
134
非タスクコンテキスト(API)/2
機能
μITRON3.0
メッセージバッファへの送信
ipsnd_mbf
固定長メモリブロックの獲得
ipget_blf
可変長メモリブロックの獲得
ipget_blk
タイムティックの供給
タスクの優先順位の回転
μITRON4.0
T-Kernel
isig_tim
irot_rdq
irot_rdq
tk_rot_rdq
実行状態のタスクIDの参照
iget_tid
tk_get_tid
CPUロック状態への移行
iloc_cpu
CPUロック状態の解除
iunl_cpu
タスクの強制待ち
tk_sus_tsk
タスクイベントの送信
tk_sig_tev
周期ハンドラの動作開始
tk_sta_cyc
周期ハンドラの動作停止
tk_stp_cyc
アラームハンドラの動作開始
tk_sta_alm
アラームハンドラの動作停止
tk_stp_alm
(C) 2014 T-Engine Forum, All Rights Reserved.
135
デバイスドライバ
▶
デバイスドライバとは、特定の入出力デバイス(周辺機器などのハー
ドウェア)を制御し、アプリケーションソフトウェアに対して抽象化した
インタフェースを提供するためのソフトウェア
▶
μITRON仕様では、デバイスを制御するプログラムを特別に管理す
る機能はなく、汎用OS のデバイス・ドライバのようなものは規定され
ていない

ただしハードウェアを制御するプログラムは必要

デバイスドライバの形式として、DIC(Device Interface Component)という
概念が提案されている

▶
参考:「組込みシステムにおけるPDIC機能ガイドライン」(T-Engine Forum)
開発時に規定した形式またはミドルウェア等で規定されている形式
でデバイスドライバを作成する
(C) 2014 T-Engine Forum, All Rights Reserved.
136
μITRONのデバイスドライバ
▶
大きく分けて、二つの形式
 ドライバ処理の中心は割込みハンドラ


利点:割込み応答性が高い、タスク動作の影響を受けにくい

欠点:データ処理の時間が長い場合は他の割込み処理の応答性
能に影響が出る場合もある、待ち状態を作ることが難しい
割込みハンドラはデバイスドライバタスクを起動する程
度で、処理の中心はデバイスドライバタスク

利点:他の割込み処理を阻害する等の影響が出にくい、データ
処理途中でも、他の優先度が高いタスクが動作可能

欠点:割込みハンドラでデータ処理する形式よりも応答性が低
い、他の優先度が高いタスクの動作によって、処理性能に差が
生じる
(C) 2014 T-Engine Forum, All Rights Reserved.
137
T-Kernel Line-upについて(参考)
μT-Kernel
μT-Kernel は、小規模組込みシステムをターゲットとしたリアルタイムOS です。ARM のプロセッサで言えば、CortexM がターゲットとする応用分野に適したOSです。非常にコンパクトなOS であり、たとえばROM が8KB、RAM が4KB
程度しかないハードウェアでも動作するように作られています。一般的に組込みLinuxと呼ばれているものでは、どん
なに小さく設定しても数MB 以上のRAM を使用しますが、これと比較してもいかにコンパクトなOSであるかがよく解ると
思います。
これだけコンパクトなOS ではありますが、他のRTOS と比較してもかなり充実したAPI を備えています。特に、タスク関
連のAPI や、タスク間同期・通信関連のAPI については、他のRTOS(例えばFreeRTOS やμC/OS-II)と比べてもか
なり充実しています。これは、RTOS の本質がCPU の計算時間を実行したい処理に最適に割り当てることにあるため
に非常に重要なことです。μT-Kernel を動作させるような小規模な組込みシステムでは、一般的に省電力・省コスト
のローエンドなプロセッサが用いられる想定ですが、この時間の割り当てに関する制御が効率良くプログラムから行え
るようにするためには、それ相応のAPI 群が必要だからです。
具体的に、μT-Kernel では以下のような機能を提供しています。使わない機能については、ROM およびRAM の
節約のために、機能を個別に取り外すことも可能になっています。
タスク管理機能
タスク付属同期機能
同期・通信機能
拡張同期・通信機能
メモリプール管理機能
時間管理機能
割込み管理機能
サブシステム管理機能
デバイス管理機能
デバッガサポート機能
(C) 2014 T-Engine Forum, All Rights Reserved.
T-Kernel 2.0
T-Kernel 2.0 を一言で表すと、高性能・高機能な組込みシステムのためのRTOSといって良いでしょう。ARM のプ
138
ロセッサで言えば、Cortex-A がターゲットとする応用分野に適しています。ちょうど、RTOS と情報系OS の「いいと
こ取り」をしたような設計となっており、μT-Kernelと同様なRTOSの機能を基本とした上で、情報系OS の機能をサ
ポートできるように設計・実装がなされたものです。
情報系OSとの「いいとこ取り」という観点から重要なのが「サブシステム管理機能」です。これは、T-Kernel 2.0 とい
うRTOS の上にOS の機能を追加するためのメカニズムで、これを用いることでRTOS をベースとして、例えばファイ
ル管理機能やネットワーク通信機能といった情報系の機能を、OS 機能として追加することが可能となります。さら
には完全な情報系OS の機能をOS 機能として追加することすら可能で、実際にT-Kernel Standard Extension は
完全な情報系OS の機能を実現したOS 拡張ですし、その他にも会員企業によってPOSIX 拡張等が開発された例
もあります。
なお、前節で説明したμT-Kernel にも実は「サブシステム管理」という機能が列挙されていますが、T-Kernel 2.0
とは異なりこれはあくまで簡易的なもので、互換性のために提供されるものです。このように、T-Kernel ファミリでは、
実現方法や内部的な動作、構成等がいずれも大幅に異なっていますが、それぞれの間でのAPI の互換性が考慮
されて設計されています。これにより、「T-Kernel」という共通のAPI を、小さな組込みシステムから大規模なものに
まで、スケーラブルに利用することができるようになっています。
現在のμT-Kernel は、T-Kernel 2.0 の前身であるT-Kernel 1.0 を、互換性を保ちながら軽量かつ簡易な構成と
する形で設計されたもので、ほぼT-Kernel と共通になっています。ただし、T-Kernel 2.0 は情報系OS の機能を必
要とするような比較的大きな構成での利用を想定しているため、μT-Kernel に対して以下のような機能を追加した
ものとなっています。
マイクロ秒単位の時間管理
組込みシステムにおけるデバイスの制御においては、マイクロ秒単位のきめ細かい時間管理が必要となること
も多く、これを実現するためにマイクロ秒単位の時間管理をサポートした。
Cortex-A 系のCPU にみられるような処理の高速化に伴い、マイクロ秒単位の制御が実用化できる環境が
整った。
大容量デバイスのサポート
SD カード等を始めとして、組込み機器においても大容量のデバイスを利用するケースが増えており、これらの
大容量デバイスを扱うための機能を追加した。
標準化範囲の拡大
物理タイマやキャッシュ制御等、T-Kernel 2.0 の仕様で規定される機能範囲を拡張した。
これにより、これらの機能を利用する際のAPI
が共通化され、ミドルウェアの流通性が向上する。
(C) 2014 T-Engine
Forum, All Rights Reserved.
139
T2EX
T2EX はT-Kernel 2.0 Extension の略で、直訳すると「T-Kernel 2.0(の)拡張」です。その名が示す通り、T2EX はT-Kernel 2.0 のため
のOS 拡張機能であり、RTOSに情報系OSのいいところを持ってこられるようにするための、OSのアドオン(拡張機能)のコレクションです。
「T-Engine プロジェクトとT-Kernel のシリーズ」の節では、組込みシステムが高機能化・高性能化、あるいは機能分散化しているという話
に触れましたが、ちょうどそのあたりを狙った設計となっています。高度なOS 機能を情報系OS よりも軽量な形で追加することで組込みシ
ステムの高機能化・高性能化をサポートしつつ、ネットワーク通信機能により機能分散化をOS レベルからサポートできるようになっていま
す。
T2EXの主な特徴は以下のとおりです。
高度な組込みシステムのための情報系OS機能の追加
ファイル管理機能やネットワーク通信機能といった、情報系OSの機能を追加。これによって、高機能な組込みシステムの開発を強力
にサポートする。
アドオン・アーキテクチャ
限られたROM/RAM の中で高度な組込みシステムを実現するため、OS機能を独立させる。
ビルド時のコンフィギュレーションにより、必要なものだけを取捨選択して開発可能。たとえば、T-Kernel 2.0にネットワーク通信機能
だけ追加した構成で開発したい、といったように、拡張機能をそれぞれ独立して付け加えたり取り外したりしてシステムを構築し、コン
パクトな組込みシステムを効率的に開発することが可能である。
メモリ保護機能のサポート
高機能な組込みシステムの開発では、OSをアプリケーションから保護する機能が不可欠となる。
情報系OSとは異なる単一空間上のメモリ保護を実現し、効率的かつ安全なシステムの開発を可能にした。
コンパクト
情報系OSの機能を実現しながらも、非常にコンパクトな組込みシステムが開発可能である。
例えば、100KB以内のRAM でファイルシステムを含む機器(デジタルカメラなど)を開発することも可能である。Linux 等では少なくと
も数MB は消費するため、同じ処理を実現する上で極めてコンパクト性が高いと言える。
T2EXの主な機能を列挙すると以下の通りです。これらはT-Kernel 2.0のAPI と混在させて利用することが可能であり、高いリアルタイム性
を実現しながらも高度な処理を実現できます。
ネットワーク通信機能
ファイル管理機能
標準C互換ライブラリ(標準入出力機能を含む)
カレンダ機能
プログラムロード機能
(C) 2014 T-Engine Forum, All Rights Reserved.
メモリ保護機能
140
なお、T2EX のアーキテクチャは以下に示す通りで、図に示される機能間の依存関係を満たす範囲で前述の各機能
を付け加えたり取り外したりといったことが可能になっています。
(C) 2014 T-Engine Forum, All Rights Reserved.
【講座】T-Kernel/ITRON入門テキスト「ITRON入門」
著者 T-Engine Forum
本テキストは、クリエイティブ・コモンズ 表示 - 継承 4.0
国際 ライセンスの下に提供されています。
http://creativecommons.org/licenses/by-sa/4.0
Copyright ©2014 T-Engine Forum
【ご注意およびお願い】
1.本テキストの中で第三者が著作権等の権利を有している箇所については、利用者の方が当
該第三者から利用許諾を得てください。
2.本テキストの内容については、その正確性、網羅性、特定目的への適合性等、一切の保証
をしないほか、本テキストを利用したことにより損害が生じても著者は責任を負いません。
3.本テキストをご利用いただく際、可能であれば [email protected] までご利用者のお名前
、ご所属、ご連絡先メールアドレスをご連絡いただければ幸いです。
ダウンロード

PPT - T-Engine Forum