ITRON入門 サービスコールの役割と位置づけ【解説】

ITRON入門カリキュラム
この記事は約14分で読めます。

こんにちは、ナナです。

マルチタスクの解説に移りたいところですが、まだ知識の準備が整っていません。ITRONに関する知識を補っておきましょう。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • サービスコールとは何か?
  • ITRONが提供するサービスコールには何があるのか?
  • サービスコールの名前の規則とは?

では、順に解説していきましょう。

スポンサー

ITRON仕様におけるサービスコールの定義

ITRON仕様においてサービスコールは次のように定義されています。PDFを見てみましょう。

2.1.2 API構成要素

API(Application Program Interface)とはアプリケーションプログラムがカーネルやソフトウェア部品を使う場合のインターフェースのことをいう。

(A)サービスコール

アプリケーションプログラムからカーネルまたはソフトウェア部品を呼び出すインターフェースをサービスコールと呼ぶ。ITRON仕様では、サービスコールの名称、機能、パラメータとリターンパラメータの種類・順序・名称・データ型を標準化する。

マイコン入門編を実施された方はシステムの機能をモジュールという単位で分割しましたね。
※マイコン入門編を実施していない方は次の記事を見ておくとよいでしょう。

ITRONカーネルをモジュールとして捉えた場合のインターフェースこそがサービスコールと定義されるものです。

サービスコール

ITRONのおけるサービスコールは、WindowsではWindowsAPI、Linuxではシステムコールと呼ばれています。

OSによって呼び名は異なりますが、OSというものがアプリケーションへ提供している関数サービスである、という捉え方は一緒です。

スポンサー

ITRONのサービスコール一覧

ITRON仕様では様々なサービスコールが定義されています。ITRON仕様の存在意義とはこのサービスコールを明確に定義したことにあります。

サービスコールの一覧

ITRON仕様のサービスコールは分類ごとに多くの種類が存在します。

stdと記載されているものはスタンダードプロファイルと呼ばれるITRONで標準的に実装するレベルとして必要な項目です。

カーネルの作り手はITRON仕様のstd項目を全て実装すれば「ITRON仕様のスタンダードプロファイルに準拠している」とうたってよいということになります。

タスク管理機能

cre_tskタスクの生成
acre_tskタスクの生成(ID番号自動割付け)
del_tskタスクの削除
act_tskstdタスクの起動
iact_tskstdタスクの起動(割り込みコンテキスト用)
can_actstdタスク起動要求のキャンセル
sta_tskタスクの起動(起動コード指定)
ext_tskstd自タスクの終了
exd_tsk自タスクの終了と削除
ter_tskstdタスクの強制終了
chg_pristdタスク優先度の変更
get_pristdタスク優先度の参照
ref_tskタスクの状態参照
ref_tstタスクの状態参照(簡易版)

タスク付属同期機能

slp_tskstd起床待ち
tslp_tskstd起床待ち(タイムアウトあり)
wup_tskstdタスクの起床
iwup_tskstdタスクの起床(割り込みコンテキスト用)
can_wupstdタスク起床要求のキャンセル
rel_waistd待ち状態の強制解除
irel_waistd待ち状態の強制解除(割り込みコンテキスト用)
sus_tskstd強制待ち状態への移行
rsm_tskstd強制待ち状態からの再開
frsm_tskstd強制待ち状態からの強制再開
dly_tskstd自タスクの遅延

タスク例外処理機能

def_texタスク例外処理ルーチンの定義
ras_texstdタスク例外処理の要求
iras_texstdタスク例外処理の要求(割り込みコンテキスト用)
dis_texstdタスク例外処理の禁止
ena_texstdタスク例外処理の許可
sns_texstdタスク例外処理禁止状態の参照
ref_texタスク例外処理の状態参照

同期・通信機能(セマフォ)

cre_semセマフォの生成
acre_semセマフォの生成(ID番号自動割付け)
del_semセマフォの削除
sig_semstdセマフォ資源の返却
isig_semstdセマフォ資源の返却(割り込みコンテキスト用)
wai_semstdセマフォ資源の獲得
pol_semstdセマフォ資源の獲得(ポーリング)
twai_semstdセマフォ資源の獲得(タイムアウトあり)
ref_semセマフォの状態参照

同期・通信機能(イベントフラグ)

cre_flgイベントフラグの生成
acre_flgイベントフラグの生成(ID番号自動割付け)
del_flgイベントフラグの削除
set_flgstdイベントフラグのセット
iset_flgstdイベントフラグのセット(割り込みコンテキスト用)
clr_flgstdイベントフラグのクリア
wai_flgstdイベントフラグ待ち
pol_flgstdイベントフラグ待ち(ポーリング)
twai_flgstdイベントフラグ待ち(タイムアウトあり)
ref_flgイベントフラグの状態参照

