こんにちは、ナナです。
マルチタスクの解説に移りたいところですが、まだ知識の準備が整っていません。ITRONに関する知識を補っておきましょう。
本記事では次の疑問点を解消する内容となっています。
では、順に解説していきましょう。
ITRON仕様におけるサービスコールの定義
ITRON仕様においてサービスコールは次のように定義されています。PDFを見てみましょう。
マイコン入門編を実施された方はシステムの機能をモジュールという単位で分割しましたね。
※マイコン入門編を実施していない方は次の記事を見ておくとよいでしょう。
ITRONカーネルをモジュールとして捉えた場合のインターフェースこそがサービスコールと定義されるものです。
ITRONのおけるサービスコールは、WindowsではWindowsAPI、Linuxではシステムコールと呼ばれています。
OSによって呼び名は異なりますが、OSというものがアプリケーションへ提供している関数サービスである、という捉え方は一緒です。
ITRONのサービスコール一覧
ITRON仕様では様々なサービスコールが定義されています。ITRON仕様の存在意義とはこのサービスコールを明確に定義したことにあります。
サービスコールの一覧
ITRON仕様のサービスコールは分類ごとに多くの種類が存在します。
stdと記載されているものはスタンダードプロファイルと呼ばれるITRONで標準的に実装するレベルとして必要な項目です。
カーネルの作り手はITRON仕様のstd項目を全て実装すれば「ITRON仕様のスタンダードプロファイルに準拠している」とうたってよいということになります。
タスク管理機能
cre_tsk | タスクの生成 | |
acre_tsk | タスクの生成(ID番号自動割付け) | |
del_tsk | タスクの削除 | |
act_tsk | std | タスクの起動 |
iact_tsk | std | タスクの起動(割り込みコンテキスト用) |
can_act | std | タスク起動要求のキャンセル |
sta_tsk | タスクの起動(起動コード指定) | |
ext_tsk | std | 自タスクの終了 |
exd_tsk | 自タスクの終了と削除 | |
ter_tsk | std | タスクの強制終了 |
chg_pri | std | タスク優先度の変更 |
get_pri | std | タスク優先度の参照 |
ref_tsk | タスクの状態参照 | |
ref_tst | タスクの状態参照(簡易版) |
タスク付属同期機能
slp_tsk | std | 起床待ち |
tslp_tsk | std | 起床待ち(タイムアウトあり) |
wup_tsk | std | タスクの起床 |
iwup_tsk | std | タスクの起床(割り込みコンテキスト用) |
can_wup | std | タスク起床要求のキャンセル |
rel_wai | std | 待ち状態の強制解除 |
irel_wai | std | 待ち状態の強制解除(割り込みコンテキスト用) |
sus_tsk | std | 強制待ち状態への移行 |
rsm_tsk | std | 強制待ち状態からの再開 |
frsm_tsk | std | 強制待ち状態からの強制再開 |
dly_tsk | std | 自タスクの遅延 |
タスク例外処理機能
def_tex | タスク例外処理ルーチンの定義 | |
ras_tex | std | タスク例外処理の要求 |
iras_tex | std | タスク例外処理の要求(割り込みコンテキスト用) |
dis_tex | std | タスク例外処理の禁止 |
ena_tex | std | タスク例外処理の許可 |
sns_tex | std | タスク例外処理禁止状態の参照 |
ref_tex | タスク例外処理の状態参照 |
同期・通信機能(セマフォ)
cre_sem | セマフォの生成 | |
acre_sem | セマフォの生成(ID番号自動割付け) | |
del_sem | セマフォの削除 | |
sig_sem | std | セマフォ資源の返却 |
isig_sem | std | セマフォ資源の返却(割り込みコンテキスト用) |
wai_sem | std | セマフォ資源の獲得 |
pol_sem | std | セマフォ資源の獲得(ポーリング) |
twai_sem | std | セマフォ資源の獲得(タイムアウトあり) |
ref_sem | セマフォの状態参照 |
同期・通信機能(イベントフラグ)
cre_flg | イベントフラグの生成 | |
acre_flg | イベントフラグの生成(ID番号自動割付け) | |
del_flg | イベントフラグの削除 | |
set_flg | std | イベントフラグのセット |
iset_flg | std | イベントフラグのセット(割り込みコンテキスト用) |
clr_flg | std | イベントフラグのクリア |
wai_flg | std | イベントフラグ待ち |
pol_flg | std | イベントフラグ待ち(ポーリング) |
twai_flg | std | イベントフラグ待ち(タイムアウトあり) |
ref_flg | イベントフラグの状態参照 |
同期・通信機能(データキュー)
cre_dtq | データキューの生成 | |
acre_dtq | データキューの生成(ID番号自動割付け) | |
del_dtq | データキューの削除 | |
snd_dtq | std | データキューへの送信 |
psnd_dtq | std | データキューへの送信(ポーリング) |
ipsnd_dtq | std | データキューへの送信(ポーリング・割り込みコンテキスト用) |
tsnd_dtq | std | データキューへの送信(タイムアウトあり) |
fsnd_dtq | std | データキューへの強制送信 |
ifsnd_dtq | std | データキューへの強制送信(割り込みコンテキスト用) |
rcv_dtq | std | データキューからの受信 |
prcv_dtq | std | データキューからの受信(ポーリング) |
trcv_dtq | std | データキューからの受信(タイムアウトあり) |
ref_dtq | データキューの状態参照 |
同期・通信機能(メールボックス)
cre_mbx | メールボックスの生成 | |
acre_mbx | メールボックスの生成(ID番号自動割付け) | |
del_mbx | メールボックスの削除 | |
snd_mbx | std | メールボックスへの送信 |
rcv_mbx | std | メールボックスからの受信 |
prcv_mbx | std | メールボックスからの受信(ポーリング) |
trcv_mbx | std | メールボックスからの受信(タイムアウトあり) |
ref_mbx | メールボックスの状態参照 |
拡張同期・通信機能(ミューテックス)
cre_mtx | ミューテックスの生成 | |
acre_mtx | ミューテックスの生成(ID番号自動割付け) | |
del_mtx | ミューテックスの削除 | |
loc_mtx | ミューテックスのロック | |
ploc_mtx | ミューテックスのロック(ポーリング) | |
tloc_mtx | ミューテックスのロック(タイムアウトあり) | |
unl_mtx | ミューテックスのロック解除 | |
ref_mtx | ミューテックスの状態参照 |
拡張同期・通信機能(メッセージバッファ)
cre_mbf | メッセージバッファの生成 | |
acre_mbf | メッセージバッファの生成(ID番号自動割付け) | |
del_mbf | メッセージバッファの削除 | |
snd_mbf | メッセージバッファへの送信 | |
psnd_mbf | メッセージバッファへの送信(ポーリング) | |
tsnd_mbf | メッセージバッファへの送信(タイムアウトあり) | |
rcv_mbf | メッセージバッファからの受信 | |
prcv_mbf | メッセージバッファからの受信(ポーリング) | |
trcv_mbf | メッセージバッファからの受信(タイムアウトあり) | |
ref_mbf | メッセージバッファの状態参照 |
拡張同期・通信機能(ランデブ)
cre_por | ランデブポートの生成 | |
acre_por | ランデブポートの生成(ID番号自動割付け) | |
del_por | ランデブポートの削除 | |
cal_por | ランデブポートの呼出し | |
tcal_por | ランデブポートの呼出し(タイムアウトあり) | |
acp_por | ランデブの受付 | |
pacp_por | ランデブの受付(ポーリング) | |
tacp_por | ランデブの受付(タイムアウトあり) | |
fwd_por | ランデブの回想 | |
rpl_rdv | ランデブの終了 | |
ref_por | ランデブポートの状態参照 | |
ref_rdv | ランデブの状態参照 |
メモリプール管理機能(固定長メモリプール)
cre_mpf | 固定長メモリプールの生成 | |
acre_mpf | 固定長メモリプールの生成(ID番号自動割付け) | |
del_mpf | 固定長メモリプールの削除 | |
get_mpf | std | 固定長メモリブロックの獲得 |
pget_mpf | std | 固定長メモリブロックの獲得(ポーリング) |
tget_mpf | std | 固定長メモリブロックの獲得(タイムアウトあり) |
rel_mpf | std | 固定長メモリブロックの返却 |
ref_mpf | 固定長メモリブロックの状態参照 |
メモリプール管理機能(可変長メモリプール)
cre_mpl | 可変長メモリブロックの生成 | |
acre_mpl | 可変長メモリブロックの生成(ID番号自動割付け) | |
del_mpl | 可変長メモリブロックの削除 | |
get_mpl | 可変長メモリブロックの獲得 | |
pget_mpl | 可変長メモリブロックの獲得(ポーリング) | |
tget_mpl | 可変長メモリブロックの獲得(タイムアウトあり) | |
rel_mpl | 可変長メモリブロックの返却 | |
ref_mpl | 可変長メモリブロックの状態参照 |
時間管理機能(システム時刻管理)
set_tim | std | システム時刻の設定 |
get_tim | std | システム時刻の参照 |
isig_tim | std | タイムティックの供給 |
時間管理機能(周期ハンドラ)
cre_cyc | 周期ハンドラの生成 | |
acre_cyc | 周期ハンドラの生成(ID番号自動割付け) | |
del_cyc | 周期ハンドラの削除 | |
sta_cyc | std | 周期ハンドラの動作開始 |
stp_cyc | std | 周期ハンドラの動作停止 |
ref_cyc | 周期ハンドラの状態参照 |
時間管理機能(アラームハンドラ)
cre_alm | アラームハンドラの生成 | |
acre_alm | アラームハンドラの生成(ID番号自動割付け) | |
del_alm | アラームハンドラの削除 | |
sta_alm | アラームハンドラの動作開始 | |
stp_alm | アラームハンドラの動作停止 | |
ref_alm | アラームハンドラの状態参照 |
時間管理機能(オーバーランハンドラ)
def_ovr | オーバーランハンドラの定義 |
sta_ovr | オーバーランハンドラの動作開始 |
stp_ovr | オーバーランハンドラの動作停止 |
ref_ovr | オーバーランハンドラの状態参照 |
システム状態管理機能
rot_rdq | std | タスクの優先順位の回転 |
irot_rdq | std | タスクの優先順位の回転(割り込みコンテキスト用) |
get_tid | std | 実行状態のタスクIDの参照 |
iget_tid | std | 実行状態のタスクIDの参照(割り込みコンテキスト用) |
loc_cpu | std | CPUロック状態への移行 |
iloc_cpu | std | CPUロック状態への移行(割り込みコンテキスト用) |
unl_cpu | std | CPUロック状態の解除 |
iunl_cpu | std | CPUロック状態の解除(割り込みコンテキスト用) |
dis_dsp | std | ディスパッチの禁止 |
ena_dsp | std | ディスパッチの許可 |
sns_ctx | std | コンテキストの参照 |
sns_loc | std | CPUロック状態の参照 |
snd_dsp | std | ディスパッチ禁止状態の参照 |
sns_dpn | std | ディスパッチ保留状態の参照 |
ref_sys | システムの状態参照 |
割り込み管理機能
def_inh | 割込みハンドラの定義 | |
cre_isr | 割込みサービスルーチンの生成 | |
acre_isf | 割込みサービスルーチンの生成(ID番号自動割付け) | |
del_isr | 割込みサービスルーチンの削除 | |
ref_isr | 割込みサービスルーチンの状態参照 | |
dis_int | 割込みの禁止 | |
ena_int | 割込みの許可 | |
chg_ixx | 割込みマスクの変更 | |
get_ixx | 割込みマスクの参照 |
サービスコール管理機能
def_svc | 拡張サービスコールの定義 | |
cal_svc | サービスコールの呼出し |
システム構成管理機能
def_exc | CPU例外ハンドラの定義 | |
ref_cfg | コンフィギュレーション情報の参照 | |
ref_ver | バージョン情報の参照 |
非常に多くのサービスコールが定義されているのがわかります。これら全てを実際覚えるわけではありません。この中でもよく使うサービスコールというものがありますので、それらを中心に順に機能を知っていきましょう。
ITRON仕様書の読み方
ITRONの仕様書は多くのページがあるが、ほとんどがこれらサービスコールに対する仕様が記述されたものである!
使うシーンが来たら対象のサービスコールの説明を参照するという考え方で読めばよい!
ITRONの後継OSであるT-Kernelにおいてサービスコールは「tk_」で始まる名称となっている!
tk_cre_tskといったサービスコール名称となるため、ITRONのサービスコールを覚えておくとT-Kernelのサービスコールを覚えたことになる!
サービスコール名称の規則
サービスコールの名称を眺めると規則性があるのがわかります。ITRON仕様ではサービスコールの名称の付け方にルールを設けています。
例えばcre_tsk(タスク生成)というサービスコールは次の意味で解釈します。
- creがxxxであり、create(生成)という操作を示す
- tskがyyyであり、task(タスク)という対象を示す
英語の省略形で表現されるため慣れていない方は、正式な英語と紐づけて記憶してください。このような省略形の英字はサービスコールに限らず、モジュールのインターフェース名称でもよく利用される英字です。
特に注意すべき派生系のサービスコール
派生したサービスコールには派生文字zを付与したzxxx_yyyとする、とされています。
特に注意を払うべき派生系サービスコールが「i」の文字が付与されたサービスコールです。このサービスコールは必ず特徴を知っておく必要があります。
派生文字「i」の意味するもの
派生文字「i」とは「interrupt」を意味しています。interruptといえば「割り込み」ですね。
サービスコールの中で「i」が接頭文字となっているものは、割り込みハンドラの中から呼ぶことができるサービスコールです。
逆に言うと「i」が付いていないサービスコールは割り込みハンドラから呼んではなりません。
このルールはものすごく大事なルールであり、ITRONが搭載されたシステムにおいて割り込みを扱うときには、常に頭に入れておく必要があります。油断すると忘れてプログラムが正常に動かないといったことが起きます。
割り込みハンドラを理解していない方は、マイコン入門編の次の記事を参照してください。
「割り込みハンドラから呼ぶことができる」という表現は実は正確ではありません。正確には「割り込みコンテキストから呼ぶことができるサービスコール」が正しい表現です。
現段階では割り込みコンテキストの解説をしていないため、今の段階では割り込みハンドラから呼ぶことができるサービスコールとしてまずは理解してください。
ITRONが定義するオブジェクトの概念と種類
ITRONではオブジェクトというものを利用してプログラミングをします。
オブジェクト指向言語を経験されている方は同じものと捉えてよいでしょう。オブジェクト指向言語を知らない方でも大丈夫です。順に解説していきましょう。
ITRONで定義されるオブジェクトの種類
ITRONでは次のオブジェクトが定義されています。
- タスク
- イベントフラグ
- データキュー
- メールボックス
- メッセージバッファ
- ランデブ
- 周期ハンドラ
- アラームハンドラ
- セマフォ
- ミューテックス
- 固定長メモリプール
- 可変長メモリプール
このようなオブジェクトを利用しながらITRONのシステムは構築します。これらのオブジェクトは全てではありませんが、本カリキュラムで順次解説を行います。
ITRON仕様においてオブジェクトは次のように定義されています。
オブジェクトとは結局何なのか?
オブジェクトというものがピンと来ていない方もいるでしょう。C言語入門編を実施した方は思い出してください。
オブジェクトとはハンドルのことです。C言語入門編にてファイルハンドルやキャッシュカードに例えたハンドルの解説を行いました。
ハンドルの概要を忘れてしまった方や理解していない方は、次の記事を見ておくとよいでしょう。
ITRON仕様におけるオブジェクトの登録と解除は次のように説明されています。
この説明はハンドルの説明と同じですよね。
識別するための情報が、ハンドルではヒープメモリのポインタでしたが、ITRONのオブジェクトは整数型のIDで管理されています。このような違いはあるものの考え方や使い方はハンドルそのものです。