μ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

どのようなものが組込みシステムか？

ロボット制御分野
ＮＣ/ＦＡ制御分野

組込みシステムＯＡ機器分野計測機器分野通信制御分野音声認識
車両 / 車載機器分野

ＡＶ機器分野マイコン内蔵炊飯器、洗濯機、コピー機、ＦＡＸ、
携帯情報端末、電子楽器、自動車、ロボットなど(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

組込み機器制御(シングルタスク)

ｼﾝｸﾞﾙﾀｽｸ

DVD

処理１
関数

処理２
関数

DVD
Play

GPS
Information
Get

プログラムが複雑→ 規模が大きくなると管理出来ない！
(C) 2014 T-Engine Forum, All Rights Reserved.

GPS

14

リアルタイムとマルチタスク
・車の運転の例
スピードが50km/h
以下になったらアクセルを踏む<2秒以内>

前方30m以内に歩行者を発見したらブレーキを踏む<0.1秒以内>
前方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)単位で実行※タスクとはプログラム実行の最小単位、意味のある１つの仕事のくくり(モジュールや関数のこと)

各種入力

入力
処理
タスク

起動指示

計算
処理
タス
ク

表示
起動指示
処理
タス
ク

表示データ
出力

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を介してハード
ウェアを制御するため、マイコンが変わっても、ソフト
ウェアの大幅な変更は必要無い(再利用可)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
 トロンプロジェクトはUbiquitous Computing研究開発の先駆け▶

トロン(TRON)
 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仕様【効果】
・メモリへのアクセス保護（信頼性・安全性）
・カーネルオブジェクトへのアクセス保護（セキュリティ）（第２フェーズ）（第１フェーズ）

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プロジェクト
ユビキタスコンピューティング環境構築を目指して、オープンなリアルタイム標準開発環境を整備するプロジェクト。 ハードウェア、ＯＳ、ミドルウェ
ア、開発環境について、強い標準化が進められている。
T-Kernel2.0

uT-Kernel2.0

ITRON4.0仕様

ITRON4.0/PX仕様

ITRON
弱い標準化とプロファイルに基づく展開ITRONの成果をベースとして、互換性や厳密性の向上を図り、生産性向上や再利用性、移植性を高めることを目的に仕様を整理。

・同一プロファイル規定のOS間で互換性を保証(スタンダードプロファイル、自動車プロファイル)・保護機能拡張(ITRON4.0/PX仕様)によるＭＭＵ
サポート(メモリ保護を主目的としている)(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 UnixクローンOS Linuxの組込み版▶

OSEK/VDX
 車載向け、欧州▶

Symbian OS/Android OS/iOS
 携帯電話/スマートフォン向け▶

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）
 待ち状態と強制待ち状態の２つの待ち状態が重なった状態
 待ち状態のタスクに対して、sus_tskが発行された状態▶

休止状態（DORMANT)
 タスクが起動されるのを待っている状態
 タスクの起動前、および タスク終了後の状態▶

未登録状態（NON-EXISTENT) タスクが登録されていない状態
 システムから削除された状態(C) 2014 T-Engine Forum, All Rights Reserved.

38

タスクの状態(アイコン)

実行状態
RUNNING

実行可能状態
READY

待ち状態
WAIT

強制待ち状態SUSPEND

二重待ち状態
WAIT-SUSPEND

休止状態
DORMANT(C) 2014 T-Engine Forum, All Rights Reserved.

39

タスク遷移の様子

dispatchpreempt
実行可能状態
READY

待ち条件

待ち解除

実行状態
強制終了 RUNNING

待ち状態
WAIT
中断

再開

二重待ち状態
WAIT-SUSPEND
中断
再開

終了と削除

待ち解除

強制待ち状態SUSPEND

起動

強制終了

強制終了

強制終了

終了

休止状態
DORMANT

削除(C) 2014 T-Engine Forum, All Rights Reserved.

生成

未登録状態
NON-EXISTENT

40

レディーキュー