同期・通信機能(データキュー)

cre_dtqデータキューの生成
acre_dtqデータキューの生成(ID番号自動割付け)
del_dtqデータキューの削除
snd_dtqstdデータキューへの送信
psnd_dtqstdデータキューへの送信(ポーリング)
ipsnd_dtqstdデータキューへの送信(ポーリング・割り込みコンテキスト用)
tsnd_dtqstdデータキューへの送信(タイムアウトあり)
fsnd_dtqstdデータキューへの強制送信
ifsnd_dtqstdデータキューへの強制送信(割り込みコンテキスト用)
rcv_dtqstdデータキューからの受信
prcv_dtqstdデータキューからの受信(ポーリング)
trcv_dtqstdデータキューからの受信(タイムアウトあり)
ref_dtqデータキューの状態参照

同期・通信機能(メールボックス)

cre_mbxメールボックスの生成
acre_mbxメールボックスの生成(ID番号自動割付け)
del_mbxメールボックスの削除
snd_mbxstdメールボックスへの送信
rcv_mbxstdメールボックスからの受信
prcv_mbxstdメールボックスからの受信(ポーリング)
trcv_mbxstdメールボックスからの受信(タイムアウトあり)
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_mpfstd固定長メモリブロックの獲得
pget_mpfstd固定長メモリブロックの獲得(ポーリング)
tget_mpfstd固定長メモリブロックの獲得(タイムアウトあり)
rel_mpfstd固定長メモリブロックの返却
ref_mpf固定長メモリブロックの状態参照

メモリプール管理機能(可変長メモリプール)

cre_mpl可変長メモリブロックの生成
acre_mpl可変長メモリブロックの生成(ID番号自動割付け)
del_mpl可変長メモリブロックの削除
get_mpl可変長メモリブロックの獲得
pget_mpl可変長メモリブロックの獲得(ポーリング)
tget_mpl可変長メモリブロックの獲得(タイムアウトあり)
rel_mpl可変長メモリブロックの返却
ref_mpl可変長メモリブロックの状態参照

時間管理機能(システム時刻管理)

set_timstdシステム時刻の設定
get_timstdシステム時刻の参照
isig_timstdタイムティックの供給

時間管理機能(周期ハンドラ)

cre_cyc周期ハンドラの生成
acre_cyc周期ハンドラの生成(ID番号自動割付け)
del_cyc周期ハンドラの削除
sta_cycstd周期ハンドラの動作開始
stp_cycstd周期ハンドラの動作停止
ref_cyc周期ハンドラの状態参照

時間管理機能(アラームハンドラ)

cre_almアラームハンドラの生成
acre_almアラームハンドラの生成(ID番号自動割付け)
del_almアラームハンドラの削除
sta_almアラームハンドラの動作開始
stp_almアラームハンドラの動作停止
ref_almアラームハンドラの状態参照

時間管理機能(オーバーランハンドラ)

def_ovrオーバーランハンドラの定義
sta_ovrオーバーランハンドラの動作開始
stp_ovrオーバーランハンドラの動作停止
ref_ovrオーバーランハンドラの状態参照

システム状態管理機能

rot_rdqstdタスクの優先順位の回転
irot_rdqstdタスクの優先順位の回転(割り込みコンテキスト用)
get_tidstd実行状態のタスクIDの参照
iget_tidstd実行状態のタスクIDの参照(割り込みコンテキスト用)
loc_cpustdCPUロック状態への移行
iloc_cpustdCPUロック状態への移行(割り込みコンテキスト用)
unl_cpustdCPUロック状態の解除
iunl_cpustdCPUロック状態の解除(割り込みコンテキスト用)
dis_dspstdディスパッチの禁止
ena_dspstdディスパッチの許可
sns_ctxstdコンテキストの参照
sns_locstdCPUロック状態の参照
snd_dspstdディスパッチ禁止状態の参照
sns_dpnstdディスパッチ保留状態の参照
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_excCPU例外ハンドラの定義
ref_cfgコンフィギュレーション情報の参照
ref_verバージョン情報の参照

非常に多くのサービスコールが定義されているのがわかります。これら全てを実際覚えるわけではありません。この中でもよく使うサービスコールというものがありますので、それらを中心に順に機能を知っていきましょう。

ITRON仕様書の読み方

ITRONの仕様書は多くのページがあるが、ほとんどがこれらサービスコールに対する仕様が記述されたものである!

使うシーンが来たら対象のサービスコールの説明を参照するという考え方で読めばよい!

ITRONの後継OSであるT-Kernelにおいてサービスコールは「tk_」で始まる名称となっている!

tk_cre_tskといったサービスコール名称となるため、ITRONのサービスコールを覚えておくとT-Kernelのサービスコールを覚えたことになる!

スポンサー

