
μITRONとは、リアルタイムOS(RTOS)の仕様の一つです。μITRONは、旧トロン協会によってAPIの仕様が策定され、現在はトロンフォーラムに管理されています。組み込み機器に要求されるリアルタイム性などの特長を持っています。
TRON(The Real-time Operating system Nucleus)とは
μITRONの前身となるTRON(読み方:トロン)プロジェクトは、東京大学の坂村健教授(当時)が主宰するTRONプロジェクトの派生プロジェクトとして1984年に誕生しました。TRONプロジェクトは組み込み用のリアルタイムアーキテクチャを開発するプロジェクトです。
TRON(読み方:トロン)とは
TRONプロジェクトとは、The Real-time Operating system Nucleusの略。組み込み用のリアルタイムアーキテクチャを開発するプロジェクト
μITRON以外にもBTRON、CTRON、JTRONといった様々な派生プロジェクトが存在しましたが、実質的に現存しているプロジェクトはμITRONだけです。μITRONの’I’はindustrialの略で産業用途向けに策定されたリアルタイムOSです。
- μITRONの前身はTRON
- μITRONの’I’はindustrialの略
- μITRONは産業用途向けに策定されている
μITRON(読み方:マイクロアイトロン)とは、TRONの一系統
μITRON(読み方:マイクロアイトロン)とは、組み込み機器向けのリアルタイムOS(以下、RTOS)の仕様の一つです。
リアルタイムOS(RTOS)とは
リアルタイムOS(RTOS)とは、要求される時間内に処理が実行できるシステム(=リアルタイムシステム)を構築するためのOSのこと。RTOSは、産業ロボットや輸送機械など、主に組み込み機器向けのOSとして使用されている。
RTOSの仕様にはいくつか種類がありますが、そのうちトロンフォーラムが仕様を定めているものの一つに「ITRON」という仕様があります。
μITRONは、そのITRONの一系統です。μITRONの特徴は、API仕様がオープンになっている点です。
μITRONの仕様は全て公開されており、誰でも自由にこの仕様を使ってオリジナルのμITRON仕様のRTOSを作ることができます。このため、様々な企業や団体が開発し、多くの機器に搭載されました。
ポイント
- μITRONは、組み込み機器向けのRTOSの仕様の一つ
- μITRONは、API仕様がオープンになっている
μITRONの4つの特徴
μITRONは、前述の通り、組み込み機器向けのRTOSの仕様です。
このためμITRONは、組み込み機器が要求するいくつかの仕様を満たしている、という特徴があります。
具体的には、μITRONの特徴としては、以下の4つの点があります。
- リアルタイム性を持つ
- マルチタスク実行が可能
- リソースをあまり消費しない
- ハードウェアに依存しない
リアルタイム性を持つ
μITRONの1つ目の特徴は、リアルタイム性を持つことです。
リアルタイム性とは
リアルタイム性とは、要求される期限までに処理を実行できる性質のこと。
組み込み分野では、処理の完了に期限が設定されます。
例えば、自動車に使用されている組み込みシステムを具体例として考えます。自動車には、自動車を制御するためのCPUが多く使用されています。これらのCPUは、エンジンの回転や、噴出するガソリンの量をコントロールします。
この時、もしも自動車のエンジン制御で規定された期限内に処理ができなければ、エンジンの停止が起こるかもしれません。これにより、事故が発生してしまうリスクもあります。
上記のように、多くの組み込み機器は、リアルタイム性を要求します。μITRONは、このようなリアルタイム性を持ち、組み込み機器に要求されるリアルタイム性を担保しています。
マルチタスク実行が可能
μITRONの2つ目の特徴は、マルチタスク実行が可能になることです。
タスクとは
タスクとは、OSが処理するプログラムの最小単位のこと。
マルチタスクとは
マルチタスクとは、複数のタスクを並列して処理するために、CPUを仮想化、多重化すること。
通常はシングルプロセッサシステムでは、1つのCPUにつき1つのタスクしか実行できません。このため、複数の処理を行いたい場合は、一つずつ順番に取り掛かるしかありません。
これに対しマルチタスクでは、複数のタスクを並列して処理できます。これにより、μITRONでは、組み込み機器が要求するリアルタイム性を担保しながら、多くのタスクを処理できるようになります。
リソースをあまり消費しない
μITRONの3つ目の特徴は、リソースをあまり消費しないことです。
多くの組み込み機器は、コストを極力下げるために、マイコンの基板面積や、フラッシュメモリ容量を最小限に抑えています。μITRONは、必要な機能に絞り込んでメモリを最小化することで、メモリ容量や性能に制限のあるマイコンでも搭載できます。
ハードウェアに依存しない
μITRONの4つ目の特徴は、ハードウェアに依存しないことです。
組み込み開発では、CPUや周辺ICの生産中止などに伴い、新しいCPUやICを選定し、ハードウェアを作り直すことがあります。
このため、多くの組み込み機器のプログラムには、移植性の高さが求められます。
μITRONを含むRTOSは、ハードウェアとアプリケーションの間に入り、ハードウェアとソフトウェアのデータ処理の受け渡しを行います。
この時、ハードウェアの違いをRTOSが吸収します。このため、ハードウェアの違いが、上位層のアプリケーションに影響せず、異なるハードウェアであっても同じように動作します。
その結果、移植性の高いプログラムを生成できます。
ポイント
- μITRONはリアルタイム性を持つ
- μITRONはマルチタスク実行が可能
- μITRONはリソースをあまり消費しない
- μITRONはハードウェアに依存しない
現在の仕様はμITRON4.0
μITRONは、全機能を引き継ぐ形でアップデートされており、2021年1月現在の最新仕様は、μITRON4.0となっています。
μITRON4.0の機能
μITRONは、具体的に以下の機能を持っています。
タスク管理機能(タスクスケジューリング) | タスクの実行順序を制御する機能 |
タスク付属同期機能 | タスクの状態を直接操作することによって同期する機能 |
同期・通信機能 | タスクとは独立した同期機能。セマフォ、イベントフラグ、メールボックスを含む |
割込み管理機能 | 外部割込みとCPU例外を対象に割込みハンドラを定義する機能 |
時間管理機能 | 時間に依存した処理を行う機能。システム時刻管理、周期ハンドラ、アラームハンドラを含む |
メモリ管理機能(メモリプール) | メモリプールの管理やメモリブロックの割当てを行う機能 |
システム状態管理機能 | システム全体の状態を設定・参照する機能 |
μITRON・Linux・Windowsの違い
μITRON・Linux・Windowsの違い・比較表
ここまでμITRONを紹介してきましたが、汎用OSとはどのような違いがあるのでしょうか。
μITRON・Linux・Windowsは、元々利用される目的が異なっていました。簡単に言えば、μITRONは機械を制御するOS、Windowsは人が機械を制御(man machine)するOS、Linux(Unix)はデータを処理するOSです。
以下の表が、μITRONと汎用OSであるLinuxやWindowsとの比較となります。
μITRON | Linux | Windows | |
---|---|---|---|
メモリ使用量 | 数Kバイト~1Mバイト | 数Mバイト~数十Mバイト | 数Mバイト~数十Mバイト |
利用できるCPU | 16bit〜64bit | 32bit以上 | 32bit以上 |
ライブラリ | 少ない | 豊富 | 豊富 |
リアルタイム性能 | 高い | 低い | 低い |
利用目的 | 機械を制御 | 人が機械を制御 | データを処理 |
詳細については、以下の記事をご覧ください。
μITRONのシステムコール(サービスコール)一覧
次に、μITRONのシステムコールを見ていきます。
システムコールとは
実行中のプログラムがOSの機能を呼び出すために使用する仕組みのこと。また、その命令や関数などのAPIを指す。
μITRON4.0仕様では、このシステムコールのことを「サービスコール」と呼びます。
μITRON4.0のシステムコールは、トロンフォーラムが公開している「μITRON 4.0仕様書」で確認できます。
μITRON4.0のシステムコールは、以下の通りです。
タスク管理機能
ER ercd = cre_tsk ( ID tskid, T_CTSK *pk_ctsk ) ;
ER_ID tskid = acre_tsk ( T_CTSK *pk_ctsk ) ;
ER ercd = del_tsk ( ID tskid ) ;
ER ercd = act_tsk ( ID tskid ) ;
ER ercd = iact_tsk ( ID tskid ) ;
ER_UINT actcnt = can_act ( ID tskid ) ;
ER ercd = sta_tsk ( ID tskid, VP_INT stacd ) ;
void ext_tsk ( ) ;
void exd_tsk ( ) ;
ER ercd = ter_tsk ( ID tskid ) ;
ER ercd = chg_pri ( ID tskid, PRI tskpri ) ;
ER ercd = get_pri ( ID tskid, PRI *p_tskpri ) ;
ER ercd = ref_tsk ( ID tskid, T_RTSK *pk_rtsk ) ;
ER ercd = ref_tst ( ID tskid, T_RTST *pk_rtst ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)321ページ
タスク付属同期機能
ER ercd = slp_tsk ( ) ;
ER ercd = tslp_tsk ( TMO tmout ) ;
ER ercd = wup_tsk ( ID tskid ) ;
ER ercd = iwup_tsk ( ID tskid ) ;
ER_UINT wupcnt = can_wup ( ID tskid ) ;
ER ercd = rel_wai ( ID tskid ) ;
ER ercd = irel_wai ( ID tskid ) ;
ER ercd = sus_tsk ( ID tskid ) ;
ER ercd = rsm_tsk ( ID tskid ) ;
ER ercd = frsm_tsk ( ID tskid ) ;
ER ercd = dly_tsk ( RELTIM dlytim ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)321ページ
タスク例外処理機能
ER ercd = def_tex ( ID tskid, T_DTEX *pk_dtex ) ;
ER ercd = ras_tex ( ID tskid, TEXPTN rasptn ) ;
ER ercd = iras_tex ( ID tskid, TEXPTN rasptn ) ;
ER ercd = dis_tex ( ) ;
ER ercd = ena_tex ( ) ;
BOOL state = sns_tex ( ) ;
ER ercd = ref_tex ( ID tskid, T_RTEX *pk_rtex ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)321ページ
同期・通信機能
セマフォ
ER ercd = cre_sem ( ID semid, T_CSEM *pk_csem ) ;
ER_ID semid = acre_sem ( T_CSEM *pk_csem ) ;
ER ercd = del_sem ( ID semid ) ;
ER ercd = sig_sem ( ID semid ) ;
ER ercd = isig_sem ( ID semid ) ;
ER ercd = wai_sem ( ID semid ) ;
ER ercd = pol_sem ( ID semid ) ;
ER ercd = twai_sem ( ID semid, TMO tmout ) ;
ER ercd = ref_sem ( ID semid, T_RSEM *pk_rsem ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)322ページ
イベントフラグ
ER ercd = cre_flg ( ID flgid, T_CFLG *pk_cflg ) ;
ER_ID flgid = acre_flg ( T_CFLG *pk_cflg ) ;
ER ercd = del_flg ( ID flgid ) ;
ER ercd = set_flg ( ID flgid, FLGPTN setptn ) ;
ER ercd = iset_flg ( ID flgid, FLGPTN setptn ) ;
ER ercd = clr_flg ( ID flgid, FLGPTN clrptn ) ;
ER ercd = wai_flg ( ID flgid, FLGPTN waiptn, MODE wfmode,
FLGPTN *p_flgptn ) ;
ER ercd = pol_flg ( ID flgid, FLGPTN waiptn, MODE wfmode,
FLGPTN *p_flgptn ) ;
ER ercd = twai_flg ( ID flgid, FLGPTN waiptn, MODE wfmode,
FLGPTN *p_flgptn, TMO tmout ) ;
ER ercd = ref_flg ( ID flgid, T_RFLG *pk_rflg ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)322ページ
データキュー
ER ercd = cre_dtq ( ID dtqid, T_CDTQ *pk_cdtq ) ;
ER_ID dtqid = acre_dtq ( T_CDTQ *pk_cdtq ) ;
ER ercd = del_dtq ( ID dtqid ) ;
ER ercd = snd_dtq ( ID dtqid, VP_INT data ) ;
ER ercd = psnd_dtq ( ID dtqid, VP_INT data ) ;
ER ercd = ipsnd_dtq ( ID dtqid, VP_INT data ) ;
ER ercd = tsnd_dtq ( ID dtqid, VP_INT data, TMO tmout ) ;
ER ercd = fsnd_dtq ( ID dtqid, VP_INT data ) ;
ER ercd = ifsnd_dtq ( ID dtqid, VP_INT data ) ;
ER ercd = rcv_dtq ( ID dtqid, VP_INT *p_data ) ;
ER ercd = prcv_dtq ( ID dtqid, VP_INT *p_data ) ;
ER ercd = trcv_dtq ( ID dtqid, VP_INT *p_data, TMO tmout ) ;
ER ercd = ref_dtq ( ID dtqid, T_RDTQ *pk_rdtq ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)322ページ
メールボックス
ER ercd = cre_mbx ( ID mbxid, T_CMBX *pk_cmbx ) ;
ER_ID mbxid = acre_mbx ( T_CMBX *pk_cmbx ) ;
ER ercd = del_mbx ( ID mbxid ) ;
ER ercd = snd_mbx ( ID mbxid, T_MSG *pk_msg ) ;
ER ercd = rcv_mbx ( ID mbxid, T_MSG **ppk_msg ) ;
ER ercd = prcv_mbx ( ID mbxid, T_MSG **ppk_msg ) ;
ER ercd = trcv_mbx ( ID mbxid, T_MSG **ppk_msg, TMO tmout ) ;
ER ercd = ref_mbx ( ID mbxid, T_RMBX *pk_rmbx ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)322ページ
メッセージバッファ
ER ercd = cre_mbf ( ID mbfid, T_CMBF *pk_cmbf ) ;
ER_ID mbfid = acre_mbf ( T_CMBF *pk_cmbf ) ;
ER ercd = del_mbf ( ID mbfid ) ;
ER ercd = snd_mbf ( ID mbfid, VP msg, UINT msgsz ) ;
ER ercd = psnd_mbf ( ID mbfid, VP msg, UINT msgsz ) ;
ER ercd = tsnd_mbf ( ID mbfid, VP msg, UINT msgsz, TMO tmout ) ;
ER_UINT msgsz = rcv_mbf ( ID mbfid, VP msg ) ;
ER_UINT msgsz = prcv_mbf ( ID mbfid, VP msg ) ;
ER_UINT msgsz = trcv_mbf ( ID mbfid, VP msg, TMO tmout ) ;
ER ercd = ref_mbf ( ID mbfid, T_RMBF *pk_rmbf ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)323ページ
ランデブ
ER ercd = cre_por ( ID porid, T_CPOR *pk_cpor ) ;
ER_ID porid = acre_por ( T_CPOR *pk_cpor ) ;
ER ercd = del_por ( ID porid ) ;
ER_UINT rmsgsz = cal_por ( ID porid, RDVPTN calptn, VP msg,
UINT cmsgsz ) ;
ER_UINT rmsgsz = tcal_por ( ID porid, RDVPTN calptn, VP msg,
UINT cmsgsz, TMO tmout ) ;
ER_UINT cmsgsz = acp_por ( ID porid, RDVPTN acpptn, RDVNO *p_rdvno,
VP msg ) ;
ER_UINT cmsgsz = pacp_por ( ID porid, RDVPTN acpptn,
RDVNO *p_rdvno, VP msg ) ;
ER_UINT cmsgsz = tacp_por ( ID porid, RDVPTN acpptn,
RDVNO *p_rdvno, VP msg, TMO tmout ) ;
ER ercd = fwd_por ( ID porid, RDVPTN calptn, RDVNO rdvno, VP msg,
UINT cmsgsz ) ;
ER ercd = rpl_rdv ( RDVNO rdvno, VP msg, UINT rmsgsz ) ;
ER ercd = ref_por ( ID porid, T_RPOR *pk_rpor ) ;
ER ercd = ref_rdv ( RDVNO rdvno, T_RRDV *pk_rrdv ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)323ページ
メモリプール管理機能
固定長メモリプール
ER ercd = cre_mpf ( ID mpfid, T_CMPF *pk_cmpf ) ;
ER_ID mpfid = acre_mpf ( T_CMPF *pk_cmpf ) ;
ER ercd = del_mpf ( ID mpfid ) ;
ER ercd = get_mpf ( ID mpfid, VP *p_blk ) ;
ER ercd = pget_mpf ( ID mpfid, VP *p_blk ) ;
ER ercd = tget_mpf ( ID mpfid, VP *p_blk, TMO tmout ) ;
ER ercd = rel_mpf ( ID mpfid, VP blk ) ;
ER ercd = ref_mpf ( ID mpfid, T_RMPF *pk_rmpf ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)324ページ
可変長メモリプール
ER ercd = cre_mpl ( ID mplid, T_CMPL *pk_cmpl ) ;
ER_ID mplid = acre_mpl ( T_CMPL *pk_cmpl ) ;
ER ercd = del_mpl ( ID mplid ) ;
ER ercd = get_mpl ( ID mplid, UINT blksz, VP *p_blk ) ;
ER ercd = pget_mpl ( ID mplid, UINT blksz, VP *p_blk ) ;
ER ercd = tget_mpl ( ID mplid, UINT blksz, VP *p_blk, TMO tmout ) ;
ER ercd = rel_mpl ( ID mplid, VP blk ) ;
ER ercd = ref_mpl ( ID mplid, T_RMPL *pk_rmpl ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)324ページ
時間管理機能
システム時刻管理
ER ercd = set_tim ( SYSTIM *p_systim ) ;
ER ercd = get_tim ( SYSTIM *p_systim ) ;
ER ercd = isig_tim ( ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)324ページ
周期ハンドラ
ER ercd = cre_cyc ( ID cycid, T_CCYC *pk_ccyc ) ;
ER_ID cycid = acre_cyc ( T_CCYC *pk_ccyc ) ;
ER ercd = del_cyc ( ID cycid ) ;
ER ercd = sta_cyc ( ID cycid ) ;
ER ercd = stp_cyc ( ID cycid ) ;
ER ercd = ref_cyc ( ID cycid, T_RCYC *pk_rcyc ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)324ページ
周期ハンドラ
ER ercd = cre_cyc ( ID cycid, T_CCYC *pk_ccyc ) ;
ER_ID cycid = acre_cyc ( T_CCYC *pk_ccyc ) ;
ER ercd = del_cyc ( ID cycid ) ;
ER ercd = sta_cyc ( ID cycid ) ;
ER ercd = stp_cyc ( ID cycid ) ;
ER ercd = ref_cyc ( ID cycid, T_RCYC *pk_rcyc ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)324ページ
アラームハンドラ
ER ercd = cre_alm ( ID almid, T_CALM *pk_calm ) ;
ER_ID almid = acre_alm ( T_CALM *pk_calm ) ;
ER ercd = del_alm ( ID almid ) ;
ER ercd = sta_alm ( ID almid, RELTIM almtim ) ;
ER ercd = stp_alm ( ID almid ) ;
ER ercd = ref_alm ( ID almid, T_RALM *pk_ralm ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)324ページ
オーバランハンドラ
ER ercd = def_ovr ( T_DOVR *pk_dovr ) ;
ER ercd = sta_ovr ( ID tskid, OVRTIM ovrtim ) ;
ER ercd = stp_ovr ( ID tskid ) ;
ER ercd = ref_ovr ( ID tskid, T_ROVR *pk_rovr ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)325ページ
システム状態管理機能
ER ercd = rot_rdq ( PRI tskpri ) ;
ER ercd = irot_rdq ( PRI tskpri ) ;
ER ercd = get_tid ( ID *p_tskid ) ;
ER ercd = iget_tid ( ID *p_tskid ) ;
ER ercd = loc_cpu ( ) ;
ER ercd = iloc_cpu ( ) ;
ER ercd = unl_cpu ( ) ;
ER ercd = iunl_cpu ( ) ;
ER ercd = dis_dsp ( ) ;
ER ercd = ena_dsp ( ) ;
BOOL state = sns_ctx ( ) ;
BOOL state = sns_loc ( ) ;
BOOL state = sns_dsp ( ) ;
BOOL state = sns_dpn ( ) ;
ER ercd = ref_sys ( T_RSYS *pk_rsys ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)325ページ
割込み管理機能
ER ercd = def_inh ( INHNO inhno, T_DINH *pk_dinh ) ;
ER ercd = cre_isr ( ID isrid, T_CISR *pk_cisr ) ;
ER_ID isrid = acre_isr ( T_CISR *pk_cisr ) ;
ER ercd = del_isr ( ID isrid ) ;
ER ercd = ref_isr ( ID isrid, T_RISR *pk_risr ) ;
ER ercd = dis_int ( INTNO intno ) ;
ER ercd = ena_int ( INTNO intno ) ;
ER ercd = chg_ixx ( IXXXX ixxxx ) ;
ER ercd = get_ixx ( IXXXX *p_ixxxx ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)325ページ
サービスコール管理機能
ER ercd = def_svc ( FN fncd, T_DSVC *pk_dsvc ) ;
ER_UINT ercd = cal_svc ( FN fncd, VP_INT par1, VP_INT par2, …) ;
出典:μITRON4.0仕様書(Ver.4.03.03)325ページ
システム構成管理機能
ER ercd = def_exc ( EXCNO excno, T_DEXC *pk_dexc ) ;
ER ercd = ref_cfg ( T_RCFG *pk_rcfg ) ;
ER ercd = ref_ver ( T_RVER *pk_rver ) ;
出典:μITRON4.0仕様書(Ver.4.03.03)326ページ
ITRON・μITRONのシェア
以下は、トロンフォーラムが行った「2019年度組み込みシステムにおけるリアルタイムOSの利用動向に関するアンケート調査報告書」の結果です。
出典:組み込みOSのAPIはTRON系OSがシェア60%、24年連続トップ
μITRONを含むITRON仕様のRTOSが1位であり、45%のシェアを占めています。
ITRONは、以下の2つのメリットがあります。
- OSの仕様が特定の会社の利益や特定の国の政策に縛られない
- 仕様がオープンになっているため利用者が手を加えられる
このため、シェアがトップであると考えられます。
μITRONはなぜ使い続けられているのか?
μITRON仕様のRTOSは、登場からすでに35年以上を経過していますが、いまだに多くの機器で採用されています。それはなぜでしょうか?
RTOSのコア部分であるカーネルの機能は小さく、たとえCPUが高性能化されても、ソフトウェアの動作原理は変わりません。したがってカーネル部分の構造を大きく変える必要がありません。
周辺デバイスは新しい仕様のものが逐次登場していますが、こちらはカーネルではなくデバイスドライバやミドルウェアのサポートによって対応しています。このため、カーネルはほとんど同じ仕様で長く使うことができます。
また、マルチコア対応のCPUが増えたことで、μITRONのRTOSを複数のコアで動作させたり、Linuxを共存させるマルチOSなども登場しています。
以上のことから、μITRONが使い続けられている理由は、以下の通りです。
- CPUを高性能化しても、カーネル部分の構造を大きく変える必要がない
- 周辺デバイスを変更しても、カーネルはほとんど同じ仕様で長く使用できる
μITRON仕様ベースのOS一覧
μITRON仕様ベースに準拠した主なRTOSの種類として、以下が挙げられます。
- UDEOS4/Lite
- TOPPERS/JSP カーネル
- μC3(マイクロ・シー・キューブ)/Compact(弊社製品)
- μC3(マイクロ・シー・キューブ)/Standard(弊社製品)
- μC3(マイクロ・シー・キューブ)/Standard+M(弊社製品)
- μC3(マイクロ・シー・キューブ)+Linux(弊社製品)