レディキュー（優先度 : 1）
TASK
1

TASK
2

TASK
4

TASK
5

TASK
3

レディキュー（優先度 : 2）

レディキュー（優先度 : 3）
TASK
6

・実行可能状態にあるタスクのつながる行列
・最も優先順位の高いタスクが実行状態になる(C) 2014 T-Engine Forum, All Rights Reserved.

41

タスクの実行順序

レディキュー（優先度 : 1）
TASK
1

TASK
2

TASK
4

TASK
5

TASK
3

レディキュー（優先度 : 2）

レディキュー（優先度 : 3）
TASK
6

・優先順（優先度の数字が小さい順）
・同じ優先度なら先にレディーキューに並んだ順（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文字程度の略語が使用されています。以下に代表的なものを示します。
略語 元になった英語
cancancelchgchange
clr
clear
cre
createdeldelete
slp
sleep
dtq
data queuesem 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;/* タスク生成情報 */IDtskid_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(休止)状態のタスクを(Priority: Middle)
READY状態にします。そして、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

タスク管理機能(ご参考)
優

先

① 度

エラーや特定のイベント発生に従って、あらかじめ決めておいたタスクの実行順序を変更し高 ②③
たい場合、次の２つの方法があります。 ←実
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）

例：Delay task

Task B
優先度：低(Priority = Low)

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.

mailboxmailboxキューには、メッセージはない

メッセージがキューに入れられるメッセージをキューから取り出すメールボックスを使ったサンプルプログラム#include "kernel.2h"#include "kernel_id.h"#include "sample_task.h"66/*************************************************************************//* メッセージ形式*//*************************************************************************/
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(論理和)待ち(右図)とします。

タスク１
wai_flg

フラグの イベントフラ
セット待ち グ(C) 2014 T-Engine Forum, All Rights Reserved.

フラグの
セット

タスク２
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

割込み処理動作（例）
割込み発生
Ｔask A
タスク切り替えが無い場
合には割込み発生元に戻ります。

①
Ｔask B

割込み
ハンドラ

T-Kernel

tk_ret_int ()

割込み処理

④
④

②
③

タスクスケジューリング

スケジューリング(C) 2014 T-Engine Forum, All Rights Reserved.

89

割込み管理機能(注意点)項目

タスク

割込みハンドラ実行管理

ＯＳにより５つの状態で管理さＯＳは実行管理を行いません。

れます。
（ＲＥＡＤＹ、ＷＡＩＴ等）
実行スケジュー

ＲＥＡＤＹ状態のタスクの中でＯＳでは管理されず外部割込み処

ル

最高の優先度を持つタスクが実理で直接起動されます。

行されます。
実行の切替えシステムコール

優先度の高いタスクの実行要

１・タスクにより処理は中断さ

求、実行タスクの状態変化によれません。

り、タスク実行が切り替えられ

２・割込みハンドラ同士では割込ます。

みレベルの高い方を優先します。

割込みハンドラ専用システムコ

制限があります。

ール以外の全システムコールが使用可能です。

割込みハンドラを作成する場合には、次の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

アプリケーションプログラムの開発手順は大別して次の７段階で構成されます。
（１）処理をタスク/ハンドラに分割（２）各タスクの優先度を決定（３）各タスクで使用するシステムコールを選択（４）アプリケーションプログラムの記述（５）コンフィグレーション（６）リロケータブルオブジェクトファイルの作成（７）RTOSライブラリとアプリケーションとのリンク
以上により作成した実行オブジェトファイルをデバッグすることにより、アプリケーションプログラムの動作検証を行います。
上記の各開発手順における概要の説明を以下に示します。