サービスコール名称の規則

サービスコールの名称を眺めると規則性があるのがわかります。ITRON仕様ではサービスコールの名称の付け方にルールを設けています。

2.2 APIの名称に関する原則

標準化されるソフトウェア部品のAPIの名称に持ちるために、その種類を2~4文字程度で表すソフトウェア部品識別名を定める。

2.2.2 サービスコール

カーネルのサービスコールの名称は、xxxで操作の方法、yyyで操作の対象をあらわし、xxx_yyyの形を基本とする。xxx_yyyから派生したサービスコールは、派生したことを表す文字zを付与し、zxxx_yyyの形とする。

例えばcre_tsk(タスク生成)というサービスコールは次の意味で解釈します。

  • creがxxxであり、create(生成)という操作を示す
  • tskがyyyであり、task(タスク)という対象を示す

英語の省略形で表現されるため慣れていない方は、正式な英語と紐づけて記憶してください。このような省略形の英字はサービスコールに限らず、モジュールのインターフェース名称でもよく利用される英字です。

2.2.5 パラメータとリターンパラメータ

「表2-1.uITRON4.0仕様における省略名と元になった英語」に省略形と正式英語の一覧表が記載されている。

特に注意すべき派生系のサービスコール

派生したサービスコールには派生文字zを付与したzxxx_yyyとする、とされています。

特に注意を払うべき派生系サービスコールが「i」の文字が付与されたサービスコールです。このサービスコールは必ず特徴を知っておく必要があります。

派生文字「i」の意味するもの

派生文字「i」とは「interrupt」を意味しています。interruptといえば「割り込み」ですね。

サービスコールの中で「i」が接頭文字となっているものは、割り込みハンドラの中から呼ぶことができるサービスコールです。

逆に言うと「i」が付いていないサービスコールは割り込みハンドラから呼んではなりません。

このルールはものすごく大事なルールであり、ITRONが搭載されたシステムにおいて割り込みを扱うときには、常に頭に入れておく必要があります。油断すると忘れてプログラムが正常に動かないといったことが起きます。

割り込みハンドラを理解していない方は、マイコン入門編の次の記事を参照してください。

「割り込みハンドラから呼ぶことができる」という表現は実は正確ではありません。正確には「割り込みコンテキストから呼ぶことができるサービスコール」が正しい表現です。

現段階では割り込みコンテキストの解説をしていないため、今の段階では割り込みハンドラから呼ぶことができるサービスコールとしてまずは理解してください。

スポンサー

ITRONが定義するオブジェクトの概念と種類

ITRONではオブジェクトというものを利用してプログラミングをします。

オブジェクト指向言語を経験されている方は同じものと捉えてよいでしょう。オブジェクト指向言語を知らない方でも大丈夫です。順に解説していきましょう。

ITRONで定義されるオブジェクトの種類

ITRONでは次のオブジェクトが定義されています。

  • タスク
  • イベントフラグ
  • データキュー
  • メールボックス
  • メッセージバッファ
  • ランデブ
  • 周期ハンドラ
  • アラームハンドラ
  • セマフォ
  • ミューテックス
  • 固定長メモリプール
  • 可変長メモリプール

このようなオブジェクトを利用しながらITRONのシステムは構築します。これらのオブジェクトは全てではありませんが、本カリキュラムで順次解説を行います。

ITRON仕様においてオブジェクトは次のように定義されています。

2.1.3 オブジェクトのID番号とオブジェクト番号

カーネルやソフトウェア部品が捜査対象とする資源をオブジェクトと総称する。オブジェクトは、その種類ごとに番号によって識別する。

オブジェクトとは結局何なのか?

オブジェクトというものがピンと来ていない方もいるでしょう。C言語入門編を実施した方は思い出してください。

オブジェクトとはハンドルのことです。C言語入門編にてファイルハンドルやキャッシュカードに例えたハンドルの解説を行いました。

ハンドルの概要を忘れてしまった方や理解していない方は、次の記事を見ておくとよいでしょう。

ITRON仕様におけるオブジェクトの登録と解除は次のように説明されています。

3.8 オブジェクトの登録とその解除

ID番号で識別されるオブジェクトは、オブジェクトを生成する静的API(CRE_YYY)またはサービスコール(cre_yyy)によってカーネルに登録され、オブジェクトを削除するサービスコール(del_yyy)によってその登録が解除される。

オブジェクト生成時には、生成するオブジェクトのID番号と生成に必要な情報を指定する。オブジェクト削除時には削除するオブジェクトのID番号を指定する。

この説明はハンドルの説明と同じですよね。

識別するための情報が、ハンドルではヒープメモリのポインタでしたが、ITRONのオブジェクトは整数型のIDで管理されています。このような違いはあるものの考え方や使い方はハンドルそのものです。