(１) 処理をタスク及びハンドラに分割開発する製品の仕様に基づいて、プロセッサで実行したい処理をタスク/ハンドラに分割します。状況変化をとらえて動作する処理を「ハンドラ」とし、主な処理を「タスク」とします。「タスク」と「ハンドラ」の２種類の要素を組み合わせて設計します。
タスク/ハンドラ分割における設計が、リアルタイム処理性能を大きく左右します。
タスク分割を決定する際には、下記の項目を考慮してください。
（１）順次処理は同一タスク、並行処理は別タスクとする（２）機能的な関連性が深い処理をグルーピングしてタスクとする（３）適度な大きさおよび適度な数の処理に分割してタスクとする（４）複数のタスク間にまたがるデータはできるだけ少なくする※タスク分割についての一例を参考までに付録に紹介してあります。
(C) 2014 T-Engine Forum, All Rights Reserved.

108(２) 各タスクの優先度を決定(1)で決定したタスクにおける処理の内容を比較して、各タスクの優先度を決定します。他のタスクに実行権を奪われたくないタスクは、優先度を高くする必要があります。

(３) 各タスクで使用するシステムコールを選択
各タスク間の同期、通信を考慮して、各タスクの処理において使用するシステムコールを決定します。

(４) アプリケーションプログラムの記述
サービスコールを使って、アプリケーションプログラム(1で決定したハンドラとタスク)を記述します。通常、C言語を使用して、アプリケーションプログラムを記述します。

(５) コンフィグレーション
設計、記述したタスクに合わせて、RTOSを使用するためのコンフィグレーションを行い、システム環境定義ファイル
を作成します。
コンフィグレーションの手段として、GUIコンフィグレーションツールを使うと便利です(OSベンダ提供)。GUIより入力されたコンフィグレーション情報から、システム環境定義ファイルを自動生成します。

(６) リロケータブルオブジェクトファイルの作成(4)で作成したアプリケーションプログラムと、(5)で作成したシステム環境定義ファイルをコンパイル/アセンブルして、リロケータブルオブジェクトファイルを作成します。アプリケーションプログラムファイル一つに対して、一つのリロケー
タブルオブジェクトファイルが作成されます。システム環境定義ファイルも一つのリロケータブルオブジェクトファイルとして作成されます。

(７) 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

おまけ(タスク分割)▶ キー関連処理(順次処理)をグルーピングし、１つの(キー入力)タ

スクとした。
▶ その結果、キーマトリクス走査ができなくなるというトラブルが発
生した。

キー

キー入力タスクキーマトリクス走査処理(10ms毎)
入力値

キー有効性
判定処理
キーデータ

デコード処理(C) 2014 T-Engine Forum, All Rights Reserved.

短縮メモ
リへの格
納処理

短縮メモリの
クリア処理

短縮メモリ

114

おまけ(タスク分割)▶ 問題点は･･･キーマトリクス走査は10ms毎に行う必要があるが、短縮メモリへの格納に30ms掛かるため、この間、キーマトリクス走査ができなくなってしまった。
▶ 改善のポイントは･･･順次処理とはいえ、処理時間の異なる処理は別タスクにする。

(C) 2014 T-Engine Forum, All Rights Reserved.

115

おまけ(タスク分割)▶ キーマトリクス走査処理とデコード処理で１つ、キー有効性判定

処理と短縮メモリ関連処理で１つ、それぞれタスク分割した。

キー入力タスクキー

モード移行タスク

キーマトリクス走査処理(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_tsktk_del_tsk

タスクの起動act_tsk

タスク起動要求のキャンセル

can_act

タスクの起動(起動コード指定)

sta_tsk

sta_tsktk_sta_tsk

自タスクの終了

ext_tsk

ext_tsktk_ext_tsk

タスクの強制終了

ter_tsk

ter_tsktk_ter_tsk

タスク優先度の変更

chg_pri

chg_pritk_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_tsktk_slp_tsk(tmout=-1)

起床待ち(タイムアウトあり)

tslp_tsk

tslp_tsk

tk_slp_tsk(tmout)タスクの起床wup_tsk

wup_tsktk_wup_tsk

タスク起床要求のキャンセル

can_wup

can_wuptk_can_wup

強制待ち状態への移行

sus_tsk

sus_tsktk_sus_tsk

強制待ち状態からの再開

rsm_tsk

rsm_tsktk_rsm_tsk

強制待ち状態からの再開

frsm_tsk

frsm_tsk

tk_frsm_tsk

自タスクの遅延dly_tsk

dly_tsktk_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_semtk_cre_sem

セマフォの削除

del_sem

del_sem

tk_del_sem

セマフォ資源の返却

sig_sem

sig_semtk_sig_sem

セマフォ資源の獲得

wai_sem

wai_sem

tk_wai_sem(tmout=-1)

セマフォ資源の獲得(ポーリング)

preq_sem

pol_sem

tk_wai_sem(tmout=0)

セマフォ資源の獲得(タイムアウトあり)

twai_sem

twai_semtk_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_ｆｌｇ(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_timtk_set_tim

システム時刻の参照(実際の時間)

get_timtk_get_tim

システム時刻の設定

set_tim

システム稼働時間の参照

get_tim

周期ハンドラの生成

cre_cyc

周期ハンドラの生成(ID番号自動割付)

acre_cyctk_cre_cyc

del_cyctk_del_cyc

周期ハンドラの動作開始

sta_cyctk_sta_cyc

周期ハンドラの動作停止

stp_cyctk_stp_cyc

ref_cyctk_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_dspdis_dsptk_dis_dsp

ディスパッチ許可

ena_dspena_dsptk_ena_dsp

コンテキストの参照

sns_ctx

CPUロック状態の参照

sns_loc

ディスパッチ禁止状態の参照

sns_dsp

ディスパッチ保留状態の参照

sns_dpnシステムの状態参照

ref_sys

省電力モード設定

ref_systk_ref_sys
tk_set_pow(C) 2014 T-Engine Forum, All Rights Reserved.

132

非タスクコンテキスト

μITRON3.0仕様

μITRON4.0仕様

T-Kernel

タスク独立部用のシステムコールの名
称は、ixxx_yyyとする

非タスクコンテキスト用のサービスコー
ルの名称は、ixxx_yyyとする

タスク独立部用のシステムコールは、タスク用のシステムコールと同じ名称

タスク独立部用のシステムコールの種
類は実装依存(C) 2014 T-Engine Forum, All Rights Reserved.

133

非タスクコンテキスト(API)/1
機能μITRON3.0

タスクの起動μITRON4.0

T-Kerneliact_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_semisig_semtk_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-Kernelisig_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 のプロセッサで言えば、Cortex-M がターゲットとする応用分野に適した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といって良いでしょう。
138
ARM のプロセッサで言えば、Cortex-A がターゲットとする応用分野に適しています。ちょうど、RTOS と情報系OS の「いいとこ取り」をしたような設計となっており、μT-Kernelと同様なRTOSの機能を基本とした上で、情報系OS の機能をサポートできるように設計・実装がなされたものです。
情報系OSとの「いいとこ取り」という観点から重要なのが「サブシステム管理機能」です。これは、TKernel 2.0 というRTOS の上にOS の機能を追加するためのメカニズムで、これを用いることでRTOS
をベースとして、例えばファイル管理機能やネットワーク通信機能といった情報系の機能を、OS 機能として追加することが可能となります。さらには完全な情報系OS の機能をOS 機能として追加することすら可能で、実際にT-Kernel Standard Extension は完全な情報系OS の機能を実現したOS 拡張ですし、
その他にも会員企業によってPOSIX 拡張等が開発された例もあります。
なお、前節で説明したμT-Kernel にも実は「サブシステム管理」という機能が列挙されていますが、TKernel 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.0Allの仕様で規定される機能範囲を拡張した。
(C) 2014 T-Engine Forum,
Rights Reserved.
これにより、これらの機能を利用する際のAPI が共通化され、ミドルウェアの流通性が向上する。

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.本テキストをご利用いただく際、可能であれば office@t-engine.org までご利用者のお名前、ご所属、ご連絡先メールアドレスをご連絡いただければ幸いです。