ngki̲spec‑120.txt

page 1

TOPPERS新世代カーネル統合仕様書
バージョン: Release 1.2.0
最終更新: 2010年5月10日
このドキュメントは，TOPPERS新世代カーネルに属する一連のリアルタイムカー
ネルの仕様を，統合的に記述するものである．現時点で，TOPPERS/ASPカーネルとTOPPERS/FMPカーネルの仕様に関しては記述が完成しているが，未完成部分も残っている．特に動的生成対応カーネルについては，仕様検討が不十分なところが多い．なお，本文中から参照している図は，ファイルの最後にまとめて掲載してある．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
TOPPERS New Generation Kernel Specification
Copyright (C) 2006‑2010 by Embedded and Real‑Time Systems Laboratory
Graduate School of Information Science, Nagoya Univ., JAPANCopyright (C) 2006‑2010 by TOPPERS Project, Inc., JAPAN
上記著作権者は，以下の (1)〜(3) の条件を満たす場合に限り，本ドキュメ
ント（本ドキュメントを改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
(1) 本ドキュメントを利用する場合には，上記の著作権表示，この利用条件
および下記の無保証規定が，そのままの形でドキュメント中に含まれていること．
(2) 本ドキュメントを改変する場合には，ドキュメントを改変した旨の記述
を，改変後のドキュメント中に含めること．ただし，改変後のドキュメ
ントが，TOPPERSプロジェクト指定の開発成果物である場合には，この限りではない．
(3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．また，本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
本ドキュメントは，無保証で提供されているものである．上記著作権者およびTOPPERSプロジェクトは，本ドキュメントに関して，特定の使用目的に対する適合性も含めて，いかなる保証も行わない．また，本ドキュメントの利用により直接的または間接的に生じたいかなる損害に関しても，その責任を負わない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑○目次
第１章 TOPPERS新世代カーネルの概要
1.1 TOPPERS新世代カーネル仕様の位置付け
1.2 TOPPERS新世代カーネル仕様の設計方針
1.3 TOPPERS/ASPカーネルの適用対象領域と仕様設計方針
1.4 TOPPERS/FMPカーネルの適用対象領域と仕様設計方針
1.5 TOPPERS/HRP2カーネルの適用対象領域と仕様設計方針
1.6 TOPPERS/ASP Safetyカーネルの適用対象領域と仕様設計方針
第２章 主要な概念と共通定義
2.1 仕様の位置付け
2.1.1 カーネルの機能セット
2.1.2 ターゲット非依存の規定とターゲット定義の規定

ngki̲spec‑120.txt

page 22.1.3 想定するソフトウェア構成
2.1.4 想定するハードウェア構成
2.1.5 想定するプログラミング言語
2.2 APIの構成要素とコンベンション
2.2.1 APIの構成要素
2.2.2 パラメータとリターンパラメータ
2.2.3 返値とエラーコード
2.2.4 機能コード
2.2.5 ヘッダファイル
2.3 主な概念
2.3.1 オブジェクトと処理単位
2.3.2 サービスコールとパラメータ
2.3.3 保護機能
2.3.4 マルチプロセッサ対応
2.3.5 その他
2.4 処理単位の種類と実行
2.4.1 処理単位の種類
2.4.2 処理単位の実行順序
2.4.3 カーネル処理の不可分性
2.4.4 処理単位を実行するプロセッサ
2.5 システム状態とコンテキスト
2.5.1 カーネル動作状態と非動作状態
2.5.2 タスクコンテキストと非タスクコンテキスト
2.5.3 カーネルの振舞いに影響を与える状態
2.5.4 全割込みロック状態と全割込みロック解除状態
2.5.5 CPUロック状態とCPUロック解除状態
2.5.6 割込み優先度マスク
2.5.7 ディスパッチ禁止状態とディスパッチ許可状態
2.5.8 ディスパッチ保留状態
2.5.9 カーネル管理外の状態
2.5.10 処理単位とシステム状態
2.6 タスクの状態遷移とスケジューリング規則
2.6.1 基本的なタスク状態
2.6.2 タスクの状態遷移
2.6.3 タスクのスケジューリング規則
2.6.4 待ち行列と待ち解除の順序
2.6.5 タスク例外処理マスク状態と待ち禁止状態
2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち
2.7 割込み処理モデル
2.7.1 割込み処理の流れ
2.7.2 割込み優先度
2.7.3 割込み要求ラインの属性
2.7.4 割込みを受け付ける条件
2.7.5 割込み番号と割込みハンドラ番号
2.7.6 マルチプロセッサにおける割込み処理
2.7.7 カーネル管理外の割込み
2.7.8 カーネル管理外の割込みの設定方法
2.8 CPU例外処理モデル
2.8.1 CPU例外処理の流れ
2.8.2 CPU例外ハンドラから呼び出せるサービスコール
2.8.3 エミュレートされたCPU例外ハンドラ
2.8.4 カーネル管理外のCPU例外
2.9 システムの初期化と終了
2.9.1 システム初期化手順
2.9.2 システム終了手順
2.10 オブジェクトの登録とその解除
2.10.1 ID番号で識別するオブジェクト
2.10.2 オブジェクト番号で識別するオブジェクト

ngki̲spec‑120.txt

page 32.10.3 識別番号を持たないオブジェクト
2.10.4 オブジェクト生成に必要なメモリ領域
2.10.5 オブジェクトが属する保護ドメインの設定
2.10.6 オブジェクトが属するクラスの設定
2.11 オブジェクトのアクセス保護2.11.1 オブジェクトのアクセス保護とアクセス違反の通知
2.11.2 メモリオブジェクトに対するアクセス許可ベクタの制限
2.11.3 デフォルトのアクセス許可ベクタ
2.11.4 アクセス許可ベクタの設定
2.11.5 カーネルの管理領域のアクセス保護2.11.6 ユーザタスクのユーザスタック領域
2.12 システムコンフィギュレーション手順
2.12.1 システムコンフィギュレーションファイル
2.12.2 静的APIの文法とパラメータ
2.12.3 保護ドメインの指定
2.12.4 クラスの指定
2.12.5 コンフィギュレータの処理モデル
2.12.6 静的APIのパラメータに関するエラー検出
2.12.7 オブジェクトのID番号の指定
2.13 TOPPERSネーミングコンベンション
2.13.1 モジュール識別名
2.13.2 データ型名
2.13.3 関数名
2.13.4 変数名
2.13.5 定数名
2.13.6 マクロ名
2.13.7 静的API名
2.13.8 ファイル名
2.13.9 モジュール内部の名称の衝突回避
2.14 TOPPERS共通定義
2.14.1 TOPPERS共通ヘッダファイル
2.14.2 TOPPERS共通データ型
2.14.3 TOPPERS共通定数2.14.4 TOPPERS共通エラーコード
2.14.5 TOPPERS共通マクロ2.14.6 TOPPERS共通構成マクロ
2.15 カーネル共通定義
2.15.1 カーネルヘッダファイル
2.15.2 カーネル共通定数2.15.3 カーネル共通マクロ2.15.4 カーネル共通構成マクロ
第３章 システムインタフェースレイヤAPI仕様
3.1 システムインタフェースレイヤの概要
3.2 SILヘッダファイル
3.3 全割込みロック状態の制御
3.4 スピンロック
3.5 微少時間待ち
3.6 エンディアンの取得
3.7 メモリ空間アクセス関数
3.8 I/O空間アクセス関数
3.9 プロセッサIDの参照
第４章 カーネルAPI仕様
4.1 タスク管理機能
4.2 タスク付属同期機能

ngki̲spec‑120.txt

page 4

4.3 タスク例外処理機能
4.4 同期・通信機能
4.4.1 セマフォ
4.4.2 イベントフラグ
4.4.3 データキュー
4.4.4 優先度データキュー
4.4.5 メールボックス
4.4.6 ミューテックス
4.4.7 メッセージバッファ（☆未完成）
4.4.8 スピンロック
4.5 メモリプール管理機能
4.5.1 固定長メモリプール
4.6 時間管理機能
4.6.1 システム時刻管理
4.6.2 周期ハンドラ
4.6.3 アラームハンドラ
4.6.4 オーバランハンドラ
4.7 システム状態管理機能
4.8 メモリオブジェクト管理機能
4.9 割込み管理機能
4.10 CPU例外管理機能
4.11 拡張サービスコール管理機能
4.12 システム構成管理機能
第５章 リファレンス
5.1 サービスコール一覧
5.2 静的API一覧
5.3 データ型
5.3.1 TOPPERS共通データ型
5.3.2 カーネルの使用するデータ型
5.3.3 カーネルの使用するパケット形式
5.4 定数とマクロ
5.4.1 TOPPERS共通定数5.4.2 TOPPERS共通マクロ5.4.3 カーネル共通定数5.4.4 カーネル共通マクロ5.4.5 カーネルの機能毎の定数
5.4.6 カーネルの機能毎のマクロ
5.5 構成マクロ5.5.1 TOPPERS共通構成マクロ
5.5.2 カーネル共通構成マクロ
5.5.3 カーネルの機能毎の構成マクロ
5.6 エラーコード一覧
5.7 機能コード一覧
5.8 カーネルオブジェクトに対するアクセスの種別
5.9 省略名の元になった英語
5.9.1 サービスコールと静的APIの名称の中のxxxの元になった英語
5.9.2 サービスコールと静的APIの名称の中のyyyの元になった英語
5.9.3 サービスコールの名称の中のzの元になった英語

第１章 TOPPERS新世代カーネルの概要
TOPPERS新世代カーネルとは，TOPPERSプロジェクトにおいてITRON仕様をベースとして開発している一連のリアルタイムカーネルの総称である．この章では，
TOPPERS新世代カーネル仕様の位置付けと設計方針，それに属する各カーネルの適用対象領域と設計方針について述べる．

ngki̲spec‑120.txt

page 5

1.1 TOPPERS新世代カーネル仕様の位置付け
TOPPERSプロジェクトでは，2000年に公開したTOPPERS/JSPカーネルを始めとして，μITRON4.0仕様およびその保護機能拡張（μITRON4.0/PX仕様）に準拠した
リアルタイムカーネルを開発してきた．
μITRON4.0仕様は1999年に，μITRON4.0/PX仕様は2002年に公表されたが，それ以降現在までの間に，大きな仕様改訂は実施されていない．その間に，組込みシステムおよびソフトウェアのますますの大規模化・複雑化，これまで以上に高い信頼性・安全性に対する要求，小さい消費エネルギー下での高い性能要求など，組込みシステム開発を取り巻く状況は刻々変化している．リアルタイム
カーネルに対しても，マルチプロセッサへの対応，発展的な保護機能のサポー
ト，機能安全対応，省エネルギー制御機能のサポートなど，新しい要求が生じている．
TOPPERSプロジェクトでは，リアルタイムカーネルに対するこのような新しい要求に対応するために，μITRON4.0仕様を発展させる形で，TOPPERS新世代カーネ
ル仕様を策定することになった．
ただし，ITRON仕様が，各社が開発するリアルタイムカーネルを標準化することを目的に，リアルタイムカーネルの「標準仕様」を規定することを目指しているのに対して，TOPPERS新世代カーネル仕様は，TOPPERSプロジェクトにおいて開発している一連のリアルタイムカーネルの「実装仕様」を記述するものであり，ITRON仕様とは異なる目的・位置付けを持つものである．
1.2 TOPPERS新世代カーネル仕様の設計方針
TOPPERS新世代カーネル仕様を設計するにあたり，次の方針を設定する．
(1) μITRON4.0仕様をベースに拡張・改良を加える
TOPPERS新世代カーネル仕様は，多くの技術者の尽力により作成され，多くの実
装・使用実績があるμITRON4.0仕様をベースとする．ただし，μITRON4.0仕様の策定時以降の状況の変化を考慮し，μITRON4.0仕様で不十分と考えられる点については積極的に拡張・改良する．μITRON4.0仕様への準拠性にはこだわらない．
(2) ソフトウェアの再利用性を重視する
μITRON4.0仕様の策定時点と比べると，組込みソフトウェアの大規模化が進展している一方で，ハードウェアの性能向上も著しい．そのため，ソフトウェアの再利用性を向上させるためには，少々のオーバヘッドは許容される状況にある．
そこで，TOPPERS新世代カーネル仕様では，μITRON4.0仕様においてオーバヘッ
ド削減のために実装定義または実装依存としていたような項目についても，ター
ゲットシステムに依存する項目とするのではなく，強く規定する方針とする．
(3) 高信頼・安全なシステム構築を支援する
TOPPERS新世代カーネル仕様は，高信頼・安全な組込みシステム構築を支援するものとする．
安全性の面では，アプリケーションプログラムに問題がある場合でも，リーゾ
ナブルなオーバヘッドでそれを救済できるなら，救済するような仕様とする．
また，アプリケーションプログラムの誤動作を検出する機能や，システムの自
己診断のための機能についても，順次取り込んでいく．

ngki̲spec‑120.txt

page 6(4) アプリケーションシステム構築に必要な機能は積極的に取り込む
上記の方針を満たした上で，多くのアプリケーションシステムに共通に必要となる機能については，積極的にカーネルに取り込む．
カーネル単体の信頼性を向上させるためには，カーネルの機能は少なくした方が楽である．しかし，アプリケーションシステム構築に必要となる機能は，カーネルがサポートしていなければアプリケーションプログラムで実現しなければならず，システム全体の信頼性を考えると，多くのアプリケーションシステムに共通に必要となる機能については，カーネルに取り込んだ方が有利である．
1.3 TOPPERS/ASPカーネルの適用対象領域と仕様設計方針
TOPPERS/ASPカーネル（ASPは，Advanced Standard Profileの略．以下，ASPカーネル）は，TOPPERS新世代カーネルの基盤となるリアルタイムカーネルである．
保護機能を持ったカーネルやマルチプロセッサ対応のカーネルは，ASPカーネルを拡張する形で開発する．
ASPカーネルは，20年以上に渡るITRON仕様の技術開発成果をベースとして，完成度の高いリアルタイムカーネルを実現するものである．完成度を高めるという観点から，カーネル本体の仕様については，枯れた技術で実装できる範囲に留める．
ASPカーネルの主な適用対象は，高い信頼性・安全性・リアルタイム性を要求される組込みシステムとする．ソフトウェア規模の面では，プログラムサイズ（バイナリコード）が数十KB〜1MB程度のシステムを主な適用対象とする．それより大規模なシステムには，保護機能を持ったリアルタイムカーネルを適用すべきと考えられる．
ASPカーネルの機能は，カーネル内で動的なメモリ管理が不要な範囲に留める．
これは，高い信頼性・安全性・リアルタイム性を要求される組込みシステムでは，システム稼働中に発生するメモリ不足への対処が難しいためである．この方針から，カーネルオブジェクトは静的に生成することとし，動的なオブジェ
クト生成機能は設けない．ただし，アプリケーションプログラムが動的なメモ
リ管理をするためのカーネル機能である固定長メモリプール機能はサポートする．
1.4 TOPPERS/FMPカーネルの適用対象領域と仕様設計方針
TOPPERS/FMPカーネル（FMPは，Flexible Multiprocessor Profileの略．以下，
FMPカーネル）は，ASPカーネルを，マルチプロセッサ対応に拡張したリアルタ
イムカーネルである．
FMPカーネルの適用対象となるターゲットハードウェアは，ホモジニアスなマル
チプロセッサシステムである．各プロセッサが全く同一のものである必要はな
いが，すべてのプロセッサでバイナリコードを共有することから，同じバイナ
リコードを実行できることが必要である．
FMPカーネルでは，タスクを実行するプロセッサを静的に決定するのが基本であり，カーネルは自動的に負荷分散する機能を持たないが，タスクをマイグレー
ションさせるサービスコールを備えている．これを用いて，アプリケーション
で動的な負荷分散を実現することが可能である．
FMPカーネルの機能は，ASPカーネルと同様に，カーネル内で動的なメモリ管理が不要な範囲に留める．
1.5 TOPPERS/HRP2カーネルの適用対象領域と仕様設計方針

ngki̲spec‑120.txt

page 7

TOPPERS/HRP2カーネル（HRPは，High Reliable system Profileの略．2はバー
ジョン番号を示す．以下，HRP2カーネル）は，さらに高い信頼性・安全性を要求される組込みシステムや，より大規模な組込みシステム向けに適用できるよ
うに，ASPカーネルを拡張したリアルタイムカーネルである．
HRP2カーネルの適用対象となるターゲットハードウェアは，特権モードと非特権モードを備え，メモリ保護のためにMMU（Memory Management Unit）またはMPU（Memory Protection Unit）を持つプロセッサを用いたシステムである．
HRP2カーネルの主な適用対象は，ソフトウェア規模の面では，プログラムサイズ（バイナリコード）が数百KB以上のシステムである．
HRP2カーネルの機能は，ASPカーネルと同様に，カーネル内で動的なメモリ管理が不要な範囲に留める．具体的には，ASPカーネルに対して，メモリ保護機能とオブジェクトアクセス保護機能，拡張サービスコール機能，ミューテックス機
能，オーバランハンドラ機能を追加し，メールボックス機能を削除している．
1.6 TOPPERS/ASP Safetyカーネルの適用対象領域と仕様設計方針
TOPPERS/ASP Safetyカーネル（以下，ASP Safetyカーネル）は，小規模な安全関連システムに用いるために，ASPカーネルの機能を徹底的な検証が可能な範囲にサブセット化したものである．メールボックスのように安全性の観点から問題のある機能や，タスク例外処理機能のように使用頻度に比べて検証にコストのかかる機能はサポートしない．
ASP Safetyカーネルの主な適用対象は，特に高い安全性を要求される組込みシ
ステムとする．ソフトウェア規模の面では，プログラムサイズ（バイナリコー
ド）が数十KB〜1MB程度のシステムを主な適用対象とする．それより大規模なシステムには，保護機能を持ったカーネルを適用すべきと考えられる．

第２章 主要な概念と共通定義
2.1 仕様の位置付け
この仕様は，TOPPERS新世代カーネルに属する各カーネルの仕様を，統合的に記述することを目標としている．また，TOPPERS新世代カーネル上で動作する各種のシステムサービスに共通に適用される事項についても規定する．
2.1.1 カーネルの機能セット
TOPPERS新世代カーネルは，ASPカーネルをベースとして，保護機能，マルチプ
ロセッサ，カーネルオブジェクトの動的生成，機能安全などに対応した一連のカーネルで構成される．
この仕様では，TOPPERS新世代カーネルを構成する一連のカーネルの仕様を統合的に記述するが，言うまでもなく，カーネルの種類によってサポートする機能は異なる．サポートする機能をカーネルの種類毎に記述する方法もあるが，カーネルの種類はユーザ要求に対応して増える可能性もあり，その度に仕様書を修正するのは得策ではない．
そこでこの仕様では，サポートする機能を，カーネルの種類毎ではなく，カーネルの対応する機能セット毎に記述する．具体的には，保護機能を持ったカーネルを保護機能対応カーネル，マルチプロセッサに対応したカーネルをマルチプロセッサ対応カーネル，カーネルオブジェクトの動的生成機能を持ったカー
ネルを動的生成対応カーネルと呼ぶことにする．
【TOPPERS/ASPカーネルにおける規定】

ngki̲spec‑120.txt

page 8ASPカーネルは，保護機能対応カーネル，マルチプロセッサ対応カーネル，動的生成対応カーネルのいずれでもない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルは，マルチプロセッサ対応カーネルであり，保護機能対応カーネル，
動的生成対応カーネルではない．
【TOPPERS/HRP2カーネルにおける規定】
HRP2カーネルは，保護機能対応カーネルであり，マルチプロセッサ対応カーネ
ル，動的生成対応カーネルではない．
【μITRON4.0仕様，μITRON4.0/PX仕様との関係】
μITRON4.0仕様は，カーネルオブジェクトの動的生成機能を持っているが，保護機能を持っておらず，マルチプロセッサにも対応していない．μITRON4.0/PX
仕様は，μITRON4.0仕様に対して保護機能を追加するための仕様であり，カー
ネルオブジェクトの動的生成機能と保護機能を持っているが，マルチプロセッ
サには対応していない．
2.1.2 ターゲット非依存の規定とターゲット定義の規定
TOPPERS新世代カーネルは，アプリケーションプログラムの再利用性を向上させるために，ターゲットハードウェアや開発環境の違いをできる限り隠蔽することを目指している．ただし，ターゲットハードウェアや開発環境の制限によって実現できない機能が生じたり，逆にターゲットハードウェアの特徴を活かす
ためには機能拡張が不可欠になる場合がある．また，同一のターゲットハード
ウェアであっても，アプリケーションシステムによって使用方法が異なる場合があり，ターゲットシステム毎に仕様の細部に違いが生じることは避けられない．
そこで，TOPPERS新世代カーネルの仕様は，ターゲットシステムによらずに定めるターゲット非依存（target‑independent）の規定と，ターゲットシステム毎に定めるターゲット定義（target‑defined）の規定に分けて記述する．この仕様書は，ターゲット非依存の規定について記述するものであり，この仕様書で「ターゲット定義」とした事項は，ターゲットシステム毎に用意するドキュメ
ントにおいて規定する．
また，この仕様書でターゲット非依存に規定した事項であっても，ターゲット
ハードウェアや開発環境の制限によって実現できない場合や，実現するための
オーバヘッドが大きくなる場合には，この仕様書の規定を逸脱する場合がある．
このような場合には，ターゲットシステム毎に用意するドキュメントでその旨を明記する．
2.1.3 想定するソフトウェア構成
この仕様では，アプリケーションシステムを構成するソフトウェアを，アプリ
ケーションプログラム（以下，単にアプリケーションと呼ぶ），システムサー
ビス，カーネルの3階層に分けて考える（図2‑1）．カーネルとシステムサービ
スをあわせて，ソフトウェアプラットフォームと呼ぶ．
カーネルは，コンピュータの持つ最も基本的なハードウェア資源であるプロセッ
サ，メモリ，タイマを抽象化し，上位階層のソフトウェア（アプリケーション
およびシステムサービス）に論理的なプログラム実行環境を提供するソフトウェアである．

ngki̲spec‑120.txt

page 9システムサービスは，各種の周辺デバイスを抽象化するソフトウェアで，ファイルシステムやネットワークプロトコルスタック，各種のデバイスドライバなどが含まれる．
また，この仕様では，プロセッサと各種の周辺デバイスの接続方法を隠蔽するためのソフトウェア階層として，システムインタフェースレイヤ（SIL）を規定
する．
システムインタフェースレイヤ，カーネル，各種のシステムサービス（これらをモジュールと呼ぶ）を，上位階層のソフトウェアから使うためのインタフェー
スを，API（Application Programming Interface）と呼ぶ．
この仕様書では，第3章においてシステムインタフェースレイヤのAPI仕様を，第4章においてカーネルのAPI仕様を規定する．システムサービスのAPI仕様は，
システムサービス毎の仕様書で規定される．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，カーネルとアプリケーションの中間にあるソフトウェア
をソフトウェア部品と呼んでいたが，TOPPERS組込みコンポーネントシステム（TECS）においてはカーネルもソフトウェア部品の1つと捉えることから，この仕様ではシステムサービスと呼ぶことにした．
2.1.4 想定するハードウェア構成
この仕様では，カーネルがサポートするハードウェア構成として，以下のこと
を想定している．これらに合致しないターゲットハードウェアでカーネルを動作させることは可能であるが，合致しない部分への適応はアプリケーションの責任になる．
(a) メモリ番地は，常に同一のメモリを指すこと（オーバレイのように，異なるメモリを同一のメモリ番地でアクセスすることがないこと）．マルチプロセッ
サ対応カーネルにおいては，同一のメモリに対しては，各プロセッサから同一の番地でアクセスできること．
(b) マルチプロセッサ対応カーネルにおいては，各プロセッサが同一の機械語
命令を実行できること．
2.1.5 想定するプログラミング言語
この仕様におけるAPI仕様は，ISO/IEC 9899:1990（以下，C90と呼ぶ）または
ISO/IEC 9899:1999（以下，C99と呼ぶ）に準拠したC言語を，フリースタンディ
ング環境で用いることを想定して規定している．
ただし，C90の規定に加えて，以下のことを仮定している．
・16ビットおよび32ビットの整数型があること・ポインタが格納できるサイズの整数型があること
2.2 APIの構成要素とコンベンション
2.2.1 APIの構成要素(1) サービスコール
上位階層のソフトウェアから，下位階層のソフトウェアを呼び出すインタフェー
スをサービスコール（service call）と呼ぶ．カーネルのサービスコールを，システムコール（system call）と呼ぶ場合もある．

ngki̲spec‑120.txt

page 10(2) コールバック
下位階層のソフトウェアから，上位階層のソフトウェアを呼び出すインタフェー
スをコールバック（callback）と呼ぶ．
(3) 静的API
オブジェクトの生成情報や初期状態などを定義するために，システムコンフィ
ギュレーションファイル中に記述するインタフェースを，静的API（staticAPI）と呼ぶ．
(4) 構成マクロ
下位階層のソフトウェアに関する各種の情報を取り出すために，上位階層のソ
フトウェアが用いるマクロを，構成マクロ（configuration macro）と呼ぶ．
2.2.2 パラメータとリターンパラメータ
サービスコールやコールバックに渡すデータをパラメータ（parameter），それらが返すデータをリターンパラメータ（return parameter）と呼ぶ．また，静的APIに渡すデータもパラメータと呼ぶ．
オブジェクトを生成するサービスコールなど，パラメータの数が多い場合やター
ゲット定義のパラメータを追加する可能性がある場合には，複数のパラメータを1つの構造体に入れ，その領域へのポインタをパラメータとして渡す．また，
パラメータのサイズが大きい場合にも，パラメータを入れた領域へのポインタをパラメータとして渡す場合がある．
C言語APIでは，リターンパラメータは，関数の返値とするか，リターンパラメー
タを入れる領域へのポインタをパラメータとして渡すことで実現する．オブジェ
クトの状態を参照するサービスコールなど，リターンパラメータの数が多い場
合やターゲット定義のリターンパラメータを追加する可能性がある場合には，複数のリターンパラメータを1つの構造体に入れて返すこととし，その領域へのポインタをパラメータとして渡す．
複数のパラメータまたはリターンパラメータを入れるための構造体を，パケット（packet）と呼ぶ．
サービスコールやコールバックに，パケットを置く領域へのポインタやリター
ンパラメータを入れる領域へのポインタを渡す場合，別に規定がない限りは，
サービスコールやコールバックの処理が完了した後は，それらの領域を参照す
ることはなく，別の目的に使用できる．
2.2.3 返値とエラーコード
一部の例外を除いて，サービスコールおよびコールバックの返値は，処理が正常終了したかを表す符号付き整数とする．処理が正常終了した場合には，E̲OK（＝0）または正の値が返るものとし，値の意味はサービスコールまたはコール
バック毎に定める．処理が正常終了しなかった場合には，その原因を表す負の値が返る．処理が正常終了しなかった原因を表す値を，エラーコード（errorcode）と呼ぶ．
エラーコードは，いずれも負の値のメインエラーコードとサブエラーコードで構成される．メインエラーコードとサブエラーコードからエラーコードを構成するマクロ（ERCD）と，エラーコードからメインエラーコードを取り出すマクロ（MERCD），サブエラーコードを取り出すマクロ（SERCD）が用意されている．

ngki̲spec‑120.txt

page 11

メインエラーコードの名称・意味・値は，カーネルとシステムサービスで共通に定める（「2.14.4 TOPPERS共通エラーコード」の節を参照）．サービスコー
ルおよびコールバックの機能説明中の「E̲XXXXXエラーとなる」または「E̲XXXXXエラーが返る」という記述は，メインエラーコードとしてE̲XXXXXが返ることを意味する．
サブエラーコードは，エラーの原因をより詳細に表すために用いる．カーネル
はサブエラーコードを使用せず，サブエラーコードとして常に‑1が返る．サブ
エラーコードの名称・意味・値は，サブエラーコードを使用するシステムサー
ビスのAPI仕様において規定する．
サービスコールが負の値のエラーコード（警告を表すものを除く）を返した場
合には，サービスコールによる副作用がないのが原則である．ただし，そのような実装ができない場合にはこの原則の例外とし，サービスコールの機能説明にその旨を記述する．
サービスコールが複数のエラーを検出するべき状況では，その内のいずれか1つのエラーを示すエラーコードが返る．コールバックが複数のエラーを検出するべき状況では，その内のいずれか1つのエラーを示すエラーコードを返せばよい．
なお，静的APIは返値を持たない．静的APIの処理でエラーが検出された場合の扱いについては，「2.12.5 コンフィギュレータの処理モデル」の節および「2.12.6 静的APIのパラメータに関するエラー検出」の節を参照すること．
2.2.4 機能コード
ソフトウェア割込みによりサービスコールを呼び出す場合などに用いるためのサービスコールを識別するための番号を，機能コード（function code）と呼ぶ．
機能コードは符号付きの整数値とし，カーネルのサービスコールには負の値を割り付け，拡張サービスコールには正の値を用いる．
2.2.5 ヘッダファイル
カーネルやシステムサービスを用いるために必要な定義を含むファイル．
【補足説明】
ヘッダファイルは，複数回インクルードしてもエラーにならないように対処するのが原則である．具体的には，ヘッダファイルの先頭で特定の識別子（例えば，kernel.hなら"TOPPERS̲KERNEL̲H"）をマクロ定義し，ヘッダファイルの内
容全体をその識別子が定義されていない場合のみ有効とする条件ディレクティ
ブを付加する．
2.3 主な概念
2.3.1 オブジェクトと処理単位(1) オブジェクト
カーネルまたはシステムサービスが管理対象とするソフトウェア資源を，オブジェクト（object）と呼ぶ．特に，カーネルが管理対象とするソフトウェア資源を，カーネルオブジェクト（kernel object）と呼ぶ．
オブジェクトは，種類毎に，番号によって識別する．カーネルまたはシステムサービスで，オブジェクトに対して任意に識別番号を付与できる場合には，1から連続する正の整数値でオブジェクトを識別する．この場合に，オブジェクトの識別番号を，オブジェクトのID番号（ID number）と呼ぶ．そうでない場合，
すなわちカーネルまたはシステムサービスの内部または外部からの条件によっngki̲spec‑120.txt

page 12て識別番号が決まる場合には，オブジェクトの識別番号を，オブジェクト番号（object number）と呼ぶ．識別する必要のないオブジェクトには，識別番号を付与しない場合がある．
オブジェクト属性（object attribute）は，オブジェクトの動作モードや初期状態を定めるもので，オブジェクトの登録時に指定する．オブジェクト属性にTA̲XXXXが指定されている場合，そのオブジェクトを，TA̲XXXX属性のオブジェ
クトと呼ぶ．複数の属性を指定する場合には，オブジェクト属性を渡すパラメー
タに，指定する属性値のビット毎論理和（C言語の"￨"）を渡す．また，指定すべきオブジェクト属性がない場合には，TA̲NULLを指定する．
(2) 処理単位
オブジェクトの中には，プログラムが対応付けられるものがある．プログラムが対応付けられるオブジェクト（または，対応付けられるプログラム）を，処理単位（processing unit）と呼ぶ．処理単位に対応付けられるプログラムは，
アプリケーションまたはシステムサービスで用意し，カーネルが実行制御する．
処理単位の実行を要求することを起動（activate），処理単位の実行を開始することを実行開始（start）と呼ぶ．
拡張情報（extended information）は，処理単位が呼び出される時にパラメータとして渡される情報で，処理単位の登録時に指定する．拡張情報は，カーネ
ルやシステムサービスの動作には影響しない．
(3) タスクカーネルが実行順序を制御するプログラムの並行実行の単位をタスク（task）と呼ぶ．タスクは，処理単位の1つである．
サービスコールの機能説明において，サービスコールを呼び出したタスクを，
自タスク（invoking task）と呼ぶ．拡張サービスコールからサービスコールを呼び出した場合には，拡張サービスコールを呼び出したタスクが自タスクである．
カーネルには，静的APIにより，少なくとも1つのタスクを登録しなければならない．
【補足説明】
タスクが呼び出した拡張サービスコールが実行されている間は，「サービスコー
ルを呼び出した処理単位」は拡張サービスコールであり，「自タスク」とは一致しない．そのため，保護機能対応カーネルにおいて，「サービスコールを呼び出した処理単位の属する保護ドメイン」と「自タスクの属する保護ドメイン」
は，異なるものを指す．
(4) ディスパッチとスケジューリング
プロセッサが実行するタスクを切り換えることを，タスクディスパッチまたは
単にディスパッチ（dispatching）と呼ぶ．それに対して，次に実行すべきタス
クを決定する処理を，タスクスケジューリングまたは単にスケジューリング
（scheduling）と呼ぶ．
ディスパッチが起こるべき状態（すなわち，スケジューリングによって，現在実行しているタスクとは異なるタスクが，実行すべきタスクに決定されている状態）となっても，何らかの理由でディスパッチを行わないことを，ディスパッ
チの保留（pend dispatching）という．ディスパッチを行わない理由が解除された時点で，ディスパッチが起こる．

ngki̲spec‑120.txt

page 13(5) 割込みとCPU例外
プロセッサが実行中の処理とは独立に発生するイベントによって起動される例
外処理のことを，外部割込みまたは単に割込み（interrupt）と呼ぶ．それに対して，プロセッサが実行中の処理に依存して起動される例外処理を，CPU例外（CPU exception）と呼ぶ．
周辺デバイスからの割込み要求をプロセッサに伝える経路を遮断し，割込み要求が受け付けられるのを抑止することを，割込みのマスク（mask interrupt）
または割込みの禁止（disable interrupt）という．マスクが解除された時点で，まだ割込み要求が保持されていれば，その時点で割込み要求を受け付ける．
マスクすることができない割込みを，NMI（non‑maskable interrupt）と呼ぶ．
【μITRON4.0仕様との関係】
μITRON4.0仕様において，未定義のまま使われていた割込みとCPU例外という用語を定義した．
(6) タイムイベントとタイムイベントハンドラ
時間の経過をきっかけに発生するイベントをタイムイベント（time event）と呼ぶ．タイムイベントにより起動され，カーネルが実行制御する処理単位を，タイムイベントハンドラ（time event handler）と呼ぶ．
2.3.2 サービスコールとパラメータ(1) 優先順位と優先度
優先順位（precedence）とは，処理単位の実行順序を説明するための仕様上の概念である．複数の処理単位が実行できる場合には，その中で最も優先順位の高い処理単位が実行される．
優先度（priority）は，タスクなどの処理単位の優先順位や，メッセージなどの配送順序を決定するために，アプリケーションが処理単位やメッセージなどに与える値である．優先度は，符号付きの整数型であるPRI型で表し，値が小さいほど優先度が高い（すなわち，先に実行または配送される）ものとする．優先度には，1から連続した正の値を用いるのを原則とする．
(2) システム時刻と相対時間
カーネルが管理する時刻を，システム時刻（system time）と呼ぶ．システム時
刻は，符号無しの整数型であるSYSTIM型で表し，単位はミリ秒とする．システ
ム時刻は，タイムティック（time tick）を通知するためのタイマ割込みが発生する毎に更新される．
イベントを発生させる時刻を指定する場合には，基準時刻（base time）からの相対時間（relative time）によって指定する．基準時刻は，別に規定がない限
りは，相対時間を指定するサービスコールを呼び出した時刻となる．
相対時間は，符号無しの整数型であるRELTIM型で表し，単位はシステム時刻と同一，すなわちミリ秒とする．相対時間には，少なくとも，16ビットの符号無しの整数型（uint16̲t型）に格納できる任意の値を指定することができるが，
RELTIM型（uint̲t型に定義される）に格納できる任意の値を指定できるとは限らない．相対時間に指定できる最大値は，構成マクロTMAX̲RELTIMに定義されている．

ngki̲spec‑120.txt

page 14

イベントを発生させる時刻を相対時間で指定した場合，イベントの処理が行われるのは，基準時刻から相対時間によって指定した以上の時間が経過した後となる．ただし，基準時刻を定めるサービスコールを呼び出した時に，タイム
ティックを通知するためのタイマ割込みがマスクされている場合（タイマ割込
みより優先して実行される割込み処理が実行されている場合を含む）は，相対時間によって指定した以上の時間が経過した後となることは保証されない．
イベントが発生する時刻を参照する場合には，基準時刻からの相対時間として返される．基準時刻は，相対時間を返すサービスコールを呼び出した時刻となる．
イベントが発生する時刻が相対時間で返された場合，イベントの処理が行われるのは，基準時刻から相対時間として返された以上の時間が経過した後となる．
ただし，相対時間を返すサービスコールを呼び出した時に，タイムティックを通知するためのタイマ割込みがマスクされている場合（タイマ割込みより優先して実行される割込み処理が実行されている場合を含む）は，相対時間として返された以上の時間が経過した後となることは保証されない．
【補足説明】
相対時間に0を指定した場合，基準時刻後の最初のタイムティックでイベントの処理が行われる．また，1を指定した場合，基準時刻後の2回目以降のタイム
ティックでイベントの処理が行われる．これは，基準時刻後の最初のタイム
ティックは，基準時刻の直後に発生する可能性があるため，ここでイベントの処理を行うと，基準時刻からの経過時間が1以上という仕様を満たせないためである．
同様に，相対時間として0が返された場合，基準時刻後の最初のタイムティック
でイベントの処理が行われる．また，1が返された場合，基準時刻後の2回目以降のタイムティックでイベントの処理が行われる．
【μITRON4.0仕様との関係】
相対時間（RELTIM型）とシステム時刻（SYSTIM型）の時間単位は，μITRON4.0
仕様では実装定義としていたが，この仕様ではミリ秒と規定した．また，相対時間の解釈について，より厳密に規定した．
TMAX̲RELTIMは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
(3) タイムアウトとポーリング
サービスコールの中で待ち状態が指定した時間以上継続した場合に，サービス
コールの処理を取りやめて，サービスコールからリターンすることを，タイムアウト（timeout）という．タイムアウトしたサービスコールからは，E̲TMOUT
エラーが返る．
タイムアウトを起こすまでの時間（タイムアウト時間）は，符号付きの整数型であるTMO型で表し，単位はシステム時刻と同一，すなわちミリ秒とする．タイ
ムアウト時間に正の値を指定した場合には，タイムアウトを起こすまでの相対時間を表す．すなわち，タイムアウトの処理が行われるのは，サービスコール
を呼び出してから指定した以上の時間が経過した後となる．
ポーリング（polling）を行うサービスコールとは，サービスコールの中で待ち状態に遷移すべき状況になった場合に，サービスコールの処理を取りやめてリターンするサービスコールのことをいう．ここで，サービスコールの処理を取りやめてリターンすることを，ポーリングに失敗したという．ポーリングに失敗したサービスコールからは，E̲TMOUTエラーが返る．

ngki̲spec‑120.txt

page 15

ポーリングを行うサービスコールでは，待ち状態に遷移することはないのが原則である．そのため，ポーリングを行うサービスコールは，ディスパッチ保留状態であっても呼び出すことができる．ただし，サービスコールの中で待ち状態に遷移する状況が複数ある場合，ある状況でポーリング動作をしても，他の状況では待ち状態に遷移する場合がある．このような場合の振舞いは，該当するサービスコール毎に規定する．
タイムアウト付きのサービスコールは，別に規定がない限りは，タイムアウト
時間にTMO̲POL（＝0）を指定した場合にはポーリングを行い，TMO̲FEVR（＝‑1）
を指定した場合にはタイムアウトを起こさないものとする．
エラーコードに関する原則により，サービスコールがタイムアウトした場合やポーリングに失敗した場合には，サービスコールによる副作用がないのが原則である．ただし，そのような実装ができない場合にはこの原則の例外とし，どのような副作用があるかをサービスコール毎に規定する．
【補足説明】
タイムアウト付きのサービスコールを，タイムアウト時間をTMO̲POLとして呼び出した場合には，ディスパッチ保留状態で呼び出すとE̲CTXエラーとなることを除いては，ポーリングを行うサービスコールと同じ振舞いをする．また，タイ
ムアウト時間をTMO̲FEVRとして呼び出した場合には，タイムアウトなしのサービスコールと全く同じ振舞いをする．
【μITRON4.0仕様との関係】
タイムアウト時間（TMO型）の時間単位は，μITRON4.0仕様では実装定義として
いたが，この仕様ではミリ秒と規定した．
【仕様決定の理由】
ディスパッチ保留状態において，ポーリングを行うサービスコールを呼び出すことができるのに対して，タイムアウト付きのサービスコールをタイムアウト
時間をTMO̲POLとして呼び出すとエラーになるのは，ディスパッチ保留状態では，別に規定がない限り，自タスクを広義の待ち状態に遷移させる可能性のあるサー
ビスコール（タイムアウト付きのサービスコールはこれに該当）を呼び出すことはできないと規定されているためである．
(4) ノンブロッキング
サービスコールの中で待ち状態に遷移すべき状況になった時，サービスコールの処理を継続したままサービスコールからリターンする場合，そのサービスコー
ルをノンブロッキング（non‑blocking）という．処理を継続したままリターン
する場合，サービスコールからはE̲WBLKエラーが返る．E̲WBLKは警告を表すエ
ラーコードであり，サービスコールによる副作用がないという原則は適用されない．
サービスコールからE̲WBLKエラーが返った場合には，サービスコールの処理は継続しているため，サービスコールに渡したパラメータまたはリターンパラメー
タを入れる領域はまだ参照される可能性があり，別の目的に使用することはできない．継続している処理が完了した場合や，何らかの理由で処理が取りやめられた場合には，コールバックを呼び出すなどの方法で，サービスコールを呼び出したソフトウェアに通知するものとする．
ノンブロッキングの指定は，タイムアウト時間にTMO̲NBLK（＝‑2）を指定する
ことによって行う．ノンブロッキングの指定を行えるサービスコールは，指定した場合の振舞いをサービスコール毎に規定する．

ngki̲spec‑120.txt

page 16【補足説明】
ノンブロッキングは，システムサービスでサポートすることを想定した機能である．カーネルは，ノンブロッキングの指定を行えるサービスコールをサポートしていない．
2.3.3 保護機能
この節では，保護機能に関連する主な概念について説明する．この節の内容は，保護機能対応カーネルにのみ適用される．
(1) アクセス保護
保護機能対応カーネルは，処理単位が，許可されたカーネルオブジェクトに対して，許可された種別のアクセスを行うことのみを許し，それ以外のアクセスを防ぐアクセス保護機能を提供する．
アクセス制御の用語では，処理単位が主体（subject），カーネルオブジェクトが対象（object）ということになる．
(2) メモリオブジェクト
保護機能対応カーネルにおいては，メモリ領域をカーネルオブジェクトとして扱い，アクセス保護の対象とする．カーネルがアクセス保護の対象とする連続したメモリ領域を，メモリオブジェクト（memory object）と呼ぶ．メモリオブジェクトは，互いに重なりあうことはない．
メモリオブジェクトは，その先頭番地によって識別する．言い換えると，先頭番地がオブジェクト番号となる．
メモリオブジェクトの先頭番地とサイズには，ターゲットハードウェアでメモリ保護が実現できるように，ターゲット定義の制約が課せられる．
(3) 保護ドメイン
保護機能を提供するために用いるカーネルオブジェクトの集合を，保護ドメイン（protection domain）と呼ぶ．保護ドメインは，保護ドメインIDと呼ぶID番
号によって識別する．
カーネルオブジェクトは，たかだか1つの保護ドメインに属する．処理単位は，いずれか1つの保護ドメインに属さなければならないのに対して，それ以外のカー
ネルオブジェクトは，いずれの保護ドメインにも属さないことができる．いずれの保護ドメインにも属さないカーネルオブジェクトを，無所属のカーネルオ
ブジェクト（independent kernel object）と呼ぶ．
処理単位がカーネルオブジェクトにアクセスできるかどうかは，処理単位が属する保護ドメインにより決まるのが原則である．すなわち，カーネルオブジェ
クトに対するアクセス権は，処理単位ではなく，保護ドメイン単位で管理される．このことから，ある保護ドメインに属する処理単位がアクセスできること
を，単に，その保護ドメインからアクセスできるという．
ただし，タスクのユーザスタック領域は，ターゲット定義での変更がない限りは，そのタスク（とカーネルドメインに属する処理単位）のみがアクセスできる（「2.11.6 ユーザタスクのユーザスタック領域」の節を参照）．これは，「処理単位がカーネルオブジェクトにアクセスできるかどうかは，処理単位が属する保護ドメインにより決まる」という原則の例外となっている．
デフォルトでは，保護ドメインに属するカーネルオブジェクトは，同じ保護ド

ngki̲spec‑120.txt

page 17

メイン（とカーネルドメイン）のみからアクセスできる．また，無所属のカー
ネルオブジェクトは，すべての保護ドメインからアクセスできる．
(4) カーネルドメインとユーザドメイン
システムには，カーネルドメイン（kernel domain）と呼ばれる保護ドメインが1つ存在する．カーネルドメインに属する処理単位は，プロセッサの特権モードで実行される．また，すべてのカーネルオブジェクトに対して，すべての種別のアクセスを行うことが許可される．この仕様で，「ある保護ドメイン（またはタスク）のみからアクセスできる」といった場合でも，カーネルドメインドメインからはアクセスすることができる．
カーネルドメイン以外の保護ドメインを，ユーザドメイン（user domain）と呼
ぶ．ユーザドメインに属する処理単位は，プロセッサの非特権モードで実行される．また，どのカーネルオブジェクトに対してどの種別のアクセスを行えるかを制限することができる．
ユーザドメインには，1から連続する正の整数値の保護ドメインIDが付与される．
カーネルドメインの保護ドメインIDは，TDOM̲KERNEL（＝‑1）である．
この仕様では，システムに登録できるユーザドメインの数は，32個以下に制限する．
【補足説明】
ユーザドメインは，システムコンフィギュレーションファイル中にユーザドメ
インの囲みを記述することで，カーネルに登録する（「2.12.3 保護ドメインの指定」の節を参照）．ユーザドメインを動的に生成する機能は，現時点では用意していない．
保護機能対応でないカーネルは，カーネルドメインのみをサポートしているとみなすこともできる．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様のシステムドメイン（system domain）は，現時点ではサポートしない．システムドメインは，それに属する処理単位が，プロセッサの特権
モードで実行され，カーネルオブジェクトに対するアクセスを制限することができる保護ドメインである．
(5) システムタスクとユーザタスク
カーネルドメインに属するタスクをシステムタスク（system task），ユーザド
メインに属するタスクをユーザタスク（user task）と呼ぶ．
【補足説明】
特権モードで実行されるタスクをシステムタスク，非特権モードで実行されるタスクをユーザタスクと定義する方法もあるが，ユーザタスクであっても，サービスコールの実行中は特権モードで実行されるため，上記の定義とした．
μITRON4.0/PX仕様のシステムドメインに属するタスクは，システムタスクと呼ぶことになる．
(6) アクセス許可パターン
あるカーネルオブジェクトに対するある種別のアクセスが，どの保護ドメインに属する処理単位に許可されているかを表現するビットパターンを，アクセス

ngki̲spec‑120.txt

page 18

許可パターン（access permission pattern）と呼ぶ．アクセス許可パターンの各ビットは，1つのユーザドメインに対応する．カーネルドメインには，すべてのアクセスが許可されているため，カーネルドメインに対応するビットは用意されていない．
アクセス許可パターンは，符号無し32ビット整数に定義されるデータ型（ACPTN）で保持し，値が1のビットに対応するユーザドメインにアクセスが許可されていることを表す．そのため，2つのアクセス許可パターンのビット毎論
理和（C言語の"￨"）を求めることで，アクセスを許可されているユーザドメイ
ンの和集合（union）を得ることができる．また，2つのアクセス許可パターンのビット毎論理積（C言語の"&"）を求めることで，アクセスを許可されている
ユーザドメインの積集合（intersection）を得ることができる．
アクセス許可パターンの指定に用いるために，指定したユーザドメインのみにアクセスを許可することを示すアクセス許可パターンを構成するマクロ（TACP）が用意されている．また，カーネルドメインのみにアクセスを許可することを示すアクセス許可パターンを表す定数（TACP̲KERNEL）と，すべての保護ドメイ
ンにアクセスを許可することを示すアクセス許可パターンを表す定数（TACP̲SHARED）が用意されている．
(7) アクセス許可ベクタ
カーネルオブジェクトに対するアクセスは，カーネルオブジェクトの種類毎に，通常操作1，通常操作2，管理操作，参照操作の4つの種別に分類されている．あるカーネルオブジェクトに対する4つの種別のアクセスに関するアクセス許可パ
ターンをひとまとめにしたものを，アクセス許可ベクタ（access permission
vector）と呼び，次のように定義されるデータ型（ACVCT）で保持する．
typedef struct acvct {ACPTN
acptn1;
ACPTN
acptn2;
ACPTN
acptn3;
ACPTN
acptn4;} ACVCT;/* 通常操作1のアクセス許可パターン *//* 通常操作2のアクセス許可パターン *//* 管理操作のアクセス許可パターン *//* 参照操作のアクセス許可パターン */【補足説明】
カーネルオブジェクトの種類毎のアクセスの種別の分類については，「5.8 カー
ネルオブジェクトに対するアクセスの種別」の節を参照すること．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様では，アクセス許可ベクタを，1つまたは2つのアクセス許可
パターンで構成することも許しているが，この仕様では4つで構成するものと決めている．
(8) サービスコールの呼出し方法
保護機能対応カーネルでは，サービスコールは，ソフトウェア割込みによって呼び出すのが基本である．サービスコール呼出しを通常の方法で記述した場合，
ソフトウェア割込みによって呼び出すコードが生成される．
一般に，ソフトウェア割込みによるサービスコール呼出しはオーバヘッドが大きい．そのため，カーネルドメインに属する処理単位からは，関数呼出しによってサービスコールを呼び出すことで，オーバヘッドを削減することができる．
そこで，カーネルドメインに属する処理単位から関数呼出しによってサービス
コールを呼び出せるように，以下の機能が用意されている．

ngki̲spec‑120.txt

page 19

カーネルドメインに属する処理単位が実行する関数のみを含んだソースファイ
ルでは，カーネルヘッダファイル（kernel.h）をインクルードする前に，
TOPPERS̲SVC̲CALLをマクロ定義することで，サービスコール呼出しを通常の方法で記述した場合に，関数呼出しによって呼び出すコードが生成される．
また，カーネルドメインに属する処理単位が実行する関数と，ユーザドメインに属する処理単位が実行する関数の両方を含んだソースファイルでは，関数呼出しによってサービスコールを呼び出すための名称を作るマクロ（SVC̲CALL）
を用いることで，関数呼出しによって呼び出すコードが生成される．例えば，
act̲tskを関数呼出しによって呼び出す場合には，次のように記述すればよい．
ercd = SVC̲CALL(act̲tsk)(tskid);【補足説明】
拡張サービスコールを，関数呼出しによって呼び出す方法は用意されていない．
カーネルドメインに属する処理単位が，関数呼出しによって，拡張サービスコー
ルとして登録した関数を呼び出すことはできるが，その場合には，処理単位が呼び出した通常の関数であるとみなされ，拡張サービスコールであるとは扱われない．
2.3.4 マルチプロセッサ対応
この節では，マルチプロセッサ対応に関連する主な概念について説明する．この節の内容は，マルチプロセッサ対応カーネルにのみ適用される．
(1) クラス
マルチプロセッサに対応するために用いるカーネルオブジェクトの集合を，クラス（class）と呼ぶ．クラスは，クラスIDと呼ぶID番号によって識別する．
カーネルオブジェクトは，いずれか1つのクラスに属するのが原則である．カー
ネルオブジェクトが属するクラスは，オブジェクトの登録時に決定し，登録後に変更することはできない．
【補足説明】
処理単位を実行するプロセッサを静的に決定する機能分散型のマルチプロセッ
サシステムでは，プロセッサ毎にクラスを設ける方法が典型的である．それに対して，対称型のマルチプロセッサシステムで，処理単位のマイグレーションを許す場合には，プロセッサ毎のクラスに加えて，どのプロセッサでも実行できるクラスを（システム中に1つまたは初期割付けプロセッサ毎に）設ける方法が典型的である．
カーネルオブジェクトはいずれか1つのクラスに属するという原則に関わらず，
以下のオブジェクトはいずれのクラスにも属さない．
・オーバランハンドラ
・拡張サービスコール
・グローバル初期化ルーチン
・グローバル終了処理ルーチン
マルチプロセッサ対応でないカーネルは，カーネルによって規定された1つのクラスのみをサポートしているとみなすこともできる．
(2) プロセッサたかだか1つの処理単位のみを同時に実行できるハードウェアの単位を，プロセッngki̲spec‑120.txt

page 20

サ（processor）と呼ぶ．プロセッサは，プロセッサIDと呼ぶID番号によって識別する．
複数のプロセッサを持つシステム構成をマルチプロセッサ（multiprocessor）と呼び，同時に複数の処理単位を実行することができる．
システムの初期化時と終了時に特別な役割を果たすプロセッサを，マスタプロ
セッサ（master processor）と呼び，システムに1つ存在する．どのプロセッサをマスタプロセッサとするかは，ターゲット定義である．マスタプロセッサ以
外のプロセッサを，スレーブプロセッサ（slave processor）と呼ぶ．なお，カーネル動作状態では，マスタプロセッサとスレーブプロセッサの振舞いに違いはない．
(3) 処理単位の割付けとマイグレーション
処理単位は，後述のマイグレーションが発生しない限りは，いずれか1つのプロセッサに割り付けられて実行される．処理単位を実行するプロセッサを，割付
けプロセッサと呼ぶ．また，処理単位が登録時に割り付けられるプロセッサを，初期割付けプロセッサと呼ぶ．
処理単位によっては，処理単位の登録後に，割付けプロセッサを変更することが可能である．処理単位の登録後に割付けプロセッサを変更することを，処理単位のマイグレーション（migration）と呼ぶ．
割付けプロセッサを変更できる処理単位に対しては，処理単位を割り付けることができるプロセッサ（これを，割付け可能プロセッサと呼ぶ）を制限することができる．
(4) クラスの持つ属性とカーネルオブジェクト
タスクの初期割付けプロセッサや割付け可能プロセッサなど，カーネルオブジェ
クトをマルチプロセッサ上で実現する際に設定すべき属性は，そのカーネルオ
ブジェクトが属するクラスによって定まる．
各クラスが持ち，それに属するカーネルオブジェクトに適用される属性は，次の通りである．
・初期割付けプロセッサ・割付け可能プロセッサ（複数のプロセッサを指定可能，初期割付けプロセッ
サを含む）
・ATT̲MOD／ATA̲MODにおいて，オブジェクトモジュール中に含まれる各セクションが配置されるメモリリージョン・コントロールブロックの配置場所
・その他に必要なメモリ領域（タスクのスタック領域やデータキューのデー
タキュー管理領域など）の配置場所
・その他の管理情報（ロック単位など）使用できるクラスのID番号とその属性は，ターゲット定義である．
【仕様決定の理由】
クラスを導入することで，カーネルオブジェクト毎に上記の属性を設定できる
ようにしなかったのは，これらの属性をアプリケーション設計者が個別に設定するよりも，ターゲット依存部の実装者が有益な組み合わせをあらかじめ用意
しておく方が良いと考えたためである．
(5) ローカルタイマ方式とグローバルタイマ方式

ngki̲spec‑120.txt

page 21

システム時刻の管理方式として，プロセッサ毎にシステム時刻を持つローカル
タイマ方式と，システム全体で1つのシステム時刻を持つグローバルタイマ方式の2つの方式がある．どちらの方式を用いることができるかは，ターゲット定義
である．
ローカルタイマ方式では，プロセッサ毎のシステム時刻は，それぞれのプロセッ
サが更新する．異なるプロセッサのシステム時刻を同期させる機能は，カーネ
ルでは用意しない．
グローバルタイマ方式では，システム中の1つのプロセッサがシステム時刻を更新する．これを，システム時刻管理プロセッサと呼ぶ．どのプロセッサをシス
テム時刻管理プロセッサとするかは，ターゲット定義である．
【補足説明】
システム時刻管理プロセッサが，マスタプロセッサと一致している必要はない．
【未決定事項】
ローカルタイマ方式の場合に，プロセッサ毎に異なるタイムティックの周期を設定したい場合が考えられるが，現時点の実装ではサポートしておらず，
TIC̲NUMEとTIC̲DENOの扱いも未決定であるため，今後の課題とする．
2.3.5 その他
(1) オブジェクトモジュール
プログラムのオブジェクトコードとデータを含むファイルを，オブジェクトモ
ジュール（object module）と呼ぶ．オブジェクトファイルとライブラリは，オ
ブジェクトモジュールである．
(2) メモリリージョン
オブジェクトモジュールの配置対象となる同じ性質を持った連続したメモリ領域をメモリリージョン（memory region）と呼ぶ．
メモリリージョンは，文字列によって識別する．メモリリージョンを識別する
文字列を，メモリリージョン名と呼ぶ．
どのようなメモリリージョンが使用できるかは，ターゲット定義である．
【補足説明】
この仕様では，メモリ領域（memory area）という用語は，連続したメモリの範囲という一般的な意味で使っている．
(3) 標準のセクション
コンパイラに特別な指定をしない場合に出力するセクションを，標準のセクション（standard sections）と呼ぶ．
2.4 処理単位の種類と実行順序
2.4.1 処理単位の種類
カーネルが実行を制御する処理単位の種類は次の通りである．
(a) タスクngki̲spec‑120.txt

page 22(a.1) タスク例外処理ルーチン(b) 割込みハンドラ(b.1) 割込みサービスルーチン(b.2) タイムイベントハンドラ(c) CPU例外ハンドラ(d) 拡張サービスコール(e) 初期化ルーチン(f) 終了処理ルーチン
ここで，タイムイベントハンドラとは，時間の経過をきっかけに起動される処
理単位である周期ハンドラ，アラームハンドラ，オーバランハンドラの総称である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，オーバランハンドラと拡張サービスコールをサポートしていない．ただし，オーバランハンドラ機能拡張パッケージを用いると，オーバラ
ンハンドラ機能を追加することができる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，オーバランハンドラと拡張サービスコールをサポートしていない．
2.4.2 処理単位の実行順序
処理単位の実行順序を規定するために，ここでは，処理単位の優先順位を規定する．また，ディスパッチが起こるタイミングを規定するために，ディスパッ
チを行うカーネル内の処理であるディスパッチャの優先順位についても規定する．
タスクの優先順位は，ディスパッチャの優先順位よりも低い．タスク間では，高い優先度を持つ方が優先順位が高く，同じ優先度を持つタスク間では，先に実行できる状態となった方が優先順位が高い．詳しくは，「2.6.3 タスクのス
ケジューリング規則」の節を参照すること．
タスク例外処理ルーチンの優先順位は，例外が要求されたタスクと同じである
が，タスクよりも先に実行される．
割込みハンドラの優先順位は，ディスパッチャの優先順位よりも高い．割込み
ハンドラ間では，高い割込み優先度を持つ方が優先順位が高く，同じ割込み優先度を持つ割込みハンドラ間では，先に実行開始された方が優先順位が高い．
同じ割込み優先度を持つ割込みハンドラ間での実行開始順序は，この仕様では規定しない．詳しくは，「2.7.2 割込み優先度」の節を参照すること．
割込みサービスルーチンとタイムイベントハンドラの優先順位は，それを呼び出す割込みハンドラと同じである．
CPU例外ハンドラの優先順位は，CPU例外がタスクまたはタスク例外処理ルーチ
ンで発生した場合には，ディスパッチャの優先順位と同じであるが，ディスパッ
チャよりも先に実行される．CPU例外がその他の処理単位で発生した場合には，
CPU例外ハンドラの優先順位は，その処理単位の優先順位と同じであるが，その処理単位よりも先に実行される．
拡張サービスコールの優先順位は，それを呼び出した処理単位と同じであるが，それを呼び出した処理単位よりも先に実行される．
初期化ルーチンは，カーネルの動作開始前に，システムコンフィギュレーショ

ngki̲spec‑120.txt

page 23

ンファイル中に初期化ルーチンを登録する静的APIを記述したのと同じ順序で実行される．終了処理ルーチンは，カーネルの動作終了後に，終了処理ルーチンを登録する静的APIを記述したのと逆の順序で実行される．
マルチプロセッサ対応カーネルでは，初期化ルーチンには，クラスに属さない
グローバル初期化ルーチンと，クラスに属するローカル初期化ルーチンがある．
グローバル初期化ルーチンがマスタプロセッサで実行された後に，各プロセッ
サでローカル初期化ルーチンが実行される．また，終了処理ルーチンには，クラスに属さないグローバル終了処理ルーチンと，クラスに属するローカル終了
処理ルーチンがある．ローカル終了処理ルーチンが各プロセッサで実行された
後に，マスタプロセッサでグローバル終了処理ルーチンが実行される．
2.4.3 カーネル処理の不可分性
カーネルのサービスコール処理やディスパッチャ，割込みハンドラとCPU例外ハンドラの出入口処理などのカーネル処理は不可分に実行されるのが基本である．
実際には，カーネル処理の途中でアプリケーションが実行される場合はあるが，アプリケーションがサービスコールを用いて観測できる範囲で，カーネル処理が不可分に実行された場合と同様に振る舞うのが原則である．これを，カーネ
ル処理の不可分性という．
ただし，マルチプロセッサ対応カーネルにおいては，カーネル処理が実行されているプロセッサ以外のプロセッサから，カーネル処理の途中の状態が観測できる場合がある．具体的には，1つのサービスコールにより複数のオブジェクトの状態が変化する場合に，一部のオブジェクトの状態のみが変化し，残りのオブジェクトの状態が変化していない過渡的な状態が観測できる場合がある．
【補足説明】
マルチプロセッサ対応でないカーネルでは，1つのサービスコールにより複数のタスクが実行できる状態になる場合，新しく実行状態となるべきタスクへのディ
スパッチは，すべてのタスクの状態遷移が完了した後に行われる．例えば，低優先度のタスクAが発行したサービスコールにより，中優先度のタスクBと高優
先度のタスクCがこの順で待ち解除される場合，タスクBとタスクCが待ち解除された後に，タスクCへのディスパッチが行われる．
マルチプロセッサ対応カーネルでは，上のことは，1つのプロセッサ内では成り立つが，他のプロセッサに割り付けられたタスクに対しては成り立たない．例
えば，プロセッサ1で低優先度のタスクAが実行されている時に，他のプロセッ
サ2で実行されているタスクが発行したサービスコールにより，プロセッサ1に割り付けられた中優先度のタスクBと高優先度のタスクCがこの順で待ち解除される場合，タスクCが待ち解除される前に，タスクBへディスパッチされる場合がある．
2.4.4 処理単位を実行するプロセッサ
マルチプロセッサ対応カーネルでは，処理単位を実行するプロセッサ（割付けプロセッサ）は，その処理単位が属するクラスの初期割付けプロセッサと割付け可能プロセッサから，次のように決まる．
タスク，周期ハンドラ，アラームハンドラは，登録時に，属するクラスの初期
割付けプロセッサに割り付けられる．また，割付けプロセッサを変更するサービスコール（mact̲tsk／imact̲tsk，mig̲tsk，msta̲cyc，msta̲alm／
imsta̲alm）によって，割付けプロセッサを，クラスの割付け可能プロセッサのいずれかに変更することができる．
割込みハンドラ，CPU例外ハンドラ，ローカル初期化ルーチン，ローカル終了処
理ルーチンは，属するクラスの初期割付けプロセッサで実行される．クラスのngki̲spec‑120.txt

page 24

割付け可能プロセッサの情報は用いられない．
割込みサービスルーチンは，属するクラスの割付け可能プロセッサのいずれか（オプション設定によりすべて）で実行される．クラスの初期割付けプロセッ
サの情報は用いられない．
以上を整理すると，次の表の通りとなる．この表の中で，「○」はその情報が使用されることを，「ー」はその情報が使用されないことを示す．
初期割付けプロセッサ
割付け可能プロセッサ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
タスク（タスク例外処理○○
ルーチンを含む）‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
割込みハンドラ○ー
割込みサービスルーチンー○
周期ハンドラ○○アラームハンドラ○○‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CPU例外ハンドラ○ー‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ローカル初期化ルーチン○ー
ローカル終了処理ルーチン○ー‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
オーバランハンドラ，拡張サービスコール，グローバル初期化ルーチン，グロー
バル終了処理ルーチンは，いずれのクラスにも属さない．オーバランハンドラ
は，オーバランを起こしたタスクの割付けプロセッサによって実行される．拡張サービスコールは，それを呼び出した処理単位の割付けプロセッサによって実行される．グローバル初期化ルーチンとグローバル終了処理ルーチンは，マスタプロセッサによって実行される．
2.5 システム状態とコンテキスト
2.5.1 カーネル動作状態と非動作状態
カーネルの初期化が完了した後，カーネルの終了処理が開始されるまでの間を，カーネル動作状態と呼ぶ．それ以外の状態，すなわちカーネルの初期化完了前（初期化ルーチンの実行中を含む）と終了処理開始後（終了処理ルーチンの実
行中を含む）を，カーネル非動作状態と呼ぶ．
カーネル非動作状態では，原則として，NMIを除くすべての割込みがマスクされる．
カーネル非動作状態では，システムインタフェースレイヤのAPIとカーネル非動作状態を参照するサービスコール（sns̲ker）のみを呼び出すことができ，その他のサービスコールを呼び出すことはできない．カーネル非動作状態で，その他のサービスコールを呼び出した場合の動作は，保証されない．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，カーネル動作状態かカー
ネル非動作状態のいずれかの状態を取る．
2.5.2 タスクコンテキストと非タスクコンテキスト
処理単位が実行される環境（用いるスタック領域やプロセッサの動作モードなど）をコンテキストと呼ぶ．
カーネル動作状態において，処理単位が実行されるコンテキストは，タスクコ

ngki̲spec‑120.txt

page 25

ンテキストと非タスクコンテキストに分類される．
タスク（タスク例外処理ルーチンを含む）が実行されるコンテキストは，タス
クコンテキストに分類される．また，タスクコンテキストから呼び出した拡張サービスコールが実行されるコンテキストは，タスクコンテキストに分類される．
割込みハンドラ（割込みサービスルーチンおよびタイムイベントハンドラを含む）とCPU例外ハンドラが実行されるコンテキストは，非タスクコンテキストに分類される．また，非タスクコンテキストから呼び出した拡張サービスコールが実行されるコンテキストは，非タスクコンテキストに分類される．
タスクコンテキストからは，非タスクコンテキスト専用のサービスコールを呼び出すことはできない．逆に，非タスクコンテキストからは，タスクコンテキ
スト専用のサービスコールを呼び出すことはできない．いずれも，呼び出した
場合にはE̲CTXエラーとなる．
2.5.3 カーネルの振舞いに影響を与える状態
カーネル動作状態において，プロセッサは，カーネルの振舞いに影響を与える状態として，次の状態を持つ．
・全割込みロックフラグ（全割込みロック状態と全割込みロック解除状態）
・CPUロックフラグ（CPUロック状態とCPUロック解除状態）
・割込み優先度マスク（割込み優先度マスク全解除状態と全解除でない状態）
・ディスパッチ禁止フラグ（ディスパッチ禁止状態とディスパッチ許可状態）
これらの状態は，それぞれ独立な状態である．すなわち，プロセッサは上記の状態の任意の組合せを取ることができ，それぞれの状態を独立に変化させることができる．
2.5.4 全割込みロック状態と全割込みロック解除状態
プロセッサは，NMIを除くすべての割込みをマスクするための全割込みロックフ
ラグを持つ．全割込みロックフラグがセットされた状態を全割込みロック状態，クリアされた状態を全割込みロック解除状態と呼ぶ．すなわち，全割込みロッ
ク状態では，NMIを除くすべての割込みがマスクされる．
全割込みロック状態では，システムインタフェースレイヤのAPIとカーネル非動作状態を参照するサービスコール（sns̲ker），カーネルを終了するサービスコー
ル（ext̲ker）のみを呼び出すことができ，その他のサービスコールを呼び出す
ことはできない．全割込みロック状態で，その他のサービスコールを呼び出した場合の動作は，保証されない．また，全割込みロック状態では，実行中の処理単位からリターンしてはならない．リターンした場合の動作は保証されない．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，全割込みロックフラグを持つ．すなわち，プロセッサ毎に，全割込みロック状態か全割込みロック解
除状態のいずれかの状態を取る．
2.5.5 CPUロック状態とCPUロック解除状態
プロセッサは，カーネル管理の割込み（「2.7.7 カーネル管理外の割込み」の節を参照）をすべてマスクするためのCPUロックフラグを持つ．CPUロックフラ
グがセットされた状態をCPUロック状態，クリアされた状態をCPUロック解除状態と呼ぶ．すなわち，CPUロック状態では，すべてのカーネル管理の割込みがマスクされ，ディスパッチが保留される．
NMI以外にカーネル管理外の割込みを設けない場合には，全割込みロックフラグ

ngki̲spec‑120.txt

page 26とCPUロックフラグの機能は同一となるが，両フラグは独立に存在する．
CPUロック状態で呼び出すことができるサービスコールは次の通り．
・システムインタフェースレイヤのAPI・loc̲cpu／iloc̲cpu，unl̲cpu／iunl̲cpu・unl̲spn／iunl̲spn（マルチプロセッサ対応カーネルのみ）
・dis̲int，ena̲int
・sns̲yyy，xsns̲yyy（CPU例外ハンドラからのみ）
・get̲utm
・ext̲tsk，ext̲ker・cal̲svc（保護機能対応カーネルのみ）
CPUロック状態で，その他のサービスコールを呼び出した場合には，E̲CTXエラーとなる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，CPUロックフラグを持つ．
すなわち，プロセッサ毎に，CPUロック状態かCPUロック解除状態のいずれかの状態を取る．
【補足説明】
マルチプロセッサ対応カーネルにおいて，あるプロセッサがCPUロック状態にある間は，そのプロセッサにおいてのみ，すべてのカーネル管理の割込みがマスクされ，ディスパッチが保留される．それに対して他のプロセッサにおいては，
割込みはマスクされず，ディスパッチも起こるため，CPUロック状態を使って他のプロセッサで実行される処理単位との排他制御を実現することはできない．
2.5.6 割込み優先度マスク
プロセッサは，割込み優先度を基準に割込みをマスクするための割込み優先度
マスクを持つ．割込み優先度マスクがTIPM̲ENAALL（＝0）の時は，いずれの割込み要求もマスクされない．この状態を割込み優先度マスク全解除状態と呼ぶ．
割込み優先度マスクがTIPM̲ENAALL（＝0）以外の時は，割込み優先度マスクと同じかそれより低い割込み優先度を持つ割込みはマスクされ，ディスパッチは保留される．この状態を割込み優先度マスクが全解除でない状態と呼ぶ．
割込み優先度マスクが全解除でない状態では，別に規定がない限りは，自タス
クを広義の待ち状態に遷移させる可能性のあるサービスコールを呼び出すことはできない．呼び出した場合には，E̲CTXエラーとなる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，割込み優先度マスクを持つ．
2.5.7 ディスパッチ禁止状態とディスパッチ許可状態
プロセッサは，ディスパッチを保留するためのディスパッチ禁止フラグを持つ．
ディスパッチ禁止フラグがセットされた状態をディスパッチ禁止状態，クリアされた状態をディスパッチ許可状態と呼ぶ．すなわち，ディスパッチ禁止状態
では，ディスパッチは保留される．
ディスパッチ禁止状態では，別に規定がない限りは，自タスクを広義の待ち状態に遷移させる可能性のあるサービスコールを呼び出すことはできない．呼び出した場合には，E̲CTXエラーとなる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，ディスパッチ禁止フラグを持つ．すなわち，プロセッサ毎に，ディスパッチ禁止状態かディスパッチ
許可状態のいずれかの状態を取る．

ngki̲spec‑120.txt

page 27【補足説明】
マルチプロセッサ対応カーネルにおいて，あるプロセッサがディスパッチ禁止状態にある間は，そのプロセッサにおいてのみ，ディスパッチが保留される．
それに対して他のプロセッサにおいては，ディスパッチが起こるため，ディス
パッチ禁止状態を使って他のプロセッサで実行されるタスクとの排他制御を実現することはできない．
2.5.8 ディスパッチ保留状態
非タスクコンテキストの実行中，全割込みロック状態，CPUロック状態，割込み
優先度マスクが全解除でない状態，ディスパッチ禁止状態では，ディスパッチ
が保留される．これらの状態を総称して，ディスパッチ保留状態と呼ぶ．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，ディスパッチ保留状態
かそうでない状態のいずれかの状態を取る．
2.5.9 カーネル管理外の状態
全割込みロック状態，カーネル管理外の割込みハンドラ実行中（「2.7.7 カー
ネル管理外の割込み」の節を参照），カーネル管理外のCPU例外ハンドラ実行中（「2.8.4 カーネル管理外のCPU例外」の節を参照）を総称して，カーネル管理外の状態と呼ぶ．
それぞれの節で規定する通り，カーネル管理外の状態では，システムインタ
フェースレイヤのAPIとsns̲ker，ext̲kerのみ（カーネル管理外のCPU例外ハン
ドラからは，それに加えてxsns̲dpnとxsns̲xpn）を呼び出すことができ，その他のサービスコールを呼び出すことはできない．カーネル管理外の状態から，その他のサービスコールを呼び出した場合の動作は，保証されない．
カーネル管理外の状態では，少なくとも，カーネル管理の割込みはマスクされている．カーネル管理外の割込み（の一部）もマスクされている場合もある．
保護機能対応カーネルでは，カーネル管理外の状態になるのは，特権モードで実行している間に限られる．
2.5.10 処理単位とシステム状態
各処理単位が実行開始されるシステム状態の条件（実行開始条件），各処理単位の実行開始時にカーネルによって行われるシステム状態の変更処理（実行開始時処理），各処理単位からのリターン前（または終了前）にアプリケーショ
ンが設定しておくべきシステム状態（リターン前または終了前），各処理単位
からのリターン時（または終了時）にカーネルによって行われるシステム状態の変更処理（リターン時処理または終了時処理）は，次の表の通りである．
CPUロック
割込み優先度ディスパッチ
タスク例外
フラグ
マスク
禁止フラグ
禁止フラグ
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【タスク】
実行開始条件解除
全解除
許可−
実行開始時処理 そのまま
そのまま
そのまま
禁止する(*7)
終了前
原則解除(*1)
原則全解除(*1) 原則許可(*1)
任意
終了時処理
解除する
全解除する
許可する
−
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【タスク例外処理ルーチン】
実行開始条件解除
任意
任意
許可
実行開始時処理 そのまま
そのまま
そのまま
禁止する
リターン前
原則解除(*1)
原則元に(*1)
原則元に(*1)
原則禁止(*1)

ngki̲spec‑120.txt

page 28

リターン時処理 解除する
元に戻す(*4)
元に戻す(*4)
許可する‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【カーネル管理の割込みハンドラ】【割込みサービスルーチン】【タイムイベントハンドラ】
実行開始条件解除
自優先度より低い 任意
任意
実行開始時処理 そのまま自優先度に(*2) そのまま
そのまま
リターン前
原則解除(*1)
変更不可(*3)
変更不可(*3)
変更不可(*3)
リターン時処理 解除する
元に戻す(*5)
そのままそのまま‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【CPU例外ハンドラ】
実行開始条件
任意
任意
任意
任意
実行開始時処理 そのまま(*6)
そのまま
そのまま
そのまま
リターン前
原則元に(*1)
変更不可(*3)
変更不可(*3)
変更不可(*3)
リターン時処理 元に戻す
元に戻す(*5)
そのままそのまま‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【拡張サービスコール】
実行開始条件
任意
任意
任意
任意
実行開始時処理 そのまま
そのまま
そのまま
そのまま
リターン前
任意
任意
任意
任意
リターン時処理 そのまま
そのまま
そのまま
そのまま
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
この表の中で「原則(*1)」とは，処理単位からのリターン前（または終了前）に，アプリケーションが指定された状態に設定しておくことが原則であるが，この原則に従わなくても，リターン時（または終了時）にカーネルによって状態が設定されるため，支障がないことを意味する．
「自優先度に(*2)」 とは，割込みハンドラと割込みサービスルーチンの場合にはそれを要求した割込みの割込み優先度，周期ハンドラとアラームハンドラの場合にはタイマ割込みの割込み優先度，オーバランハンドラの場合にはオーバ
ランタイマ割込みの割込み優先度に変更することを意味する．
「変更不可(*3)」 とは，その処理単位中で，そのシステム状態を変更するAPIが用意されていないことを示す．
保護機能対応カーネルでは，タスク例外処理ルーチンからのリターン時にカーネルによって行われるシステム状態を元に戻す処理(*4)は，タスクにそれぞれの状態変更を許可している場合にのみ行われる．ここでカーネルは，元のシステム状態に戻す処理を実現するために，元のシステム状態をユーザスタック上に保存する．アプリケーションがユーザスタック上に保存されたシステム状態
を書き換えた場合，タスク例外処理ルーチンからのリターン時に，書き換えた
後のシステム状態に変更される（すなわち，元に戻されるとは限らない）．
タスク実行開始時のタスク例外禁止フラグの変更処理(*7)は，正確には，タス
ク起動時に行われる処理である．タスク例外禁止フラグは，タスクが休止状態の時（すなわち，タスクの起動前と終了後）は無効である．
【補足説明】
マルチプロセッサ対応カーネルにおいて，タスクがタスク例外処理ルーチンを実行中にマイグレーションされた場合，マイグレーション先のプロセッサにおいて，割込み優先度マスクとディスパッチ禁止フラグが元に戻される．
【仕様決定の理由】
保護機能対応カーネルにおいて，タスク例外処理ルーチンからのリターン時のシステム状態の変更処理(*4)が，タスクに状態変更を許可している場合にのみ

ngki̲spec‑120.txt

page 29

行われるのは，タスクがユーザスタック上の状態を書き換えることで，許可していない状態変更を起こせてしまうことを防止するためである．タスクに状態変更を許可していない場合には，タスク例外処理ルーチン中で状態を変更できないため，カーネルによって元の状態に戻す必要がない．
割込みハンドラやCPU例外ハンドラで，その処理単位中で割込み優先度マスクを変更するAPIが用意されていないにもかかわらず，処理単位からのリターン時に元の状態に戻す(*5)のは，プロセッサによっては，割込み優先度マスクがステー
タスレジスタ等に含まれており，APIを用いずに変更できてしまう場合があるた
めである．
CPU例外ハンドラの実行開始時には，CPUロックフラグは変更されない(*6)ことから，CPUロック状態でCPU例外が発生した場合，CPU例外ハンドラの実行開始直後はCPUロック状態となっている．CPUロック状態でCPU例外が発生した場合，起動されるCPU例外ハンドラはカーネル管理外のCPU例外ハンドラであり（xsns̲dpn，
xsns̲xpnともtrueを返す），CPU例外ハンドラ中でiunl̲cpuを呼び出してCPUロッ
ク状態を解除しようとした場合の動作は保証されない．ただし，保証されないにも関わらずiunl̲cpuを呼び出した場合も考えられるため，リターン時には元に戻すこととしている．
2.6 タスクの状態遷移とスケジューリング規則
2.6.1 基本的なタスク状態
カーネルに登録したタスクは，実行できる状態，休止状態，広義の待ち状態のいずれかの状態を取る．また，実行できる状態と広義の待ち状態を総称して，起動された状態と呼ぶ．さらに，タスクをカーネルに登録していない仮想的な状態を，未登録状態と呼ぶ．
(a) 実行できる状態（runnable）
タスクを実行できる条件が，プロセッサが使用できるかどうかを除いて，揃っている状態．実行できる状態は，さらに，実行状態と実行可能状態に分類される．
(a.1) 実行状態（running）
タスクが実行されている状態．または，そのタスクの実行中に，割込みまたはCPU例外により非タスクコンテキストの実行が開始され，かつ，タスクコンテキ
ストに戻った後に，そのタスクの実行を再開するという状態．
(a.2) 実行可能状態（ready）
タスク自身は実行できる状態にあるが，それよりも優先順位の高いタスクが実行状態にあるために，そのタスクが実行されない状態．
(b) 休止状態（dormant）
タスクが実行すべき処理がない状態．タスクの実行を終了した後，次に起動するまでの間は，タスクは休止状態となっている．タスクが休止状態にある時には，タスクの実行を再開するための情報（実行再開番地やレジスタの内容など）は保存されていない．
(c) 広義の待ち状態（blocked）
タスクが，処理の途中で実行を止められている状態．タスクが広義の待ち状態にある時には，タスクの実行を再開するための情報（実行再開番地やレジスタの内容など）は保存されており，タスクが実行を再開する時には，広義の待ちngki̲spec‑120.txt

page 30

状態に遷移する前の状態に戻される．広義の待ち状態は，さらに，（狭義の）待ち状態，強制待ち状態，二重待ち状態に分類される．
(c.1) （狭義の）待ち状態（waiting）
タスクが何らかの条件が揃うのを待つために，自ら実行を止めている状態．
(c.2) 強制待ち状態（suspended）
他のタスクによって，強制的に実行を止められている状態．ただし，自タスクを強制待ち状態にすることも可能である．
(c.3) 二重待ち状態（waiting‑suspended）
待ち状態と強制待ち状態が重なった状態．すなわち，タスクが何らかの条件が揃うのを待つために自ら実行を止めている時に，他のタスクによって強制的に実行を止められている状態．
単にタスクが「待ち状態である」といった場合には，二重待ち状態である場合を含み，「待ち状態でない」といった場合には，二重待ち状態でもないことを意味する．また，単にタスクが「強制待ち状態である」といった場合には，二重待ち状態である場合を含み，「強制待ち状態でない」といった場合には，二重待ち状態でもないことを意味する．
(d) 未登録状態（non‑existent）
タスクをカーネルに登録していない仮想的な状態．タスクの生成前と削除後は，タスクは未登録状態にあるとみなす．
カーネルによっては，これらのタスク状態以外に，過渡的な状態が存在する場
合がある．過渡的な状態については，「2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち」の節を参照すること．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，タスクが未登録状態になることはない．また，上記のタスク
状態以外の過渡的な状態になることもない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，タスクが未登録状態になることはない．上記のタスク状態以外の過渡的な状態として，タスクが強制待ち状態［実行継続中］になることがある．詳しくは，「2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち」の節を参照すること．
2.6.2 タスクの状態遷移
タスクの状態遷移を図2‑2に示す．
未登録状態のタスクをカーネルに登録することを，タスクを生成する（create）という．生成されたタスクは，休止状態に遷移する．また，タスク生成時の属性指定により，生成と同時にタスクを起動し，実行できる状態にすることもできる．逆に，登録されたタスクを未登録状態に遷移させることを，タスクを削除する（delete）という．
休止状態のタスクを，実行できる状態にすることを，タスクを起動する（activate）という．起動されたタスクは，実行できる状態になる．逆に，起動された状態のタスクを，休止状態（または未登録状態）に遷移させることを，ngki̲spec‑120.txt

page 31

タスクを終了する（terminate）という．
実行できる状態になったタスクは，まずは実行可能状態に遷移するが，そのタスクの優先順位が実行状態のタスクよりも高い場合には，ディスパッチ保留状
態でない限りはただちにディスパッチが起こり，実行状態へ遷移する．この時，それまで実行状態であったタスクは実行可能状態に遷移する．この時，実行状態に遷移したタスクは，実行可能状態に遷移したタスクをプリエンプトしたという．逆に，実行可能状態に遷移したタスクは，プリエンプトされたという．
タスクを待ち解除するとは，タスクが待ち状態（二重待ち状態を除く）であれば実行できる状態に，二重待ち状態であれば強制待ち状態に遷移させることをいう．また，タスクを強制待ちから再開するとは，タスクが強制待ち状態（二重待ち状態を除く）であれば実行できる状態に，二重待ち状態であれば待ち状態に遷移させることをいう．
【補足説明】
タスクの実行開始とは，タスクが起動された後に最初に実行される（実行状態に遷移する）時のことをいう．
2.6.3 タスクのスケジューリング規則
実行できるタスクは，優先順位の高いものから順に実行される．すなわち，ディスパッチ保留状態でない限りは，実行できるタスクの中で最も高い優先順位を持つタスクが実行状態となり，他は実行可能状態となる．
タスクの優先順位は，タスクの優先度とタスクが実行できる状態になった順序から，次のように定まる．優先度の異なるタスクの間では，優先度の高いタス
クが高い優先順位を持つ．優先度が同一のタスクの間では，先に実行できる状態になったタスクが高い優先順位を持つ．すなわち，同じ優先度を持つタスク
は，FCFS（First Come First Served）方式でスケジューリングされる．ただし，
サービスコールの呼出しにより，同じ優先度を持つタスク間の優先順位を変更することも可能である．
最も高い優先順位を持つタスクが変化した場合には，ディスパッチ保留状態でない限りはただちにディスパッチが起こり，最も高い優先順位を持つタスクが実行状態となる．ディスパッチ保留状態においては，実行状態のタスクは切り換わらず，最も高い優先順位を持つタスクは実行可能状態にとどまる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，上記のスケジューリン
グ規則を適用して，タスクスケジューリングを行う．すなわち，プロセッサがディスパッチ保留状態でない限りは，そのプロセッサに割り付けられた実行できるタスクの中で最も高い優先順位を持つタスクが実行状態となり，他は実行可能状態となる．そのため，実行状態のタスクは，プロセッサ毎に存在する．
2.6.4 待ち行列と待ち解除の順序
タスクが待ち解除される順序の管理のために，待ち状態のタスクがつながれているキューを，待ち行列と呼ぶ．また，タスクが同期・通信オブジェクトの待
ち行列につながれている場合に，そのオブジェクトを，タスクの待ちオブジェ
クトと呼ぶ．
待ち行列にタスクをつなぐ順序には，FIFO順とタスクの優先度順がある．どちらの順序でつなぐかは，待ち行列毎に規定される．多くの待ち行列において，どちらの順序でつなぐかを，オブジェクト属性により指定できる．
FIFO順の待ち行列においては，新たに待ち状態に遷移したタスクは待ち行列の最後につながれる．それに対してタスクの優先度順の待ち行列においては，新ngki̲spec‑120.txt

page 32

たに待ち状態に遷移したタスクは，優先度の高い順に待ち行列につながれる．
同じ優先度のタスクが待ち行列につながれている場合には，新たに待ち状態に遷移したタスクが，同じ優先度のタスクの中で最後につながれる．
待ち解除の条件がタスクによって異なる場合には，待ち行列の先頭のタスクは待ち解除の条件を満たさないが，後方のタスクが待ち解除の条件を満たす場合がある．このような場合の振舞いとして，次の2つのケースがある．どちらの振舞いをするかは，待ち行列毎に規定される．
(a) 待ち解除の条件を満たしたタスクの中で，待ち行列の前方につながれたものから順に待ち解除される．すなわち，待ち行列の前方に待ち解除の条件を満たさないタスクがあっても，後方のタスクが待ち解除の条件を満たしていれば，先に待ち解除される．
(b) タスクの待ち解除は，待ち行列につながれている順序で行われる．すなわ
ち，待ち行列の前方に待ち解除の条件を満たさないタスクがあると，後方のタスクが待ち解除の条件を満たしても，待ち解除されない．
ここで，(b)の振舞いをする待ち行列においては，待ち行列につながれたタスクの強制終了，タスク優先度の変更（待ち行列がタスクの優先度順の場合のみ），待ち状態の強制解除が行われた場合に，タスクの待ち解除が起こることがある．
具体的には，これらの操作により新たに待ち行列の先頭になったタスクが，待ち解除の条件を満たしていれば，ただちに待ち解除される．さらに，この待ち解除により新たに待ち行列の先頭になったタスクに対しても，同じ処理が繰り返される．
2.6.5 タスク例外処理マスク状態と待ち禁止状態
保護機能対応カーネルにおいて，ユーザタスクについては特権モードで実行している間（特権モードを実行している間に，実行可能状態や広義の待ち状態になっている場合を含む．また，サービスコールを呼び出して，実行可能状態や広義の待ち状態になっている場合も含む．タスクの実行開始前は含まない），
システムタスクについては拡張サービスコールを実行している間（拡張サービ
スコールを実行している間に，実行可能状態や広義の待ち状態になっている場
合を含む）は，タスク例外処理ルーチンの実行は開始されない．これらの状態
を，タスク例外処理マスク状態と呼ぶ．
タスクは，タスク例外処理マスク状態である時に，基本的なタスク状態と重複して，待ち禁止状態になることができる．
待ち禁止状態とは，タスクが待ち状態に入ることが一時的に禁止された状態である．待ち禁止状態にあるタスクが，サービスコールを呼び出して待ち状態に遷移しようとした場合，サービスコールはE̲RLWAIエラーとなる．
タスクを待ち禁止状態に遷移させるサービスコールは，対象タスクがタスク例
外処理マスク状態である場合に，対象タスクを待ち禁止状態に遷移させる．その後，タスクがタスク例外処理マスク状態でなくなる時点（ユーザタスクについては特権モードから戻る時点，システムタスクについて拡張サービスコール
からリターンする時点）で，待ち禁止状態が解除される．また，タスクの待ち禁止状態を解除するサービスコールによっても，待ち禁止状態を解除することができる．
【仕様決定の理由】
タスク例外処理ルーチンでは，タスクの本体のための例外処理（例えば，タスクに対して終了要求があった時の処理）を行うことを想定しており，タスクから呼び出した拡張サービスコールのための例外処理を行うことは想定していな
い．そのため，拡張サービスコールを実行している間にタスク例外処理が要求ngki̲spec‑120.txt

page 33

された場合に，すぐにタスク例外処理ルーチンを実行すると，拡張サービスコー
ルのための例外処理が行われないことになる．
また，ユーザタスクの場合には，特権モードを実行中にタスク例外処理ルーチ
ンを実行すると，システムスタックに情報を残したまま非特権モードに戻ることになる．この状態で，タスク例外処理ルーチンから大域脱出すると，システ
ムスタック上に不要な情報が残ってしまう．
これらの理由から，タスクが拡張サービスコールを実行している間は，タスク
例外処理マスク状態とし，タスク例外処理ルーチンの実行を開始しないこととする．さらに，ユーザタスクについては，特権モードを実行している間（拡張サービスコールを実行している間を含む）を，タスク例外処理マスク状態とする．
対象タスクに，タスク例外処理ルーチンをすみやかに実行させたい場合には，
タスク例外処理の要求に加えて，待ち状態の強制解除を行う（必要に応じて，強制待ち状態からの再開も行う）．保護機能対応でないカーネルにおいては，
この方法により，対象タスクが正常に待ち解除されるのを待たずに，タスク例
外処理ルーチンを実行させることができる．
それに対して，保護機能対応カーネルにおいては，対象タスクがタスク例外処理マスク状態で実行している間は，タスク例外処理ルーチンの実行が開始されない．そのため，対象タスクに対して待ち状態の強制解除を行っても，その後に対象タスクが待ち状態に入ると，タスク例外処理ルーチンがすみやかに実行されないことになる．
待ち禁止状態は，この問題を解決するために導入したものである．タスク例外
処理の要求（ras̲tex／iras̲tex）に加えて，待ち禁止状態への遷移（dis̲wai／
idis̲wai）と待ち状態の強制解除（rel̲wai／irel̲wai）をこの順序で行うこと
で，対象タスクが正常に待ち解除されるのを待たずに，タスク例外処理ルーチ
ンを実行させることができる．
タスク例外処理マスク状態を，ユーザタスクについても拡張サービスコールを実行している間とせず，特権モードで実行している間とした理由は，拡張サービスコールを実行している間とした場合に次のような問題があるためである．
ユーザタスクが，ソフトウェア割込みにより自タスクを待ち状態に遷移させる
サービスコールを呼び出した直後に割込みが発生し，その割込みハンドラの中でiras̲tex，idis̲wai，irel̲waiが呼び出されると，この時点では待ち解除もされず待ち禁止状態にもならないために，割込みハンドラからのリターン後に待ち状態に入ってしまう．ソフトウェア割込みによりすべての割込みが禁止されないターゲットプロセッサでは，ソフトウェア割込みの発生とサービスコー
ルの実行を不可分にできないため，このような状況を防ぐことができない．
なお，拡張サービスコールは，待ち状態に入るサービスコールからE̲RLWAIが返された場合には，実行中の処理を取りやめて，E̲RLWAIを返値としてリターンするように実装すべきである．
【μITRON4.0仕様，μITRON4.0/PX仕様との関係】
待ち禁止状態は，μITRON4.0仕様にはない概念であり，μITRON4.0/PX仕様で導入された．ただし，μITRON4.0/PX仕様では，タスクの待ち状態を強制解除する
サービスコールが，タスクを待ち禁止状態へ遷移させる機能も持つこととしている．その結果μITRON4.0/PX仕様は，待ち状態を強制解除するサービスコールの仕様において，μITRON4.0仕様との互換性がなくなっている．
この仕様では，待ち状態の強制解除と待ち禁止状態への遷移を別々のサービス
コールで行うこととした．これにより，待ち状態を強制解除するサービスコー

ngki̲spec‑120.txt

page 34

ルの仕様が，μITRON4.0仕様と互換になっている．一方，μITRON4.0/PX仕様とは互換性がない．
2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち
ディスパッチ保留状態において，実行状態のタスクを強制待ち状態へ遷移させるサービスコールを呼び出した場合，実行状態のタスクの切換えは，ディスパッ
チ保留状態が解除されるまで保留される．
この間，それまで実行状態であったタスクは，実行状態と強制待ち状態の間の過渡的な状態にあると考える．この状態を，強制待ち状態［実行継続中］と呼ぶ．一方，ディスパッチ保留状態が解除された後に実行すべきタスクは，実行可能状態にとどまる．
タスクが強制待ち状態［実行継続中］にある時に，ディスパッチ保留状態が解除されると，ただちにディスパッチが起こり，タスクは強制待ち状態に遷移す
る．
過渡的な状態も含めたタスクの状態遷移を図2‑3に示す．
タスクが強制待ち状態［実行継続中］である時の扱いは次の通りである．
(a) プロセッサを占有して実行を継続する．
強制待ち状態［実行継続中］のタスクは，プロセッサを占有して，そのまま継続して実行される．
(b) 実行状態のタスクに関する情報を参照するサービスコールでは，実行状態であるものと扱う．
実行状態のタスクに関する情報を参照するサービスコール（get̲tid／iget̲tid，get̲did，sns̲tex）では，強制待ち状態［実行継続中］のタスクが，それを実行するプロセッサにおいて実行状態のタスクであるものと扱う．具体的には，強制待ち状態［実行継続中］のタスクが実行されている時にget̲tid／iget̲tidを発行すると，そのタスクのID番号を参照する．また，get̲didを発行するとそのタスクが属する保護ドメインのID番号を，sns̲texを発行するとそのタスクのタスク例外処理禁止フラグを参照する．
(c) その他のサービスコールでは，強制待ち状態であるものと扱う．
その他のサービスコールでは，強制待ち状態［実行継続中］のタスクは，強制待ち状態であるものと扱う．
なお，TOPPERS新世代カーネルでは，ディスパッチ保留状態において，実行状態のタスクを強制終了させるサービスコールはサポートしていない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ディスパッチ保留状態において実行状態のタスクを強制待ち状態へ遷移させるサービスコールはサポートしていないため，タスクが強制待ち状態［実行継続中］になることはない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ディスパッチ保留状態において実行状態のタスクを強制待ち状態へ遷移させるサービスコールを，他のプロセッサから呼び出すことができるため，タスクが強制待ち状態［実行継続中］になる場合がある．

ngki̲spec‑120.txt

page 35

2.7 割込み処理モデル
TOPPERS新世代カーネルにおける割込み処理のモデルは，TOPPERS標準割込み処理モデルに準拠している．
TOPPERS標準割込み処理モデルの概念図を図2‑4に示す．この図は，割込み処理モデルの持つすべての機能が，ハードウェア（プロセッサおよび割込みコントローラ）で実現されているとして描いた概念図である．実際のハードウェアで不足している機能については，カーネル内の割込み処理のソフトウェアで実現される．
【μITRON4.0仕様との関係】
割込み処理モデルは，μITRON4.0仕様から大幅に拡張している．
2.7.1 割込み処理の流れ
周辺デバイス（以下，デバイスと呼ぶ）からの割込み要求は，割込みコントローラ（IRC）を経由して，プロセッサに伝えられる．デバイスから割込みコントロー
ラに割込み要求を伝えるための信号線を，割込み要求ラインと呼ぶ．一般には，1つの割込み要求ラインに，複数のデバイスからの割込み要求が接続される．
プロセッサは，デバイスからの割込み要求を受け付ける条件が満たされた場合，割込み要求を受け付ける．受け付けた割込み要求が，カーネル管理の割込みである場合には，カーネル内の割込み出入口処理を経由して，カーネル内の割込
みハンドラを実行する．
カーネル内の割込みハンドラは，アプリケーションが割込み要求ラインに対して登録した割込みサービスルーチン（ISR）を呼び出す．割込みサービスルーチ
ンは，プロセッサの割込みアーキテクチャや割込みコントローラに依存せず，割込みを要求したデバイスのみに依存して記述するのが原則である．1つの割込
み要求ラインに対して複数のデバイスが接続されることから，1つの割込み要求
ラインに対して複数の割込みサービスルーチンを登録することができる．
ただし，カーネルが標準的に用意している割込みハンドラで対応できない特殊なケースも考えられる．このような場合に対応するために，アプリケーションが用意した割込みハンドラをカーネルに登録することもできる．
カーネルが用いるタイマデバイスからの割込み要求の場合，カーネル内の割込
みハンドラが，タイムイベントの処理を行う．具体的には，タイムアウト処理等を行うことに加えて，アプリケーションが登録したタイムイベントハンドラを呼び出す．
なお，受け付けた割込み要求に対して，割込みサービスルーチンも割込みハンドラも登録していない場合の振舞いは，ターゲット定義である．
2.7.2 割込み優先度
割込み要求は，割込み処理の優先順位を指定するための割込み優先度を持つ．
プロセッサは，割込み優先度マスクの現在値よりも高い割込み優先度を持つ割込み要求のみを受け付ける．逆に言うと，割込み優先度マスクの現在値と同じか，それより低い割込み優先度を持つ割込みは，マスクされる．
プロセッサは，割込み要求を受け付けると，割込み優先度マスクを，受け付け
た割込み要求の割込み優先度に設定する（ただし，受け付けた割込みがNMIである場合には例外とする）．また，割込み処理からのリターンにより，割込み優
先度マスクを，割込み要求を受け付ける前の値に戻す．

ngki̲spec‑120.txt

page 36

これらのことから，他の方法で割込みをマスクしていない限り，ある割込み要求の処理中は，それと同じかそれより低い割込み優先度を持つ割込み要求は受け付けられず，それより高い割込み優先度を持つ割込み要求は受け付けられることになる．つまり，割込み優先度は，多重割込みを制御するためのものと位置付けることができる．それに対して，同時に発生している割込み要求の中で，割込み優先度の高い割込み要求が先に受け付けられるとは限らない．
割込み優先度は，PRI型で表現し，値が小さいほど優先度が高いものとするが，優先度に関する原則には従わず，‑1から連続した負の値を用いる．これは，割込み優先度とタスク優先度を比較できるようになることと，いずれの割込みもマスクしない割込み優先度マスクの値を0にできるためである．
割込み優先度の段階数は，ターゲット定義である．プロセッサが割込み優先度
マスクを実現するための機能を持たないか，実現するために大きいオーバヘッ
ドを生じる場合には，ターゲット定義で，割込み優先度の段階数を1にする（すなわち，多重割込みを許さない）場合がある．
2.7.3 割込み要求ラインの属性
各割込み要求ラインは，以下の属性を持つ．なお，1つの割込み要求ラインに複数のデバイスからの割込み要求が接続されている場合，それらの割込み要求は同一の属性を持つ．それらの割込み要求に別々の属性を設定することはできな
い．
(1) 割込み要求禁止フラグ
割込み要求ライン毎に，割込みをマスクするための割込み要求禁止フラグを持つ．割込み要求禁止フラグをセットすると，その割込み要求処理ラインにより伝えられる割込み要求はマスクされる．
プロセッサが割込み要求禁止フラグを実現するための機能を持たないか，実現するために大きいオーバヘッドを生じる場合には，ターゲット定義で，割込み禁止フラグをサポートしない場合がある．また，プロセッサの持つ割込み要求
禁止フラグの機能がこの仕様に合致しない場合には，ターゲット定義で，割込み禁止フラグをサポートしないか，振舞いが異なるものとする場合がある．
アプリケーションが，割込み要求禁止フラグを動的にセット／クリアする機能を用いると，次の理由でソフトウェアの再利用性が下がる可能性があるため，注意が必要である．プロセッサによっては（この割込み処理モデルに合致した）割込み要求禁止フラグの機能を実現できない場合がある．また，割込み要求禁止フラグを設定することで複数のデバイスからの割込みがマスクされる場合がある．ソフトウェアの再利用性を上げるためには，あるデバイスからの割込みのみをマスクしたい場合には，できる限り，そのデバイス自身の機能を使ってマスクを実現すべきである．
(2) 割込み優先度
割込み要求ライン毎に，割込み優先度を設定することができる．割込み要求の割込み優先度とは，その割込み要求を伝える割込み要求ラインに対して設定された割込み優先度のことである．
(3) トリガモード
割込み要求ラインに対する割込み要求が，レベルトリガであるかエッジトリガ
であるかを設定することができる．エッジトリガの場合には，さらに，ポジティ
ブエッジかネガティブエッジか両エッジトリガかを設定できる場合もある．また，レベルトリガの場合には，ローレベルトリガかハイレベルトリガかを設定できる場合もある．

ngki̲spec‑120.txt

page 37

プロセッサがトリガモードを設定するための機能を持たないか，設定するために大きいオーバヘッドを生じる場合には，ターゲット定義で，トリガモードの設定をサポートしない場合がある．
2.7.4 割込みを受け付ける条件
NMI以外の割込み要求は，次の4つの条件が揃った場合に受け付けられる．
(a) 割込み要求ラインに対する割込み要求禁止フラグがクリアされていること(b) 割込み要求ラインに設定された割込み優先度が，割込み優先度マスクの現在値よりも高い（優先度の値としては小さい）こと(c) 全割込みロックフラグがクリアされていること(d) 割込み要求がカーネル管理の割込みである場合には，CPUロックフラグがクリアされていることこれらの条件が揃った割込み要求が複数ある場合に，どの割込み要求が最初に受け付けられるかは，この仕様では規定しない．すなわち，割込み優先度の高
い割込み要求が先に受け付けられるとは限らない．
2.7.5 割込み番号と割込みハンドラ番号
割込みサービスルーチンの登録対象となる割込み要求ラインを識別するための番号を，割込み番号と呼ぶ．割込み番号は，符号無しの整数型であるINTNO型で表し，ターゲットハードウェアの仕様から決まる自然な番号付けを基本として，ターゲット定義で付与される．そのため，1から連続した正の値であるとは限らない．
それに対して，アプリケーションが用意した割込みハンドラをカーネルに登録する場合に，割込みハンドラの登録対象となる割込みを識別するための番号を，割込みハンドラ番号と呼ぶ．割込みハンドラ番号は，符号無しの整数型である
INHNO型で表し，ターゲットハードウェアの仕様から決まる自然な番号付けを基本として，ターゲット定義で付与される．そのため，1から連続した正の値であるとは限らない．
割込みハンドラ番号は，割込み番号と1対1に対応するのが基本である（両者が一致する場合が多い）．
ただし，割込みを要求したデバイスが割込みベクタを生成してプロセッサに渡すアーキテクチャなどでは，割込み番号と割込みハンドラ番号の対応を，カーネルが管理していない場合がある．そこで，ターゲット定義で，割込み番号に対応しない割込みハンドラ番号や，割込みハンドラ番号に対応しない割込み番号を設ける場合もある．この場合でも，割込みサービスルーチンの登録対象にできるのは，割込み番号と割込みハンドラ番号の1対1の対応関係をカーネルが管理している割込み番号のみである．
2.7.6 マルチプロセッサにおける割込み処理
この節では，マルチプロセッサにおける割込み処理について説明する．この節の内容は，マルチプロセッサ対応カーネルにのみ適用される．
マルチプロセッサ対応カーネルでは，TOPPERS標準割込み処理モデルの構成要素の中で，図2‑4の破線に囲まれた部分はプロセッサ毎に持ち，それ以外の部分はシステム全体で1つのみ持つ．すなわち，全割込みロックフラグ，CPUロックフ
ラグ，割込み優先度マスクはプロセッサ毎に持つのに対して，割込み要求ライ

ngki̲spec‑120.txt

page 38

ンおよびその属性（割込み要求禁止フラグ，割込み優先度，トリガモード）はシステム全体で共通に持つ．
割込み番号は，割込み要求ラインを識別するための番号であることから，割込
み要求ラインが複数のプロセッサに接続されている場合でも，1つの割込み要求
ラインには1つの割込み番号を付与する．逆に，複数のプロセッサが同じ種類のデバイスを持っている場合でも，別のデバイスからの割込み要求ラインには異なる割込み番号を付与する（図2‑5）．
割込みサービスルーチンは，登録対象の割込み要求ラインが複数のプロセッサに接続されている場合には，そのいずれによっても実行することができる．ただし，その内のどのプロセッサで割込みサービスルーチンを実行するかは，割込みサービスルーチンが属するクラスの割付け可能プロセッサにより決定される．割込みサービスルーチンが属するクラスの割付け可能プロセッサは，登録対象の割込み要求ラインが接続されたプロセッサの集合に含まれていなければならない．また，同一の割込み要求ラインに対して登録する割込みサービスルー
チンは，同一のクラスに属していなければならない．
それに対して，割込みハンドラはプロセッサ毎に登録する．そのため，同じ割込み要求に対応する割込みハンドラであっても，プロセッサ毎に異なる割込み
ハンドラ番号を付与する（図2‑5）．割込みハンドラが属するクラスの初期割付
けプロセッサは，割込みが要求されるプロセッサと一致していなければならない．
【補足説明】
マルチプロセッサ対応カーネルにおける割込み番号の付与方法は，複数のプロセッサに接続された割込み要求ラインに対しては，割込み番号の上位ビットを0とし，1つのプロセッサのみに接続された割込み要求ラインに対しては，割込
み番号の上位ビットに，接続されたプロセッサのID番号を含める方法を基本とする．また，割込みハンドラ番号の付与方法は，割込みハンドラ番号の上位ビッ
トに，その割込みハンドラを実行するプロセッサのID番号を含める方法を基本とする（図2‑5）．
【使用上の注意】
複数のプロセッサで実行することができる割込みサービスルーチンは，それらのプロセッサのいずれかで実行されるものと設定した場合でも，複数回の割込み要求により，異なるプロセッサで同時に実行される可能性がある．
2.7.7 カーネル管理外の割込み
高い割込み応答性を求められるアプリケーションでは，カーネル内で割込みをマスクすることにより，割込み応答性の要求を満たせなくなる場合がある．このような要求に対応するために，カーネル内では，ある割込み優先度（これを，TMIN̲INTPRIと書く）よりも高い割込み優先度を持つ割込みをマスクしないこととしている．TMIN̲INTPRIを固定するか設定できるようにするか，設定できるよ
うにする場合の設定方法は，ターゲット定義である．
TMIN̲INTPRIよりも高い割込み優先度を持ち，カーネル内でマスクしない割込みを，カーネル管理外の割込みと呼ぶ．また，カーネル管理外の割込みによって起動される割込みハンドラを，カーネル管理外の割込みハンドラと呼ぶ．NMIは，
カーネル管理外の割込みとして扱う．NMI以外にカーネル管理外の割込みを設けるか（設けられるようにするか）どうかは，ターゲット定義である．
それに対して，TMIN̲INTPRIと同じかそれよりも低い割込み優先度を持つ割込みをカーネル管理の割込み，カーネル管理の割込みによって起動される割込みハ
ンドラをカーネル管理の割込みハンドラと呼ぶ．

ngki̲spec‑120.txt

page 39

カーネル管理外の割込みハンドラは，カーネル内の割込み出入口処理を経由せずに実行するのが基本である．ただし，すべての割込みで同じ番地に分岐する
プロセッサでは，カーネル内の割込み出入口処理を全く経由せずにカーネル管
理外の割込みハンドラを実行することができず，出入口処理の一部分を経由してカーネル管理外の割込みハンドラが実行されることになる．
カーネル管理外の割込みハンドラが実行開始される時のシステム状態とコンテ
キスト，割込みハンドラの終了時に行われる処理，割込みハンドラの記述方法
は，ターゲット定義である．カーネル管理外の割込みハンドラからは，システ
ムインタフェースレイヤのAPIとsns̲ker，ext̲kerのみを呼び出すことができ，その他のサービスコールを呼び出すことはできない．カーネル管理外の割込み
ハンドラから，その他のサービスコールを呼び出した場合の動作は，保証されない．
2.7.8 カーネル管理外の割込みの設定方法
カーネル管理外の割込みの設定方法は，ターゲット定義で，次の3つの方法のいずれかが採用される．
(a‑1) NMI以外にカーネル管理外の割込みを設けない(a‑2) カーネル構築時に特定の割込みをカーネル管理外にすると決める
これら場合には，カーネル管理外とする割込みはカーネル構築時（ターゲット
依存部の実装時やカーネルのコンパイル時）に決まるため，カーネル管理外とする割込みをアプリケーション側で設定する必要はない．ここで，カーネル管理外とされた割込みに対して，カーネルのAPIにより割込みハンドラを登録でき
るかと，割込み要求ラインの属性を設定できるかは，ターゲット定義である．
割込みハンドラを登録できる場合には，それを定義するAPIにおいて，カーネル
管理外であることを示す割込みハンドラ属性（TA̲NONKERNEL）を指定する．また，割込み要求ラインの属性を設定できる場合には，設定する割込み優先度を
TMIN̲INTPRIよりも高い値とする．
(b) カーネル管理外とする割込みをアプリケーションで設定できるようにする
この場合には，カーネル管理外とする割込みの設定は，次の方法で行う．まず，カーネル管理外とする割込みハンドラを定義するAPIにおいて，カーネル管理外であることを示す割込みハンドラ属性（TA̲NONKERNEL）を指定する．また，カーネル管理外とする割込みの割込み要求ラインに対して設定する割込み優先度を，
TMIN̲INTPRIよりも高い値とする．
いずれの場合にも，カーネル管理の割込みの割込み要求ラインに対して設定する割込み優先度は，TMIN̲INTPRIより高い値であってはならない．また，カーネル管理外の割込みに対して，割込みサービスルーチンを登録することはできな
い．
2.8 CPU例外処理モデル
プロセッサが検出するCPU例外の種類や，CPU例外検出時のプロセッサの振舞い
は，プロセッサによって大きく異なる．そのため，CPU例外ハンドラをターゲッ
トハードウェアに依存せずに記述することは，少なくとも現時点では困難である．そこでこの仕様では，CPU例外の処理モデルを厳密に標準化するのではなく，ターゲットハードウェアに依存せずに決められる範囲で規定する．
2.8.1 CPU例外処理の流れ
アプリケーションは，プロセッサが検出するCPU例外の種類毎に，CPU例外ハンドラを登録することができる．プロセッサがCPU例外の発生を検出すると，カーngki̲spec‑120.txt

page 40

ネル内のCPU例外出入口処理を経由して，発生したCPU例外に対して登録したCPU例外ハンドラが呼び出される．
CPU例外ハンドラの登録対象となるCPU例外を識別するための番号を，CPU例外ハ
ンドラ番号と呼ぶ．CPU例外ハンドラ番号は，符号無しの整数型であるEXCNO型で表し，ターゲットハードウェアの仕様から決まる自然な番号付けを基本として，ターゲット定義で付与される．そのため，1から連続した正の値であるとは限らない．
マルチプロセッサ対応カーネルでは，異なるプロセッサで発生するCPU例外は，異なるCPU例外であると扱う．すなわち，同じ種類のCPU例外であっても，異なるプロセッサのCPU例外には異なるCPU例外ハンドラ番号を付与し，プロセッサ毎にCPU例外ハンドラを登録する．CPU例外ハンドラが属するクラスの初期割付
けプロセッサは，CPU例外が発生するプロセッサと一致していなければならない．
CPU例外ハンドラにおいては，CPU例外が発生した状態からのリカバリ処理を行う．どのようなリカバリ処理を行うかは，一般にはCPU例外の種類やそれが発生したコンテキストおよび状態に依存するが，大きく次の4つの方法が考えられる．
(a) カーネルに依存しない形でCPU例外の原因を取り除き，実行を継続する．
(b) CPU例外を起こしたタスクよりも優先度の高いタスクを起動または待ち解除
し，そのタスクでリカバリ処理を行う（例えば，CPU例外を起こしたタスクを強制終了し，再度起動する）．ただし，CPU例外を起こしたタスクが最高優先度の場合には，この方法でリカバリ処理を行うことはできない（リカバリ処理を行うタスクを最高優先度とし，タスクの起動または待ち解除後に優先順位を回転させることで，リカバリ処理を行える可能性があるが，推奨できる方法ではない）．
(c) CPU例外を起こしたタスクにタスク例外処理を要求し，タスク例外処理ルー
チンでリカバリ処理を行う（例えば，CPU例外を起こしたタスクを終了する）．
(d) システム全体に対してリカバリ処理を行う（例えば，システムを再起動する）．
この中で(a)と(d)の方法は，カーネルの機能を必要としないため，CPU例外が発生したコンテキストおよび状態に依存せずに常に行える．それに対して(b)と(c)の方法は，CPU例外ハンドラからそのためのサービスコールを呼び出せることが必要であり，それが行えるかどうかは、CPU例外が発生したコンテキストおよび状態に依存する．
なお，発生したCPU例外に対して，CPU例外ハンドラを登録していない場合の振舞いは，ターゲット定義である．
【使用上の注意】
CPU例外ハンドラの出入口処理でCPU例外が発生し，それを処理するためのCPU例
外ハンドラの出入口処理で同じ原因でCPU例外が発生すると，CPU例外が繰り返し発生し，アプリケーションが登録したCPU例外ハンドラまで処理が到達しない状況が考えられる．このような状況が発生するかどうかはターゲットによるが，これが許容できない場合には，CPU例外ハンドラの出入口処理を経由せずに，ア
プリケーションが用意したCPU例外ハンドラを直接実行するようにしなければならない．
【補足説明】
マルチプロセッサ対応カーネルにおけるCPU例外ハンドラ番号の付与方法は，CPU例外ハンドラ番号の上位ビットに，そのCPU例外が発生するプロセッサのIDngki̲spec‑120.txt

page 41

番号を含める方法を基本とする．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，CPU例外からのリカバリ処理の方法については，記述されていない．
2.8.2 CPU例外ハンドラから呼び出せるサービスコール
CPU例外ハンドラからは，CPU例外発生時のディスパッチ保留状態を参照するサービスコール（xsns̲dpn）と，CPU例外発生時のタスク例外処理保留状態を参照するサービスコール（xsns̲xpn）を呼び出すことができる．
xsns̲dpnは，CPU例外がタスクコンテキストで発生し，そのタスクがディスパッ
チできる状態である場合にfalseを返す．xsns̲dpnがfalseを返した場合，そのCPU例外ハンドラから，非タスクコンテキストから呼び出せるすべてのサービス
コールを呼び出すことができ，(b)の方法によるリカバリ処理が可能である．ただし，CPU例外を起こしたタスクが最高優先度の場合には，この方法でリカバリ処理を行うことはできない．
xsns̲xpnは，CPU例外がタスクコンテキストで発生し，そのタスクがタスク例外
処理ルーチンを実行できる状態である場合にfalseを返す．xsns̲xpnがfalseを返した場合，そのCPU例外ハンドラから，非タスクコンテキストから呼び出せる
すべてのサービスコールを呼び出すことができ，(c)の方法によるリカバリ処理が可能である．
ただし，保護機能対応カーネルにおけるタスク例外実行開始時スタック不正例
外とタスク例外リターン時スタック不正例外に対するCPU例外ハンドラでは，
xsns̲xpnがfalseを返した場合でも，(c)の方法によるリカバリ処理を行うことはできない．
xsns̲dpnとxsns̲xpnのいずれのサービスコールもtrueを返した場合，そのCPU例
外ハンドラからは，xsns̲dpnとxsns̲xpnに加えて，システムインタフェースレ
イヤのAPIとsns̲ker，ext̲kerのみを呼び出すことができ，その他のサービスコー
ルを呼び出すことはできない．いずれのサービスコールもtrueを返したにもかかわらず，その他のサービスコールを呼び出した場合の動作は，保証されない．
この場合には，(b)と(c) の方法によるリカバリ処理は行うことはできず，(a)または(d)の方法によるリカバリ処理を行うしかないことになる．
【μITRON4.0仕様との関係】
CPU例外ハンドラで行える操作に関しては，μITRON4.0仕様を見直し，全面的に修正した．
2.8.3 エミュレートされたCPU例外ハンドラ
エラーコードによってアプリケーションに通知できないエラーをカーネルが検出した場合に，アプリケーションが登録したエラー処理を，カーネルが呼び出す場合がある．この場合に，カーネルが検出するエラーをCPU例外と同等に扱うものとし，エミュレートされたCPU例外と呼ぶ．また，エラー処理のためのプログラムをCPU例外ハンドラと同等に扱うものとし，エミュレートされたCPU例外
ハンドラと呼ぶ．
具体的には，エミュレートされたCPU例外ハンドラに対してもCPU例外ハンドラ
番号が付与され，CPU例外ハンドラと同じ方法で登録できる．また，エミュレー
トされたCPU例外ハンドラからも，CPU例外ハンドラから呼び出せるサービスコー
ルを呼び出すことができ，CPU例外ハンドラと同様のリカバリ処理を行うことができる．

ngki̲spec‑120.txt

page 42【μITRON4.0仕様との関係】
エミュレートされたCPU例外およびCPU例外ハンドラは，μITRON4.0仕様に定義されていない概念である．
2.8.4 カーネル管理外のCPU例外
カーネル内のクリティカルセクションの実行中（これを，カーネル実行中と呼ぶ），全割込みロック状態，CPUロック状態，カーネル管理外の割込みハンドラ
実行中のいずれかで発生したCPU例外を，カーネル管理外のCPU例外と呼ぶ．また，それによって起動されるCPU例外ハンドラを，カーネル管理外のCPU例外ハンドラと呼ぶ．さらに，カーネル管理外のCPU例外ハンドラ実行中に発生したCPU例外も，カーネル管理外のCPU例外とする．
ターゲット定義で，割込み優先度マスクがTMIN̲INTPRIと同じかそれよりも高い状態（割込み優先度がTMIN̲INTPRIの割込みを処理する割込みハンドラおよび割込みサービスルーチンの実行中を含む）で発生したCPU例外も，カーネル管理外のCPU例外と扱う場合がある．
それに対して，CPU管理外のCPU例外以外のCPU例外をカーネル管理のCPU例外，
カーネル管理のCPU例外によって起動されるCPU例外ハンドラをカーネル管理のCPU例外ハンドラと呼ぶ．
カーネル管理外のCPU例外ハンドラからは，システムインタフェースレイヤのAPIとsns̲ker，ext̲ker，xsns̲dpn，xsns̲xpnのみを呼び出すことができ，その他のサービスコールを呼び出すことはできない．カーネル管理外のCPU例外ハン
ドラから，その他のサービスコールを呼び出した場合の動作は，保証されない．
カーネル管理外のCPU例外ハンドラにおいては，xsns̲dpnとxsns̲xpnのいずれのサービスコールもtrueを返す．そのため，カーネル管理外のCPU例外からは，(a)または(d)の方法によるリカバリ処理しか行えない．
【補足説明】
カーネル管理外のCPU例外は，カーネル管理外の割込みと異なり，特定のCPU例
外をカーネル外とするわけではない．同じCPU例外であっても，CPU例外が起こる状況によって，カーネル管理となる場合とカーネル管理外となる場合がある．
2.9 システムの初期化と終了
2.9.1 システム初期化手順
システムのリセット後，最初に実行するプログラムを，スタートアップモジュー
ルと呼ぶ．スタートアップモジュールはカーネルの管理外であり，アプリケー
ションで用意するのが基本であるが，スタートアップモジュールで行うべき処理を明確にするために，カーネルの配布パッケージの中に，標準のスタートアッ
プモジュールが用意されている．
標準のスタートアップモジュールは，プロセッサのモードとスタックポインタ
等の初期化，NMIを除くすべての割込みのマスク（全割込みロック状態と同等の状態にする），ターゲットシステム依存の初期化フックの呼出し，BSSセクショ
ンのクリア，DATAセクションの初期化，ソフトウェア環境（ライブラリなど）
依存の初期化フックの呼出しを行った後，カーネルの初期化処理へ分岐する．
ここで呼び出すターゲットシステム依存の初期化フックでは，リセット後に速やかに行うべき初期化処理を行うことが想定されている．
マルチプロセッサ対応カーネルでは，すべてのプロセッサがスタートアップモ

ngki̲spec‑120.txt

page 43

ジュールを実行し，カーネルの初期化処理へ分岐する．ただし，共有リソースの初期化処理（BSSセクションのクリア，DATAセクションの初期化，ソフトウェ
ア環境依存の初期化フックの呼出しなど）は，マスタプロセッサのみで実行する．各プロセッサがカーネルの初期化処理へ分岐するのは，共有リソースの初期化処理が完了した後でなければならないため，スレーブプロセッサは，カー
ネルの初期化処理へ分岐する前に，マスタプロセッサによる共有リソースの初期化処理の完了を待ち合わせる必要がある．
カーネルの初期化処理においては，まず，カーネル自身の初期化処理（カーネ
ル内のデータ構造の初期化，カーネルが用いるデバイスの初期化など）と静的
APIの処理（オブジェクトの登録など）が行われる．静的APIのパラメータに関するエラーは，コンフィギュレータによって検出されるのが原則であるが，コンフィギュレータで検出できないエラーが，この処理中に検出される場合もある．
タスクの起動順序など，静的APIの処理順序によりシステムの規定された振舞いが変化する場合には，システムコンフィギュレーションファイルにおける静的
APIの記述順と同じ順序で静的APIが処理された場合と，同じ振舞いとなる．それに対して，周期ハンドラの動作開始順序は，同じタイムティックで行うべき処理が複数ある場合の処理順序が規定されないことから（「4.6.1 システム時刻管理」の節を参照），このことが適用されない．
次に，静的API（ATT̲INI）により登録した初期化ルーチンが，システムコンフィ
ギュレーションファイルにおける静的APIの記述順と同じ順序で実行される．
マルチプロセッサ対応カーネルでは，すべてのプロセッサがカーネル自身の初期化処理と静的APIの処理を完了した後に，マスタプロセッサがグローバル初期
化ルーチンを実行する．グローバル初期化ルーチンの実行が完了した後に，各プロセッサは，自プロセッサに割り付けられたローカル初期化ルーチンを実行する．すなわち，ローカル初期化ルーチンは，初期割付けプロセッサにより実行される．
以上が終了すると，カーネル非動作状態から動作状態に遷移し（「2.5.1 カー
ネル動作状態と非動作状態」の節を参照），カーネルの動作が開始される．具
体的には，割込みがマスク解除され，タスクの実行が開始される．
マルチプロセッサ対応カーネルでは，すべてのプロセッサがローカル初期化ルーチンの実行を完了した後に，カーネル非動作状態から動作状態に遷移し，カー
ネルの動作が開始される．マルチプロセッサ対応カーネルにおけるシステム初期化の流れと，各プロセッサが同期を取るタイミングを，図2‑6に示す．
【μITRON4.0仕様との関係】
μITRON4.0仕様においては，初期化ルーチンの実行は静的APIの処理に含まれるものとしていたが，この仕様では，初期化ルーチンを登録する静的APIの処理には，初期化ルーチンを登録することのみを意味し，初期化ルーチンの実行は含
まれないものとした．
2.9.2 システム終了手順
カーネルを終了させるサービスコール（ext̲ker）を呼び出すと，カーネル動作
状態から非動作状態に遷移する（「2.5.1 カーネル動作状態と非動作状態」の節を参照）．具体的には，NMIを除くすべての割込みがマスクされ，タスクの実行が停止される．
マルチプロセッサ対応カーネルでは，カーネルを終了させるサービスコール（ext̲ker）は，どのプロセッサからでも呼び出すことができる．1つのプロセッ
サでカーネルを終了させるサービスコールを呼び出すと，そのプロセッサがカーngki̲spec‑120.txt

page 44

ネル動作状態から非動作状態に遷移した後，他のプロセッサに対してカーネル
終了処理の開始を要求する．複数のプロセッサから，カーネルを終了させるサー
ビスコール（ext̲ker）を呼び出してもよい．
次に，静的API（ATT̲TER）により登録した終了処理ルーチンが，システムコン
フィギュレーションファイルにおける静的APIの記述順と逆の順序で実行される．
また，ソフトウェア環境（ライブラリなど）依存の終了処理を行うために，
atexitで登録された関数が呼び出される．
マルチプロセッサ対応カーネルでは，すべてのプロセッサがカーネル非動作状態に遷移した後に，各プロセッサが，自プロセッサに割り付けられたローカル
終了処理ルーチンを実行する．すなわち，ローカル終了処理ルーチンは，初期割付けプロセッサにより実行される．すべてのプロセッサでローカル処理ルー
チンの実行が完了した後に，マスタプロセッサがグローバル終了処理ルーチンを実行する．
以上が終了すると，ターゲットシステム依存の終了処理が呼び出される．ター
ゲットシステム依存の終了処理は，カーネルの管理外であり，アプリケーショ
ンで用意するのが基本であるが，カーネルの配布パッケージの中に，ターゲッ
トシステム毎に標準的なルーチンが用意されている．
マルチプロセッサ対応カーネルでは，すべてのプロセッサで，ターゲットシス
テム依存の終了処理が呼び出される．マルチプロセッサ対応カーネルにおけるシステム終了処理の流れと，各プロセッサが同期を取るタイミングを，図2‑7に示す．
【使用上の注意】
マルチプロセッサ対応カーネルで，あるプロセッサからカーネルを終了させる
サービスコール（ext̲ker）を呼び出しても，他のプロセッサがカーネル動作状
態で割込みをマスクしたまま実行し続けると，カーネルが終了しない．
プロセッサが割込みをマスクしたまま実行し続けないようにするのは，アプリ
ケーションの責任である．例えば，ある時間を超えて割込みをマスクしたまま実行し続けていないかを，ウォッチドッグタイマを用いて監視する方法が考えられる．割込みをマスクしたまま実行し続けていた場合には，そのプロセッサからもカーネルを終了させるサービスコール（ext̲ker）を呼び出すことで，カーネルを終了させることができる．
【μITRON4.0仕様との関係】
μITRON4.0仕様には，システム終了に関する規定はない．
2.10 オブジェクトの登録とその解除
2.10.1 ID番号で識別するオブジェクト
ID番号で識別するオブジェクトは，オブジェクトを生成する静的
API（CRE̲YYY），サービスコール（acre̲yyy），またはオブジェクトを追加する静的API（ATT̲YYY，ATA̲YYY）によってカーネルに登録する．オブジェクトを追加する静的APIによって登録されたオブジェクトはID番号を持たないため，
ID番号を指定して操作することができない．
オブジェクトを生成する静的API（CRE̲YYY）は，生成するオブジェクトにID番
号を割り付け，ID番号を指定するパラメータとして記述した識別名を，割り付けたID番号にマクロ定義する．同じ識別名のオブジェクトが生成済みの場合には，E̲OBJエラーとなる．

ngki̲spec‑120.txt

page 45

オブジェクトを生成するサービスコール（acre̲yyy）は，割付け可能なID番号の数を指定する静的API（AID̲YYY）によって確保されたID番号の中から，使用されていないID番号を1つ選び，生成するオブジェクトに割り付ける．割り付けたID番号は，サービスコールの返値としてアプリケーションに通知する．使用
されていないID番号が残っていない場合には，E̲NOIDエラーとなる．
割付け可能なID番号の数を指定する静的API（AID̲YYY）は，システムコンフィ
ギュレーションファイル中に複数記述することができる．その場合，各静的
APIで指定した数の合計の数のID番号が確保される．
オブジェクトを生成するサービスコール（acre̲yyy）によって登録したオブジェ
クトは，オブジェクトを削除するサービスコール（del̲yyy）によって登録を解除することができる．登録解除したオブジェクトのID番号は，未使用の状態に戻され，そのID番号を用いて新しいオブジェクトを登録することができる．この場合に，登録解除前のオブジェクトに対して行うつもりの操作が，新たに登録したオブジェクトに対して行われないように，注意が必要である．
オブジェクトを生成または追加する静的APIによって登録したオブジェクトは，登録を解除することができない．登録を解除しようとした場合には，E̲OBJエラーとなる．
タスク以外の処理単位は，その処理単位が実行されている間でも，登録解除することができる．この場合，登録解除された処理単位に実行が強制的に終了させられることはなく，処理単位が自ら実行を終了するまで，処理単位の実行は継続される．
同期・通信オブジェクトを削除した時に，そのオブジェクトを待っているタスクがあった場合，それらのタスクは待ち解除され，待ち状態に遷移させたサービスコールはE̲DLTエラーとなる．複数のタスクが待ち解除される場合には，待ち行列につながれていた順序で待ち解除される．削除した同期・通信オブジェ
クトが複数の待ち行列を持つ場合には，別の待ち行列で待っていたタスクの間の待ち解除の順序は，該当するサービスコール毎に規定する．
オブジェクトを再初期化するサービスコール（ini̲yyy）は，指定したオブジェ
クトを削除した後に，同じパラメータで再度生成したのと等価の振舞いをする．
ただし，オブジェクトを生成または追加する静的APIによって登録したオブジェ
クトも，再初期化することができる．
なお，動的生成対応カーネル以外では，オブジェクトを生成するサービスコー
ル（acre̲yyy），割付け可能なID番号の数を指定する静的API（AID̲YYY），オ
ブジェクトを削除するサービスコール（del̲yyy）は，サポートされない．
【μITRON4.0仕様との関係】
ID番号を指定してオブジェクトを生成するサービスコール（cre̲yyy）を廃止した．また，オブジェクトを生成または追加する静的APIによって登録したオブジェ
クトは，登録解除できないこととした．
μITRON4.0仕様では，割付け可能なID番号の数を指定する静的API（AID̲YYY）
は規定されていない．
複数の待ち行列を持つ同期・通信オブジェクトを削除した時に，別の待ち行列で待っていたタスクの間の待ち解除の順序は，μITRON4.0仕様では実装依存とされている．
【μITRON4.0/PX仕様との関係】
アクセス許可ベクタを指定してオブジェクトを生成する静的API（CRA̲YYY）はngki̲spec‑120.txt

page 46

廃止し，オブジェクトの登録後にアクセス許可ベクタを設定する静的
API（SAC̲YYY）をサポートすることとした．これにあわせて，アクセス許可ベクタを指定してオブジェクトを登録するサービスコール（cra̲yyy，acra̲yyy，
ata̲yyy）も廃止した．
【仕様決定の理由】
ID番号を指定してオブジェクトを生成するサービスコール（cre̲yyy）とアクセ
ス許可ベクタを指定してオブジェクトを登録するサービスコール（cra̲yyy，acra̲yyy，ata̲yyy）を廃止したのは，必要性が低いと考えたためである．
静的APIについても，サービスコールに整合するよう変更した．
2.10.2 オブジェクト番号で識別するオブジェクト
オブジェクト番号で識別するオブジェクトは，オブジェクトを定義する静的
API（DEF̲YYY）またはサービスコール（def̲yyy）によってカーネルに登録する．
オブジェクトを定義するサービスコール（def̲yyy）によって登録したオブジェ
クトは，同じサービスコールを，オブジェクトの定義情報を入れたパケットへのポインタをNULLとして呼び出すことによって，登録を解除することができる．
登録解除したオブジェクト番号は，オブジェクト登録前の状態に戻され，同じオブジェクト番号に対して新たにオブジェクトを定義することができる．登録解除されていないオブジェクト番号に対して再度オブジェクトを登録しようとした場合には，E̲OBJエラーとなる．
オブジェクトを定義する静的APIによって登録したオブジェクトは，登録を解除することができない．登録を解除しようとした場合には，E̲OBJエラーとなる．
なお，動的生成対応カーネル以外では，オブジェクトを定義するサービスコール（def̲yyy）はサポートされない．
【μITRON4.0仕様との関係】
この仕様では，オブジェクトの定義を変更したい場合には，一度登録解除した
後に，新たにオブジェクトを定義する必要がある．また，オブジェクトを定義
する静的APIによって登録したオブジェクトは，この仕様では，登録解除できないこととした．
2.10.3 識別番号を持たないオブジェクト
識別する必要がないために，識別番号を持たないオブジェクトは，オブジェク
トを追加する静的API（ATT̲YYY）によってカーネルに登録する．
2.10.4 オブジェクト生成に必要なメモリ領域
カーネルオブジェクトを生成する際に，サイズが一定でないメモリ領域を必要とする場合には，カーネルオブジェクトを生成する静的APIおよびサービスコー
ルに，使用するメモリ領域の先頭番地を渡すパラメータを設けている．このパラメータをNULLとした場合，必要なメモリ領域は，コンフィギュレータまたはカーネルにより確保される．
【補足説明】
カーネルオブジェクトを生成する際には，管理ブロックなどを置くためのメモリ領域も必要になるが，サイズが一定のメモリ領域はコンフィギュレータにより確保されるため，カーネルオブジェクトを生成する静的APIおよびサービスコー
ルにそれらのメモリ領域の先頭番地を渡すパラメータを設けていない．

ngki̲spec‑120.txt

page 47

2.10.5 オブジェクトが属する保護ドメインの設定
保護機能対応カーネルにおいて，カーネルオブジェクトが属する保護ドメイン
は，オブジェクトの登録時に決定し，登録後に変更することはできない．
カーネルオブジェクトを静的APIによって登録する場合には，オブジェクトを登録する静的APIを，そのオブジェクトを属させる保護ドメインの囲みの中に記述する．無所属のオブジェクトを登録する静的APIは，保護ドメインの囲みの外に記述する（「2.12.3 保護ドメインの指定」の節を参照）．
カーネルオブジェクトをサービスコールによって登録する場合には，オブジェ
クト属性にTA̲DOM(domid)を指定することにより，オブジェクトを属させる保護
ドメインを設定する．ここでdomidは，そのオブジェクトを属させる保護ドメイ
ンのID番号であり，TDOM̲KERNEL（＝‑1）を指定することでカーネルドメインに属させることができる．また，domidにTDOM̲SELF（＝0）を指定するか，オブジェ
クト属性にTA̲DOM(domid)を指定しないことで，自タスクが属する保護ドメインに属させることができる．さらに，無所属のオブジェクトを登録する場合には，domidにTDOM̲NONE（＝‑2）を指定する．
ただし，特定の保護ドメインのみに属することができるカーネルオブジェクトを登録するサービスコールの中には，オブジェクトを属させる保護ドメインを
オブジェクト属性で設定する必要がないものもある．
割付け可能なID番号の数を指定する静的API（AID̲YYY）で確保したID番号は，
どの保護ドメインに属するオブジェクトにも（また，無所属のオブジェクトにも）割り付けられる．これらの静的APIは，保護ドメインの囲みの外に記述しなければならない．保護ドメインの囲みの中に記述した場合には，E̲RSATRエラーとなる．
【補足説明】
この仕様では，カーネルオブジェクトの属する保護ドメインを参照する機能は用意していない．
【仕様決定の理由】
カーネルオブジェクトをサービスコールによって登録する場合に，オブジェク
トを属させる保護ドメインをオブジェクト属性で指定することにしたのは，保護機能対応でないカーネルとの互換性のためには，サービスコールのパラメー
タを増やさない方が望ましいためである．
2.10.6 オブジェクトが属するクラスの設定
マルチプロセッサ対応カーネルにおいて，カーネルオブジェクトが属するクラスは，オブジェクトの登録時に決定し，登録後に変更することはできない．
カーネルオブジェクトを静的APIによって登録する場合には，オブジェクトを登録する静的APIを，そのオブジェクトを属させるクラスの囲みの中に記述する．
クラスに属さないオブジェクトを登録する静的APIは，クラスの囲みの外に記述する（「2.12.4 クラスの指定」の節を参照）．
カーネルオブジェクトをサービスコールによって登録する場合には，オブジェ
クト属性にTA̲CLS(clsid)を指定することにより，オブジェクトを属させるクラスを設定する．ここでclsidは，そのオブジェクトを属させるクラスのID番号であり，clsidにTCLS̲SELF（＝0）を指定するか，オブジェクト属性にTA̲CLS(clsid)を指定しないことで，自タスクが属するクラスに属させることができる．

ngki̲spec‑120.txt

page 48

割付け可能なID番号の数を指定する静的API（AID̲YYY）で確保したID番号は，
静的APIを囲むクラスに属するオブジェクトにのみ割り付けられる．これらの静的APIは，確保したID番号を割り付けるオブジェクトの属すべきクラスの囲みの中に記述しなければならない．クラスの囲みの外に記述した場合には，
E̲RSATRエラーとなる．
【補足説明】
この仕様では，カーネルオブジェクトの属するクラスを参照する機能は用意していない．
【仕様決定の理由】
カーネルオブジェクトをサービスコールによって登録する場合に，オブジェク
トを属させるクラスをオブジェクト属性で指定することにしたのは，マルチプ
ロセッサ対応でないカーネルとの互換性のためには，サービスコールのパラメー
タを増やさない方が望ましいためである．
2.11 オブジェクトのアクセス保護
この節では，カーネルオブジェクトのアクセス保護について述べる．この節の内容は，保護機能対応カーネルにのみ適用される．
2.11.1 オブジェクトのアクセス保護とアクセス違反の通知
カーネルオブジェクトに対するアクセスは，そのオブジェクトに対して設定されたアクセス許可ベクタによって保護される．ただし，アクセス許可ベクタを持たないオブジェクトに対するアクセスは，システム状態に対するアクセス許可ベクタによって保護される．また，オブジェクトを登録するサービスコールと，特定のオブジェクトに関連しないシステムの状態に対するアクセスについては，システム状態のアクセス許可ベクタによって保護される．
アクセス許可ベクタによって許可されていないアクセス（アクセス違反）は，カーネルによって検出され，以下の方法によって通知される．
サービスコールにより，メモリオブジェクト以外のカーネルオブジェクトに対して，許可されていないアクセスを行おうとした場合，サービスコールから
E̲OACVエラーが返る．また，メモリオブジェクトに対して，許可されていない
管理操作または参照操作を行おうとした場合も，サービスコールからE̲OACVエラーが返る．
メモリオブジェクトに対して，通常のメモリアクセスにより，許可されていない書込みアクセスまたは読出しアクセス（実行アクセスを含む）を行おうとした場合，CPU例外ハンドラが起動される．どのCPU例外ハンドラが起動されるかは，ターゲット定義である．ターゲットによっては，エミュレートされたCPU例
外ハンドラの場合もある．また，ターゲット定義で，アクセス違反の状況に応じて異なるCPU例外ハンドラが起動される場合もある．この（これらの）CPU例
外ハンドラを，メモリアクセス違反ハンドラと呼ぶ．
メモリオブジェクトに対して，サービスコールを通じて，許可されていない書
込みアクセスまたは読出しアクセスを行おうとした場合，サービスコールから
E̲MACVエラーが返るか，メモリアクセス違反ハンドラが起動される．E̲MACVエ
ラーが返るかメモリアクセス違反ハンドラされるかは，ターゲット定義である．
メモリアクセス違反ハンドラでは，アクセス違反を発生させたアクセスに関する情報（アクセスした番地，アクセスの種別，アクセスした命令の番地など）を参照する方法を，ターゲット定義で用意する．

ngki̲spec‑120.txt

page 49

メモリオブジェクトとしてカーネルに登録されていないメモリ領域に対して，
カーネルドメイン以外の保護ドメインから，書込みアクセスまたは読出しアクセス（実行アクセスを含む）を行おうとした場合には，メモリオブジェクトに対するアクセスが許可されていない場合と同様に扱われる．
【未決定事項】
マルチプロセッサ対応カーネルにおいて，システム状態のアクセス許可ベクタをシステム全体で1つ持つかプロセッサ毎に持つかは，今後の課題である．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様では，アクセス保護の実装定義の制限について規定しているが，この仕様では，メモリオブジェクトに対するアクセス許可ベクタのターゲッ
ト定義の制限以外については規定していない．
【仕様決定の理由】
オブジェクトを登録するサービスコールを，そのオブジェクトのアクセス許可
ベクタによって保護しないのは，オブジェクトを登録する前には，アクセス許可ベクタが設定されていないためである．
2.11.2 メモリオブジェクトに対するアクセス許可ベクタの制限
メモリオブジェクトの書込みアクセスと読出しアクセス（実行アクセスを含む）
に対して設定できるアクセス許可パターンは，ターゲット定義で制限される場
合がある．
ただし，少なくとも，次の5つの組み合わせの設定は，行うことができる．
(a) メモリオブジェクトが属する保護ドメインのみに，読出しアクセス（実行アクセスを含む）のみを許可する．これを，専有リードオンリー（private
read only）と呼ぶ．
(b) メモリオブジェクトが属する保護ドメインのみに，書込みアクセスと読出しアクセス（実行アクセスを含む）を許可する．これを，専有リードライ
ト（private read/write）と呼ぶ．
(c) すべての保護ドメインに，読出しアクセス（実行アクセスを含む）のみを許可する．これを，共有リードオンリー（shared read only）と呼ぶ．
(d) すべての保護ドメインに，書込みアクセスと読出しアクセス（実行アクセ
スを含む）を許可する．これを，共有リードライト（shared read/write）と呼ぶ．
(e) メモリオブジェクトが属する保護ドメインに，書込みアクセスと読出しア
クセス（実行アクセスを含む）を許可し，他の保護ドメインには，読出しアクセス（実行アクセスを含む）のみを許可する．これを，共有リード専
有ライト（shared read private write）と呼ぶ．
また，ターゲット定義で，1つの保護ドメインに登録できるメモリオブジェクトの数が制限される場合がある．
2.11.3 デフォルトのアクセス許可ベクタ
静的APIによりカーネルオブジェクトを登録した直後は，次に規定されるデフォ
ルトのアクセス許可ベクタが設定される．

ngki̲spec‑120.txt

page 50

保護ドメインに属するカーネルオブジェクトに対しては，4つの種別のアクセス
がいずれも，その保護ドメインのみに許可される．すなわち，カーネルドメインに属するオブジェクトに対しては，4つのアクセス許可パターンがいずれもTACP̲KERNELに，ユーザドメインに属するオブジェクトに対しては，4つのアクセス許可パターンがいずれもTACP(domid)（domidはオブジェクトが属する保護ドメインのID番号）に設定される．
無所属のカーネルオブジェクトに対しては，4つの種別のアクセスがいずれも，すべての保護ドメインに許可される．すなわち，4つのアクセス許可パターンがいずれも，TACP̲SHAREDに設定される．
システム状態のアクセス許可ベクタは，4つの種別のアクセスがいずれも，カーネルドメインのみに許可される．すなわち，4つのアクセス許可パターンがいず
れも，TACP̲KERNELに設定される．
【未決定事項】
サービスコールによりカーネルオブジェクトを登録した直後のアクセス許可ベクタについては，今後の課題である．
2.11.4 アクセス許可ベクタの設定
アクセス許可ベクタをデフォルト以外の値に設定するために，カーネルオブジェ
クトのアクセス許可ベクタを設定する静的API（SAC̲YYY）とサービスコール（sac̲yyy）が用意されている．また，システム状態のアクセス許可ベクタを設定する静的API（SAC̲SYS）とサービスコール（sac̲sys）が用意されている．
ただし，静的APIによって登録したオブジェクトは，サービスコール（sac̲yyy）
によってアクセス許可ベクタを設定することができない．アクセス許可ベクタを設定しようとした場合には，E̲OBJエラーとなる．
メモリオブジェクトに対しては，アクセス許可ベクタを設定する静的APIは用意されておらず，オブジェクトの登録と同時にアクセス許可ベクタを設定する静的API（ATA̲YYY）が用意されている．
オブジェクトに対するアクセスが許可されているかは，そのオブジェクトにアクセスするサービスコールを呼び出した時点でチェックされる．そのため，ア
クセス許可ベクタを変更しても，変更以前に呼び出されたサービスコールの振舞いには影響しない．例えば，待ち行列を持つ同期・通信オブジェクトのアク
セス許可ベクタを変更しても，呼び出した時点ですでに待ち行列につながれているタスクには影響しない．また，ミューテックスのアクセス許可ベクタを変更しても，呼び出した時点ですでにミューテックをロックしていたタスクには影響しない．
なお，動的生成対応カーネル以外では，アクセス許可ベクタを設定するサービ
スコール（sac̲yyy）はサポートされない．
この仕様では，カーネルオブジェクトに設定されたアクセス許可ベクタを参照
する機能は用意していない．
【μITRON4.0/PX仕様との関係】
アクセス許可ベクタを指定してオブジェクトを生成する静的API（CRA̲YYY）は廃止し，オブジェクトの登録後にアクセス許可ベクタを設定する静的
API（SAC̲YYY）をサポートすることとした．
静的APIによって登録したオブジェクトは，サービスコール（sac̲yyy）によってアクセス許可ベクタを設定することができないこととした．

ngki̲spec‑120.txt

page 51

オブジェクトの状態参照するサービスコール（ref̲yyy）により，オブジェクトに設定されたアクセス許可ベクタを参照する機能サポートしないこととした．
2.11.5 カーネルの管理領域のアクセス保護
カーネルが動作するために，カーネルの内部で用いるメモリ領域を，カーネルの管理領域と呼ぶ．ユーザタスクからカーネルを保護するためには，カーネルの管理領域にアクセスできるのは，カーネルドメインのみでなければならない．
そのため，カーネルの管理領域は，4つの種別のアクセスがカーネルドメインのみに許可されたメモリオブジェクト（これを，カーネル専用のメモリオブジェ
クトと呼ぶ）の中に置かれる．
オブジェクト生成に必要なメモリ領域（「2.10.4 オブジェクト生成に必要なメ
モリ領域」の節を参照）の中で，カーネルの管理領域に該当するもの（すなわち，カーネルの内部で用いるもの）を，カーネルの用いるオブジェクト管理領
域と呼ぶ．
カーネルの用いるオブジェクト管理領域として，カーネル専用のメモリオブジェ
クトに含まれないメモリ領域を指定した場合，E̲PARエラーとなる．また，カーネルの用いるオブジェクト管理領域の先頭番地にNULLを指定した場合，必要なメモリ領域が，カーネル専用のメモリオブジェクトの中に確保される．
【補足説明】
この仕様では，データキュー管理領域，優先度データキュー管理領域，固定長
メモリプール管理領域が，カーネルの用いるオブジェクト管理領域に該当する．
また，システムタスクのスタック領域，ユーザタスクのシステムスタック領域，
非タスクコンテキスト用のスタック領域も，カーネルの用いるオブジェクト管
理領域と同様に扱われる．一方，ユーザタスクのユーザスタック領域と固定長
メモリプール領域は，カーネルの内部で用いるメモリ領域ではないため，カーネルの用いるオブジェクト管理領域に該当しない．
2.11.6 ユーザタスクのユーザスタック領域
ユーザタスクが非特権モードで実行する間に用いるスタック領域を，システム
スタック領域（「4.1 タスク管理機能」の節を参照）と対比させて，ユーザス
タック領域と呼ぶ．ユーザスタック領域は，そのタスクと同じ保護ドメインに属する1つのメモリオブジェクトとしてカーネルに登録されるが，他のメモリオ
ブジェクトとは異なり，次のように扱われる．
タスクのユーザスタック領域に対しては，そのタスクのみが書込みアクセスおよび読出しアクセスを行うことができる．そのため，書込みアクセスと読出し
アクセス（実行アクセスを含む）に対するアクセス許可パターンは意味を持たない．ユーザスタック領域に対して実行アクセスを行えるかどうかは，ターゲッ
ト定義である．
ただし，上記の仕様を実現するために大きいオーバヘッドを生じる場合には，ターゲット定義で，タスクのユーザスタック領域を，そのタスクが属する保護ドメインのみからアクセスできるものとする場合がある．
2.12 システムコンフィギュレーション手順
2.12.1 システムコンフィギュレーションファイル
カーネルやシステムサービスが管理するオブジェクトの生成情報や初期状態などを記述するファイルを，システムコンフィギュレーションファイル（system
configuration file）と呼ぶ．また，システムコンフィギュレーションファイ

ngki̲spec‑120.txt

page 52

ルを解釈して，カーネルやシステムサービスの構成・初期化情報を含むファイルなどを生成するツールを，コンフィギュレータ（configurator）と呼ぶ．
システムコンフィギュレーションファイルには，カーネルの静的API，システム
サービスの静的API，保護ドメインの囲み，クラスの囲み，コンフィギュレータ
に対するINCLUDEディレクティブ，C言語プリプロセッサのインクルードディレ
クティブ（#include）と条件ディレクティブ（#if，#ifdefなど）のみを記述することができる．
コンフィギュレータに対するINCLUDEディレクティブは，システムコンフィギュ
レーションファイルを複数のファイルに分割して記述するために用いるもので，その文法は次のいずれかである（両者の違いは，指定されたファイルを探すディ
レクトリの違いのみ）．
INCLUDE("ファイル名");
INCLUDE(<ファイル名>);
コンフィギュレータは，INCLUDEディレクティブによって指定されたファイル中の記述を，システムコンフィギュレーションファイルの一部分として解釈する．
すなわち，INCLUDEディレクティブによって指定されたファイル中には，カーネルの静的API，システムサービスの静的API，コンフィギュレータに対する
INCLUDEディレクティブ，C言語プリプロセッサのインクルードディレクティブと条件ディレクティブのみを記述することができる．
C言語プリプロセッサのインクルードディレクティブは，静的APIのパラメータを解釈するために必要なC言語のヘッダファイルを指定するために用いる．また，
条件ディレクティブは，有効とする静的APIを選択するために用いることができる．ただし，インクルードディレクティブは，コンフィギュレータが生成するファイルでは先頭に集められる．そのため，条件ディレクティブの中にインクルードディレクティブを記述しても，インクルードディレクティブは常に有効となる．また，1つの静的APIの記述の途中に，条件ディレクティブを記述することはできない．
【μITRON4.0仕様との関係】
システムコンフィギュレーションファイルにおけるC言語プリプロセッサのディ
レクティブの扱いを全面的に見直し，コンフィギュレータに対するINCLUDEディ
レクティブを設けた．また，共通静的APIを廃止した．μITRON4.0仕様における#includeディレクティブの役割は，この仕様ではINCLUDEディレクティブに置き換わる．逆に，μITRON4.0仕様におけるINCLUDE静的APIの役割は，この仕様では#includeディレクティブに置き換わる．
2.12.2 静的APIの文法とパラメータ
静的APIは，次に述べる例外を除いては，C言語の関数呼出しと同様の文法で記述する．すなわち，静的APIの名称に続けて，静的APIの各パラメータを","で区切って列挙したものを"("と")"で囲んで記述し，最後に";"を記述する．ただし，静的APIのパラメータに構造体（または構造体へのポインタ）を記述する場合には，構造体の各フィールドを","で区切って列挙したものを"{"と"}"で囲んだ形で記述する．
サービスコールに対応する静的APIの場合，静的APIのパラメータは，対応する
サービスコールのパラメータと同一とすることを原則とする．
静的APIのパラメータは，次の4種類に分類される．
(a) オブジェクト識別名

ngki̲spec‑120.txt

page 53

オブジェクトのID番号を指定するパラメータ．オブジェクトの名称を表す単一の識別名のみを記述することができる．
コンフィギュレータは，オブジェクト生成のための静的API（CRE̲YYY）を処理する際に，オブジェクトにID番号を割り付け，構成・初期化ヘッダファイルに，指定された識別名を割り付けたID番号にマクロ定義するC言語プリプロセッサのディレクティブ（#define）を生成する．
オブジェクト生成以外の静的APIが，オブジェクトのID番号をパラメータに取る
場合（カーネルの静的APIでは，SAC̲TSKやDEF̲TEXのtskidパラメータ等がこれに該当する）には，パラメータとして記述する識別名は，生成済みのオブジェ
クトの名称を表す識別名でなければならない．そうでない場合には，コンフィ
ギュレータがエラーを報告する．
静的APIの整数定数式パラメータの記述に，オブジェクト識別名を使用することはできない．
(b) 整数定数式パラメータ
オブジェクト番号や機能コード，オブジェクト属性，サイズや数，優先度など，整数値を指定するパラメータ．プログラムが配置される番地に依存せずに値の決まる整数定数式を記述することができる．
整数定数式の解釈に必要な定義や宣言等は，システムコンフィギュレーション
ファイルからC言語プリプロセッサのインクルードディレクティブによってインクルードするファイルに含まれていなければならない．
(c) 一般定数式パラメータ
処理単位のエントリ番地，メモリ領域の先頭番地，拡張情報など，番地を指定する可能性のあるパラメータ．任意の定数式を記述することができる．
定数式の解釈に必要な定義や宣言等は，システムコンフィギュレーションファ
イルからC言語プリプロセッサのインクルードディレクティブによってインクルー
ドするファイルに含まれていなければならない．
(d) 文字列パラメータ
オブジェクトモジュール名やセクション名など，文字列を指定するパラメータ．
任意の文字列を，C言語の文字列の記法で記述することができる．
【μITRON4.0仕様との関係】
μITRON4.0仕様においては，静的APIのパラメータを次の4種類に分類していたが，コンフィギュレータの仕組みを見直したことに伴い全面的に見直した．
(A) 自動割付け対応整数値パラメータ(B) 自動割付け非対応整数値パラメータ(C) プリプロセッサ定数式パラメータ(D) 一般定数式パラメータ
この仕様の(a)が，おおよそμITRON4.0仕様の(A)に相当するが，(a)には整数値を記述できない点が異なる．(b)〜(c)と(B)〜(D)の間には単純な対応関係がな
いが，記述できる定数式の範囲には，(B)⊂(C)⊂(b)⊂(c)＝(D)の関係がある．
μITRON4.0仕様では，静的APIのパラメータは基本的には(D)とし，コンフィギュ
レータが値を知る必要があるパラメータを(B)，構成・初期化ファイルに生成するC言語プリプロセッサの条件ディレクティブ（#if）中に含めたい可能性のあngki̲spec‑120.txt

page 54

るパラメータを(C)としていた．
それに対して，この仕様におけるコンフィギュレータの処理モデル（「2.12.5
コンフィギュレータの処理モデル」の節を参照）では，コンフィギュレータのパス2において定数式パラメータの値を知ることができるため，(B)〜(D)の区別をする必要がない．そのため，静的APIのパラメータは基本的には(b)とし，パス2で値を知ることのできない定数式パラメータのみを(c)としている．
2.12.3 保護ドメインの指定
保護機能対応カーネルでは，オブジェクトを登録する静的API等を，そのオブジェ
クトが属する保護ドメインの囲みの中に記述する．無所属のオブジェクトを登録する静的APIは，保護ドメインの囲みの外に記述する．保護ドメインに属すべきオブジェクトを登録する静的API等を，保護ドメインの囲みの外に記述した場
合には，コンフィギュレータがE̲RSATRエラーを報告する．
ユーザドメインの囲みの文法は次の通り．
DOMAIN(保護ドメイン名) {ユーザドメインに属するオブジェクトを登録する静的API等}
保護ドメイン名には，ユーザドメインの名称を表す単一の識別名のみを記述することができる．
コンフィギュレータは，ユーザドメインの囲みを処理する際に，ユーザドメイ
ンに保護ドメインIDを割り付け，構成・初期化ヘッダファイルに，指定された保護ドメイン名を割り付けた保護ドメインIDにマクロ定義するC言語プリプロセッ
サのディレクティブ（#define）を生成する．また，ユーザドメインの囲みの中およびそれ以降に記述する静的APIの整数定数式パラメータの記述に保護ドメイ
ン名を記述すると，割り付けた保護ドメインIDの値に評価される．
ユーザドメインの囲みの中を空にすることで，ユーザドメインへの保護ドメイ
ンIDの割付けのみを行うことができる．
カーネルドメインの囲みの文法は次の通り．
KERNEL̲DOMAIN {カーネルドメインに属するオブジェクトを登録する静的API等}
同じ保護ドメイン名を指定したユーザドメインの囲みや，カーネルドメインの囲みを，複数回記述してもよい．保護機能対応でないカーネルで保護ドメインの囲みを記述した場合や，保護ドメインの囲みの中に保護ドメインの囲みを記述した場合には，コンフィギュレータがエラーを報告する．
【仕様決定の理由】
保護ドメインに属すべきオブジェクトを登録する静的API等を保護ドメインの囲
みの外に記述した場合のエラーコードをE̲RSATRとしたのは，オブジェクトを動的に登録するAPIにおいては，オブジェクトの属する保護ドメインを，オブジェ
クト属性によって指定するためである．
2.12.4 クラスの指定
マルチプロセッサ対応カーネルでは，オブジェクトを登録する静的API等を，そのオブジェクトが属するクラスの囲みの中に記述する．クラスに属すべきオブジェクトを登録する静的API等を，クラスの囲みの外に記述した場合には，コンngki̲spec‑120.txt

page 55

フィギュレータがE̲RSATRエラーを報告する．
クラスの囲みの文法は次の通り．
CLASS(クラスID) {クラスに属するオブジェクトを登録する静的API等}
クラスIDには，静的APIの整数定数式パラメータと同等の定数式を記述することができる．使用できないクラスIDを指定した場合には，コンフィギュレータがE̲IDエラーを報告する．
同じクラスIDを指定したクラスの囲みを複数回記述してもよい．マルチプロセッ
サ対応でないカーネルでクラスの囲みを記述した場合や，クラスの囲みの中にクラスの囲みを記述した場合には，コンフィギュレータがエラーを報告する．
なお，保護機能とマルチプロセッサの両方に対応するカーネルでは，保護ドメ
インの囲みとクラスの囲みはどちらが外側になっていてもよい．
【仕様決定の理由】
クラスに属すべきオブジェクトを登録する静的API等をクラスの囲みの外に記述した場合のエラーコードをE̲RSATRとしたのは，オブジェクトを動的に登録する
APIにおいては，オブジェクトの属するクラスを，オブジェクト属性によって指定するためである．
2.12.5 コンフィギュレータの処理モデル
コンフィギュレータは，次の3つないしは4つのパスにより，システムコンフィ
ギュレーションファイルを解釈し，構成・初期化情報を含むファイルなどを生成する（図2‑8）．
最初のパス1では，システムコンフィギュレーションファイルを解釈し，そこに含まれる静的APIの整数定数式パラメータの値をCコンパイラを用いて求めるために，パラメータ計算用C言語ファイル（cfg1̲out.c）を生成する．この時，システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイン
クルードディレクティブは，パラメータ計算用C言語ファイルの先頭に集めて生成する．また，条件ディレクティブは，順序も含めて，そのままの形でパラメー
タ計算用C言語ファイルに出力する．システムコンフィギュレーションファイルに文法エラーや未サポートの記述があった場合には，この段階で検出される．
次に，Cコンパイラおよび関連ツールを用いて，パラメータ計算用C言語ファイ
ルをコンパイルし，ロードモジュールを生成する．また，それをSレコードフォー
マットの形（cfg1̲out.srec）に変換し，ロードモジュール中の各シンボルとアドレスの対応表を含むシンボルファイル（cfg1̲out.syms）を生成する．静的
APIのパラメータに解釈できない式が記述された場合には，この段階でエラーが検出される．
コンフィギュレータのパス2では，パス1で生成されたオブジェクトファイルを
Sレコードフォーマットの形に変換したものとシンボルファイルから，C言語プ
リプロセッサの条件ディレクティブによりどの静的APIが有効となったかと，それらの静的APIの整数定数式パラメータの値を取り出し，カーネルおよびシステ
ムサービスの構成・初期化ファイル（kernel̲cfg.cなど）と構成・初期化ヘッ
ダファイル（kernel̲cfg.hなど）を生成する．構成・初期化ヘッダファイルには，登録できるオブジェクトの数（動的生成対応カーネル以外では，静的APIによって登録されたオブジェクトの数に一致）やオブジェクトのID番号などの定義を出力する．静的APIの整数定数式パラメータに不正がある場合には，この段階でエラーが検出される．

ngki̲spec‑120.txt

page 56

パス2で生成されたこれらのファイルを，他のソースファイルとあわせてコンパ
イルし，アプリケーションのロードモジュールを生成する．また，それをSレコー
ドフォーマットの形（system.srec）に変換し，ロードモジュール中の各シンボ
ルと番地の対応表を含むシンボルファイル（system.syms）を生成する．
コンフィギュレータのパス3では，パス1で生成されたロードモジュールをSレコー
ドフォーマットの形に変換したものとシンボルファイル，パス2で生成されたロードモジュールをSレコードフォーマットの形に変換したものとシンボルファイル
から，静的APIパラメータの値などを取り出し，妥当性のチェックを行う．静的
APIの一般定数式パラメータに不正がある場合には，この段階でエラーが検出される．
保護機能対応カーネルにおいては，ターゲットシステムによって，メモリ保護のための設定情報を生成するために，パス3ではじめて得られる情報を必要とする場合がある．この場合には，パス3において再度，カーネルおよびシステムサー
ビスの構成・初期化ファイル（kernel̲cfg.cなど）と構成・初期化ヘッダファ
イル（kernel̲cfg.hなど）を生成する．これらのファイルを，他のソースファ
イルとあわせてコンパイルし，アプリケーションの最終的なロードモジュールを生成する（図2‑9）．
コンフィギュレータのパス4では，パス1で生成されたロードモジュールをSレコー
ドフォーマットの形に変換したものとシンボルファイル，パス3で生成されたロードモジュールをSレコードフォーマットの形に変換したものとシンボルファイル
から，生成したロードモジュールの妥当性のチェックを行う．この段階で検出されるエラーは，コンフィギュレーション処理の不具合を示すものである．
【μITRON4.0仕様との関係】
コンフィギュレータの処理モデルは全面的に変更した．
2.12.6 静的APIのパラメータに関するエラー検出
静的APIのパラメータに関するエラー検出は，同じものがサービスコールとして呼ばれた場合と同等とすることを原則とする．言い換えると，サービスコール
によっても検出できないエラーは，静的APIにおいても検出しない．静的APIの機能説明中の「E̲XXXXXエラーとなる」または「E̲XXXXXエラーが返る」という記述は，コンフィギュレータがそのエラーを検出することを意味する．
ただし，エラーの種類によっては，サービスコールと同等のエラー検出を行うことが難しいため，そのようなものについては例外とする．例えば，メモリ不足をコンフィギュレータによって検出するのは容易ではない．
逆に，オブジェクト属性については，サービスコールより強力なエラーチェッ
クを行える可能性がある．例えば，タスク属性にTA̲STAと記述されている場合，サービスコールではエラーを検出できないが，コンフィギュレータでは検出できる可能性がある．ただし，このようなエラー検出を完全に行おうとするとコンフィギュレータが複雑になるため，このようなエラーを検出することは必須とせず，検出できた場合には警告として報告する．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，静的APIのパラメータに関するエラー検出について規定されていない．
2.12.7 オブジェクトのID番号の指定
コンフィギュレータのオプション機能として，アプリケーション設計者がオブngki̲spec‑120.txt

page 57

ジェクトのID番号を指定するための次の機能を用意する．
コンフィギュレータのオプション指定により，オブジェクト識別名とID番号の対応表を含むファイルを渡すと，コンフィギュレータはそれに従ってオブジェ
クトにID番号を割り付ける．それに従ったID番号割付けができない場合（ID番
号に抜けができる場合など）には，コンフィギュレータはエラーを報告する．
またコンフィギュレータは，オプション指定により，オブジェクト識別名とコンフィギュレータが割り付けたID番号の対応表を含むファイルを，コンフィギュ
レータに渡すファイルと同じフォーマットで生成する．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，オブジェクト生成のための静的APIのID番号を指定するパラメータに整数値を記述できるため，このような機能は用意されていない．
2.13 TOPPERSネーミングコンベンション
この節では，TOPPERSソフトウェアのAPIの構成要素の名称に関するネーミング
コンベンションについて述べる．このネーミングコンベンションは，モジュール間のインタフェースに関わる名称に適用することを想定しているが，モジュール内部の名称に適用してもよい．
2.13.1 モジュール識別名
異なるモジュールのAPIの構成要素の名称が衝突することを避けるために，各モ
ジュールに対して，それを識別するためのモジュール識別名を定める．モジュー
ル識別名は，英文字と数字で構成し，2〜8文字程度の長さとする．
カーネルのモジュール識別名は"kernel"，システムインタフェースレイヤのモ
ジュール識別名は"sil"とする．
APIの構成要素の名称には，モジュール識別名を含めることを原則とするが，カーネルのAPIなど，頻繁に使用されて衝突のおそれが少ない場合には，モジュール
識別名を含めない名称を使用する．
以下では，モジュール識別名の英文字を英小文字としたものをwww，英大文字としたものをWWWと表記する．
2.13.2 データ型名
各サイズの整数型など，データの意味を定めない基本データ型の名称は，英小文字，数字，"̲"で構成する．データ型であることを明示するために，末尾が"̲t"である名称とする．
複合データ型やデータの意味を定めるデータ型の名称は，英大文字，数字，"̲"で構成する．データ型であることを明示するために，先頭が"T̲"または末尾が"̲T"である名称とする場合もある．
データ型の種類毎に，次のネーミングコンベンションを定める．
(A) パケットのデータ型
T̲CYYYT̲DYYYT̲RYYYT̲WWW̲CYYY
T̲WWW̲DYYY

acre̲yyyに渡すパケットのデータ型
def̲yyyに渡すパケットのデータ型
ref̲yyyに渡すパケットのデータ型
www̲acre̲yyyに渡すパケットのデータ型
www̲def̲yyyに渡すパケットのデータ型

ngki̲spec‑120.txt
T̲WWW̲RYYY

page 58www̲ref̲yyyに渡すパケットのデータ型

2.13.3 関数名関数の名称は，英小文字，数字，"̲"で構成する．
関数の種類毎に，次のネーミングコンベンションを定める．
(A) サービスコール
サービスコールは，xxx̲yyyまたはwww̲xxx̲yyyの名称とする．ここで，xxxは操作の方法，yyyは操作の対象を表す．xxx̲yyyまたはwww̲xxx̲yyyから派生したサービスコールは，それぞれzxxx̲yyyまたはwww̲zxxx̲yyyの名称とする．ここでzは，派生したことを表す文字である．派生したことを表す文字を2つ付加する場合には，zzxxx̲yyyまたはwww̲zzxxx̲yyyの名称となる．
非タスクコンテキスト専用のサービスコールの名称は，派生したことを表す文字として"i"を付加し，ixxx̲yyy，izxxx̲yyy，www̲ixxx̲yyy，www̲izxxx̲yyyといった名称とする．
【補足説明】
サービスコールの名称を構成する省略名（xxx，yyy，z）の元になった英語については，「5.9 省略名の元になった英語」の節を参照すること．
(B) コールバック
コールバックの名称は，サービスコールのネーミングコンベンションに従う．
2.13.4 変数名
変数（const修飾子のついたものを含む）の名称は，英小文字，数字，"̲"で構成する．データ型が異なる変数には，異なる名称を付けることを原則とする．
変数の名称に関して，次のガイドラインを設ける．
〜id
〜no
〜atr
〜stat
〜mode
〜pri
〜sz
〜cnt
〜ptn
〜tim
〜cd
i〜
max〜
min〜
left〜

〜ID（オブジェクトのID番号，ID型）〜番号（オブジェクト番号）〜属性（オブジェクト属性，ATR型）〜状態（オブジェクト状態，STAT型）〜モード（サービスコールの動作モード，MODE型）〜優先度（優先度，PRI型）〜サイズ（単位はバイト数，SIZE型またはuint̲t型）〜の個数（単位は個数，uint̲t型）〜パターン〜時刻，〜時間
〜コード
〜の初期値
〜の最大値
〜の最小値
〜の残り

また，ポインタ変数（関数ポインタを除く）の名称に関して，次のガイドラインを設ける．
p̲〜
pp̲〜
pk̲〜

ポインタ
ポインタを入れる領域へのポインタ
パケットへのポインタ

ngki̲spec‑120.txt
ppk̲〜

page 59

パケットへのポインタを入れる領域へのポインタ

変数の種類毎に，次のネーミングコンベンションを定める．
(A) パケットへのポインタ
pk̲cyyypk̲dyyypk̲ryyy
pk̲www̲cyyy
pk̲www̲dyyy
pk̲www̲ryyy

acre̲yyyに渡すパケットへのポインタ
def̲yyyに渡すパケットへのポインタ
ref̲yyyに渡すパケットへのポインタ
www̲acre̲yyyに渡すパケットへのポインタ
www̲def̲yyyに渡すパケットへのポインタ
www̲ref̲yyyに渡すパケットへのポインタ

2.13.5 定数名
定数（C言語プリプロセッサのマクロ定義によるもの）の名称は，英大文字，数
字，"̲"で構成する．
定数の種類毎に，次のネーミングコンベンションを定める．
(A) メインエラーコード
メインエラーコードは，先頭が"E̲"である名称とする．
(B) 機能コード
TFN̲XXX̲YYY
TFN̲WWW̲XXX̲YYY

xxx̲yyyの機能コード
www̲xxx̲yyyの機能コード(C) その他の定数
その他の定数は，先頭がTUU̲またはTUU̲WWW̲である名称とする．ここでUUは，定数の種類またはデータ型を表す．同じパラメータまたはリターンパラメータに用いられる定数の名称については，UUを同一にすることを原則とする．
また，定数の名称に関して，次のガイドラインを設ける．
TA̲〜
TSZ̲〜
TBIT̲〜
TMAX̲〜
TMIN̲〜

オブジェクトの属性値〜のサイズ〜のビット数〜の最大値〜の最小値

2.13.6 マクロ名
マクロ（C言語プリプロセッサのマクロ定義によるもの）の名称は，それが表す構成要素のネーミングコンベンションに従う．すなわち，関数を表すマクロは関数のネーミングコンベンションに，定数を表すマクロは定数のネーミングコ
ンベンションに従う．ただし，簡単な関数を表すマクロや，副作用があるなどの理由でマクロであることを明示したい場合には，英大文字，数字，"̲"で構成する場合もある．
マクロの種類毎に，次のネーミングコンベンションを定める．
(A) 構成マクロ
構成マクロの名称は，英大文字，数字，"̲"で構成し，次のガイドラインを設ける．

ngki̲spec‑120.txt

TSZ̲〜
TBIT̲〜
TMAX̲〜
TMIN̲〜page 60〜のサイズ〜のビット数〜の最大値〜の最小値

2.13.7 静的API名
静的APIの名称は，英大文字，数字，"̲"で構成し，対応するサービスコールの名称中の英小文字を英大文字で置き換えたものとする．対応するサービスコー
ルがない場合には，サービスコールのネーミングコンベンションに従って定めた名称中の英小文字を英大文字で置き換えたものとする．
2.13.8 ファイル名
ファイルの名称は，英小文字，数字，"̲"，"."で構成する．英大文字と英小文
字を区別しないファイルシステムに対応するために，英大文字は使用しない．
また，"‑"も使用しない．
ファイルの種類毎に，次のネーミングコンベンションを定める．
(A) ヘッダファイル
モジュールを用いるために必要な定義を含むヘッダファイルは，そのモジュー
ルのモジュール識別名の末尾に".h"を付加した名前（すなわち，www.h）とする．
2.13.9 モジュール内部の名称の衝突回避
モジュール内部の名称が，他のモジュール内部の名称と衝突することを避けるために，次のガイドラインを設ける．
モジュール内部に閉じて使われる関数や変数などの名称で，オブジェクトファ
イルのシンボル表に登録されて外部から参照できる名称は，C言語レベルで，先頭が̲www̲または̲WWW̲である名称とする．例えば，カーネルの内部シンボルは，
C言語レベルで，先頭が"̲kernel̲"または"̲KERNEL̲"である名称とする．
また，モジュールを用いるために必要な定義を含むヘッダファイル中に用いる名称で，それをインクルードする他のモジュールで使用する名称と衝突する可能性のある名称は，"TOPPERS̲"で始まる名称とする．
2.14 TOPPERS共通定義
TOPPERSソフトウェアに共通に用いる定義を，TOPPERS共通定義と呼ぶ．
2.14.1 TOPPERS共通ヘッダファイル
TOPPERS共通定義（共通データ型，共通定数，共通マクロ）は，TOPPERS共通ヘッダファイル（t̲stddef.h）およびそこからインクルードされるファイルに含まれている．TOPPERS共通定義を用いる場合には，TOPPERS共通ヘッダファイルをインクルードする．
TOPPERS共通ヘッダファイルは，カーネルヘッダファイル（kernel.h）やシステ
ムインタフェースレイヤヘッダファイル（sil.h）からインクルードされるため，
これらのファイルをインクルードする場合には，TOPPERS共通ヘッダファイルを直接インクルードする必要はない．
2.14.2 TOPPERS共通データ型

ngki̲spec‑120.txt

page 61

C90に規定されているデータ型以外で，TOPPERSソフトウェアで共通に用いるデータ型は次の通りである．
int8̲tuint8̲t
int16̲tuint16̲t
int32̲tuint32̲t
int64̲tuint64̲t
int128̲t
uint128̲t

符号付き8ビット整数（オプション，C99準拠）
符号無し8ビット整数（オプション，C99準拠）
符号付き16ビット整数（C99準拠）
符号無し16ビット整数（C99準拠）
符号付き32ビット整数（C99準拠）
符号無し32ビット整数（C99準拠）
符号付き64ビット整数（オプション，C99準拠）
符号無し64ビット整数（オプション，C99準拠）
符号付き128ビット整数（オプション，C99準拠）
符号無し128ビット整数（オプション，C99準拠）

int̲least8̲t
uint̲least8̲t

8ビット以上の符号付き整数（C99準拠）
int̲least8̲t型と同じサイズの符号無し整数（C99準拠）

float32̲t
double64̲t

IEEE754準拠の32ビット単精度浮動小数点数（オプション）
IEEE754準拠の64ビット倍精度浮動小数点数（オプション）

bool̲tchar̲tint̲tuint̲tlong̲tulong̲t

真偽値（trueまたはfalse）
符号無しの文字型（unsigned charと一致）
16ビット以上の符号付き整数
int̲t型と同じサイズの符号無し整数
32ビット以上かつint̲t型以上のサイズの符号付き整数
long̲t型と同じサイズの符号無し整数

intptr̲t
uintptr̲t

ポインタを格納できるサイズの符号付き整数（C99準拠）
intptr̲t型と同じサイズの符号無し整数（C99準拠）

FN
ER

機能コード（符号付き整数，int̲tに定義）
正常終了（E̲OK）またはエラーコード（符号付き整数，int̲tに定義）
オブジェクトのID番号（符号付き整数，int̲tに定義）
オブジェクト属性（符号無し整数，uint̲tに定義）
オブジェクトの状態（符号無し整数，uint̲tに定義）
サービスコールの動作モード（符号無し整数，uint̲tに定義）
優先度（符号付き整数，int̲tに定義）
メモリ領域のサイズ（符号無し整数，ポインタを格納できるサイズの符号無し整数型に定義）

ID
ATR
STAT
MODE
PRI
SIZE

TMO
RELTIM
SYSTIM
SYSUTM

タイムアウト指定（符号付き整数，単位はミリ秒，int̲tに定義）
相対時間（符号無し整数，単位はミリ秒，uint̲tに定義）
システム時刻（符号無し整数，単位はミリ秒，ulong̲tに定義）
性能評価用システム時刻（符号無し整数，単位はマイクロ秒，
ulong̲tに定義）

FP

プログラムの起動番地（型の定まらない関数ポインタ）

ER̲BOOL
ER̲ID

エラーコードまたは真偽値（符号付き整数，int̲tに定義）
エラーコードまたはID番号（符号付き整数，int̲tに定義，
負のID番号は格納できない）
エラーコードまたは符号無し整数（符号付き整数，int̲tに定義，符号無し整数を格納する場合の有効ビット数はuint̲tより1ビット短い）ER̲UINT

ACPTN

アクセス許可パターン（符号無し32ビット整数，uint32̲tに定義）

ngki̲spec‑120.txt
ACVCT

page 62

アクセス許可ベクタ

ここで，データ型が「AまたはB」とは，AかBのいずれかの値を取ることを示す．
例えばER̲BOOLは，エラーコードまたは真偽値のいずれかの値を取る．
int8̲t，uint8̲t，int64̲t，uint64̲t，int128̲t，uint128̲t，float32̲t，
double64̲tが使用できるかどうかは，ターゲットシステムに依存する．これらが使用できるかどうかは，それぞれ，INT8̲MAX，UINT8̲MAX，INT64̲MAX，
UINT64̲MAX，INT128̲MAX，UINT128̲MAX，FLOAT32̲MAX，DOUBLE64̲MAXがマクロ定義されているかどうかで判別することができる．IEEE754準拠の浮動小数点数がサポートされていないターゲットシステムでは，float32̲tとdouble64̲tは使用できないものとする．
【μITRON4.0仕様との関係】
B，UB，H，UH，W，UW，D，UD，VP̲INTに代えて，C99準拠のint8̲t，uint8̲t，
int16̲t，uint16̲t，int32̲t，uint32̲t，int64̲t，uint64̲t，intptr̲tを用いることにした．また，uintptr̲t，int128̲t，uint128̲tを用意することにした．
VPは，void *と等価であるため，用意しないことにした．また，ターゲットシ
ステムにより振舞いが一定しないことから，VB，VH，VW，VDに代わるデータ型
は用意しないことにした．
INT，UINTに代えて，C99の型名と相性が良いint̲t，uint̲tを用いることにした．
また，32ビット以上かつint̲t型（またはuint̲t型）以上のサイズが保証される整数型として，long̲t，ulong̲tを用意し，8ビット以上のサイズで必ず存在する整数型として，C99準拠のint̲least8̲t，uint̲least8̲tを導入することにした．int̲least16̲t，uint̲least16̲t，int̲least32̲t，uint̲least32̲tを導入しなかったのは，16ビットおよび32ビットの整数型があることを仮定しており，それぞれint16̲t，uint16̲t，int32̲t，uint32̲tで代用できるためである．
TECSとの整合性を取るために，BOOLに代えて，bool̲tを用いることにした．また，符号無し整数で文字を表す型としてchar̲t，IEEE754準拠の単精度浮動小数
点数を表す型としてfloat32̲t，IEEE754準拠の64ビットを表す型としてdouble64̲tを導入した．
性能評価用システム時刻のためのデータ型として，SYSUTMを用意することにした．
2.14.3 TOPPERS共通定数
C90に規定されている定数以外で，TOPPERSソフトウェアで共通に用いる定数は次の通りである（一部，C90に規定されているものも含む）．
(1) 一般定数
NULL

無効ポインタ

true
false

1
0

真
偽

E̲OK

0

正常終了

【μITRON4.0仕様との関係】
BOOLをbool̲tに代えたことから，TRUEおよびFALSEに代えて，trueおよびfalseを用いることにした．

ngki̲spec‑120.txt

page 63(2) 整数型に格納できる最大値と最小値
INT8̲MAX
INT8̲MINUINT8̲MAX
INT16̲MAX
INT16̲MIN
UINT16̲MAX
INT32̲MAX
INT32̲MIN
UINT32̲MAX
INT64̲MAX
INT64̲MIN
UINT64̲MAX
INT128̲MAX
INT128̲MIN
UINT128̲MAX

int8̲tに格納できる最大値（オプション，C99準拠）
int8̲tに格納できる最小値（オプション，C99準拠）
uint8̲tに格納できる最大値（オプション，C99準拠）
int16̲tに格納できる最大値（C99準拠）
int16̲tに格納できる最小値（C99準拠）
uint16̲tに格納できる最大値（C99準拠）
int32̲tに格納できる最大値（C99準拠）
int32̲tに格納できる最小値（C99準拠）
uint32̲tに格納できる最大値（C99準拠）
int64̲tに格納できる最大値（オプション，C99準拠）
int64̲tに格納できる最小値（オプション，C99準拠）
uint64̲tに格納できる最大値（オプション，C99準拠）
int128̲tに格納できる最大値（オプション，C99準拠）
int128̲tに格納できる最小値（オプション，C99準拠）
uint128̲tに格納できる最大値（オプション，C99準拠）

INT̲LEAST8̲MAX
INT̲LEAST8̲MIN
UINT̲LEAST8̲MAX
INT̲MAX
INT̲MIN
UINT̲MAX
LONG̲MAX
LONG̲MINULONG̲MAX

int̲least8̲tに格納できる最大値（C99準拠）
int̲least8̲tに格納できる最小値（C99準拠）
uint̲least8̲tに格納できる最大値（C99準拠）
int̲tに格納できる最大値（C90準拠）
int̲tに格納できる最小値（C90準拠）
uint̲tに格納できる最大値（C90準拠）
long̲tに格納できる最大値（C90準拠）
long̲tに格納できる最小値（C90準拠）
ulong̲tに格納できる最大値（C90準拠）

FLOAT32̲MIN

float32̲tに格納できる最小の正規化された正の浮動小数点数（オプション）
float32̲tに格納できる表現可能な最大の有限浮動小数点数（オプション）
double64̲tに格納できる最小の正規化された正の浮動小数点数（オプション）
double64̲tに格納できる表現可能な最大の有限浮動小数点数（オプション）

FLOAT32̲MAX
DOUBLE64̲MIN
DOUBLE64̲MAX(3) 整数型のビット数
CHAR̲BIT

char型のビット数（C90準拠）(4) オブジェクト属性
TA̲NULL

0U

オブジェクト属性を指定しない(5) タイムアウト指定
TMO̲POL
TMO̲FEVR
TMO̲NBLK

0
‑1
‑2

ポーリング
永久待ち
ノンブロッキング(6) アクセス許可パターン
TACP̲KERNELTACP̲SHARED

0U
0U

カーネルドメインのみにアクセスを許可
すべての保護ドメインにアクセスを許可

2.14.4 TOPPERS共通エラーコード

ngki̲spec‑120.txt

page 64

TOPPERSソフトウェアで共通に用いるメインエラーコードは次の通りである．
(A) 内部エラークラス（EC̲SYS，‑5〜‑8）
E̲SYS

‑5

システムエラー(B) 未サポートエラークラス（EC̲NOSPT，‑9〜‑16）
E̲NOSPT
E̲RSFNE̲RSATR

‑9
‑10
‑11

未サポート機能
予約機能コード
予約属性(C) パラメータエラークラス（EC̲PAR，‑17〜‑24）
E̲PAR
E̲ID

‑17
‑18

パラメータエラー
不正ID番号(D) 呼出しコンテキストエラークラス（EC̲CTX，‑25〜‑32）
E̲CTX
E̲MACVE̲OACVE̲ILUSE

‑25
‑26
‑27
‑28

コンテキストエラー
メモリアクセス違反
オブジェクトアクセス違反
サービスコール不正使用(E) 資源不足エラークラス（EC̲NOMEM，‑33〜‑40）
E̲NOMEME̲NOIDE̲NORES

‑33
‑34
‑35

メモリ不足
ID番号不足資源不足(F) オブジェクト状態エラークラス（EC̲OBJ，‑41〜‑48）
E̲OBJ
E̲NOEXSE̲QOVR

‑41
‑42
‑43

オブジェクト状態エラー
オブジェクト未登録
キューイングオーバフロー(G) 待ち解除エラークラス（EC̲RLWAI，‑49〜‑56）
E̲RLWAIE̲TMOUT
E̲DLT
E̲CLS

‑49
‑50
‑51
‑52

待ち禁止状態または待ち状態の強制解除
ポーリング失敗またはタイムアウト
待ちオブジェクトの削除または再初期化
待ちオブジェクトの状態変化(H) 警告クラス（EC̲WARN，‑57〜‑64）
E̲WBLKE̲BOVR‑57‑58

ノンブロッキング受付け
バッファオーバフロー

このエラークラスに属するエラーコードは，警告を表すエラーコードであり，サービスコールがエラーコードを返した場合には副作用がないという原則の例
外となる．
【μITRON4.0仕様との関係】
E̲NORESは，μITRON4.0仕様に規定されていないエラーコードである．
2.14.5 TOPPERS共通マクロngki̲spec‑120.txt

page 65(1) 整数定数を作るマクロINT8̲C(val)
UINT8̲C(val)
INT16̲C(val)
UINT16̲C(val)
INT32̲C(val)
UINT32̲C(val)
INT64̲C(val)
UINT64̲C(val)
INT128̲C(val)
UINT128̲C(val)int̲least8̲t型の定数を作るマクロ（C99準拠）
uint̲least8̲t型の定数を作るマクロ（C99準拠）
int16̲t型の定数を作るマクロ（C99準拠）
uint16̲t型の定数を作るマクロ（C99準拠）
int32̲t型の定数を作るマクロ（C99準拠）
uint32̲t型の定数を作るマクロ（C99準拠）
int64̲t型の定数を作るマクロ（オプション，C99準拠）
uint64̲t型の定数を作るマクロ（オプション，C99準拠）
int128̲t型の定数を作るマクロ（オプション，C99準拠）
uint128̲t型の定数を作るマクロ（オプション，C99準拠）

UINT̲C(val)ULONG̲C(val)uint̲t型の定数を作るマクロ
ulong̲t型の定数を作るマクロ【仕様決定の理由】
C99に用意されていないUINT̲CとULONG̲Cを導入したのは，アセンブリ言語からも参照する定数を記述するためである．C言語のみで用いる定数をこれらのマクロを使って記述する必要はない．
(2) 型に関する情報を取り出すためのマクロ
offsetof(structure, field)

構造体structure中のフィールドfieldのバイト位置を返すマクロ（C90準拠）

alignof(type)型typeのアラインメント単位を返すマクロ

ALIGN̲TYPE(addr, type)

番地addrが型typeに対してアラインしているかどうかを返すマクロ(3) assertマクロ
assert(exp)expが成立しているかを検査するマクロ（C90準拠）(4) コンパイラの拡張機能のためのマクロ
inlineInlineasm
Asm
throw()
NoReturn

インライン関数
ファイルローカルなインライン関数
インラインアセンブラ
インラインアセンブラ（最適化抑止）
例外を発生しない関数
リターンしない関数(5) エラーコード構成・分解マクロ
ERCD(mercd, sercd)

メインエラーコードmercdとサブエラーコードsercdから，エラーコードを構成するためのマクロ

MERCD(ercd)

エラーコードercdからメインエラーコードを抽出するためのマクロ
エラーコードercdからサブエラーコードを抽出するためのマクロ

SERCD(ercd)(6) アクセス許可パターン構成マクロ
TACP(domid)

domidで指定されるユーザドメインのみにアクセスをngki̲spec‑120.txt

page 66
許可するアクセス許可パターンを構成するためのマクロ

ここで，TACPのパラメータ（domid）には，ユーザドメインのID番号のみを指定することができる．TDOM̲SELF，TDOM̲KERNEL，TDOM̲NONEを指定した場合の動作は，保証されない．
2.14.6 TOPPERS共通構成マクロ(1) 相対時間の範囲
TMAX̲RELTIM

相対時間に指定できる最大値

2.15 カーネル共通定義
カーネルの複数の機能で共通に用いる定義を，カーネル共通定義と呼ぶ．
2.15.1 カーネルヘッダファイル
カーネルを用いるために必要な定義は，カーネルヘッダファイル（kernel.h）
およびそこからインクルードされるファイルに含まれている．カーネルを用いる場合には，カーネルヘッダファイルをインクルードする．
ただし，カーネルを用いるために必要な定義の中で，コンフィギュレータによって生成されるものは，カーネル構成・初期化ヘッダファイル（kernel̲cfg.h）に含まれる．具体的には，登録できるオブジェクトの数（TNUM̲YYY）やオブジェ
クトのID番号などの定義が，これに該当する．これらの定義を用いる場合には，カーネル構成・初期化ヘッダファイルをインクルードする．
μITRON4.0仕様で規定されており，この仕様で廃止されたデータ型および定数を用いる場合には，ITRON仕様互換ヘッダファイル（itron.h）をインクルード
する．
【μITRON4.0仕様との関係】
この仕様では，コンフィギュレータが生成するヘッダファイルに，オブジェク
トのID番号の定義に加えて，登録できるオブジェクトの数（TNUM̲YYY）の定義が含まれることとした．これに伴い，ヘッダファイルの名称を，μITRON4.0仕様の自動割付け結果ヘッダファイル（kernel̲id.h）から，カーネル構成・初期
化ヘッダファイル（kernel̲cfg.h）に変更した．
2.15.2 カーネル共通定数(1) オブジェクト属性
TA̲TPRI

0x01U

タスクの待ち行列をタスクの優先度順に【μITRON4.0仕様との関係】
値が0のオブジェクト属性（TA̲HLNG，TA̲TFIFO，TA̲MFIFO，TA̲WSGL）は，デフォルトの扱いにして廃止した．これは，「(tskatr & TA̲HLNG) != 0U」のような間違いを防ぐためである．TA̲ASMは，有効な使途がないために廃止した．
TA̲MPRIは，メールボックス機能でのみ使用するため，カーネル共通定義から外した．
(2) 保護ドメインID
TDOM̲SELF

0

自タスクの属する保護ドメイン

ngki̲spec‑120.txt
TDOM̲KERNELTDOM̲NONE

page 67‑1‑2

カーネルドメイン
無所属（保護ドメインに属さない）(3) その他のカーネル共通定数
TCLS̲SELF

0

自タスクの属するクラス

TPRC̲NONE
TPRC̲INI

00

割付けプロセッサの指定がない
初期割付けプロセッサ

TSK̲SELF
TSK̲NONE00

自タスク指定該当するタスクがない

TPRI̲SELF
TPRI̲INI

00

自タスクのベース優先度の指定
タスクの起動時優先度の指定

TIPM̲ENAALL0

割込み優先度マスク全解除(4) カーネルで用いるメインエラーコード「2.14.4 TOPPERS共通エラーコード」の節で定義したメインエラーコードの中
で，E̲CLS，E̲WBLK，E̲BOVRの3つは，カーネルでは使用しない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，サービスコールから，E̲SYS，E̲RSFN，E̲RSATR，E̲MACV，
E̲OACV，E̲NOMEM，E̲NOID，E̲NORES，E̲NOEXSが返る状況は起こらない．
E̲RSATRは，コンフィギュレータによって検出される．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，サービスコールから，E̲SYS，E̲RSFN，E̲RSATR，E̲MACV，
E̲OACV，E̲NOMEM，E̲NOID，E̲NORES，E̲NOEXSが返る状況は起こらない．
E̲RSATRとE̲NORESは，コンフィギュレータによって検出される．
2.15.3 カーネル共通マクロ(1) オブジェクト属性を作るマクロ
保護機能対応カーネルでは，オブジェクトが属する保護ドメインを指定するためのオブジェクト属性を作るマクロとして，次のマクロを用意している．
TA̲DOM(domid)

domidで指定される保護ドメインに属する

マルチプロセッサ対応カーネルでは，オブジェクトが属するクラスを指定する
ためのオブジェクト属性を作るマクロとして，次のマクロを用意している．
TA̲CLS(clsid)

clsidで指定されるクラスに属する(2) サービスコールの呼出し方法を指定するマクロ
保護機能対応カーネルでは，サービスコールの呼出し方法を指定するためのマクロとして，次のマクロを用意している．
SVC̲CALL(svc)

svcで指定されるサービスコールを関数呼出しによって呼び出すための名称

2.15.4 カーネル共通構成マクロngki̲spec‑120.txt

page 68(1) サポートする機能
TOPPERS̲SUPPORT̲PROTECTTOPPERS̲SUPPORT̲MULTI̲PRC
TOPPERS̲SUPPORT̲DYNAMIC̲CRE

保護機能対応のカーネル
マルチプロセッサ対応のカーネル
動的生成対応のカーネル【未決定事項】
マクロ名は，今後変更する可能性がある．
(2) 優先度の範囲
TMIN̲TPRI
TMAX̲TPRI

タスク優先度の最小値（＝1）
タスク優先度の最大値【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，タスク優先度の最大値（TMAX̲TPRI）は16に固定されている．
ただし，タスク優先度拡張パッケージを用いると，TMAX̲TPRIを256に拡張することができる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，タスク優先度の最大値（TMAX̲TPRI）は16に固定されている．
【μITRON4.0仕様との関係】
メッセージ優先度の最小値（TMIN̲MPRI）と最大値（TMAX̲MPRI）は，メールボッ
クス機能でのみ使用するため，カーネル共通定義から外した．
(3) プロセッサの数
マルチプロセッサ対応カーネルでは，プロセッサの数を知るためのマクロとして，次の構成マクロを用意している．
TNUM̲PRCID

プロセッサの数(4) 特殊な役割を持ったプロセッサ
マルチプロセッサ対応カーネルでは，特殊な役割を持ったプロセッサを知るた
めのマクロとして，次の構成マクロを用意している．
TOPPERS̲MASTER̲PRCID
TOPPERS̲SYSTIM̲PRCID

マスタプロセッサのID番号
システム時刻管理プロセッサのID番号（グローバルタイマ方式の場合のみ）(5) タイマ方式
マルチプロセッサ対応カーネルでは，システム時刻の方式を知るためのマクロとして，次の構成マクロを用意している．
TOPPERS̲SYSTIM̲LOCALTOPPERS̲SYSTIM̲GLOBAL

ローカルタイマ方式の場合にマクロ定義
グローバルタイマ方式の場合にマクロ定義(6) バージョン情報
TKERNEL̲MAKER

カーネルのメーカコード（＝0x0118）

ngki̲spec‑120.txt
TKERNEL̲PRID
TKERNEL̲SPVER
TKERNEL̲PRVER

page 69
カーネルの識別番号
カーネル仕様のバージョン番号
カーネルのバージョン番号

カーネルのメーカコード（TKERNEL̲MAKER）は，TOPPERSプロジェクトから配布するカーネルでは，TOPPERSプロジェクトを表す値（0x0118）に設定されている．
カーネルの識別番号（TKERNEL̲PRID）は，TOPPERSカーネルの種類を表す．
0x00010x00020x00030x00040x00050x00060x00070x0008TOPPERS/JSPカーネル
予約（IIMPカーネル）
予約（IDLカーネル）
TOPPERS/FI4カーネル
TOPPERS/FDMPカーネル
TOPPERS/HRPカーネル
TOPPERS/ASPカーネル
TOPPERS/FMPカーネル

カーネル仕様のバージョン番号（TKERNEL̲SPVER）は，上位8ビット（0xf5）がTOPPERS新世代カーネル仕様であることを，中位4ビットがメジャーバージョン
番号，下位4ビットがマイナーバージョン番号を表す．
カーネルのバージョン番号（TKERNEL̲PRVER）は，上位4ビットがメジャーバー
ジョン番号，中位8ビットがマイナーバージョン番号，下位4ビットがパッチレベルを表す．

第３章 システムインタフェースレイヤAPI仕様
3.1 システムインタフェースレイヤの概要
システムインタフェースレイヤ（この章では，SILと略記する）は，デバイスを直接操作するプログラムが用いるための機能である．ITRONデバイスドライバ設
計ガイドラインの一部分として検討されたものをベースに，TOPPERSプロジェク
トにおいて修正を加えて用いている．
SILの機能は，プロセッサの特権モードで実行されているプログラムが使用することを想定している．非特権モードで実行されているプログラムからSILの機能を呼び出した場合の動作は，次の例外を除いては保証されない．
・微少時間待ちの機能を呼び出すこと・エンディアンの取得のためのマクロを参照すること・メモリ空間アクセス関数により，アクセスを許可されたメモリ領域にアクセスすること・I/O空間アクセス関数により，アクセスを許可されたI/O領域にアクセスすること
3.2 SILヘッダファイル
SILを用いるために必要な定義は，SILヘッダファイル（sil.h）およびそこからインクルードされるファイルに含まれている．SILを用いる場合には，SILヘッ
ダファイルをインクルードする．
3.3 全割込みロック状態の制御
デバイスを扱うプログラムの中では，すべての割込み（NMIを除く，以下同じ）をマスクしたい場合がある．カーネルで制御できるCPUロック状態は，カーネル
管理外の割込み（NMI以外にカーネル管理外の割込みがあるかはターゲット定義）

ngki̲spec‑120.txt

page 70をマスクしないため，このような場合に用いることはできない．
そこで，SILでは，すべての割込みをマスクする全割込みロック状態を制御するための以下の機能を用意している．
(1) SIL̲PRE̲LOC
全割込みロック状態の制御に必要な変数を宣言するマクロ．通常は，型と変数名を並べたもので，最後に";"を含まない．
このマクロは，SIL̲LOC̲INT，SIL̲UNL̲INTを用いる関数またはブロックの先頭の変数宣言部に記述しなければならない．
(2) SIL̲LOC̲INT()
全割込みロックフラグをセットすることで，NMIを除くすべての割込みをマスクし，全割込みロック状態に遷移する．
(3) SIL̲UNL̲INT()
全割込みロックフラグを，対応するSIL̲LOC̲INTを実行する前の状態に戻す．
なお，全割込みロック状態で呼び出せるサービスコールなどの制限事項については，「2.5.4 全割込みロック状態と全割込みロック解除状態」の節を参照す
ること．
【補足説明】
全割込みロック状態の制御機能の使用例は次の通り．
{
SIL̲PRE̲LOC;
SIL̲LOC̲INT();// この間はNMIを除くすべての割込みがマスクされる．
// この間にサービスコールを呼び出してはならない（一部例外あり）．
SIL̲UNL̲INT();}
3.4 スピンロック
マルチプロセッサシステムにおいて，カーネルの機能を用いずに，他のプロセッ
サとの間でも排他制御を実現したい場合がある．そこでSILでは，割込みのマス
クとプロセッサ間ロックの取得により排他制御を行うためのスピンロックの機能を用意している．
プロセッサ間ロックを取得している間は，全割込みロック状態にすることです
べての割込み（NMIを除く）がマスクされる．ロックが他のプロセッサに取得されている場合には，ロックが取得できるまでループによって待つ．ロックの取得を待つ間は，割込みはマスクされない（ロックの取得を試みる前にマスクしていた割込みは，マスク解除されない）．プロセッサ間ロックを取得し割込みをマスクすることを，スピンロックを取得するという．また，プロセッサ間ロッ
クを返却し割込みをマスク解除することを，スピンロックを返却するという．
SILで取得・返却するプロセッサ間ロックは，システムに唯一存在する．
(1) SIL̲PRE̲LOC

ngki̲spec‑120.txt

page 71

全割込みロック状態の制御に必要な変数を宣言するマクロであるが，スピンロックの取得・解放にも兼用する．
このマクロは，SIL̲LOC̲SPN，SIL̲UNL̲SPNを用いる関数またはブロックの先頭の変数宣言部に記述しなければならない．
(2) SIL̲LOC̲SPN()
スピンロックが取得されていない状態である場合には，プロセッサ間ロックの取得を試みる．ロックが他のプロセッサに取得されている状態である場合や，
他のプロセッサがロックの取得に成功した場合には，ロックが返却されるまでループによって待ち，返却されたらロックの取得を試みる．ロックの取得に成功した場合には，全割込みロックフラグをセットし，全割込みロック状態に遷移する．
(3) SIL̲UNL̲SPN()
プロセッサ間ロックを返却し，全割込みロックフラグを対応するSIL̲LOC̲SPNを実行する前の状態に戻す．
スピンロック取得中にSIL̲LOC̲SPNを呼び出した場合の動作は保証されない．逆に、スピンロックを取得していない状態でSIL̲UNL̲SPNを呼び出した場合の動作も保証されない．それに加えて，スピンロック取得中は全割込みロック状態となっているため，スピンロック取得中に呼び出せるサービスコールなどについては，「2.5.4 全割込みロック状態と全割込みロック解除状態」の節の制限事
項が適用される．
なお，マルチプロセッサシステム以外では，SIL̲LOC̲SPNとSIL̲UNL̲SPNは用意されていない．
【使用上の注意】
全割込ロック状態やCPUロック状態でSIL̲LOC̲SPNを呼び出すことはできるが，割込みがマスクされている時間が長くなるために，そのような使い方は避けるべきである．
3.5 微少時間待ち
デバイスをアクセスする際に，微少な時間待ちを入れなければならない場合がある．そのような場合に，NOP命令をいくつか入れるなどの方法で対応すると，ポータビリティを損なうことになる．そこで，SILでは，微少な時間待ちを行う
ための以下の機能を用意している．
(1) void sil̲dly̲nse(ulong̲t dlytim)
dlytimで指定された以上の時間（単位はナノ秒），ループなどによって待つ．
指定した値によっては，指定した時間よりもかなり長く待つ場合があるので注意すること．
3.6 エンディアンの取得
プロセッサのバイトエンディアンを取得するためのマクロとして，SILでは，以下のマクロを定義している．
(1) SIL̲ENDIAN̲BIG，SIL̲ENDIAN̲LITTLE
ビッグエンディアンプロセッサではSIL̲ENDIAN̲BIGを，リトルエンディアンプ
ロセッサではSIL̲ENDIAL̲LITTLEを，マクロ定義している．

ngki̲spec‑120.txt

page 72

3.7 メモリ空間アクセス関数
メモリ空間にマッピングされたデバイスレジスタや，デバイスとの共有メモリ
をアクセスするために，SILでは，以下の関数を用意している．
(1) uint8̲t sil̲reb̲mem(void *mem)
memで指定されるアドレスから8ビット単位で読み出した値を返す．
(2) void sil̲wrb̲mem(void *mem, uint8̲t data)
memで指定されるアドレスにdataで指定される値を8ビット単位で書き込む．
(3) uint16̲t sil̲reh̲mem(void *mem)
memで指定されるアドレスから16ビット単位で読み出した値を返す．
(4) void sil̲wrh̲mem(void *mem, uint16̲t data)
memで指定されるアドレスにdataで指定される値を16ビット単位で書き込む．
(5) uint16̲t sil̲reh̲lem(void *mem)
memで指定されるアドレスから16ビット単位でリトルエンディアンで読み出した値を返す．リトルエンディアンプロセッサでは，sil̲reh̲memと一致する．ビッ
グエンディアンプロセッサでは，sil̲reh̲memが返す値を，エンディアン変換した値を返す．
(6) void sil̲wrh̲lem(void *mem, uint16̲t data)
memで指定されるアドレスにdataで指定される値を16ビット単位でリトルエンディ
アンで書き込む．リトルエンディアンプロセッサでは，sil̲wrh̲memと一致する．
ビッグエンディアンプロセッサでは，dataをエンディアン変換した値を，sil̲wrh̲memで書き込むのと同じ結果となる．
(7) uint16̲t sil̲reh̲bem(void *mem)
memで指定されるアドレスから16ビット単位でビッグエンディアンで読み出した値を返す．ビッグエンディアンプロセッサでは，sil̲reh̲memと一致する．リト
ルエンディアンプロセッサでは，sil̲reh̲memが返す値を，エンディアン変換した値を返す．
(8) void sil̲wrh̲bem(void *mem, uint16̲t data)
memで指定されるアドレスにdataで指定される値を16ビット単位でビッグエンディ
アンで書き込む．ビッグエンディアンプロセッサでは，sil̲wrh̲memと一致する．
リトルエンディアンプロセッサでは，dataをエンディアン変換した値を，sil̲wrh̲memで書き込むのと同じ結果となる．
(9) uint32̲t sil̲rew̲mem(void *mem)
memで指定されるアドレスから32ビット単位で読み出した値を返す．
(10) void sil̲wrw̲mem(void *mem, uint32̲t data)
memで指定されるアドレスにdataで指定される値を32ビット単位で書き込む．

ngki̲spec‑120.txt

page 73(11) uint32̲t sil̲rew̲lem(void *mem)
memで指定されるアドレスから32ビット単位でリトルエンディアンで読み出した値を返す．リトルエンディアンプロセッサでは，sil̲rew̲memと一致する．ビッ
グエンディアンプロセッサでは，sil̲rew̲memが返す値を，エンディアン変換した値を返す．
(12) void sil̲wrw̲lem(void *mem, uint32̲t data)
memで指定されるアドレスにdataで指定される値を32ビット単位でリトルエンディ
アンで書き込む．リトルエンディアンプロセッサでは，sil̲wrw̲memと一致する．
ビッグエンディアンプロセッサでは，dataをエンディアン変換した値を，sil̲wrw̲memで書き込むのと同じ結果となる．
(13) uint32̲t sil̲rew̲bem(void *mem)
memで指定されるアドレスから32ビット単位でビッグエンディアンで読み出した値を返す．ビッグエンディアンプロセッサでは，sil̲rew̲memと一致する．リト
ルエンディアンプロセッサでは，sil̲rew̲memが返す値を，エンディアン変換した値を返す．
(14) void sil̲wrw̲bem(void *mem, uint32̲t data)
memで指定されるアドレスにdataで指定される値を32ビット単位でビッグエンディ
アンで書き込む．ビッグエンディアンプロセッサでは，sil̲wrw̲memと一致する．
リトルエンディアンプロセッサでは，dataをエンディアン変換した値を，sil̲wrw̲memで書き込むのと同じ結果となる．
3.8 I/O空間アクセス関数
メモリ空間とは別にI/O空間を持つプロセッサでは，I/O空間にあるデバイスレ
ジスタをアクセスするために，メモリ空間アクセス関数と同等の以下の関数を用意している．
(1) uint8̲t sil̲reb̲iop(void *iop)(2) void sil̲wrb̲iop(void *iop, uint8̲t data)(3) uint16̲t sil̲reh̲iop(void *iop)(4) void sil̲wrh̲iop(void *iop, uint16̲t data)(5) uint16̲t sil̲reh̲lep(void *iop)(6) void sil̲wrh̲lep(void *iop, uint16̲t data)(7) uint16̲t sil̲reh̲bep(void *iop)(8) void sil̲wrh̲bep(void *iop, uint16̲t data)(9) uint32̲t sil̲rew̲iop(void *iop)(10) void sil̲wrw̲iop(void *iop, uint32̲t data)(11) uint32̲t sil̲rew̲lep(void *iop)(12) void sil̲wrw̲lep(void *iop, uint32̲t data)(13) uint32̲t sil̲rew̲bep(void *iop)(14) void sil̲wrw̲bep(void *iop, uint32̲t data)
3.9 プロセッサIDの参照
マルチプロセッサシステムにおいては，プログラムがどのプロセッサで実行されているかを参照するために，以下の関数を用意している．
(1) void sil̲get̲pid(ID *p̲prcid)
この関数を呼び出したプログラムを実行しているプロセッサのID番号を参照し，
p̲prcidで指定したメモリ領域に返す．

ngki̲spec‑120.txt

page 74【使用上の注意】
タスクは，sil̲get̲pidを用いて，自タスクを実行しているプロセッサを正しく参照できるとは限らない．これは，sil̲get̲pidを呼び出し，自タスクを実行しているプロセッサのID番号を参照した直後に割込みが発生した場合，
sil̲get̲pidから戻ってきた時には自タスクを実行しているプロセッサが変化している可能性があるためである．

第４章 カーネルAPI仕様
この章では，カーネルのAPI仕様について規定する．
カーネルのAPIの種別とAPIをサポートするカーネルの種類を表すために，次の記号を用いる．
〔T〕はタスクコンテキスト専用のサービスコールを示す．非タスクコンテキス
トから呼び出すと，E̲CTXエラーとなる．
〔I〕は非タスクコンテキスト専用のサービスコールを示す．タスクコンテキス
トから呼び出すと，E̲CTXエラーとなる．
〔TI〕はタスクコンテキストからも非タスクコンテキストからも呼び出すことのできるサービスコールを示す．
〔S〕は静的APIを示す．
〔P〕は保護機能対応カーネルのみでサポートされているAPIを示す．保護機能対応でないカーネルでは，このAPIはサポートされない．
〔p〕は保護機能対応でないカーネルのみでサポートされているAPIを示す．保護機能対応カーネルでは，このAPIはサポートされない．
〔M〕はマルチプロセッサ対応カーネルのみでサポートされているAPIを示す．
マルチプロセッサ対応でないカーネルでは，このAPIはサポートされない．
〔D〕は動的生成対応カーネルのみでサポートされているAPIを示す．動的生成
対応でないカーネルでは，このAPIはサポートされない．
また，エラーコードが返る条件を表すために，次の記号を用いる．
〔s〕はサービスコールのみで返るエラーコードを示す．静的APIでは，このエラーコードは返らない．
〔S〕は静的APIのみで返るエラーコードを示す．サービスコールでは，このエ
ラーコードは返らない．
〔P〕は保護機能対応カーネルのみで返るエラーコードを示す．保護機能対応でないカーネルでは，このエラーコードは返らない．
〔D〕は動的生成対応カーネルのみで返るエラーコードを示す．動的生成対応でないカーネルでは，このエラーコードは返らない．
【μITRON4.0仕様との関係】
TOPPERS共通データ型に従い，パラメータのデータ型を次の通り変更した．これ
らの変更については，個別のAPI仕様では記述しない．

ngki̲spec‑120.txt

page 75

INT → int̲t
UINT → uint̲t
VP → void *VP̲INT → intptr̲t【μITRON4.0/PX仕様との関係】
ID番号で識別するオブジェクトのアクセス許可ベクタをデフォルト以外に設定する場合には，オブジェクトを生成した後に設定することとし，アクセス許可
ベクタを設定する静的API（SAC̲YYY）を新設した．逆に，アクセス許可ベクタを指定してオブジェクトを生成する機能（CRA̲YYY，cra̲yyy，acra̲yyy）は廃止した．これらの変更については，個別のAPI仕様では記述しない．
4.1 タスク管理機能
タスクは，プログラムの並行実行の単位で，カーネルが実行を制御する処理単位である．タスクは，タスクIDと呼ぶID番号によって識別する．
タスク管理機能に関連して，各タスクが持つ情報は次の通り．
・タスク属性・タスク状態・ベース優先度・現在優先度・起動要求キューイング数
・割付けプロセッサ（マルチプロセッサ対応カーネルの場合）
・次回起動時の割付けプロセッサ（マルチプロセッサ対応カーネルの場合）
・拡張情報
・メインルーチンの先頭番地
・起動時優先度・スタック領域・システムスタック領域（保護機能対応カーネルの場合）・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
タスクのベース優先度は，タスクの現在優先度を決定するために使われる優先度であり，タスクの起動時に起動時優先度に初期化される．
タスクの現在優先度は，タスクの実行順位を決定するために使われる優先度である．単にタスクの優先度と言った場合には，現在優先度のことを指す．タス
クがミューテックスをロックしていない間は，タスクの現在優先度はベース優
先度に一致する．ミューテックスをロックしている間のタスクの現在優先度については，「4.4.6 ミューテックス」の節を参照すること．
タスクの起動要求キューイング数は，処理されていないタスクの起動要求の数であり，タスクの生成時に0に初期化される．
割付けプロセッサは，マルチプロセッサ対応カーネルにおいて，タスクを実行するプロセッサで，タスクの生成時に，タスクが属するクラスによって定まる
初期割付けプロセッサに初期化される．
次回起動時の割付けプロセッサは，マルチプロセッサ対応カーネルにおいて，タスクが次に起動される時に割り付けられるプロセッサで，タスクの生成時に未設定の状態に初期化される．タスクの起動時に，次回起動時の割付けプロセッ
サが設定されていれば，タスクの割付けプロセッサがそのプロセッサに変更され，次回起動時の割付けプロセッサは未設定の状態に戻される．次回起動時のngki̲spec‑120.txt

page 76

割付けプロセッサが未設定の場合には，タスクの割付けプロセッサは変更されない（つまり，タスクが前に実行されていたのと同じプロセッサで実行される）．
保護機能対応カーネルにおいては，スタック領域の扱いは，ユーザタスクとシ
ステムタスクで異なる．ユーザタスクのスタック領域は，ユーザタスクが非特権モードで実行する間に用いるスタック領域であり，ユーザスタック領域と呼ぶ．その扱いについては，「2.11.6 ユーザタスクのユーザスタック領域」の節を参照すること．システムタスクのスタック領域は，カーネルの用いるオブジェ
クト管理領域と同様に扱われる．
システムスタック領域は，保護機能対応カーネルにおいて，ユーザタスクがサー
ビスコール（拡張サービスコールを含む）を呼び出し，特権モードで実行する間に用いるスタック領域である．システムスタック領域は，カーネルの用いるオブジェクト管理領域と同様に扱われる．
タスク属性には，次の属性を指定することができる．
TA̲ACT

0x02U

タスクの生成時にタスクを起動する

TA̲ACTを指定しない場合，タスクの生成直後には，タスクは休止状態となる．
また，ターゲットによっては，ターゲット定義のタスク属性を指定できる場合がある．ターゲット定義のタスク属性として，次の属性を予約している．
TA̲FPUFPUレジスタをコンテキストに含める

C言語によるタスクの記述形式は次の通り．
void task(intptr̲t exinf){
タスク本体
ext̲tsk();}
exinfには，タスクの拡張情報が渡される．ext̲tskを呼び出さず，タスクのメ
インルーチンからリターンしてもよい（ext̲tskを呼び出した場合と，同じ動作をする）．
タスク管理機能に関連するカーネル構成マクロは次の通り．
TMAX̲ACTCNT

タスクの起動要求キューイング数の最大値

TNUM̲TSKID

登録できるタスクの数（動的生成対応でないカーネルでは，静的APIによって登録されたタスクの数に一致）【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，TMAX̲ACTCNTは1に固定されている．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，TMAX̲ACTCNTは1に固定されている．
【μITRON4.0仕様との関係】
この仕様では，自タスクの拡張情報の参照するサービスコール（get̲inf）をサポートし，起動コードを指定してタスクを起動するサービスコール（sta̲tsk），
タスクを終了と同時に削除するサービスコール（exd̲tsk），タスクの状態を参ngki̲spec‑120.txt

page 77

照するサービスコールの簡易版（ref̲tst）はサポートしないこととした．
TNUM̲TSKIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲TSK
タスクの生成〔S〕
acre̲tsk
タスクの生成〔TD〕【静的API】＊保護機能対応でないカーネルの場合
CRE̲TSK(ID tskid, { ATR tskatr, intptr̲t exinf, TASK task,
PRI itskpri, SIZE stksz, STK̲T *stk })＊保護機能対応カーネルの場合
CRE̲TSK(ID tskid, { ATR tskatr, intptr̲t exinf, TASK task,
PRI itskpri, SIZE stksz, STK̲T *stk, SIZE sstksz, STK̲T *sstk })※ sstkszおよびsstkの記述は省略することができる．
【C言語API】
ER̲ID tskid = acre̲tsk(const T̲CTSK *pk̲ctsk)【パラメータ】
ID
T̲CTSK *tskid
pk̲ctsk

生成するタスクのID番号（CRE̲TSKの場合）
タスクの生成情報を入れたパケットへのポイン
タ（静的APIを除く）＊タスクの生成情報（パケットの内容）
ATR
tskatr
タスク属性
intptr̲t
exinf
タスクの拡張情報
TASK
task
タスクのメインルーチンの先頭番地
PRI
itskpri
タスクの起動時優先度
SIZE
stksz
タスクのスタック領域のサイズ（バイト数）
STK̲T *
stk
タスクのスタック領域の先頭番地
SIZE
sstksz
タスクのシステムスタック領域のサイズ（バイト数，保護機能対応カーネルの場合，静的APIにおいては省略可）
STK̲T *
sstk
タスクのシステムスタック領域の先頭番地（保護機能対応カーネルの場合，静的APIにおいては省略可）【リターンパラメータ】
ER̲ID
tskid

【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲NOMEM
E̲OBJ

生成されたタスクのID番号（正の値）またはエ
ラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（tskatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（task，itskpri，stksz，stk，sstksz，sstkが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲ctskが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるタスクIDがない）
メモリ不足（スタック領域やシステムスタック領域が確保できない）
オブジェクト状態エラー（tskidで指定したタスクが登録

ngki̲spec‑120.txt

page 78
済み：CRE̲TSKの場合，スタック領域が登録済みのメモリ
オブジェクトとメモリ領域が重なる）【機能】
各パラメータで指定したタスク生成情報に従って，タスクを生成する．具体的な振舞いは以下の通り．
まず，stkとstkszからタスクが用いるスタック領域が設定される．また，保護機能対応カーネルで，生成するタスクがユーザタスクの場合には，sstkとsstkszからシステムスタック領域が設定される．
次に，生成されたタスクに対してタスク生成時に行うべき初期化処理が行われ，生成されたタスクは休止状態になる．さらに，tskatrにTA̲ACTを指定した場合には，タスク起動時に行うべき初期化処理が行われ，生成されたタスクは実行できる状態になる．
静的APIにおいては，tskidはオブジェクト識別名，tskatr，itskpri，stkszは整数定数式パラメータ，exinf，task，stkは一般定数式パラメータである．コ
ンフィギュレータは，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
itskpriは，TMIN̲TPRI以上，TMAX̲TPRI以下でなければならない．
stkをNULLとした場合，stkszで指定したサイズのスタック領域が，コンフィギュ
レータまたはカーネルにより確保される．stkszにターゲット定義の制約に合致しないサイズを指定した時には，ターゲット定義の制約に合致するように大きい方に丸めたサイズで確保される．
保護機能対応カーネルにおいて，生成するタスクがユーザタスクの場合には，コンフィギュレータまたはカーネルにより確保されるスタック領域（ユーザス
タック領域）は，「2.11.6 ユーザタスクのユーザスタック領域」の節の規定に従ったものとなる．
スタック領域をアプリケーションで確保する場合には，stkszで指定したサイズのスタック領域を確保し，stkにその先頭番地を指定する．スタック領域をアプ
リケーションで確保するために，次のデータ型とマクロを用意している．
STK̲T

スタック領域を確保するためのデータ型

COUNT̲STK̲T(sz)

サイズszのスタック領域を確保するために必要な
STK̲T型の配列の要素数を求めるマクロ
要素数COUNT̲STK̲T(sz)のSTK̲T型の配列のサイズ（szを，STK̲T型のサイズの倍数になるように大きい方に丸めた値）

ROUND̲STK̲T(sz)

これらを用いてスタック領域を確保する方法は次の通り．
STK̲T<スタック領域の変数名>[COUNT̲STK̲T(<スタック領域のサイズ>)];

この時，stkには<スタック領域の変数名>を，stkszにはROUND̲STK̲T(<スタック
領域のサイズ>)を指定する．
この方法に従わず，stkやstkszにターゲット定義の制約に合致しない先頭番地
やサイズを指定した時には，E̲PARエラーとなる．
ただし，保護機能対応カーネルにおいて，生成するタスクがユーザタスクの場
合には，この方法を用いてスタック領域（ユーザスタック領域）を確保しても，

ngki̲spec‑120.txt

page 79

ターゲット定義の制約に合致する先頭番地とサイズとなるとは限らず，スタッ
ク領域をアプリケーションで確保する方法は，ターゲット定義である．また，
stkとstkszで指定したスタック領域が，登録済みのメモリオブジェクトとメモ
リ領域が重なる場合には，E̲OBJエラーとなる．これは，アプリケーションで確保したスタック領域は，1つのメモリオブジェクトとしてカーネルに登録され，それが属する保護ドメインとアクセス権は，「2.11.6 ユーザタスクのユーザス
タック領域」の節の規定に従って設定されるためである．
保護機能対応カーネルにおけるsstkとsstkszの扱いは，生成するタスクがユー
ザタスクの場合とシステムタスクの場合で異なる．
生成するタスクがユーザタスクの場合の扱いは次の通り．
sstkの記述を省略するか，sstkをNULLとした場合，sstkszで指定したサイズのシステムスタック領域が，コンフィギュレータまたはカーネルにより確保される．sstkszにターゲット定義の制約に合致しないサイズを指定した時には，ターゲット定義の制約に合致するように大きい方に丸めたサイズで確保される．
sstkszの記述も省略した場合には，ターゲット定義のデフォルトのサイズで確保される．
sstkがNULLでない場合，sstkszで指定したサイズのシステムスタック領域を，
アプリケーションで確保する．システムスタック領域をアプリケーションで確保するための方法は，上述のスタック領域の確保方法と同じである．その方法に従わず，sstkやsstkszにターゲット定義の制約に合致しない先頭番地やサイズを指定した時には，E̲PARエラーとなる．
生成するタスクがシステムタスクの場合の扱いは次の通り．
sstkに指定することができるのは，NULLのみである．sstkにNULL以外を指定した場合には，E̲PARエラーとなる．
sstkszに0以外の値を指定した場合で，stkがNULLの場合には，コンフィギュレー
タまたはカーネルにより確保されるスタック領域のサイズに，sstkszが加えられる．stkszにsstkszを加えた値が，ターゲット定義の制約に合致しないサイズになる時には，ターゲット定義の制約に合致するように大きい方に丸めたサイズで確保される．
sstkszに0以外の値を指定した場合で，stkがNULLでない場合には，E̲PARエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲TSKのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲TSKのみをサポートする．
【μITRON4.0仕様との関係】
taskのデータ型をTASKに，stkのデータ型をSTK̲T *に変更した．
【μITRON4.0/PX仕様との関係】
sstkのデータ型をSTK̲T *に変更した．
【仕様決定の理由】

ngki̲spec‑120.txt

page 80

保護機能対応カーネルにおいて，sstkszおよびsstkの記述は省略することができることとしたのは，保護機能対応でないカーネル用のシステムコンフィギュ
レーションファイルを，保護機能対応カーネルにも変更なしに使えるようにするためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲TSK
割付け可能なタスクIDの数の指定〔SD〕【静的API】
AID̲TSK(uint̲t notsk)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

notsk

割付け可能なタスクIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
notskで指定した数のタスクIDを，タスクを生成するサービスコールによって割付け可能なタスクIDとして確保する．
notskは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
SAC̲TSK
タスクのアクセス許可ベクタの設定〔SP〕
sac̲tsk
タスクのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲TSK(ID tskid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲tsk(ID tskid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

tskid
p̲acvct

対象タスクのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲TSKの場合）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）

ngki̲spec‑120.txt
E̲OBJ

page 81
オブジェクト状態エラー（対象タスクは静的APIで生成された：sac̲tskの場合，対象タスクに対してアクセス許可
ベクタが設定済み：SAC̲TSKの場合）【機能】
tskidで指定したタスク（対象タスク）のアクセス許可ベクタ（4つのアクセス
許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，tskidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲TSKは，対象タスクが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
sac̲tskにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲TSK，sac̲tskをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲TSK，sac̲tskをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
del̲tsk
タスクの削除〔TD〕【C言語API】
ER ercd = del̲tsk(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する管理操作が許可されていない）
オブジェクト状態エラー（対象タスクが休止状態でない，
対象タスクは静的APIで生成された）【機能】
tskidで指定したタスク（対象タスク）を削除する．具体的な振舞いは以下の通り．
対象タスクが休止状態である場合には，対象タスクの登録が解除され，そのタ
スクIDが未使用の状態に戻される．また，タスクの生成時にタスクのスタック
領域およびシステムスタック領域がカーネルによって確保された場合は，それらのメモリ領域が解放される．
対象タスクが休止状態でない場合には，E̲OBJエラーとなる．

ngki̲spec‑120.txt

page 82【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲tskをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲tskをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
act̲tsk
タスクの起動〔T〕
iact̲tsk
タスクの起動〔I〕【C言語API】
ER ercd = act̲tsk(ID tskid)
ER ercd = iact̲tsk(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲QOVR

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：act̲tskの場合，タスクコンテキストからの呼出し：
iact̲tskの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない：act̲tskの場合）
キューイングオーバフロー（起動要求キューイング数がTMAX̲ACTCNTに一致）【機能】tskidで指定したタスク（対象タスク）に対して起動要求を行う．具体的な振舞
いは以下の通り．
対象タスクが休止状態である場合には，対象タスクに対してタスク起動時に行うべき初期化処理が行われ，対象タスクは実行できる状態になる．
対象タスクが休止状態でない場合には，対象タスクの起動要求キューイング数に1が加えられる．起動要求キューイング数に1を加えるとTMAX̲ACTCNTを超える
場合には，E̲QOVRエラーとなる．
act̲tskにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【補足説明】
マルチプロセッサ対応カーネルでは，act̲tsk／iact̲tskは，対象タスクの次回
起動時の割付けプロセッサを変更しない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
mact̲tsk
割付けプロセッサ指定でのタスクの起動〔TM〕
imact̲tsk
割付けプロセッサ指定でのタスクの起動〔IM〕【C言語API】
ER ercd = mact̲tsk(ID tskid, ID prcid)

ngki̲spec‑120.txt

page 83

ER ercd = imact̲tsk(ID tskid, ID prcid)【パラメータ】
ID
ID

tskid
prcid

【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲QOVR

対象タスクのID番号
タスクの割付け対象のプロセッサのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：mact̲tskの場合，タスクコンテキストからの呼出し：imact̲tskの場合，CPUロック状態からの呼出し）
不正ID番号（tskid，prcidが不正）
パラメータエラー（対象タスクはprcidで指定したプロセッサに割り付けられない）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない：mact̲tskの場合）
キューイングオーバフロー（起動要求キューイング数がTMAX̲ACTCNTに一致）【機能】
prcidで指定したプロセッサを割付けプロセッサとして，tskidで指定したタス
ク（対象タスク）に対して起動要求を行う．具体的な振舞いは以下の通り．
対象タスクが休止状態である場合には，対象タスクの割付けプロセッサがprcidで指定したプロセッサに変更された後，対象タスクに対してタスク起動時に行うべき初期化処理が行われ，対象タスクは実行できる状態になる．
対象タスクが休止状態でない場合には，対象タスクの起動要求キューイング数に1が加えられ，次回起動時の割付けプロセッサがprcidで指定したプロセッサに変更される．起動要求キューイング数に1を加えるとTMAX̲ACTCNTを超える場
合には，E̲QOVRエラーとなる．
mact̲tskにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
対象タスクの属するクラスの割付け可能プロセッサが，prcidで指定したプロセッ
サを含んでいない場合には，E̲PARエラーとなる．
prcidにTPRC̲INI（＝0）を指定すると，対象タスクの割付けプロセッサを，それが属するクラスの初期割付けプロセッサとする．
【補足説明】
TMAX̲ACTCNTが2以上の場合でも，対象タスクが次に起動される時の割付けプロ
セッサは，キューイングされない．すなわち，プロセッサAに割り付けられた休止状態でないタスクを対象として，プロセッサBを割付けプロセッサとしてmact̲tskを呼び出し，さらにプロセッサCを割付けプロセッサとしてmact̲tskを呼び出すと，対象タスクの次回起動時の割付けプロセッサがプロセッサCに変更
され，対象タスクがプロセッサBで実行されることはない．なお，TMAX̲ACTCNTが1の場合には，プロセッサCを割付けプロセッサとした2回目のmact̲tskがE̲QOVRエラーとなるため，次回起動時の割付けプロセッサはプロセッサBのまま変更されない．
【TOPPERS/ASPカーネルにおける規定】

ngki̲spec‑120.txt

page 84

ASPカーネルでは，mact̲tsk，imact̲tskをサポートしない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
can̲act
タスク起動要求のキャンセル〔T〕【C言語API】
ER̲UINT actcnt = can̲act(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER̲UINT
actcnt【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象タスクのID番号

キューイングされていた起動要求の数（正の値または0）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない）【機能】
tskidで指定したタスク（対象タスク）に対する処理されていない起動要求をす
べてキャンセルし，キャンセルした起動要求の数を返す．具体的な振舞いは以下の通り．
対象タスクの起動要求キューイング数が0に設定され，0に設定する前の起動要
求キューイング数が，サービスコールの返値として返される．また，マルチプ
ロセッサ対応カーネルにおいては，対象タスクの次回起動時の割付けプロセッ
サが未設定状態に戻される．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
mig̲tsk
タスクの割付けプロセッサの変更〔TM〕【C言語API】
ER ercd = mig̲tsk(ID tskid, ID prcid)【パラメータ】
ID
ID

tskid
prcid

【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲PAR

対象タスクのID番号
タスクの割付けプロセッサのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，対象タスクが自タスク
でディスパッチ保留状態からの呼出し）
不正ID番号（tskid，prcidが不正）
パラメータエラー（対象タスクはprcidで指定したプロngki̲spec‑120.txt

E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

page 85
セッサに割り付けられない）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない）
オブジェクト状態エラー（対象タスクが自タスクと異なるプロセッサに割り付けられている）【機能】
tskidで指定したタスクの割付けプロセッサを，prcidで指定したプロセッサに変更する．具体的な振舞いは以下の通り．
対象タスクが，自タスクが割り付けられたプロセッサに割り付けられている場
合には，対象タスクをprcidで指定したプロセッサに割り付ける．対象タスクが実行できる状態の場合には，prcidで指定したプロセッサに割り付けられた同じ
優先度のタスクの中で，最も優先順位が低い状態となる．
対象タスクが，自タスクが割付けられたプロセッサと異なるプロセッサに割り付けられている場合には，E̲OBJエラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
ディスパッチ保留状態で，対象タスクを自タスクとしてmig̲tskを呼び出すと，
E̲CTXエラーとなる．
prcidにTPRC̲INI（＝0）を指定すると，対象タスクの割付けプロセッサを，それが属するクラスの初期割付けプロセッサに変更する．
【補足説明】
この仕様では，タスクをマイグレーションさせることができるのは，そのタス
クと同じプロセッサに割り付けられたタスクのみである．そのため，CPUロック
状態やディスパッチ禁止状態を用いて，他のタスクへのディスパッチが起こらないようにすることで，自タスクが他のプロセッサへマイグレーションされるのを防ぐことができる．
対象タスクが，最初からprcidで指定したプロセッサに割り付けられている場合には，割付けプロセッサの変更は起こらないが，優先順位が同一優先度のタスクの中で最低となる．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ext̲tsk
自タスクの終了〔T〕【C言語API】
ER ercd = ext̲tsk()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

エラーコードコンテキストエラー（非タスクコンテキストからの呼出し）ngki̲spec‑120.txt

page 86【機能】
自タスクを終了させる．具体的な振舞いは以下の通り．
自タスクに対してタスク終了時に行うべき処理が行われ，自タスクは休止状態になる．さらに，自タスクの起動要求キューイング数が0でない場合には，自タ
スクに対してタスク起動時に行うべき処理が行われ，自タスクは実行できる状態になる．またこの時，起動要求キューイング数から1が減ぜられる．
ext̲tskは，CPUロック解除状態，割込み優先度マスク全解除状態，ディスパッ
チ許可状態で呼び出すのが原則であるが，そうでない状態で呼び出された場合には，CPUロック解除状態，割込み優先度マスク全解除状態，ディスパッチ許可
状態に遷移させた後，自タスクを終了させる．
ext̲tskが正常に処理された場合，ext̲tskからはリターンしない．
【μITRON4.0仕様との関係】
ext̲tskを非タスクコンテキストから呼び出した場合に，E̲CTXエラーが返ることとした．μITRON4.0仕様においては，ext̲tskからはリターンしないと規定されている．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ter̲tsk
タスクの強制終了〔T〕【C言語API】
ER ercd = ter̲tsk(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲ILUSE
E̲OBJ

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない）
サービスコール不正使用（対象タスクが自タスク）
オブジェクト状態エラー（対象タスクが休止状態，対象
タスクが自タスクと異なるプロセッサに割り付けられて
いる）

【機能】
tskidで指定したタスク（対象タスク）を終了させる．具体的な振舞いは以下の通り．
対象タスクが休止状態でない場合には，対象タスクに対してタスク終了時に行うべき処理が行われ，対象タスクは休止状態になる．さらに，対象タスクの起動要求キューイング数が0でない場合には，対象タスクに対してタスク起動時に行うべき処理が行われ，対象タスクは実行できる状態になる．またこの時，起動要求キューイング数から1が減ぜられる．
対象タスクが休止状態である場合には，E̲OBJエラーとなる．また，対象タスク

ngki̲spec‑120.txt

page 87

が自タスクの場合には，E̲ILUSEエラーとなる．
マルチプロセッサ対応カーネルでは，対象タスクは，自タスクと同じプロセッ
サに割り付けられているタスクに限られる．対象タスクが自タスクと異なるプロセッサに割り付けられている場合には，E̲OBJエラーとなる．
【TOPPERS/FMPカーネルにおける使用上の注意】
現時点のFMPカーネルの実装では，デッドロック回避のためのリトライ処理により，サービスコールの処理時間に上限がないため，注意が必要である（ロック方式にも依存する）．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
chg̲pri
タスク優先度の変更〔T〕【C言語API】
ER ercd = chg̲pri(ID tskid, PRI tskpri)【パラメータ】
ID
PRI

tskid
tskpri【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲ILUSE

E̲OBJ

対象タスクのID番号
ベース優先度

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
パラメータエラー（tskpriが不正）オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない）
サービスコール不正使用（tskpriが，対象タスクがロックしているかロックを待っている優先度上限ミューテッ
クスの上限優先度よりも高い場合）
オブジェクト状態エラー（対象タスクが休止状態）【機能】
tskidで指定したタスク（対象タスク）のベース優先度を，tskpriで指定した優先度に変更する．具体的な振舞いは以下の通り．
対象タスクが休止状態でない場合には，対象タスクのベース優先度が，tskpri
で指定した優先度に変更される．それに伴って，対象タスクの現在優先度も変更される．
対象タスクが，優先度上限ミューテックスをロックしていない場合には，次の処理が行われる．対象タスクが実行できる状態の場合には，同じ優先度のタスクの中で最低優先順位となる．対象タスクが待ち状態で，タスクの優先度順の待ち行列につながれている場合には，対象タスクの変更後の現在優先度に従って，その待ち行列中での順序が変更される．待ち行列中に同じ現在優先度のタスクがある場合には，対象タスクの順序はそれらの中で最後になる．
対象タスクが，優先度上限ミューテックスをロックしている場合には，対象タ
スクの現在優先度が変更されることはなく，優先順位も変更されない．
対象タスクが休止状態である場合には，E̲OBJエラーとなる．

ngki̲spec‑120.txt

page 88

tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．また，
tskpriにTPRI̲INI（＝0）を指定すると，対象タスクのベース優先度が，起動時優先度に変更される．
tskpriは，TPRI̲INIであるか，TMIN̲TPRI以上，TMAX̲TPRI以下でなければならない．また，対象タスクが優先度上限ミューテックスをロックしているかロッ
クを待っている場合，tskpriは，それらのミューテックスの上限優先度と同じかそれより低くなければならない．
【μITRON4.0仕様との関係】
対象タスクが，同じ優先度のタスクの中で最低の優先順位となる（対象タスクが待ち状態で，タスクの優先度順の待ち行列につながれている場合には，同じ優先度のタスクの中での順序が最後になる）条件を変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑get̲pri
タスク優先度の参照〔T〕【C言語API】
ER ercd = get̲pri(ID tskid, PRI *p̲tskpri)【パラメータ】
ID
PRI *

tskid
p̲tskpri【リターンパラメータ】
ER
ercd
PRI
tskpri【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

対象タスクのID番号
現在優先度を入れるメモリ領域へのポインタ

正常終了（E̲OK）またはエラーコード
現在優先度

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する参照操作が許可されていない）
メモリアクセス違反（p̲tskpriが指すメモリ領域への書
込みアクセスが許可されていない）
オブジェクト状態エラー（対象タスクが休止状態）【機能】
tskidで指定したタスク（対象タスク）の現在優先度を参照する．具体的な振舞
いは以下の通り．
対象タスクが休止状態でない場合には，対象タスクの現在優先度が，p̲tskpri
で指定したメモリ領域に返される．対象タスクが休止状態である場合には，
E̲OBJエラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲inf
自タスクの拡張情報の参照〔T〕【C言語API】
ER ercd = get̲inf(intptr̲t *p̲exinf)【パラメータ】
intptr̲t *p̲exinf

拡張情報を入れるメモリ領域へのポインタ

ngki̲spec‑120.txt

page 89【リターンパラメータ】
ER
ercd
intptr̲t
exinf【エラーコード】
E̲CTX
E̲MACV〔P〕

正常終了（E̲OK）またはエラーコード
拡張情報

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
メモリアクセス違反（p̲exinfが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
自タスクの拡張情報を参照する．参照した拡張情報は，p̲exinfで指定したメモ
リ領域に返される．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲tsk
タスクの状態参照〔T〕【C言語API】
ER ercd = ref̲tsk(ID tskid, T̲RTSK *pk̲rtsk)【パラメータ】
ID
T̲RTSK *tskid
pk̲rtsk【リターンパラメータ】
ER
ercd

対象タスクのID番号
タスクの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊タスクの現在状態（パケットの内容）
STAT
tskstat
タスク状態
PRI
tskpri
タスクの現在優先度
PRI
tskbpri
タスクのベース優先度
STAT
tskwait
タスクの待ち要因
IDwobjidタスクの待ち対象のオブジェクトのID
TMO
lefttmo
タスクがタイムアウトするまでの時間
uint̲tactcntタスクの起動要求キューイング数
uint̲twupcntタスクの起床要求キューイング数bool̲ttexmsk
タスクがタスク例外マスク状態か否か（保護機能対応カーネルの場合）
bool̲twaifbdタスクが待ち禁止状態か否か（保護機能対応カー
ネルの場合）
uint̲tsvclevel
タスクの拡張サービスコールのネストレベル（保護機能対応カーネルの場合）
ID
prcid
タスクの割付けプロセッサのID（マルチプロセッ
サ対応カーネルの場合）
ID
actprc
タスクの次回起動時の割付けプロセッサのID（マルチプロセッサ対応カーネルの場合）【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する参照操作が許可されていない）

ngki̲spec‑120.txt
E̲MACV〔P〕

page 90
メモリアクセス違反（pk̲rtskが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
tskidで指定したタスク（対象タスク）の現在状態を参照する．参照した現在状
態は，pk̲rtskで指定したメモリ領域に返される．
tskstatには，対象タスクの現在のタスク状態を表す次のいずれかの値が返される．
TTS̲RUNTTS̲RDYTTS̲WAITTS̲SUSTTS̲WAS
TTS̲DMT

0x01U
0x02U
0x04U
0x08U
0x0cU
0x10U

実行状態
実行可能状態
待ち状態
強制待ち状態
二重待ち状態
休止状態

マルチプロセッサ対応カーネルでは，対象タスクが自タスクの場合にも，
tskstatがTTS̲SUSとなる場合がある．この状況は，自タスクに対してref̲tskを発行するのと同じタイミングで，他のプロセッサで実行されているタスクから同じタスクに対してsus̲tskが発行された場合に発生する可能性がある．
対象タスクが休止状態でない場合には，tskpriには対象タスクの現在優先度が，tskbpriには対象タスクのベース優先度が返される．対象タスクが休止状態である場合には，tskpriとtskbpriの値は保証されない．
対象タスクが待ち状態である場合には，tskwaitには，対象タスクが何を待っている状態であるかを表す次のいずれかの値が返される．
TTW̲SLP
TTW̲DLY
TTW̲SEM
TTW̲FLG
TTW̲SDTQ
TTW̲RDTQ
TTW̲SPDQ
TTW̲RPDQ
TTW̲MTX
TTW̲MBX
TTW̲MPF

0x0001U
0x0002U
0x0004U
0x0008U
0x0010U
0x0020U
0x0100U
0x0200U
0x0080U
0x0040U
0x2000U

起床待ち
時間経過待ちセマフォの資源獲得待ちイベントフラグ待ち
データキューへの送信待ち
データキューからの受信待ち
優先度データキューへの送信待ち
優先度データキューからの受信待ち
ミューテックスのロック待ち状態
メールボックスからの受信待ち
固定長メモリブロックの獲得待ち

対象タスクが待ち状態でない場合には，tskwaitの値は保証されない．
対象タスクが起床待ち状態および時間経過待ち状態以外の待ち状態である場合には，wobjidに，対象タスクが待っているオブジェクトのID番号が返される．
対象タスクが待ち状態でない場合や，起床待ち状態または時間経過待ち状態である場合には，wobjidの値は保証されない．
対象タスクが時間経過待ち状態以外の待ち状態である場合には，lefttmoに，タスクがタイムアウトを起こすまでの相対時間が返される．タスクがタイムアウトを起こさない場合には，TMO̲FEVR（＝‑1）が返される．
対象タスクが時間経過待ち状態である場合には，lefttmoに，タスクの遅延時間が経過して待ち解除されるまでの相対時間が返される．ただし，返されるべき相対時間がTMO型に格納することができない場合がありうる．この場合には，相対時間（RELTIM型，uint̲t型に定義される）をTMO型（int̲t型に定義される）に型キャストした値が返される．

ngki̲spec‑120.txt

page 91

対象タスクが待ち状態でない場合には，lefttmoの値は保証されない．
actcntには，対象タスクの起動要求キューイング数が返される．
対象タスクが休止状態でない場合には，wupcntに，タスクの起床要求キューイ
ング数が返される．対象タスクが休止状態である場合には，wupcntの値は保証されない．
保護機能対応カーネルでは，texmskに，対象タスクがタスク例外マスク状態の場合にtrue，そうでない場合にfalseが返される．waifbdには，対象タスクが待ち禁止状態の場合にtrue，そうでない場合にfalseが返される．またsvclevelには，対象タスクが拡張サービスコールを呼び出していない場合には0，呼び出している場合には，実行中の拡張サービスコールがネスト段数が返される．
マルチプロセッサ対応カーネルでは，prcidに，対象タスクの割付けプロセッサのID番号が返される．
マルチプロセッサ対応カーネルでは，actprcに，対象タスクの次回起動時の割
付けプロセッサのID番号が返される．次回起動時の割付けプロセッサが未設定の場合には，actprcにTPRC̲NONE（＝0）が返される．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【補足説明】
対象タスクが時間経過待ち状態である場合に，lefttmo（TMO型）に返される値をRELTIM型に型キャストすることで，タスクが待ち解除されるまでの相対時間を正しく得ることができる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，tskwaitにTTW̲MTXが返ることはない．ただし，ミューテック
ス機能拡張パッケージを用いると，tskwaitにTTW̲MTXが返る場合がある．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，tskwaitにTTW̲MTXが返ることはない．
【使用上の注意】ref̲tskはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲tskを呼び出し，対象タスクの現在状態を参照した直後に割込みが発生した場合，ref̲tskから戻ってきた時には対象タスクの状態が変化している可能性があるためである．
【μITRON4.0仕様との関係】
対象タスクが時間経過待ち状態の時にlefttmoに返される値について規定した．
また，参照できるタスクの状態から，強制待ち要求ネスト数（suscnt）を除外した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.2 タスク付属同期機能
タスク付属同期機能は，タスクとタスクの間，または非タスクコンテキストの処理とタスクの間で同期を取るために，タスク単独で持っている機能である．

ngki̲spec‑120.txt

page 92

タスク付属同期機能に関連して，各タスクが持つ情報は次の通り．
・起床要求キューイング数
タスクの起床要求キューイング数は，処理されていないタスクの起床要求の数であり，タスクの起動時に0に初期化される．
タスク付属同期機能に関連するカーネル構成マクロは次の通り．
TMAX̲WUPCNT

タスクの起床要求キューイング数の最大値【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，TMAX̲WUPCNTは1に固定されている．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，TMAX̲WUPCNTは1に固定されている．
【μITRON4.0仕様との関係】
この仕様では，強制待ち要求をネストする機能をサポートしないこととした．
言い換えると，強制待ち要求ネスト数の最大値を1に固定する．これに伴い，強制待ち状態から強制再開するサービスコール（frsm̲tsk）とタスクの強制待ち
要求ネスト数の最大値を表すカーネル構成マクロ（TMAX̲SUSCNT）は廃止した．
また，ref̲tskで参照できる情報（T̲RTSKのフィールド）から，強制待ち要求ネ
スト数（suscnt）を除外した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
slp̲tsk
起床待ち〔T〕
tslp̲tsk
起床待ち（タイムアウト付き）〔T〕【C言語API】
ER ercd = slp̲tsk()
ER ercd = tslp̲tsk(TMO tmout)【パラメータ】
TMO

tmout

タイムアウト時間（tslp̲tskの場合）【リターンパラメータ】
ER
ercd

正常終了（E̲OK）またはエラーコード【エラーコード】
E̲CTX
E̲PAR
E̲TMOUTE̲RLWAI

コンテキストエラー（ディスパッチ保留状態からの呼出し）パラメータエラー（tmoutが不正：tslp̲tskの場合）
ポーリング失敗またはタイムアウト（slp̲tskを除く）
待ち禁止状態または待ち状態の強制解除【機能】
自タスクを起床待ちさせる．具体的な振舞いは以下の通り．
自タスクの起床要求キューイング数が0でない場合には，起床要求キューイング
数から1が減ぜられる．起床要求キューイング数が0の場合には，自タスクは起床待ち状態となる．
【補足説明】

ngki̲spec‑120.txt

page 93

自タスクの起床要求キューイング数が0でない場合には，自タスクは実行できる状態を維持し，自タスクの優先順位は変化しない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
wup̲tsk
タスクの起床〔T〕
iwup̲tsk
タスクの起床〔I〕【C言語API】
ER ercd = wup̲tsk(ID tskid)
ER ercd = iwup̲tsk(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ
E̲QOVR

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：wup̲tskの場合，タスクコンテキストからの呼出し：
iwup̲tskの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない：wup̲tskの場合）
オブジェクト状態エラー（対象タスクが休止状態）
キューイングオーバフロー（起床要求キューイング数がTMAX̲WUPCNTに一致）【機能】tskidで指定したタスク（対象タスク）を起床する．具体的な振舞いは以下の通り．
対象タスクが起床待ち状態である場合には，対象タスクが待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象タスクが起床待ち状態でなく，休止状態でもない場合には，対象タスクの起床要求キューイング数に1が加えられる．起床要求キューイング数に1を加えるとTMAX̲WUPCNTを超える場合には，E̲QOVRエラーとなる．
対象タスクが休止状態である場合には，E̲OBJエラーとなる．
wup̲tskにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
can̲wup
タスク起床要求のキャンセル〔T〕【C言語API】
ER̲UINT wupcnt = can̲wup(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER̲UINT
wupcnt【エラーコード】

対象タスクのID番号

キューイングされていた起床要求の数（正の値または0）またはエラーコード

ngki̲spec‑120.txt
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

page 94
コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない）
オブジェクト状態エラー（対象タスクが休止状態）【機能】
tskidで指定したタスク（対象タスク）に対する処理されていない起床要求をす
べてキャンセルし，キャンセルした起床要求の数を返す．具体的な振舞いは以下の通り．
対象タスクが休止状態でない場合には，対象タスクの起床要求キューイング数が0に設定され，0に設定する前の起床要求キューイング数が，サービスコールの返値として返される．
対象タスクが休止状態である場合には，E̲OBJエラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rel̲wai
強制的な待ち解除〔T〕
irel̲wai
強制的な待ち解除〔I〕【C言語API】
ER ercd = rel̲wai(ID tskid)
ER ercd = irel̲wai(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：rel̲waiの場合，タスクコンテキストからの呼出し：
irel̲waiの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない：rel̲waiの場合）
オブジェクト状態エラー（対象タスクが待ち状態でない）【機能】
tskidで指定したタスク（対象タスク）を，強制的に待ち解除する．具体的な振舞いは以下の通り．
対象タスクが待ち状態である場合には，対象タスクが待ち解除される．待ち解
除されたタスクには，待ち状態となったサービスコールからE̲RLWAIが返る．
対象タスクが待ち状態でない場合には，E̲OBJエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sus̲tsk
強制待ち状態への遷移〔T〕【C言語API】

ngki̲spec‑120.txt

page 95

ER ercd = sus̲tsk(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ
E̲QOVR

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，対象タスクが自タスク
でディスパッチ保留状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない）
オブジェクト状態エラー（対象タスクが休止状態）
キューイングオーバフロー（対象タスクが強制待ち状態）【機能】
tskidで指定したタスク（対象タスク）を強制待ちにする．具体的な振舞いは以下の通り．
対象タスクが実行できる状態である場合には，対象タスクは強制待ち状態となる．また，待ち状態（二重待ち状態を除く）である場合には，二重待ち状態となる．
対象タスクが強制待ち状態または二重待ち状態である場合はE̲QOVRエラー，休止状態である場合にはE̲OBJエラーとなる．
マルチプロセッサ対応カーネルでは，対象タスクが自タスクの場合にも，
E̲QOVRエラーとなる場合がある．この状況は，自タスクに対してsus̲tskを発行するのと同じタイミングで，他のプロセッサで実行されているタスクから同じタスクに対してsus̲tskが発行された場合に発生する可能性がある．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
ディスパッチ保留状態で，対象タスクを自タスクとしてsus̲tskを呼び出すと，
E̲CTXエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rsm̲tsk
強制待ち状態からの再開〔T〕【C言語API】
ER ercd = rsm̲tsk(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操ngki̲spec‑120.txt

E̲OBJ

page 96
作2が許可されていない）
オブジェクト状態エラー（対象タスクが強制待ち状態で
ない）

【機能】
tskidで指定したタスク（対象タスク）を，強制待ちから再開する．具体的な振舞いは以下の通り．
対象タスクが強制待ち状態である場合には，対象タスクは強制待ちから再開される．強制待ち状態でない場合には，E̲OBJエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
dis̲wai
待ち禁止状態への遷移〔TP〕
idis̲wai
待ち禁止状態への遷移〔IP〕【C言語API】
ER ercd = dis̲wai(ID tskid)
ER ercd = idis̲wai(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ
E̲QOVR

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：dis̲waiの場合，タスクコンテキストからの呼出し：
idis̲waiの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない：dis̲waiの場合）
オブジェクト状態エラー（対象タスクが休止状態，対象
タスクがタスク例外処理マスク状態でない）
キューイングオーバフロー（対象タスクが待ち禁止状態）【機能】
tskidで指定したタスク（対象タスク）を待ち禁止状態にする．具体的な振舞いは以下の通り．
対象タスクがタスク例外処理マスク状態であり，待ち禁止状態でない場合には，対象タスクは待ち禁止状態になる．
対象タスクが休止状態である場合には，E̲OBJエラーとなる．また，対象タスク
がタスク例外処理マスク状態でない場合にはE̲OBJエラー，待ち禁止状態の場合にはE̲QOVRエラーとなる．
dis̲waiにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，dis̲waiをサポートしない．
【TOPPERS/FMPカーネルにおける規定】

ngki̲spec‑120.txt

page 97

FMPカーネルでは，dis̲waiをサポートしない．
【補足説明】
dis̲waiは，対象タスクの待ち解除は行わない．対象タスクを待ち禁止状態にすることに加えて待ち解除したい場合には，dis̲waiを呼び出した後に，rel̲wai
を呼び出せばよい．
【未決定事項】
マルチプロセッサ対応カーネルでは，対象タスクを，自タスクと同じプロセッ
サに割り付けられているタスクに限るなどの制限を導入する可能性があるが，現時点では未決定である．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ena̲wai
待ち禁止状態の解除〔TP〕
iena̲wai
待ち禁止状態の解除〔IP〕【C言語API】
ER ercd = ena̲wai(ID tskid)
ER ercd = iena̲wai(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：ena̲waiの場合，タスクコンテキストからの呼出し：
iena̲waiの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない：ena̲waiの場合）
オブジェクト状態エラー（対象タスクが待ち禁止状態で
ない）

【機能】
tskidで指定したタスク（対象タスク）の待ち禁止状態を解除する．具体的な振舞いは以下の通り．
対象タスクが待ち禁止状態である場合には，待ち禁止状態は解除される．対象
タスクが待ち禁止状態でない場合には，E̲OBJエラーとなる．
ena̲waiにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ena̲waiをサポートしない．
【TOPPERS/FMPカーネルにおける規定】

ngki̲spec‑120.txt

page 98

FMPカーネルでは，ena̲waiをサポートしない．
【未決定事項】
マルチプロセッサ対応カーネルでは，対象タスクを，自タスクと同じプロセッ
サに割り付けられているタスクに限るなどの制限を導入する可能性があるが，現時点では未決定である．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
dly̲tsk
自タスクの遅延〔T〕【C言語API】
ER ercd = dly̲tsk(RELTIM dlytim)【パラメータ】
RELTIM

dlytim【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲PAR
E̲RLWAI

遅延時間

正常終了（E̲OK）またはエラーコード

コンテキストエラー（ディスパッチ保留状態からの呼出し）
パラメータエラー（dlytimが不正）待ち禁止状態または待ち状態の強制解除【機能】
dlytimで指定した時間，自タスクを遅延させる．具体的な振舞いは以下の通り．
自タスクは，dlytimで指定した時間が経過するまでの間，時間経過待ち状態となる．dly̲tskを呼び出してからdlytimで指定した相対時間後に，自タスクは待ち解除され，dly̲tskからE̲OKが返る．
dlytimは，TMAX̲RELTIM以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.3 タスク例外処理機能
タスク例外処理ルーチンは，カーネルが実行を制御する処理単位で，タスクと同一のコンテキスト内で実行される．タスク例外処理ルーチンは，各タスクに1つのみ登録できるため，タスクIDによって識別する．
タスク例外処理機能に関連して，各タスクが持つ情報は次の通り．
・タスク例外処理ルーチン属性
・タスク例外処理禁止フラグ
・保留例外要因
・タスク例外処理ルーチンの先頭番地
タスク例外処理ルーチン属性に指定できる属性はない．そのため，タスク例外
処理ルーチン属性には，TA̲NULLを指定しなければならない．
タスクは，タスク例外処理ルーチンの実行を保留するためのタスク例外処理禁ngki̲spec‑120.txt

page 99

止フラグを持つ．タスク例外処理禁止フラグがセットされた状態をタスク例外
処理禁止状態，クリアされた状態をタスク例外処理許可状態と呼ぶ．タスク例
外処理禁止フラグは，タスクの起動時に，セットした状態に初期化される．
タスクの保留例外要因は，タスクに対して要求された例外要因を蓄積するためのビットマップであり，タスクの起動時に0に初期化される．
タスク例外処理ルーチンは，「タスク例外処理許可状態である」「保留例外要因が0でない」「タスクが実行状態である」「タスクコンテキストが実行されている」の4つの条件が揃った場合に実行が開始される．さらに，保護機能対応カー
ネルにおいては，「タスク例外処理マスク状態でない」「CPUロック状態でない」の2つの条件が追加される．タスク例外処理マスク状態については，「2.6.5 タ
スク例外処理マスク状態と待ち禁止状態」の節を参照すること．
タスク例外処理ルーチンの実行が開始される時，タスク例外処理禁止フラグはセットされ，保留例外要因は0にクリアされる．
保護機能対応カーネルでは，ユーザタスクのタスク例外処理ルーチンの実行開始時に，リターン先の番地やシステム状態等が，ユーザスタック上に保存される．ここで，ユーザスタック領域に十分な空きがない場合や，ユーザスタック
ポインタがユーザスタック領域以外を指している場合，カーネルは，エミュレー
トされたCPU例外を発生させる．これを，タスク例外実行開始時スタック不正例
外と呼ぶ．
逆に，タスク例外処理ルーチンからのリターン時には，リターン先の番地やシステム状態等が，ユーザスタック上から取り出される．ここで，ユーザスタッ
ク領域に積まれている情報が足りない場合や，ユーザスタックポインタがユー
ザスタック領域以外を指している場合，カーネルは，エミュレートされたCPU例
外を発生させる．これを，タスク例外リターン時スタック不正例外と呼ぶ．
タスク例外実行開始時スタック不正例外またはタスク例外リターン時スタック
不正例外を起こしたタスクの実行を継続した場合の動作は保証されないため，
アプリケーションは，これらのCPU例外を処理するCPU例外ハンドラで，「2.8.1 CPU例外処理の流れ」の節の(b)または(d)の方法でリカバリ処理を行う必要がある．
保護機能対応カーネルにおいて，タスク例外処理ルーチンは，タスクと同じ保護ドメインに属する．
タスク例外処理機能に用いるデータ型は次の通り．
TEXPTN

タスク例外要因のビットパターン（符号無し整数，uint̲tに
定義）

C言語によるタスク例外処理ルーチンの記述形式は次の通り．
void task̲exception̲routine(TEXPTN texptn, intptr̲t exinf){
タスク例外処理ルーチン本体}
texptnにはタスク例外処理ルーチン起動時の保留例外要因が，exinfにはタスクの拡張情報が，それぞれ渡される．
タスク例外処理機能に関連するカーネル構成マクロは次の通り．
TBIT̲TEXPTN

タスク例外要因のビット数（TEXPTNの有効ビット数）

ngki̲spec‑120.txt

page 100【補足説明】
タスク例外処理ルーチンの実行開始条件の内，「CPUロック状態でない」が保護機能対応カーネルのみに適用されるものとしているのは，保護機能対応でない
カーネルでは，CPUロック状態で他の条件が揃うことはないためである．保護機
能対応カーネルでは，CPUロック状態で拡張サービスコールからリターンした場
合（より厳密には，タスク例外処理マスク状態が解除された場合）に，CPUロッ
ク状態で他の条件が揃うことになる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，タスク例外要因のビット数（TBIT̲TEXPTN）は16以上である．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，タスク例外要因のビット数（TBIT̲TEXPTN）は16以上である．
【μITRON4.0/PX仕様との関係】
ユーザタスクのタスク例外処理ルーチンの実行開始時とリターン時にユーザス
タックが不正となる問題に関して，μITRON4.0/PX仕様では考慮されていない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
DEF̲TEX
タスク例外処理ルーチンの定義〔S〕
def̲tex
タスク例外処理ルーチンの定義〔TD〕【静的API】
DEF̲TEX(ID tskid, { ATR texatr, TEXRTN texrtn })【C言語API】
ER ercd = def̲tex(ID tskid, const T̲DTEX *pk̲dtex)【パラメータ】
ID
T̲DTEX *tskid
pk̲dtex

対象タスクのID番号
タスク例外処理ルーチンの定義情報を入れたパケットへのポインタ（静的APIを除く）＊タスク例外処理ルーチンの定義情報（パケットの内容）
ATR
texatr
タスク例外処理ルーチン属性
TEXRTN
texrtn
タスク例外処理ルーチンの先頭番地【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲PAR
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）予約属性（texatrが不正または使用できない，属する保護ドメインかクラスが不正）オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する管理操作が許可されていない）
メモリアクセス違反（pk̲dtexが指すメモリ領域への読出しアクセスが許可されていない）
パラメータエラー（texrtnが不正）オブジェクト状態エラー（タスク例外処理ルーチンを定義済みのタスクに対する定義，タスク例外処理ルーチン
を未定義のタスクに対する解除，対象タスクは静的APIでngki̲spec‑120.txt

page 101
生成された）【機能】
tskidで指定したタスク（対象タスク）に対して，各パラメータで指定したタス
ク例外処理ルーチン定義情報に従って，タスク例外処理ルーチンを定義する．
ただし，def̲texにおいてpk̲dtexをNULLにした場合には，対象タスクに対する
タスク例外処理ルーチンの定義を解除する．
静的APIにおいては，tskidはオブジェクト識別名，texatrは整数定数式パラメー
タ，texrtnは一般定数式パラメータである．
静的APIによって生成したタスクに対しては，タスク例外処理ルーチンの登録はDEF̲TEXによって行わねばならず，def̲texによってタスク例外処理ルーチンを登録／登録解除することはできない．def̲texにおいて，対象タスクが静的APIで生成したタスクである場合には，E̲OBJエラーとなる．
タスク例外処理ルーチンを定義する場合（DEF̲TEXの場合およびdef̲texにおいてpk̲dtexをNULL以外にした場合）で，対象タスクに対してすでにタスク例外処
理ルーチンが定義されている場合には，E̲OBJエラーとなる．
保護機能対応カーネルにおいて，DEF̲TEXは，対象タスクが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，def̲texでタスク例外処理ルーチンを定義する場合には，タスク例
外処理ルーチンの属する保護ドメインを設定する必要はなく，タスク例外処理
ルーチン属性にTA̲DOM(domid)を指定した場合にはE̲RSATRエラーとなる．ただし，TA̲DOM(TDOM̲SELF)を指定した場合には，指定が無視され，E̲RSATRエラーは検出されない．
タスク例外処理ルーチンの定義を解除する場合（def̲texにおいてpk̲dtexを
NULLにした場合）で，対象タスクに対してタスク例外処理ルーチンが定義されていない場合には，E̲OBJエラーとなる．
def̲texにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，DEF̲TEXのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，DEF̲TEXのみをサポートする．
【μITRON4.0仕様との関係】
texrtnのデータ型をTEXRTNに変更した．
def̲texによって，定義済みのタスク例外処理ルーチンを再定義しようとした場
合に，E̲OBJエラーとすることにした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ras̲tex
タスク例外処理の要求〔T〕
iras̲tex
タスク例外処理の要求〔I〕【C言語API】
ER ercd = ras̲tex(ID tskid, TEXPTN rasptn)
ER ercd = iras̲tex(ID tskid, TEXPTN rasptn)

ngki̲spec‑120.txt【パラメータ】
ID
TEXPTN

page 102

tskid
rasptn【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲PAR
E̲OBJ

対象タスクのID番号要求するタスク例外処理のタスク例外要因

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：ras̲texの場合，タスクコンテキストからの呼出し：
iras̲texの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない：ras̲texの場合）
パラメータエラー（rasptnが不正）オブジェクト状態エラー（対象タスクが休止状態，対象
タスクに対してタスク例外処理ルーチンが定義されてい
ない）

【機能】
tskidで指定したタスク（対象タスク）に対して，rasptnで指定したタスク例外
要因のタスク例外処理を要求する．対象タスクの保留例外要因が，それまでの値とrasptnで指定した値のビット毎論理和（C言語の"￨"）に更新される．
対象タスクが休止状態である場合と，対象タスクに対してタスク例外処理ルーチンが定義されていない場合には，E̲OBJエラーとなる．
ras̲texにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
rasptnが0の場合には，E̲PARエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
dis̲tex
タスク例外処理の禁止〔T〕【C言語API】
ER ercd = dis̲tex()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクト状態エラー（自タスクに対してタスク例外
処理ルーチンが定義されていない）【機能】
自タスクのタスク例外処理禁止フラグをセットする．すなわち，自タスクをタ
スク例外処理禁止状態に遷移させる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ena̲tex
タスク例外処理の許可〔T〕

ngki̲spec‑120.txt

page 103【C言語API】
ER ercd = ena̲tex()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクト状態エラー（自タスクに対してタスク例外
処理ルーチンが定義されていない）【機能】
自タスクのタスク例外処理禁止フラグをクリアする．すなわち，自タスクをタ
スク例外処理許可状態に遷移させる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sns̲tex
タスク例外処理禁止状態の参照〔TI〕【C言語API】
bool̲t state = sns̲tex()【パラメータ】
なし【リターンパラメータ】
bool̲tstate

タスク例外処理禁止状態【機能】
実行状態のタスクのタスク例外処理禁止フラグを参照する．具体的な振舞いは
以下の通り．
実行状態のタスクが，タスク例外処理禁止状態の場合にtrue，タスク例外処理
許可状態の場合にfalseが返る．sns̲texを非タスクコンテキストから呼び出した場合で，実行状態のタスクがない場合には，trueが返る．
マルチプロセッサ対応カーネルにおいては，サービスコールを呼び出した処理
単位を実行しているプロセッサにおいて実行状態のタスクのタスク例外処理禁止フラグを参照する．
【補足説明】
sns̲texをタスクコンテキストから呼び出した場合，実行状態のタスクは自タス
クに一致する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲tex
タスク例外処理の状態参照〔T〕【C言語API】
ER ercd = ref̲tex(ID tskid, T̲RTEX *pk̲rtex)【パラメータ】
ID
T̲RTEX *tskid
pk̲rtex

対象タスクのID番号
タスク例外処理の現在状態を入れるパケットへのポインタ

ngki̲spec‑120.txt

page 104【リターンパラメータ】
ER
ercd

正常終了（E̲OK）またはエラーコード＊タスク例外処理の現在状態（パケットの内容）
STAT
texstat
タスク例外処理の状態
TEXPTN
pndptn
タスクの保留例外要因【エラーコード】
E̲CTX

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する参照操作が許可されていない）
メモリアクセス違反（pk̲rtexが指すメモリ領域への書込
みアクセスが許可されていない）
オブジェクト状態エラー（対象タスクが休止状態，対象
タスクに対してタスク例外処理ルーチンが定義されてい
ない）

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

【機能】
tskidで指定したタスク（対象タスク）のタスク例外処理に関する現在状態を参照する．参照した現在状態は，pk̲rtexで指定したパケットに返される．
texstatには，対象タスクの現在のタスク例外処理禁止フラグを表す次のいずれかの値が返される．
TTEX̲ENA
TTEX̲DIS

0x01U
0x02U

タスク例外処理許可状態
タスク例外処理禁止状態

pndptnには，対象タスクの現在の保留例外要因が返される．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4 同期・通信機能【μITRON4.0仕様との関係】
この仕様では，ランデブ機能はサポートしていない．今後の検討により，ランデブ機能をサポートすることに変更する可能性もある．
4.4.1 セマフォ
セマフォは，資源の数を表す0以上の整数値を取るカウンタ（資源数）を介して，排他制御やイベント通知を行うための同期・通信オブジェクトである．セマフォの資源数から1を減ずることを資源の獲得，資源数に1を加えることを資源の返却と呼ぶ．セマフォは，セマフォIDと呼ぶID番号によって識別する．
各セマフォが持つ情報は次の通り．
・セマフォ属性
・資源数（の現在値）
・待ち行列（セマフォの資源獲得待ち状態のタスクのキュー）
・初期資源数・最大資源数ngki̲spec‑120.txt

page 105

・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
待ち行列は，セマフォの資源が獲得できるまで待っている状態（セマフォの資源獲得待ち状態）のタスクが，資源を獲得できる順序でつながれているキューである．
セマフォの初期資源数は，セマフォを生成または再初期化した際の，資源数の初期値である．また，セマフォの最大資源数は，資源数が取りうる最大値である．資源数が最大資源数に一致している時に資源を返却しようとすると，
E̲QOVRエラーとなる．
セマフォ属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

待ち行列をタスクの優先度順にする

TA̲TPRIを指定しない場合，待ち行列はFIFO順になる．
セマフォ機能に関連するカーネル構成マクロは次の通り．
TMAX̲MAXSEM

セマフォの最大資源数の最大値（＝UINT̲MAX）

TNUM̲SEMID

登録できるセマフォの数（動的生成対応でないカーネル
では，静的APIによって登録されたセマフォの数に一致）【μITRON4.0仕様との関係】
TNUM̲SEMIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲SEM
セマフォの生成〔S〕
acre̲sem
セマフォの生成〔TD〕【静的API】
CRE̲SEM(ID semid, { ATR sematr, uint̲t isemcnt, uint̲t maxsem })【C言語API】
ER̲ID semid = acre̲sem(const T̲CSEM *pk̲csem)【パラメータ】
ID
T̲CSEM *semidpk̲csem

生成するセマフォのID番号（CRE̲SEMの場合）
セマフォの生成情報を入れたパケットへのポイ
ンタ（静的APIを除く）＊セマフォの生成情報（パケットの内容）
ATR
sematrセマフォ属性uint̲tisemcnt
セマフォの初期資源数
uint̲tmaxsemセマフォの最大資源数【リターンパラメータ】
ER̲ID
semid

【エラーコード】
E̲CTX〔s〕
E̲RSATR

生成されたセマフォのID番号（正の値）またはエラーコードコンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（sematrが不正または使用できない，属する保護ドメインかクラスが不正）ngki̲spec‑120.txt
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲OBJ

page 106
パラメータエラー（isemcnt，maxsemが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲csemが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるセマフォIDがない）
オブジェクト状態エラー（semidで指定したセマフォが登
録済み：CRE̲SEMの場合）【機能】各パラメータで指定したセマフォ生成情報に従って，セマフォを生成する．生成されたセマフォの資源数は初期資源数に，待ち行列は空の状態に初期化される．
静的APIにおいては，semidはオブジェクト識別名，isemcntとmaxsemは整数定数
式パラメータである．
isemcntは，0以上で，maxsem以下でなければならない．また，maxsemは，1以上で，TMAX̲MAXSEM以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲SEMのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲SEMのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
AID̲SEM
割付け可能なセマフォIDの数の指定〔SD〕【静的API】
AID̲SEM(uint̲t nosem)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nosem

割付け可能なセマフォIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nosemで指定した数のセマフォIDを，セマフォを生成するサービスコールによって割付け可能なセマフォIDとして確保する．
nosemは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲SEM
セマフォのアクセス許可ベクタの設定〔SP〕
sac̲sem
セマフォのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲SEM(ID semid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲sem(ID semid, const ACVCT *p̲acvct)【パラメータ】

ngki̲spec‑120.txt
ID
ACVCT *

page 107semidp̲acvct

対象セマフォのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（semidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲SEMの場合）
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象セマフォは静的APIで生成された：sac̲semの場合，対象セマフォに対してアクセス
許可ベクタが設定済み：SAC̲SEMの場合）【機能】
semidで指定したセマフォ（対象セマフォ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，semidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲SEMは，対象セマフォが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲SEM，sac̲semをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲SEM，sac̲semをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲sem
セマフォの削除〔TD〕【C言語API】
ER ercd = del̲sem(ID semid)【パラメータ】
ID

semid【リターンパラメータ】
ER
ercd

対象セマフォのID番号正常終了（E̲OK）またはエラーコード

ngki̲spec‑120.txt【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

page 108

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（semidが不正）
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する管理操作が許可されていない）
オブジェクト状態エラー（対象セマフォは静的APIで生成
された）

【機能】
semidで指定したセマフォ（対象セマフォ）を削除する．具体的な振舞いは以下の通り．
対象セマフォの登録が解除され，そのセマフォIDが未使用の状態に戻される．
また，対象セマフォの待ち行列につながれたタスクは，待ち行列の先頭のタス
クから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサー
ビスコールからE̲DLTエラーが返る．
【使用上の注意】del̲semにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲semをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲semをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sig̲sem
セマフォの資源の返却〔T〕
isig̲sem
セマフォの資源の返却〔I〕【C言語API】
ER ercd = sig̲sem(ID semid)
ER ercd = isig̲sem(ID semid)【パラメータ】
ID

semid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲QOVR

対象セマフォのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：sig̲semの場合，タスクコンテキストからの呼出し：
isig̲semの場合，CPUロック状態からの呼出し）
不正ID番号（semidが不正）
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する通常
操作1が許可されていない：sig̲semの場合）
キューイングオーバフロー（資源数が最大資源数に一致）ngki̲spec‑120.txt

page 109【機能】
semidで指定したセマフォ（対象セマフォ）に資源を返却する．具体的な振舞いは以下の通り．
対象セマフォの待ち行列にタスクが存在する場合には，待ち行列の先頭のタス
クが待ち解除される．この時，待ち解除されたタスクが資源を獲得したことになるため，対象セマフォの資源数は変化しない．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
待ち行列にタスクが存在しない場合には，対象セマフォの資源数に1が加えられる．資源数に1を加えるとそのセマフォの最大資源数を越える場合には，E̲QOVR
エラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
wai̲sem
セマフォの資源の獲得〔T〕
pol̲sem
セマフォの資源の獲得（ポーリング）〔T〕
twai̲sem
セマフォの資源の獲得（タイムアウト付き）〔T〕【C言語API】
ER ercd = wai̲sem(ID semid)
ER ercd = pol̲sem(ID semid)
ER ercd = twai̲sem(ID semid, TMO tmout)【パラメータ】
ID
TMO

semid
tmout

対象セマフォのID番号
タイムアウト時間（twai̲semの場合）【リターンパラメータ】
ER
ercd

正常終了（E̲OK）またはエラーコード【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲TMOUTE̲RLWAI
E̲DLT

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：pol̲semを除く）
不正ID番号（semidが不正）
パラメータエラー（tmoutが不正：twai̲semの場合）
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する通常
操作2が許可されていない）
ポーリング失敗またはタイムアウト（wai̲semを除く）
待ち禁止状態または待ち状態の強制解除（pol̲semを除く）
待ちオブジェクトの削除または再初期化（pol̲semを除く）【機能】
semidで指定したセマフォ（対象セマフォ）から資源を獲得する．具体的な振舞
いは以下の通り．
対象セマフォの資源数が1以上の場合には，資源数から1が減ぜられる．資源数が0の場合には，自タスクはセマフォの資源獲得待ち状態となり，対象セマフォの待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲sem
セマフォの再初期化〔T〕【C言語API】
ER ercd = ini̲sem(ID semid)【パラメータ】

ngki̲spec‑120.txt
IDpage 110semid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象セマフォのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（semidが不正）
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する管理操作が許可されていない）【機能】
semidで指定したセマフォ（対象セマフォ）を再初期化する．具体的な振舞いは
以下の通り．
対象セマフォの資源数は，初期資源数に初期化される．また，対象セマフォの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールから
E̲DLTエラーが返る．
【使用上の注意】ini̲semにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
セマフォを再初期化した場合に，アプリケーションとの整合性を保つのは，ア
プリケーションの責任である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲sem
セマフォの状態参照〔T〕【C言語API】
ER ercd = ref̲sem(ID semid, T̲RSEM *pk̲rsem)【パラメータ】
ID
T̲RSEM *semidpk̲rsem【リターンパラメータ】
ER
ercd

対象セマフォのID番号
セマフォの現在状態を入れるパケットへのポイ
ンタ

正常終了（E̲OK）またはエラーコード＊セマフォの現在状態（パケットの内容）
ID
wtskidセマフォの待ち行列の先頭のタスクのID番号uint̲tsemcntセマフォの資源数【エラーコード】
E̲CTX
E̲ID

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（semidが不正）ngki̲spec‑120.txt
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

page 111
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する参照
操作が許可されていない）
メモリアクセス違反（pk̲rsemが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
semidで指定したセマフォ（対象セマフォ）の現在状態を参照する．参照した現在状態は，pk̲rsemで指定したパケットに返される．
対象セマフォの待ち行列にタスクが存在しない場合，wtskidにはTSK̲NONE（＝0）が返る．
【使用上の注意】ref̲semはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲semを呼び出し，対象セマフォの現在状態を参照した直後に割込みが発生した場合，ref̲semから戻ってきた時には対象セマフォの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.2 イベントフラグ
イベントフラグは，イベントの発生の有無を表すビットの集合（ビットパター
ン）を介して，イベント通知を行うための同期・通信オブジェクトである．イ
ベントが発生している状態を1，発生していない状態を0とし，ビットパターン
により複数のイベントの発生の有無を表す．イベントフラグは，イベントフラ
グIDと呼ぶID番号によって識別する．
1つまたは複数のビットをセットする1にする（セットする）ことを，イベント
フラグをセットするといい，0にする（クリアする）ことを，イベントフラグをクリアするという．イベントフラグによりイベントを通知する側のタスクは，
イベントフラグをセットまたはクリアすることで，イベントの発生を通知する．
イベントフラグによりイベントの通知を受ける側のタスクは，待ちビットパター
ンと待ちモードにより，どのビットがセットされるのを待つかを指定する．待ちモードにTWF̲ORW（＝0x01U）を指定した場合，待ちビットパターンに含まれるいずれかのビットがセットされるのを待つ．待ちモードにTWF̲ANDW（＝0x02U）を指定した場合，待ちビットパターンに含まれるすべてのビットがセットされるのを待つ．この条件を，イベントフラグの待ち解除の条件と呼ぶ．
各イベントフラグが持つ情報は次の通り．
・イベントフラグ属性
・ビットパターン（の現在値）
・待ち行列（イベントフラグ待ち状態のタスクのキュー）・初期ビットパターン
・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
待ち行列は，イベントフラグが指定した待ち解除の条件を満たすまで待っている状態（イベントフラグ待ち状態）のタスクがつながれているキューである．
待ち行列につながれたタスクの待ち解除は，待ち解除の条件を満たした中で，待ち行列の前方につながれたものから順に行われる（「2.6.4 待ち行列と待ち解除の順序」の節の(a)に該当）．

ngki̲spec‑120.txt

page 112

イベントフラグの初期ビットパターンは，イベントフラグを生成または再初期化した際の，ビットパターンの初期値である．
イベントフラグ属性には，次の属性を指定することができる．
TA̲TPRITA̲WMULTA̲CLR

0x01U
0x02U
0x04U

待ち行列をタスクの優先度順にする
複数のタスクが待つのを許す
タスクの待ち解除時にイベントフラグをクリアする

TA̲TPRIを指定しない場合，待ち行列はFIFO順になる．TA̲WMULを指定しない場
合，1つのイベントフラグに複数のタスクが待つことを禁止する．
TA̲CLRを指定した場合，タスクの待ち解除時に，イベントフラグのビットパター
ンを0にクリアする．TA̲CLRを指定しない場合，タスクの待ち解除時にイベント
フラグをクリアしない．
イベントフラグ機能に用いるデータ型は次の通り．
FLGPTN

イベントフラグのビットパターン（符号無し整数，uint̲tに
定義）

イベントフラグ機能に関連するカーネル構成マクロは次の通り．
TBIT̲FLGPTN

イベントフラグのビット数（FLGPTNの有効ビット数）

TNUM̲FLGID

登録できるイベントフラグの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたイベントフラグの数に一致）【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，イベントフラグのビット数（TBIT̲FLGPTN）は16以上である．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，イベントフラグのビット数（TBIT̲FLGPTN）は16以上である．
【μITRON4.0仕様との関係】
TNUM̲FLGIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲FLG
イベントフラグの生成〔S〕
acre̲flg
イベントフラグの生成〔TD〕【静的API】
CRE̲FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })【C言語API】
ER̲ID flgid = acre̲flg(const T̲CFLG *pk̲cflg)【パラメータ】
ID

flgid

T̲CFLG *pk̲cflg

生成するイベントフラグのID番号（CRE̲FLGの場合）
イベントフラグの生成情報を入れたパケットへのポインタ（静的APIを除く）＊イベントフラグの生成情報（パケットの内容）
ATR
flgatr
イベントフラグ属性

ngki̲spec‑120.txt
FLGPTN

page 113

iflgptn【リターンパラメータ】
ER̲ID
flgid

【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲OBJ

イベントフラグの初期ビットパターン生成されたイベントフラグのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（flgatrが不正または使用できない，属する保護ドメインかクラスが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cflgが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるイベントフラグIDがない）
オブジェクト状態エラー（flgidで指定したイベントフラ
グが登録済み：CRE̲FLGの場合）【機能】各パラメータで指定したイベントフラグ生成情報に従って，イベントフラグを生成する．生成されたイベントフラグのビットパターンは初期ビットパターンに，待ち行列は空の状態に初期化される．
静的APIにおいては，flgidはオブジェクト識別名，iflgptnは整数定数式パラメー
タである．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲FLGのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲FLGのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
AID̲FLG
割付け可能なイベントフラグIDの数の指定〔SD〕【静的API】
AID̲FLG(uint̲t noflg)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

noflg

割付け可能なイベントフラグIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
noflgで指定した数のイベントフラグIDを，イベントフラグを生成するサービス
コールによって割付け可能なイベントフラグIDとして確保する．
noflgは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
SAC̲FLG
イベントフラグのアクセス許可ベクタの設定〔SP〕
sac̲flg
イベントフラグのアクセス許可ベクタの設定〔TPD〕【静的API】

ngki̲spec‑120.txt

page 114

SAC̲FLG(ID flgid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲flg(ID flgid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

flgidp̲acvct

対象イベントフラグのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲FLGの場合）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象イベントフラグは静的APIで生成された：sac̲flgの場合，対象イベントフラグに対してアクセス許可ベクタが設定済み：SAC̲FLGの場合）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，flgidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲FLGは，対象イベントフラグが属する保護ドメインの囲みの中に記述しなけ
ればならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲FLG，sac̲flgをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲FLG，sac̲flgをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
del̲flg
イベントフラグの削除〔TD〕【C言語API】
ER ercd = del̲flg(ID flgid)ngki̲spec‑120.txt【パラメータ】
ID

page 115

flgid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象イベントフラグのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する管理操作が許可されていない）
オブジェクト状態エラー（対象イベントフラグは静的APIで生成された）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）を削除する．具体的な振舞いは以下の通り．
対象イベントフラグの登録が解除され，そのイベントフラグIDが未使用の状態に戻される．また，対象イベントフラグの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
【使用上の注意】del̲flgにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲flgをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲flgをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
set̲flg
イベントフラグのセット〔T〕
iset̲flg
イベントフラグのセット〔I〕【C言語API】
ER ercd = set̲flg(ID flgid, FLGPTN setptn)
ER ercd = iset̲flg(ID flgid, FLGPTN setptn)【パラメータ】
ID
FLGPTN

flgid
setptn【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

対象イベントフラグのID番号セットするビットパターン

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出ngki̲spec‑120.txt

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

page 116
し：set̲flgの場合，タスクコンテキストからの呼出し：iset̲flgの場合，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する通常操作1が許可されていない：set̲flgの場合）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）のsetptnで指定したビットをセットする．具体的な振舞いは以下の通り．
対象イベントフラグのビットパターンは，それまでの値とsetptnで指定した値のビット毎論理和（C言語の"￨"）に更新される．対象イベントフラグの待ち行
列にタスクが存在する場合には，待ち解除の条件を満たしたタスクが，待ち行列の前方につながれたものから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
ただし，対象イベントフラグがTA̲CLR属性である場合には，待ち解除の条件を満たしたタスクを1つ待ち解除した時点で，対象イベントフラグのビットパター
ンが0にクリアされるため，他のタスクが待ち解除されることはない．
【使用上の注意】
対象イベントフラグが，TA̲WMUL属性であり，TA̲CLR属性でない場合，set̲flg
またはiset̲flgにより複数のタスクが待ち解除される場合がある．この場合，
サービスコールの処理時間およびカーネル内での割込み禁止時間が，待ち解除
されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される
場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
clr̲flg
イベントフラグのクリア〔T〕【C言語API】
ER ercd = clr̲flg(ID flgid, FLGPTN clrptn)【パラメータ】
ID
FLGPTN

flgid
clrptn【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象イベントフラグのID番号クリアするビットパターン（クリアしないビッ
トを1，クリアするビットを0とする）

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する通常操作1が許可されていない：clr̲flgの場合）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）のclrptnで指定したビットをクリアする．対象イベントフラグのビットパターンは，それまでの値とclrptnで指定した値のビット毎論理積（C言語の"&"）に更新される．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
wai̲flg
イベントフラグ待ち〔T〕

ngki̲spec‑120.txt
pol̲flgtwai̲flg

page 117

イベントフラグ待ち（ポーリング）〔T〕
イベントフラグ待ち（タイムアウト付き）〔T〕【C言語API】
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)【パラメータ】
ID
FLGPTNMODE
FLGPTN *TMO

flgid
waiptnwfmodep̲flgptn
tmout【リターンパラメータ】
ER
ercd
FLGPTN
flgptn【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲ILUSEE̲TMOUTE̲RLWAI
E̲DLT

対象イベントフラグのID番号
待ちビットパターン
待ちモード
待ち解除時のビットパターンを入れるメモリ領域へのポインタ
タイムアウト時間（twai̲flgの場合）

正常終了（E̲OK）またはエラーコード
待ち解除時のビットパターン

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：pol̲flgを除く）
不正ID番号（flgidが不正）
パラメータエラー（tmoutが不正：twai̲flgの場合）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する通常操作2が許可されていない）
メモリアクセス違反（p̲flgptnが指すメモリ領域への書
込みアクセスが許可されていない）
サービスコール不正使用（TA̲WMUL属性でないイベントフ
ラグで待ちタスクあり）
ポーリング失敗またはタイムアウト（wai̲flgを除く）
待ち禁止状態または待ち状態の強制解除（pol̲flgを除く）
待ちオブジェクトの削除または再初期化（pol̲flgを除く）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）が，waiptnとwfmodeで指定した待ち解除の条件を満たすのを待つ．具体的な振舞いは以下の通り．
対象イベントフラグが，waiptnとwfmodeで指定した待ち解除の条件を満たしている場合には，対象イベントフラグのビットパターンの現在値がflgptnに返される．対象イベントフラグがTA̲CLR属性である場合には，対象イベントフラグのビットパターンが0にクリアされる．
待ち解除の条件を満たしていない場合には，自タスクはイベントフラグ待ち状態となり，対象イベントフラグの待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲flg
イベントフラグの再初期化〔T〕【C言語API】
ER ercd = ini̲flg(ID flgid)【パラメータ】
ID

flgid

対象イベントフラグのID番号

ngki̲spec‑120.txt

page 118【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する管理操作が許可されていない）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）を再初期化する．具体的な振舞いは以下の通り．
対象イベントフラグのビットパターンは，初期ビットパターンに初期化される．
また，対象イベントフラグの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
【使用上の注意】ini̲flgにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
イベントフラグを再初期化した場合に，アプリケーションとの整合性を保つのは，アプリケーションの責任である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲flg
イベントフラグの状態参照〔T〕【C言語API】
ER ercd = ref̲flg(ID flgid, T̲RFLG *pk̲rflg)【パラメータ】
ID
T̲RFLG *flgid
pk̲rflg【リターンパラメータ】
ER
ercd

対象イベントフラグのID番号
イベントフラグの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊イベントフラグの現在状態（パケットの内容）
ID
wtskidイベントフラグの待ち行列の先頭のタスクのID
番号uint̲tflgptn
イベントフラグのビットパターン【エラーコード】
E̲CTX
E̲ID

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）ngki̲spec‑120.txt
E̲NOEXS〔D〕
E̲OACV〔P〕

page 119
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対す
る参照操作が許可されていない）
メモリアクセス違反（pk̲rflgが指すメモリ領域への書込
みアクセスが許可されていない）

E̲MACV〔P〕【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）の現在状態を参照する．
参照した現在状態は，pk̲rflgで指定したパケットに返される．
対象イベントフラグの待ち行列にタスクが存在しない場合，wtskidには
TSK̲NONE（＝0）が返る．
【使用上の注意】ref̲flgはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲flgを呼び出し，対象イベントフラグの現在状態を参照した
直後に割込みが発生した場合，ref̲flgから戻ってきた時には対象イベントフラ
グの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.3 データキュー
データキューは，1ワードのデータをメッセージとして，FIFO順で送受信するための同期・通信オブジェクトである．より大きいサイズのメッセージを送受信したい場合には，メッセージを置いたメモリ領域へのポインタを1ワードのデー
タとして送受信する方法がある．データキューは，データキューIDと呼ぶID番
号によって識別する．
各データキューが持つ情報は次の通り．
・データキュー属性
・データキュー管理領域
・送信待ち行列（データキューへの送信待ち状態のタスクのキュー）
・受信待ち行列（データキューからの受信待ち状態のタスクのキュー）・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
データキュー管理領域は，データキューに送信されたデータを，送信された順に格納しておくためのメモリ領域である．データキュー生成時に，データキュー
管理領域に格納できるデータ数を0とすることで，データキュー管理領域のサイズを0とすることができる．
保護機能対応カーネルにおいて，データキュー管理領域は，カーネルの用いるオブジェクト管理領域として扱われる．
送信待ち行列は，データキューに対してデータが送信できるまで待っている状
態（データキューへの送信待ち状態）のタスクが，データを送信できる順序でつながれているキューである．また，受信待ち行列は，データキューからデー
タが受信できるまで待っている状態（データキューからの受信待ち状態）のタ
スクが，データを受信できる順序でつながれているキューである．
データキュー属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

送信待ち行列をタスクの優先度順にする

ngki̲spec‑120.txt

page 120TA̲TPRIを指定しない場合，送信待ち行列はFIFO順になる．受信待ち行列は，FIFO順に固定されている．
データキュー機能に関連するカーネル構成マクロは次の通り．
TNUM̲DTQID

登録できるデータキューの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたデータキューの数に一致）【μITRON4.0仕様との関係】
TNUM̲DTQIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲DTQ
データキューの生成〔S〕
acre̲dtq
データキューの生成〔TD〕【静的API】
CRE̲DTQ(ID dtqid, { ATR dtqatr, uint̲t dtqcnt, void *dtqmb })【C言語API】
ER̲ID dtqid = acre̲dtq(const T̲CDTQ *pk̲cdtq)【パラメータ】
ID
T̲CDTQ *dtqid
pk̲cdtq

生成するデータキューのID番号（CRE̲DTQの場合）
データキューの生成情報を入れたパケットへのポインタ（静的APIを除く）＊データキューの生成情報（パケットの内容）
ATR
dtqatr
データキュー属性
uint̲tdtqcnt
データキュー管理領域に格納できるデータ数
void *
dtqmb
データキュー管理領域の先頭番地【リターンパラメータ】
ER̲ID
dtqid

【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲NOSPT
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲NOMEM
E̲OBJ

生成されたデータキューのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（dtqatrが不正または使用できない，属する保護ドメインかクラスが不正）未サポート機能（dtqmbがサポートされていない値）
パラメータエラー（dtqmbが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cdtqが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるデータキューIDがない）
メモリ不足（データキュー管理領域が確保できない）
オブジェクト状態エラー（dtqidで指定したデータキューが登録済み：CRE̲DTQの場合）【機能】各パラメータで指定したデータキュー生成情報に従って，データキューを生成する．dtqcntとdtqmbからデータキュー管理領域が設定され，格納されているデー
タがない状態に初期化される．また，送信待ち行列と受信待ち行列は，空の状態に初期化される．

ngki̲spec‑120.txt

page 121

静的APIにおいては，dtqidはオブジェクト識別名，dtqcntは整数定数式パラメー
タ，dtqmbは一般定数式パラメータである．コンフィギュレータは，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
dtqmbをNULLとした場合，dtqcntで指定した数のデータを格納できるデータキュー
管理領域を，コンフィギュレータまたはカーネルが確保する．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲DTQのみをサポートする．また，dtqmbにはNULLのみを指定することができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲DTQのみをサポートする．また，dtqmbにはNULLのみを指定することができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【未決定事項】
dtqmbがNULLでない場合に，データキュー管理領域をアプリケーションで確保す
る方法については，今後の課題である．
【μITRON4.0仕様との関係】
μITRON4.0/PX仕様にあわせて，データキュー生成情報の最後のパラメータを，
dtq（データキュー領域の先頭番地）から，dtqmb（データキュー管理領域の先頭番地）に改名した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲DTQ
割付け可能なデータキューIDの数の指定〔SD〕【静的API】
AID̲DTQ(uint̲t nodtq)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nodtq

割付け可能なデータキューIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nodtqで指定した数のデータキューIDを，データキューを生成するサービスコー
ルによって割付け可能なデータキューIDとして確保する．
nodtqは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲DTQ
データキューのアクセス許可ベクタの設定〔SP〕
sac̲dtq
データキューのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲dtq(ID dtqid, const ACVCT *p̲acvct)【パラメータ】

ngki̲spec‑120.txt
ID
ACVCT *

page 122dtqid
p̲acvct

対象データキューのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲DTQの場合）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象データキューは静的APIで生成された：sac̲dtqの場合，対象データキューに対して
アクセス許可ベクタが設定済み：SAC̲DTQの場合）【機能】
dtqidで指定したデータキュー（対象データキュー）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，dtqidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲DTQは，対象データキューが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲DTQ，sac̲dtqをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲DTQ，sac̲dtqをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲dtq
データキューの削除〔TD〕【C言語API】
ER ercd = del̲dtq(ID dtqid)【パラメータ】
ID

dtqid【リターンパラメータ】
ER
ercd

対象データキューのID番号正常終了（E̲OK）またはエラーコード

ngki̲spec‑120.txt【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

page 123

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する管理操作が許可されていない）
オブジェクト状態エラー（対象データキューは静的APIで生成された）【機能】
dtqidで指定したデータキュー（対象データキュー）を削除する．具体的な振舞
いは以下の通り．
対象データキューの登録が解除され，そのデータキューIDが未使用の状態に戻される．また，対象データキューの送信待ち行列と受信待ち行列につながれたタスクは，それぞれの待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
データキューの生成時に，データキュー管理領域がカーネルによって確保された場合は，そのメモリ領域が解放される．
【補足説明】
送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため，別の待ち行列で待っていたタスクの間の待ち解除の順序は，規定する必要がな
い．
【使用上の注意】del̲dtqにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲dtqをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲dtqをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
snd̲dtq
データキューへの送信〔T〕
psnd̲dtq
データキューへの送信（ポーリング）〔T〕
ipsnd̲dtq
データキューへの送信（ポーリング）〔I〕
tsnd̲dtq
データキューへの送信（タイムアウト付き）〔T〕【C言語API】
ER ercd = snd̲dtq(ID dtqid, intptr̲t data)
ER ercd = psnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = ipsnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = tsnd̲dtq(ID dtqid, intptr̲t data, TMO tmout)【パラメータ】
ID

dtqid

対象データキューのID番号

ngki̲spec‑120.txt
intptr̲t
TMO

page 124

data
tmout

送信データ
タイムアウト時間（tsnd̲dtqの場合）【リターンパラメータ】
ER
ercd

正常終了（E̲OK）またはエラーコード【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲TMOUTE̲RLWAI
E̲DLT

コンテキストエラー（非タスクコンテキストからの呼出
し：ipsnd̲dtqを除く，タスクコンテキストからの呼出し：
ipsnd̲dtqの場合，CPUロック状態からの呼出し，ディスパッチ保留状態からの呼出し：snd̲dtqとtsnd̲dtqの場合）
不正ID番号（dtqidが不正）
パラメータエラー（tmoutが不正：tsnd̲dtqの場合）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する
通常操作1が許可されていない：ipsnd̲dtqを除く）
ポーリング失敗またはタイムアウト（snd̲dtqを除く）
待ち禁止状態または待ち状態の強制解除（snd̲dtqとtsnd̲dtqの場合）
待ちオブジェクトの削除または再初期化（snd̲dtqとtsnd̲dtqの場合）【機能】
dtqidで指定したデータキュー（対象データキュー）に，dataで指定したデータを送信する．具体的な振舞いは以下の通り．
対象データキューの受信待ち行列にタスクが存在する場合には，受信待ち行列の先頭のタスクが，dataで指定したデータを受信し，待ち解除される．待ち解
除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象データキューの受信待ち行列にタスクが存在せず，データキュー管理領域にデータを格納するスペースがある場合には，dataで指定したデータが，FIFO順でデータキュー管理領域に格納される．
対象データキューの受信待ち行列にタスクが存在せず，データキュー管理領域にデータを格納するスペースがない場合には，自タスクはデータキューへの送信待ち状態となり，対象データキューの送信待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
fsnd̲dtq
データキューへの強制送信〔T〕
ifsnd̲dtq
データキューへの強制送信〔I〕【C言語API】
ER ercd = fsnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = ifsnd̲dtq(ID dtqid, intptr̲t data)【パラメータ】
ID
intptr̲t

dtqid
data

【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID

対象データキューのID番号
送信データ正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：fsnd̲dtqの場合，タスクコンテキストからの呼出し：
ifsnd̲dtqの場合，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）ngki̲spec‑120.txt
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲ILUSE

page 125
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する
通常操作1が許可されていない：fsnd̲dtqの場合）
サービスコール不正使用（対象データキューのデータキュー
管理領域のサイズが0）【機能】
dtqidで指定したデータキュー（対象データキュー）に，dataで指定したデータを強制送信する．具体的な振舞いは以下の通り．
対象データキューの受信待ち行列にタスクが存在する場合には，受信待ち行列の先頭のタスクが，dataで指定したデータを受信し，待ち解除される．待ち解
除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象データキューの受信待ち行列にタスクが存在せず，データキュー管理領域にデータを格納するスペースがある場合には，dataで指定したデータが，FIFO順でデータキュー管理領域に格納される．
対象データキューの受信待ち行列にタスクが存在せず，データキュー管理領域にデータを格納するスペースがない場合には，データキュー管理領域の先頭に格納されたデータを削除し，空いたスペースを用いて，dataで指定したデータ
が，FIFO順でデータキュー管理領域に格納される．
対象データキューのデータキュー管理領域のサイズが0の場合には，E̲ILUSEエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rcv̲dtq
データキューからの受信〔T〕
prcv̲dtq
データキューからの受信（ポーリング）〔T〕
trcv̲dtq
データキューからの受信（タイムアウト付き）〔T〕【C言語API】
ER ercd = rcv̲dtq(ID dtqid, intptr̲t *p̲data)
ER ercd = prcv̲dtq(ID dtqid, intptr̲t *p̲data)
ER ercd = trcv̲dtq(ID dtqid, intptr̲t *p̲data, TMO tmout)【パラメータ】
ID
intptr̲t *
TMO

dtqid
p̲datatmout【リターンパラメータ】
ER
ercd
intptr̲t
data【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲TMOUTE̲RLWAI

対象データキューのID番号
受信データを入れるメモリ領域へのポインタ
タイムアウト時間（trcv̲dtqの場合）

正常終了（E̲OK）またはエラーコード
受信データ

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：prcv̲dtqを除く）
不正ID番号（dtqidが不正）
パラメータエラー（tmoutが不正：trcv̲dtqの場合）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する
通常操作2が許可されていない）
メモリアクセス違反（p̲dataが指すメモリ領域への書込
みアクセスが許可されていない）
ポーリング失敗またはタイムアウト（rcv̲dtqを除く）
待ち禁止状態または待ち状態の強制解除（prcv̲dtqを除く）

ngki̲spec‑120.txt
E̲DLT

page 126
待ちオブジェクトの削除または再初期化（prcv̲dtqを除く）【機能】
dtqidで指定したデータキュー（対象データキュー）からデータを受信する．受信したデータは，p̲dataで指定したメモリ領域に返される．具体的な振舞いは
以下の通り．
対象データキューのデータキュー管理領域にデータが格納されている場合には，データキュー管理領域の先頭に格納されたデータが取り出され，p̲dataで指定したメモリ領域に返される．また，送信待ち行列にタスクが存在する場合には，
送信待ち行列の先頭のタスクの送信データが，FIFO順でデータキュー管理領域に格納され，そのタスクは待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象データキューのデータキュー管理領域にデータが格納されておらず，送信待ち行列にタスクが存在する場合には，送信待ち行列の先頭のタスクの送信デー
タが，p̲dataで指定したメモリ領域に返される．送信待ち行列の先頭のタスク
は，待ち解除される．待ち解除されたタスクには，待ち状態となったサービス
コールからE̲OKが返る．
対象データキューのデータキュー管理領域にデータが格納されておらず，送信待ち行列にタスクが存在しない場合には，自タスクはデータキューからの受信待ち状態となり，対象データキューの受信待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲dtq
データキューの再初期化〔T〕【C言語API】
ER ercd = ini̲dtq(ID dtqid)【パラメータ】
ID

dtqid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象データキューのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する管理操作が許可されていない）【機能】
dtqidで指定したデータキュー（対象データキュー）を再初期化する．具体的な振舞いは以下の通り．
対象データキューのデータキュー管理領域は，格納されているデータがない状
態に初期化される．また，対象データキューの送信待ち行列と受信待ち行列につながれたタスクは，それぞれの待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールから
E̲DLTエラーが返る．
【補足説明】
送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため，

ngki̲spec‑120.txt

page 127

別の待ち行列で待っていたタスクの間の待ち解除の順序は，規定する必要がな
い．
【使用上の注意】ini̲dtqにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
データキューを再初期化した場合に，アプリケーションとの整合性を保つのは，
アプリケーションの責任である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ref̲dtq
データキューの状態参照〔T〕【C言語API】
ER ercd = ref̲dtq(ID dtqid, T̲RDTQ *pk̲rdtq)【パラメータ】
ID
T̲RDTQ *dtqid
pk̲rdtq【リターンパラメータ】
ER
ercd

対象データキューのID番号
データキューの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊データキューの現在状態（パケットの内容）ID
stskid
データキューの送信待ち行列の先頭のタスクの
ID番号ID
rtskid
データキューの受信待ち行列の先頭のタスクの
ID番号
uint̲tsdtqcnt
データキュー管理領域に格納されているデータの数【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する
参照操作が許可されていない）
メモリアクセス違反（pk̲rdtqが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
dtqidで指定したデータキュー（対象データキュー）の現在状態を参照する．参
照した現在状態は，pk̲rdtqで指定したパケットに返される．
対象データキューの送信待ち行列にタスクが存在しない場合，stskidには
TSK̲NONE（＝0）が返る．また，受信待ち行列にタスクが存在しない場合，
rtskidにはTSK̲NONE（＝0）が返る．
【使用上の注意】ngki̲spec‑120.txt

page 128ref̲dtqはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲dtqを呼び出し，対象データキューの現在状態を参照した直後に割込みが発生した場合，ref̲dtqから戻ってきた時には対象データキューの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.4 優先度データキュー
優先度データキューは，1ワードのデータをメッセージとして，データの優先度順で送受信するための同期・通信カーネルオブジェクトである．より大きいサ
イズのメッセージを送受信したい場合には，メッセージを置いたメモリ領域へのポインタを1ワードのデータとして送受信する方法がある．優先度データキュー
は，優先度データキューIDと呼ぶID番号によって識別する．
各優先度データキューが持つ情報は次の通り．
・優先度データキュー属性
・優先度データキュー管理領域
・送信待ち行列（優先度データキューへの送信待ち状態のタスクのキュー）
・受信待ち行列（優先度データキューからの受信待ち状態のタスクのキュー）・送信できるデータ優先度の最大値
・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
優先度データキュー管理領域は，優先度データキューに送信されたデータを，
データの優先度順に格納しておくためのメモリ領域である．優先度データキュー
生成時に，優先度データキュー管理領域に格納できるデータ数を0とすることで，優先度データキュー管理領域のサイズを0とすることができる．
保護機能対応カーネルにおいて，優先度データキュー管理領域は，カーネルの用いるオブジェクト管理領域として扱われる．
送信待ち行列は，優先度データキューに対してデータが送信できるまで待っている状態（優先度データキューへの送信待ち状態）のタスクが，データを送信できる順序でつながれているキューである．また，受信待ち行列は，優先度デー
タキューからデータが受信できるまで待っている状態（優先度データキューからの受信待ち状態）のタスクが，データを受信できる順序でつながれている
キューである．
優先度データキュー属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

送信待ち行列をタスクの優先度順にする

TA̲TPRIを指定しない場合，送信待ち行列はFIFO順になる．受信待ち行列は，FIFO順に固定されている．
優先度データキュー機能に関連するカーネル構成マクロは次の通り．
TMIN̲DPRI
TMAX̲DPRI

データ優先度の最小値（＝1）
データ優先度の最大値

TNUM̲PDQID

登録できる優先度データキューの数（動的生成対応でないカーネルでは，静的APIによって登録された優先度デー
タキューの数に一致）【TOPPERS/ASPカーネルにおける規定】

ngki̲spec‑120.txt

page 129

ASPカーネルでは，データ優先度の最大値（TMAX̲DPRI）は16に固定されている．
ただし，タスク優先度拡張パッケージでは，TMAX̲DPRIを256に拡張する．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，データ優先度の最大値（TMAX̲DPRI）は16に固定されている．
【使用上の注意】
データの優先度が使われるのは，データが優先度データキュー管理領域に格納される場合のみであり，データを送信するタスクが送信待ち行列につながれている間には使われない．そのため，送信待ち行列につながれているタスクが，優先度データキュー管理領域に格納されているデータよりも高い優先度のデー
タを送信しようとしている場合でも，最初に送信されるのは，優先度データ
キュー管理領域に格納されているデータである．また，TA̲TPRI属性の優先度デー
タキューにおいても，送信待ち行列はタスクの優先度順となり，タスクが送信しようとしているデータの優先度順となるわけではない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に規定されていない機能である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲PDQ
優先度データキューの生成〔S〕
acre̲pdq
優先度データキューの生成〔TD〕【静的API】
CRE̲PDQ(ID pdqid, { ATR pdqatr, uint̲t pdqcnt, PRI maxdpri, void *pdqmb })【C言語API】
ER̲ID pdqid = acre̲pdq(const T̲CPDQ *pk̲cpdq)【パラメータ】
ID

pdqid

T̲CPDQ *pk̲cpdq生成する優先度データキューのID番号（CRE̲PDQの場合）
優先度データキューの生成情報を入れたパケッ
トへのポインタ（静的APIを除く）＊優先度データキューの生成情報（パケットの内容）
ATR
pdqatr
優先度データキュー属性
uint̲tpdqcnt
優先度データキュー管理領域に格納できるデー
タ数
PRI
maxdpri
優先度データキューに送信できるデータ優先度の最大値
void *
pdqmb
優先度データキュー管理領域の先頭番地【リターンパラメータ】
ER̲ID
pdqid

【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲NOSPT
E̲PAR
E̲OACV〔sP〕

生成された優先度データキューのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（pdqatrが不正または使用できない，属する保護ドメインかクラスが不正）未サポート機能（pdqmbがサポートされていない値）
パラメータエラー（pdqmb，maxdpriが不正）オブジェクトアクセス違反（システム状態に対する管理ngki̲spec‑120.txt

E̲MACV〔sP〕
E̲NOID〔s〕
E̲NOMEME̲OBJ

page 130
操作が許可されていない）
メモリアクセス違反（pk̲cpdqが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられる優先度データキューIDがない）
メモリ不足（優先度データキュー管理領域が確保できない）
オブジェクト状態エラー（pdqidで指定した優先度データキューが登録済み：CRE̲PDQの場合）【機能】各パラメータで指定した優先度データキュー生成情報に従って，優先度データ
キューを生成する．pdqcntとpdqmbから優先度データキュー管理領域が設定され，格納されているデータがない状態に初期化される．また，送信待ち行列と受信待ち行列は，空の状態に初期化される．
静的APIにおいては，pdqidはオブジェクト識別名，pdqcntとmaxdpriは整数定数
式パラメータ，pdqmbは一般定数式パラメータである．コンフィギュレータは，
静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
pdqmbをNULLとした場合，pdqcntで指定した数のデータを格納できる優先度デー
タキュー管理領域を，コンフィギュレータまたはカーネルが確保する．
maxdpriは，TMIN̲DPRI以上，TMAX̲DPRI以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲PDQのみをサポートする．また，pdqmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲PDQのみをサポートする．また，pdqmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【未決定事項】
pdqmbがNULLでない場合に，優先度データキュー管理領域をアプリケーションで確保する方法については，今後の課題である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲PDQ
割付け可能な優先度データキューIDの数の指定〔SD〕【静的API】
AID̲PDQ(uint̲t nopdq)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nopdq

割付け可能な優先度データキューIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nopdqで指定した数の優先度データキューIDを，優先度データキューを生成する
サービスコールによって割付け可能な優先度データキューIDとして確保する．
nopdqは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
SAC̲PDQ
優先度データキューのアクセス許可ベクタの設定〔SP〕

ngki̲spec‑120.txt
sac̲pdq

page 131

優先度データキューのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲pdq(ID pdqid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

pdqid
p̲acvct

対象優先度データキューのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（pdqidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲DTQの場合）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象優先度データキューは静的
APIで生成された：sac̲pdqの場合，対象優先度データキュー
に対してアクセス許可ベクタが設定済み：SAC̲PDQの場合）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）のアクセス許可ベクタ（4 つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，pdqidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲PDQは，対象優先度データキューが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲PDQ，sac̲pdqをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲PDQ，sac̲pdqをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑120.txt
del̲pdq

page 132

優先度データキューの削除〔TD〕【C言語API】
ER ercd = del̲pdq(ID pdqid)【パラメータ】
ID

pdqid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象優先度データキューのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（pdqidが不正）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する管理操作が許可されていない）
オブジェクト状態エラー（対象優先度データキューは静的
APIで生成された）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）を削除する．
具体的な振舞いは以下の通り．
対象優先度データキューの登録が解除され，その優先度データキューIDが未使用の状態に戻される．また，対象優先度データキューの送信待ち行列と受信待
ち行列につながれたタスクは，それぞれの待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコール
からE̲DLTエラーが返る．
優先度データキューの生成時に，優先度データキュー管理領域がカーネルによって確保された場合は，そのメモリ領域が解放される．
【補足説明】
送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため，別の待ち行列で待っていたタスクの間の待ち解除の順序は，規定する必要がな
い．
【使用上の注意】del̲pdqにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲pdqをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲pdqをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
snd̲pdq
優先度データキューへの送信〔T〕
psnd̲pdq
優先度データキューへの送信（ポーリング）〔T〕

ngki̲spec‑120.txt
ipsnd̲pdq
tsnd̲pdq

page 133

優先度データキューへの送信（ポーリング）〔I〕
優先度データキューへの送信（タイムアウト付き）〔T〕【C言語API】
ER ercd = snd̲pdq(ID pdqid, intptr̲t data, PRI datapri)
ER ercd = psnd̲pdq(ID pdqid, intptr̲t data, PRI datapri)
ER ercd = ipsnd̲pdq(ID pdqid, intptr̲t data, PRI datapri)
ER ercd = tsnd̲pdq(ID pdqid, intptr̲t data, PRI datapri, TMO tmout)【パラメータ】
ID
intptr̲t
PRI
TMO

pdqid
data
datapritmout

対象優先度データキューのID番号
送信データ
送信データの優先度
タイムアウト時間（tsnd̲pdqの場合）【リターンパラメータ】
ER
ercd

正常終了（E̲OK）またはエラーコード【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲TMOUTE̲RLWAI
E̲DLT

コンテキストエラー（非タスクコンテキストからの呼出
し：ipsnd̲pdqを除く，タスクコンテキストからの呼出し：
ipsnd̲pdqの場合，CPUロック状態からの呼出し，ディスパッチ保留状態からの呼出し：snd̲pdqとtsnd̲pdqの場合）
不正ID番号（pdqidが不正）
パラメータエラー（datapriが不正，tmoutが不正：
tsnd̲pdqのみ）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する通常操作1が許可されていない：ipsnd̲pdqを除く）
ポーリング失敗またはタイムアウト（snd̲pdqを除く）
待ち禁止状態または待ち状態の強制解除（snd̲pdqとtsnd̲pdqの場合）
待ちオブジェクトの削除または再初期化（snd̲pdqとtsnd̲pdqの場合）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）に，dataで指定したデータを，datapriで指定した優先度で送信する．具体的な振舞いは以下の通り．
対象優先度データキューの受信待ち行列にタスクが存在する場合には，受信待
ち行列の先頭のタスクが，dataで指定したデータを受信し，待ち解除される．
待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象優先度データキューの受信待ち行列にタスクが存在せず，優先度データ
キュー管理領域にデータを格納するスペースがある場合には，dataで指定したデータが，datapriで指定したデータの優先度順で優先度データキュー管理領域に格納される．
対象優先度データキューの受信待ち行列にタスクが存在せず，優先度データ
キュー管理領域にデータを格納するスペースがない場合には，自タスクは優先
度データキューへの送信待ち状態となり，対象優先度データキューの送信待ち
行列につながれる．
datapriは，TMIN̲DPRI以上で，対象データキューに送信できるデータ優先度の最大値以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑120.txt
rcv̲pdqprcv̲pdq
trcv̲pdq

page 134

優先度データキューからの受信〔T〕
優先度データキューからの受信（ポーリング）〔T〕
優先度データキューからの受信（タイムアウト付き）〔T〕【C言語API】
ER ercd = rcv̲pdq(ID pdqid, intptr̲t *p̲data, PRI *p̲datapri)
ER ercd = prcv̲pdq(ID pdqid, intptr̲t *p̲data, PRI *p̲datapri)
ER ercd = trcv̲pdq(ID pdqid, intptr̲t *p̲data, PRI *p̲datapri, TMO tmout)【パラメータ】
ID
intptr̲t *
PRI *
TMO

pdqid
p̲datap̲datapri
tmout【リターンパラメータ】
ER
ercd
intptr̲tdata
PRI
datapri【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲TMOUTE̲RLWAI
E̲DLT

対象優先度データキューのID番号
受信データを入れるメモリ領域へのポインタ
受信データの優先度を入れるメモリ領域へのポ
インタ
タイムアウト時間（trcv̲pdqの場合）

正常終了（E̲OK）またはエラーコード
受信データ
受信データの優先度

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：prcv̲pdqを除く）
不正ID番号（pdqidが不正）
パラメータエラー（tmoutが不正：trcv̲pdqの場合）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する通常操作2が許可されていない）
メモリアクセス違反（p̲dataまたはp̲datapriが指すメモ
リ領域への書込みアクセスが許可されていない）
ポーリング失敗またはタイムアウト（rcv̲pdqを除く）
待ち禁止状態または待ち状態の強制解除（prcv̲pdqを除く）
待ちオブジェクトの削除または再初期化（prcv̲pdqを除く）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）からデータを受信する．受信したデータはp̲dataで指定したメモリ領域に，その優先度はp̲datapriで指定したメモリ領域に返される．具体的な振舞いは以下の通り．
対象優先度データキューの優先度データキュー管理領域にデータが格納されている場合には，優先度データキュー管理領域の先頭に格納されたデータが取り出され，p̲dataで指定したメモリ領域に返される．また，その優先度がp̲datapriで指定したメモリ領域に返される．さらに，送信待ち行列にタスクが存在する場合には，送信待ち行列の先頭のタスクの送信データが，データの優
先度順で優先度データキュー管理領域に格納され，そのタスクは待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象優先度データキューの優先度データキュー管理領域にデータが格納されておらず，送信待ち行列にタスクが存在する場合には，送信待ち行列の先頭のタ
スクの送信データが，p̲dataで指定したメモリ領域に返される．また，その優先度がp̲datapriで指定したメモリ領域に返される．送信待ち行列の先頭のタス
クは，待ち解除される．待ち解除されたタスクには，待ち状態となったサービ
スコールからE̲OKが返る．

ngki̲spec‑120.txt

page 135

対象優先度データキューの優先度データキュー管理領域にデータが格納されておらず，送信待ち行列にタスクが存在しない場合には，自タスクは優先度デー
タキューからの受信待ち状態となり，対象優先度データキューの受信待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲pdq
優先度データキューの再初期化〔T〕【C言語API】
ER ercd = ini̲pdq(ID pdqid)【パラメータ】
ID

pdqid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象優先度データキューのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（pdqidが不正）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する管理操作が許可されていない）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）を再初期化す
る．具体的な振舞いは以下の通り．
対象優先度データキューの優先度データキュー管理領域は，格納されているデー
タがない状態に初期化される．また，対象優先度データキューの送信待ち行列と受信待ち行列につながれたタスクは，それぞれの待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービ
スコールからE̲DLTエラーが返る．
【補足説明】
送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため，別の待ち行列で待っていたタスクの間の待ち解除の順序は，規定する必要がな
い．
【使用上の注意】ini̲pdqにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
優先度データキューを再初期化した場合に，アプリケーションとの整合性を保つのは，アプリケーションの責任である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ref̲pdq
優先度データキューの状態参照〔T〕【C言語API】
ER ercd = ref̲pdq(ID pdqid, T̲RPDQ *pk̲rpdq)【パラメータ】
ID

pdqid

対象優先度データキューのID番号

ngki̲spec‑120.txt
T̲RPDQ *page 136

pk̲rpdq【リターンパラメータ】
ER
ercd

優先度データキューの現在状態を入れるパケッ
トへのポインタ

正常終了（E̲OK）またはエラーコード＊優先度データキューの現在状態（パケットの内容）ID
stskid
優先度データキューの送信待ち行列の先頭のタ
スクのID番号ID
rtskid
優先度データキューの受信待ち行列の先頭のタ
スクのID番号uint̲tspdqcnt
優先度データキュー管理領域に格納されているデータの数【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（pdqidが不正）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する参照操作が許可されていない）
メモリアクセス違反（pk̲rpdqが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）の現在状態を参照する．参照した現在状態は，pk̲rpdqで指定したパケットに返される．
対象優先度データキューの送信待ち行列にタスクが存在しない場合，stskidにはTSK̲NONE（＝0）が返る．また，受信待ち行列にタスクが存在しない場合，
rtskidにはTSK̲NONE（＝0）が返る．
【使用上の注意】ref̲pdqはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲pdqを呼び出し，対象優先度データキューの現在状態を参照
した直後に割込みが発生した場合，ref̲pdqから戻ってきた時には対象優先度デー
タキューの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.5 メールボックス
メールボックスは，共有メモリ上に置いたメッセージを，FIFO順またはメッセー
ジの優先度順で送受信するための同期・通信オブジェクトである．メールボッ
クスは，メールボックスIDと呼ぶID番号によって識別する．
各メールボックスが持つ情報は次の通り．
・メールボックス属性
・メッセージキュー
・待ち行列（メールボックスからの受信待ち状態のタスクのキュー）・送信できるメッセージ優先度の最大値
・優先度別のメッセージキューヘッダ領域
・属するクラス（マルチプロセッサ対応カーネルの場合）
メッセージキューは，メールボックスに送信されたメッセージを，FIFO順またはメッセージの優先度順につないでおくためのキューである．

ngki̲spec‑120.txt

page 137

待ち行列は，メールボックスからメッセージが受信できるまで待っている状態（メールボックスからの受信待ち状態）のタスクが，メッセージを受信できる順序でつながれているキューである．
メールボックス属性には，次の属性を指定することができる．
TA̲TPRITA̲MPRI

0x01U
0x02U

待ち行列をタスクの優先度順にする
メッセージキューをメッセージの優先度順にする

TA̲TPRIを指定しない場合，待ち行列はFIFO順になる．TA̲MPRIを指定しない場
合，メッセージキューはFIFO順になる．
優先度別のメッセージキューヘッダ領域は，TA̲MPRI属性のメールボックスに対して，メッセージキューを優先度別に設ける場合に使用する領域である．
カーネルは，メールボックスに送信されたメッセージをメッセージキューにつなぐために，メッセージの先頭のメモリ領域を使用する．そのためアプリケー
ションは，メールボックスに送信するメッセージの先頭に，カーネルが利用するためのメッセージヘッダを置かなければならない．メッセージヘッダのデー
タ型として，メールボックス属性にTA̲MPRIが指定されているか否かにより，以下のいずれかを用いる．
T̲MSG
T̲MSG̲PRI

TA̲MPRI属性でないメールボックス用のメッセージヘッダ
TA̲MPRI属性のメールボックス用のメッセージヘッダ

TA̲MPRI属性のメールボックスにメッセージを送信する場合，アプリケーション
は，メッセージの優先度を，T̲MSG̲PRI型のメッセージヘッダ中のmsgpriフィー
ルドに設定する．
保護機能対応カーネルでは，メールボックス機能はサポートしない．
メールボックス機能に関連するカーネル構成マクロは次の通り．
TMIN̲MPRI
TMAX̲MPRI

メッセージ優先度の最小値（＝1）
メッセージ優先度の最大値

TNUM̲MBXID

登録できるメールボックスの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたメールボックスの数に一致）【補足説明】
TOPPERS新世代カーネルの現時点の実装では，優先度別のメッセージキューヘッ
ダ領域は用いていない．
【使用上の注意】
メールボックス機能は，μITRON4.0仕様との互換性のために残した機能であり，保護機能対応カーネルではサポートしないため，使用することは推奨しない．
メールボックス機能は，ほとんどの場合に，データキュー機能または優先度デー
タキュー機能を用いて，メッセージを置いたメモリ領域へのポインタを送受信する方法で置き換えることができる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，メールボックス機能をサポートする．メッセージ優先度の最大値（TMAX̲MPRI）は16に固定されている．ただし，タスク優先度拡張パッケー

ngki̲spec‑120.txt

page 138

ジでは，TMAX̲MPRIを256に拡張する．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，メールボックス機能をサポートする．メッセージ優先度の最大値（TMAX̲MPRI）は16に固定されている．
【μITRON4.0仕様との関係】
TNUM̲MBXIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲MBX
メールボックスの生成〔Sp〕
acre̲mbx
メールボックスの生成〔TpD〕【静的API】
CRE̲MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })【C言語API】
ER̲ID mbxid = acre̲mbx(const T̲CMBX *pk̲cmbx)【パラメータ】
ID

mbxid

T̲CMBX *pk̲cmbx

生成するメールボックスのID番号（CRE̲MBXの場合）
メールボックスの生成情報を入れたパケットへのポインタ（静的APIを除く）＊メールボックスの生成情報（パケットの内容）
ATR
mbxatr
メールボックス属性
PRI
maxmpri
優先度メールボックスに送信できるメッセージ
優先度の最大値
void *
mprihd
優先度別のメッセージキューヘッダ領域の先頭
番地【リターンパラメータ】
ER̲ID
mbxid

【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲NOSPT
E̲PAR
E̲NOID〔s〕
E̲NOMEM
E̲OBJ

生成されたメールボックスのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（mbxatrが不正または使用できない，属するクラスが不正）
未サポート機能（mprihdがサポートされていない値）
パラメータエラー（mprihdが不正）
ID番号不足（割り付けられるメールボックスIDがない）
メモリ不足（優先度別のメッセージキューヘッダ領域が確保できない）オブジェクト状態エラー（mbxidで指定したメールボックスが登録済み：CRE̲MBXの場合）【機能】各パラメータで指定したメールボックス生成情報に従って，メールボックスを生成する．メッセージキューはつながれているメッセージがない状態に初期化され，mprihdとmaxmpriから優先度別のメッセージキューヘッダ領域が設定される．また，待ち行列は空の状態に初期化される．
静的APIにおいては，mbxidはオブジェクト識別名，maxmpriは整数定数式パラメー

ngki̲spec‑120.txt

page 139タ，mprihdは一般定数式パラメータである．コンフィギュレータは，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
mprihdをNULLとした場合，mprihdの指定に合致したサイズの優先度別のメッセー
ジキューヘッダ領域を，コンフィギュレータまたはカーネルが確保する．
maxmpriは，TMIN̲MPRI以上，TMAX̲MPRI以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲MBXのみをサポートする．また，優先度別のメッセージ
キューヘッダ領域は使用しておらず，mprihdにはNULLのみを渡すことができる．
NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲MBXのみをサポートする．また，優先度別のメッセージ
キューヘッダ領域は使用しておらず，mprihdにはNULLのみを渡すことができる．
NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【未決定事項】
mprihdがNULLでない場合に，優先度別のメッセージキューヘッダ領域をアプリ
ケーションで確保する方法については，今後の課題である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲MBX
割付け可能なメールボックスIDの数の指定〔SpD〕【静的API】
AID̲MBX(uint̲t nombx)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nombx

割付け可能なメールボックスIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nombxで指定した数のメールボックスIDを，メールボックスを生成するサービス
コールによって割付け可能なメールボックスIDとして確保する．
nombxは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲mbx
メールボックスの削除〔TDp〕【C言語API】
ER ercd = del̲mbx(ID mbxid)【パラメータ】
ID

mbxid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID

対象メールボックスのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mbxidが不正）ngki̲spec‑120.txt
E̲NOEXS〔D〕
E̲OBJ

page 140
オブジェクト未登録（対象メールボックスが未登録）
オブジェクト状態エラー（対象メールボックスは静的APIで生成された）【機能】
mbxidで指定したメールボックス（対象メールボックス）を削除する．具体的な振舞いは以下の通り．
対象メールボックスの登録が解除され，そのメールボックスIDが未使用の状態に戻される．また，対象メールボックスの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
メールボックスの生成時に，優先度別のメッセージキューヘッダ領域がカーネルによって確保された場合は，そのメモリ領域が解放される．
【使用上の注意】del̲mbxにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲mbxをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲mbxをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
snd̲mbx
メールボックスへの送信〔Tp〕【C言語API】
ER ercd = snd̲mbx(ID mbxid, T̲MSG *pk̲msg)【パラメータ】
ID
T̲MSG

mbxid
*pk̲msg【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲PAR
E̲NOEXS〔D〕

対象メールボックスのID番号
送信メッセージの先頭番地正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mbxidが不正）
パラメータエラー（メッセージヘッダ中のmsgpriが不正）オブジェクト未登録（対象メールボックスが未登録）【機能】
mbxidで指定したメールボックス（対象メールボックス）に，pk̲msgで指定したメッセージを送信する．具体的な振舞いは以下の通り．
対象メールボックスの待ち行列にタスクが存在する場合には，待ち行列の先頭のタスクが，pk̲msgで指定したメッセージを受信し，待ち解除される．待ち解ngki̲spec‑120.txt

page 141

除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象メールボックスの待ち行列にタスクが存在しない場合には，pk̲msgで指定したメッセージが，メールボックス属性のTA̲MPRI指定の有無によって指定される順序で，メッセージキューにつなぐ．
対象メールボックスがTA̲MPRI属性である場合には，pk̲msgで指定したメッセー
ジの先頭のメッセージヘッダ中のmsgpriフィールドの値が，TMIN̲MPRI以上で，対象メールボックスに送信できるメッセージ優先度の最大値以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rcv̲mbx
メールボックスからの受信〔Tp〕
prcv̲mbx
メールボックスからの受信（ポーリング）〔Tp〕
trcv̲mbx
メールボックスからの受信（タイムアウト付き）〔Tp〕【C言語API】
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)【パラメータ】
ID
T̲MSG **
TMO

mbxid
ppk̲msg
tmout【リターンパラメータ】
ER
ercd
T̲MSG *
ppk̲msg【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲TMOUTE̲RLWAI
E̲DLT

対象メールボックスのID番号
受信メッセージの先頭番地を入れるメモリ領域
へのポインタ
タイムアウト時間（trcv̲mbxの場合）

正常終了（E̲OK）またはエラーコード
受信メッセージの先頭番地

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：prcv̲mbxを除く）
不正ID番号（mbxidが不正）
パラメータエラー（tmoutが不正：trcv̲mbxの場合）
オブジェクト未登録（対象メールボックスが未登録）
ポーリング失敗またはタイムアウト（rcv̲mbxを除く）
待ち禁止状態または待ち状態の強制解除（prcv̲mbxを除く）
待ちオブジェクトの削除または再初期化（prcv̲mbxを除く）【機能】
mbxidで指定したメールボックス（対象メールボックス）からメッセージを受信する．受信したメッセージの先頭番地は，ppk̲msgで指定したメモリ領域に返される．具体的な振舞いは以下の通り．
対象メールボックスのメッセージキューにメッセージがつながれている場合には，メッセージキューの先頭につながれたメッセージが取り出され，ppk̲msgで指定したメモリ領域に返される．
対象メールボックスのメッセージキューにメッセージがつながれていない場合には，自タスクはメールボックスからの受信待ち状態となり，対象メールボッ
クスの待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲mbx
メールボックスの再初期化〔Tp〕【C言語API】

ngki̲spec‑120.txt

page 142

ER ercd = ini̲mbx(ID mbxid)【パラメータ】
ID

mbxid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕

対象メールボックスのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mbxidが不正）
オブジェクト未登録（対象メールボックスが未登録）【機能】
mbxidで指定したメールボックス（対象メールボックス）を再初期化する．具体的な振舞いは以下の通り．
対象メールボックスのメールボックス管理領域は，メッセージキューはつながれているメッセージがない状態に初期化される．また，対象メールボックスの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールから
E̲DLTエラーが返る．
【使用上の注意】ini̲mbxにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
メールボックスを再初期化した場合に，アプリケーションとの整合性を保つのは，
アプリケーションの責任である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲mbx
メールボックスの状態参照〔Tp〕【C言語API】
ER ercd = ref̲mbx(ID mbxid, T̲RMBX *pk̲rmbx)【パラメータ】
ID
T̲RMBX *mbxidpk̲rmbx【リターンパラメータ】
ER
ercd

対象メールボックスのID番号
メールボックスの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊メールボックスの現在状態（パケットの内容）
ID
wtskid
メールボックスの待ち行列の先頭のタスクのID
番号
T̲MSG *
pk̲msgメッセージキューの先頭につながれたメッセー
ジの先頭番地ngki̲spec‑120.txt【エラーコード】
E̲CTX

page 143

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mbxidが不正）
オブジェクト未登録（対象メールボックスが未登録）

E̲ID
E̲NOEXS〔D〕【機能】

mbxidで指定したメールボックス（対象メールボックス）の現在状態を参照する．
参照した現在状態は，pk̲rmbxで指定したパケットに返される．
対象メールボックスの待ち行列にタスクが存在しない場合，wtskidには
TSK̲NONE（＝0）が返る．また，メッセージキューにメッセージがつながれていない場合，pk̲msgにはNULLが返る．
【使用上の注意】ref̲mbxはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲mbxを呼び出し，対象メールボックスの現在状態を参照した
直後に割込みが発生した場合，ref̲mbxから戻ってきた時には対象メールボック
スの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.6 ミューテックス
ミューテックスは，タスク間の排他制御を行うための同期・通信オブジェクトである．タスクは，排他制御区間に入る時にミューテックスをロックし，排他制御区間を出る時にロック解除する．ミューテックスは，ミューテックスIDと呼ぶID番号によって識別する．
ミューテックスは，排他制御に伴う優先度逆転の時間を最小限に抑えるための優先度上限プロトコル（priority ceiling protocol）をサポートする．ミュー
テックス属性により優先度上限ミューテックスであると指定することで，そのミューテックスの操作時に，優先度上限プロトコルに従った現在優先度の制御が行われる．
各ミューテックスが持つ情報は次の通り．
・ミューテックス属性
・ロック状態（ロックされている状態とロック解除されている状態）
・ミューテックスをロックしているタスク
・待ち行列（ミューテックスのロック待ち状態のタスクのキュー）・上限優先度（優先度上限ミューテックスの場合）・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
待ち行列は，ミューテックスをロックできるまで待っている状態（ミューテッ
クスのロック待ち状態）のタスクが，ミューテックスをロックできる順序でつながれているキューである．
上限優先度は，優先度上限ミューテックスに対してのみ有効で，ミューテック
スの生成時に，そのミューテックスをロックする可能性のあるタスクのベース
優先度の中で最も高い優先度（または，それより高い優先度）に設定する．
ミューテックス属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

待ち行列をタスクの優先度順にする

ngki̲spec‑120.txt
TA̲CEILING

page 144

0x03U

優先度上限ミューテックスとする．待ち行列をタスクの優先度順にする

TA̲TPRI，TA̲CEILINGのいずれも指定しない場合，待ち行列はFIFO順になる．
ミューテックス機能に関連して，各タスクが持つ情報は次の通り．
・ロックしているミューテックスのリスト
ロックしているミューテックスのリストは，タスクの起動時に空に初期化される．
タスクの現在優先度は，そのタスクのベース優先度と，そのタスクがロックしている優先度上限ミューテックスの優先度上限の中で，最も高い優先度に設定される．
ミューテックス機能によりタスクの現在優先度が変化する場合には，次の処理が行われる．現在優先度を変化させるサービスコールの前後とも，当該タスクが実行できる状態である場合には，同じ優先度のタスクの中で最高優先順位となる．そのサービスコールにより，当該タスクが実行できる状態に遷移する場
合には，同じ優先度のタスクの中で最低優先順位となる．そのサービスコールの後で，当該タスクが待ち状態で，タスクの優先度順の待ち行列につながれている場合には，当該タスクの変更後の現在優先度に従って，その待ち行列中での順序が変更される．待ち行列中に同じ現在優先度のタスクがある場合には，当該タスクの順序はそれらの中で最後になる．
ミューテックス機能に関連して，タスクの終了時に行うべき処理として，タスクがロックしているミューテックスのロック解除がある．タスクの終了時にロックしているミューテックスが残っている場合，それらのミューテックスは，ロッ
クしたのと逆の順序でロック解除される．
ミューテックス機能に関連するカーネル構成マクロは次の通り．
TNUM̲MTXID

登録できるミューテックスの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたミューテックスの数に一致）【使用上の注意】
優先度上限プロトコルには，(a) 優先度の低いタスクの排他制御区間に最大1回しかブロックされない，(b) タスクの実行が開始される優先度の低いタスクにブロックされないという利点があるが，これは，タスク間の同期に優先度上限
ミューテックスのみを用い，他の方法でタスクのスケジューリングに関与しない場合に得られる利点である．
これらの利点を得るためには，タスクの優先順位の回転やディスパッチの禁止を行ってはならないことに加えて，優先度上限ミューテックスをロックしたタ
スクを待ち状態にしてはならない．特に，優先度上限ミューテックスに対して，タスクがロック待ち状態になる状況に注意が必要である（優先度上限プロトコ
ルでは，タスクがミューテックスのロック待ち状態になることはない）．
例えば，着目するタスクAと，タスクAよりベース優先度の低いタスクBとタスク
C，タスクAよりも高い上限優先度を持った優先度上限ミューテックスがある場合を考える．タスクAがミューテックスをロックし，タスクBとタスクCがミュー
テックスを待っている状況で，タスクAがミューテックスをロック解除すると，タスクBがミューテックスをロックして優先度が上がり，タスクBに切り換わる．
さらにタスクBがミューテックスをロック解除すると，タスクCがミューテック
スをロックして優先度が上がり，タスクCに切り換わる．タスクAが実行される

ngki̲spec‑120.txt

page 145のは，タスクCがミューテックスをロック解除した後である．この例では，タス
クAが実行開始後に，タスクBとタスクCの排他制御区間にブロックされることになる．
優先度上限ミューテックスに対してタスクがロック待ち状態になる状況を回避するためには，優先度上限ミューテックスをロックする場合に，待ち状態にならないploc̲mtxを用いるのが安全である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ミューテックス機能をサポートしない．ただし，ミューテッ
クス機能拡張パッケージを用いると，ミューテックス機能を追加することができる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ミューテックス機能をサポートしない．
【未決定事項】
マルチプロセッサにおいては，タスク間の同期に優先度上限ミューテックスのみを用い，他の方法でタスクのスケジューリングに関与しない場合でも，優先度上限ミューテックスに対してタスクがロック待ち状態になる．マルチプロセッ
サ対応カーネルにおける優先度上限ミューテックスの扱いについては，今後の課題である．
【μITRON4.0仕様との関係】
μITRON4.0仕様の厳密な優先度制御規則を採用し，簡略化した優先度制御規則
はサポートしていない．また，μITRON4.0仕様でサポートしている優先度継承
プロトコル（priority inheritance protocol）は，現時点ではサポートしていない．
ミューテックス機能によりタスクの現在優先度が変化する場合の振舞いは，
μITRON4.0仕様では実装依存となっているが，この仕様では規定している．
TNUM̲MTXIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲MTX
ミューテックスの生成〔S〕
acre̲mtx
ミューテックスの生成〔TD〕【静的API】
CRE̲MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })【C言語API】
ER̲ID mtxid = acre̲mtx(const T̲CMTX *pk̲cmtx)【パラメータ】
ID

mtxid

T̲CMTX *pk̲cmtx

生成するミューテックスのID番号（CRE̲MTXの場合）
ミューテックスの生成情報を入れたパケット
へのポインタ（静的APIを除く）＊ミューテックスの生成情報（パケットの内容）
ATR
mtxatr
ミューテックス属性
PRI
ceilpri
ミューテックスの上限優先度

ngki̲spec‑120.txt

page 146【リターンパラメータ】
ER̲ID
mtxid

【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲OBJ

生成されたミューテックスのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（mtxatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（ceilpriが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cmtxが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるミューテックスIDがない）
オブジェクト状態エラー（mtxidで指定したミューテック
スが登録済み：CRE̲MTXの場合）【機能】各パラメータで指定したミューテックス生成情報に従って，ミューテックスを生成する．生成されたミューテックスのロック状態はロックされていない状態に，待ち行列は空の状態に初期化される．
静的APIにおいては，mtxidはオブジェクト識別名，ceilpriは整数定数式パラメー
タである．優先度上限ミューテックス以外の場合には，ceilpriの指定を省略することができる．
優先度上限ミューテックスを生成する場合，ceilpriは，TMIN̲TPRI以上，
TMAX̲TPRI以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルのミューテックス機能拡張パッケージでは，CRE̲MTXのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲MTX
割付け可能なミューテックスIDの数の指定〔SD〕【静的API】
AID̲MTX(uint̲t nomtx)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nomtx

割付け可能なミューテックスIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nomtxで指定した数のミューテックスIDを，ミューテックスを生成するサービス
コールによって割付け可能なミューテックスIDとして確保する．
nomtxは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲MTX
ミューテックスのアクセス許可ベクタの設定〔SP〕
sac̲mtx
ミューテックスのアクセス許可ベクタの設定〔TPD〕【静的API】

ngki̲spec‑120.txt

page 147

SAC̲MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲mtx(ID mtxid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

mtxid
p̲acvct

対象ミューテックスのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲ID
E̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（属する保護ドメインかクラスが不正：SAC̲MTXの場合）
不正ID番号（mtxidが不正）
オブジェクト未登録（対象ミューテックスが未登録）
オブジェクトアクセス違反（対象ミューテックスに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象ミューテックスは静的APIで生成された：sac̲mtxの場合，対象ミューテックスに対してアクセス許可ベクタが設定済み：SAC̲MTXの場合）【機能】
mtxidで指定したミューテックス（対象ミューテックス）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，mtxidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲MTXは，対象ミューテックスが属する保護ドメインの囲みの中に記述しなけ
ればならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルのミューテックス機能拡張パッケージでは，SAC̲MTX，sac̲mtxをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲mtx
ミューテックスの削除〔TD〕【C言語API】
ER ercd = del̲mtx(ID mtxid)【パラメータ】
ID

mtxid

対象ミューテックスのID番号

ngki̲spec‑120.txt

page 148【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mtxidが不正）
オブジェクト未登録（対象ミューテックスが未登録）
オブジェクトアクセス違反（対象ミューテックスに対する管理操作が許可されていない）
オブジェクト状態エラー（対象ミューテックスは静的APIで生成された）【機能】
mtxidで指定したミューテックス（対象ミューテックス）を削除する．具体的な振舞いは以下の通り．
対象ミューテックスの登録が解除され，そのミューテックスIDが未使用の状態に戻される．対象ミューテックスをロックしているタスクがある場合には，そのタスクがロックしているミューテックスのリストから対象ミューテックスが削除され，必要な場合にはそのタスクの現在優先度が変更される．また，対象
ミューテックスの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービ
スコールからE̲DLTエラーが返る．
【使用上の注意】
対象ミューテックスをロックしているタスクには，ミューテックスが削除されたことが通知されず，そのミューテックスをロック解除する時点でエラーとなる．これが不都合な場合には，ミューテックスをロックした状態で，ミューテッ
クスを削除すればよい．
del̲mtxにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルのミューテックス機能拡張パッケージでは，del̲mtxをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
loc̲mtx
ミューテックスのロック〔T〕
ploc̲mtx
ミューテックスのロック（ポーリング）〔T〕
tloc̲mtx
ミューテックスのロック（タイムアウト付き）〔T〕【C言語API】
ER ercd = loc̲mtx(ID mtxid)
ER ercd = ploc̲mtx(ID mtxid)
ER ercd = tloc̲mtx(ID mtxid, TMO tmout)【パラメータ】
ID
TMO

mtxid
tmout

【リターンパラメータ】

対象ミューテックスのID番号
タイムアウト時間（twai̲mtxの場合）

ngki̲spec‑120.txt
ER【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲ILUSEE̲TMOUTE̲RLWAIE̲DLT

page 149

ercd

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：pol̲mtxを除く）
不正ID番号（mtxidが不正）
パラメータエラー（tmoutが不正：twai̲mtxの場合）
オブジェクト未登録（対象ミューテックスが未登録）
オブジェクトアクセス違反（対象ミューテックスに対する通常操作1が許可されていない）
サービスコール不正使用（対象ミューテックスを自タス
クがロックしている，対象優先度上限ミューテックスの上限優先度より自タスクのベース優先度が高い）
ポーリング失敗またはタイムアウト（wai̲mtxを除く）
待ち禁止状態または待ち状態の強制解除（pol̲mtxを除く）
待ちオブジェクトの削除または再初期化（pol̲mtxを除く）【機能】
mtxidで指定したミューテックス（対象ミューテックス）をロックする．具体的な振舞いは以下の通り．
対象ミューテックスがロックされていない場合には，自タスクによってロックされている状態になる．自タスクがロックしているミューテックスのリストに対象ミューテックスが追加され，必要な場合には自タスクの現在優先度が変更
される．
対象ミューテックスが自タスク以外のタスクによってロックされている場合には，自タスクはミューテックスのロック待ち状態となり，対象ミューテックスの待ち行列につながれる．
対象ミューテックスが自タスクによってロックされている場合には，E̲ILUSEエラーとなる．また，対象ミューテックスが優先度上限ミューテックスで，その上限優先度より自タスクのベース優先度が高い場合にも，E̲ILUSEエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
unl̲mtx
ミューテックスのロック解除〔T〕【C言語API】
ER ercd = unl̲mtx(ID mtxid)【パラメータ】
ID

mtxid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲ILUSE

対象ミューテックスのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mtxidが不正）
オブジェクト未登録（対象ミューテックスが未登録）
サービスコール不正使用（対象ミューテックスを自タス
クがロックしていない）【機能】
mtxidで指定したミューテックス（対象ミューテックス）をロック解除する．具ngki̲spec‑120.txt

page 150

体的な振舞いは以下の通り．
まず，自タスクがロックしているミューテックスのリストから対象ミューテッ
クスが削除され，必要な場合には自タスクの現在優先度が変更される．
対象ミューテックスの待ち行列にタスクが存在する場合には，待ち行列の先頭のタスクが待ち解除される．対象ミューテックスは，待ち解除されたタスクによってロックされている状態になる．待ち解除されたタスクがロックしている
ミューテックスのリストに対象ミューテックスが追加され，必要な場合にはそのタスクの現在優先度が変更される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
待ち行列にタスクが存在しない場合には，対象ミューテックスはロックされていない状態になる．
対象ミューテックスが自タスクによってロックされていない場合には，
E̲ILUSEエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲mtx
ミューテックスの初期化〔T〕【C言語API】
ER ercd = ini̲mtx(ID mtxid)【パラメータ】
ID

mtxid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象ミューテックスのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mtxidが不正）
オブジェクト未登録（対象ミューテックスが未登録）
オブジェクトアクセス違反（対象ミューテックスに対する管理操作が許可されていない）【機能】
mtxidで指定したミューテックス（対象ミューテックス）を再初期化する．具体的な振舞いは以下の通り．
対象ミューテックスのロック状態は，ロックされていない状態に初期化される．
対象ミューテックスをロックしているタスクがある場合には，そのタスクがロックしているミューテックスのリストから対象ミューテックスが削除され，必要な場合にはそのタスクの現在優先度が変更される．また，対象ミューテックスの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールから
E̲DLTエラーが返る．
【使用上の注意】
対象ミューテックスをロックしているタスクには，ミューテックスが再初期化されたことが通知されず，そのミューテックスをロック解除する時点でエラーとなる．これが不都合な場合には，ミューテックスをロックした状態で，ミューテックスを再初期化すればよい．
ini̲mtxにより複数のタスクが待ち解除される場合，サービスコールの処理時間

ngki̲spec‑120.txt

page 151

およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
ミューテックスを再初期化した場合に，アプリケーションとの整合性を保つのは，アプリケーションの責任である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲mtx
ミューテックスの状態参照〔T〕【C言語API】
ER ercd = ref̲mtx(ID mtxid, T̲RMTX *pk̲rmtx)【パラメータ】
ID
T̲RMTX *mtxidpk̲rmtx【リターンパラメータ】
ER
ercd

対象ミューテックスのID番号
ミューテックスの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊ミューテックスの現在状態（パケットの内容）
ID
htskidミューテックスをロックしているタスクのID番号ID
wtskidミューテックスの待ち行列の先頭のタスクのID
番号【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mtxidが不正）
オブジェクト未登録（対象ミューテックスが未登録）
オブジェクトアクセス違反（対象ミューテックスに対す
る参照操作が許可されていない）
メモリアクセス違反（pk̲rmtxが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
mtxidで指定したミューテックス（対象ミューテックス）の現在状態を参照する．
参照した現在状態は，pk̲rmtxで指定したパケットに返される．
対象ミューテックスがロックされていない場合，htskidにはTSK̲NONE（＝0）が返る．
対象ミューテックスの待ち行列にタスクが存在しない場合，wtskidには
TSK̲NONE（＝0）が返る．
【使用上の注意】ref̲mtxはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲mtxを呼び出し，対象ミューテックスの現在状態を参照した
直後に割込みが発生した場合，ref̲mtxから戻ってきた時には対象ミューテック
スの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑120.txt

page 152

4.4.7 メッセージバッファ☆未完成
4.4.8 スピンロック
スピンロックは，マルチプロセッサ対応カーネルにおいて，割込みのマスクとプロセッサ間ロックの取得により，排他制御を行うための同期・通信オブジェクトである．スピンロックは，スピンロックIDと呼ぶID番号によって識別する．
プロセッサ間ロックを取得している間は，CPUロック状態にすることですべてのカーネル管理の割込みがマスクされ，ディスパッチが保留される．ロックが他のプロセッサに取得されている場合には，ロックが取得できるまでループによって待つ．ロックの取得を待つ間は，割込みはマスクされない．プロセッサ間ロックを取得し割込みをマスクすることを，スピンロックを取得するという．また，プロセッサ間ロックを返却し割込みをマスク解除することを，スピンロックを返却するという．
タスクが取得したスピンロックを返却せずに終了した場合や，タスク例外処理
ルーチン，割込みハンドラ，割込みサービスルーチン，タイムイベントハンドラが取得したスピンロックを返却せずにリターンした場合には，カーネルによってスピンロックが返却される．また，スピンロックを取得していない状態で発生したCPU例外によって呼び出されたCPU例外ハンドラが，取得したスピンロッ
クを返却せずにリターンした場合には，カーネルによってスピンロックが返却される．一方，拡張サービスコールからのリターンでは，スピンロックは返却されない．
各スピンロックが持つ情報は次の通り．
・スピンロック属性
・ロック状態（取得されている状態と取得されていない状態）
・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス
スピンロック属性に指定できる属性はない．そのためスピンロック属性には，
TA̲NULLを指定しなければならない．
スピンロック機能に関連するカーネル構成マクロは次の通り．
TNUM̲SPNID

登録できるスピンロックの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたスピンロックの数に一致）【補足説明】
CPUロック状態では，スピンロックを取得するサービスコールを呼び出すことができないため，スピンロックを取得しているプロセッサが，さらにスピンロックを取得することはできない．そのため，1つの処理単位が，複数のスピンロックを取得した状態になることはできない．
スピンロックを取得した状態でCPU例外が発生した場合，起動されるCPU例外ハ
ンドラはカーネル管理外のCPU例外ハンドラであり（xsns̲dpn，xsns̲xpnともtrueを返す），CPU例外ハンドラ中でiunl̲spnを呼び出してスピンロックを返却しようとした場合の動作は保証されない．保証されないにも関わらずiunl̲spnを呼び出した場合には，CPU例外ハンドラからのリターン時に元の状態に戻らない．これは，CPUロック状態の扱いと一貫していないため，注意が必要である．

ngki̲spec‑120.txt

page 153【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，スピンロック機能をサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，スピンロック機能をサポートする．
【μITRON4.0仕様との関係】
スピンロック機能は，μITRON4.0仕様に定義されていない機能である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲SPN
スピンロックの生成〔SM〕
acre̲spn
スピンロックの生成〔TMD〕【静的API】
CRE̲SPN(ID spnid, { ATR spnatr })【C言語API】
ER̲ID spnid = acre̲spn(const T̲CSPN *pk̲cspn)【パラメータ】
ID
T̲CSPN *spnidpk̲cspn生成するスピンロックのID番号（CRE̲SPNの場合）
スピンロックの生成情報を入れたパケットへのポインタ（静的APIを除く）＊スピンロックの生成情報（パケットの内容）
ATR
spnatr
スピンロック属性【リターンパラメータ】
ER̲ID
spnid

【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲NORESE̲OBJ

生成されたスピンロックのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（spnatrが不正または使用できない，属する保護ドメインかクラスが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cspnが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるスピンロックIDがない）
資源不足（スピンロックを実現するためのハードウェア
資源がない：CRE̲SPNの場合）
オブジェクト状態エラー（spnidで指定したスピンロックが登録済み：CRE̲SPNの場合）【機能】
各パラメータで指定したスピンロック生成情報に従って，スピンロックを生成する．生成されたスピンロックのロック状態は，取得されていない状態に初期化される．
静的APIにおいては，spnidはオブジェクト識別名である．
スピンロックをハードウェアによって実現している場合には，ターゲット定義
で，生成できるスピンロックの数に上限がある．この上限を超えてスピンロッngki̲spec‑120.txt

page 154

クを生成しようとした場合には，E̲NORESエラーとなる．
【補足説明】
スピンロックを動的に生成する場合に，生成できるスピンロックの数の上限は
AID̲SPNによってチェックされるため，acre̲spnでE̲NORESエラーが返ることはない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲SPNのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
AID̲SPN
割付け可能なスピンロックIDの数の指定〔SMD〕【静的API】
AID̲SPN(uint̲t nospn)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nospn

割付け可能なスピンロックIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nospnで指定した数のスピンロックIDを，スピンロックを生成するサービスコー
ルによって割付け可能なスピンロックIDとして確保する．
nospnは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲SPN
スピンロックのアクセス許可ベクタの設定〔SPM〕
sac̲spn
スピンロックのアクセス許可ベクタの設定〔TPMD〕【静的API】
SAC̲SPN(ID spnid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲spn(ID spnid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

spnidp̲acvct

対象スピンロックのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）ngki̲spec‑120.txt
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

page 155
予約属性（属する保護ドメインかクラスが不正：SAC̲SPNの場合）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象スピンロックは静的APIで生成された：sac̲spnの場合，対象スピンロックに対してアクセス許可ベクタが設定済み：SAC̲SPNの場合）【機能】
spnidで指定したスピンロック（対象スピンロック）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，spnidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲SPNは，対象スピンロックが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲SPN，sac̲spnをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲spn
スピンロックの削除〔TMD〕【C言語API】
ER ercd = del̲spn(ID spnid)【パラメータ】
ID

spnid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象スピンロックのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する管理操作が許可されていない）
オブジェクト状態エラー（対象スピンロックは静的APIで生成された）【機能】
spnidで指定したスピンロック（対象スピンロック）を削除する．具体的な振舞
いは以下の通り．
対象スピンロックの登録が解除され，そのスピンロックIDが未使用の状態に戻される．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲spnをサポートしない．

ngki̲spec‑120.txt

page 156【未決定事項】
対象スピンロックが取得されている状態の場合の振舞いは，今後の課題である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
loc̲spn
スピンロックの取得〔TM〕
iloc̲spn
スピンロックの取得〔IM〕【C言語API】
ER ercd = loc̲spn(ID spnid)
ER ercd = iloc̲spn(ID spnid)【パラメータ】
ID

spnid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象スピンロックのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：loc̲spnの場合，タスクコンテキストからの呼出し：
iloc̲spnの場合，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する
通常操作1が許可されていない：loc̲spnの場合）【機能】
spnidで指定したスピンロック（対象スピンロック）を取得する．具体的な振舞
いは以下の通り．
対象スピンロックが取得されていない状態である場合には，プロセッサ間ロックの取得を試みる．ロックが他のプロセッサによって取得されている状態である場合や，他のプロセッサがロックの取得に成功した場合には，ロックが返却されるまでループによって待ち，返却されたらロックの取得を試みる．これを，ロックの取得に成功するまで繰り返す．
ロックの取得に成功した場合には，スピンロックは取得されている状態になる．
また，CPUロックフラグをセットしてCPUロック状態へ遷移し，サービスコール
からリターンする．
なお，複数のプロセッサがロックの取得を待っている時に，どのプロセッサが最初にロックを取得できるかは，現時点ではターゲット定義とする．
【補足説明】
対象スピンロックが，loc̲spn／iloc̲spnを呼び出したプロセッサによって取得されている状態である場合には，スピンロックの取得によりCPUロック状態になっているため，loc̲spn／iloc̲spnはE̲CTXエラーとなる．
プロセッサがロックを取得できる順序を，現時点ではターゲット定義としたが，リアルタイム性保証のためには，（ロックの取得待ちの間に割込みが発生しな
い限りは）loc̲spn／iloc̲spnを呼び出した順序でロックを取得できるとするのが望ましい．ただし，ターゲットハードウェアの制限で，そのような実装ができるとは限らないため，現時点ではターゲット定義としている．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
try̲spn
スピンロックの取得（ポーリング）〔TM〕

ngki̲spec‑120.txt
itry̲spn

page 157

スピンロックの取得（ポーリング）〔IM〕【C言語API】
ER ercd = try̲spn(ID spnid)
ER ercd = itry̲spn(ID spnid)【パラメータ】
ID

spnid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象スピンロックのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：try̲spnの場合，タスクコンテキストからの呼出し：itry̲spnの場合，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する
通常操作1が許可されていない：try̲spnの場合）
オブジェクト状態エラー（対象スピンロックが取得されている状態）【機能】
spnidで指定したスピンロック（対象スピンロック）の取得を試みる．具体的な振舞いは以下の通り．
対象スピンロックが取得されていない状態である場合には，プロセッサ間ロックの取得を試みる．ロックの取得に成功した場合には，スピンロックは取得されている状態になる．また，CPUロックフラグをセットしてCPUロック状態へ遷
移し，サービスコールからリターンする．
対象スピンロックが他のプロセッサによって取得されている状態である場合や，ロックの取得に失敗した場合（他のプロセッサがロックの取得に成功した場合）には，E̲OBJエラーとする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
unl̲spn
スピンロックの返却〔TM〕
iunl̲spn
スピンロックの返却〔IM〕【C言語API】
ER ercd = unl̲spn(ID spnid)
ER ercd = iunl̲spn(ID spnid)【パラメータ】
ID

spnid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象スピンロックのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：unl̲spnの場合，タスクコンテキストからの呼出し：
iunl̲spnの場合）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する
通常操作1が許可されていない：unl̲spnの場合）

ngki̲spec‑120.txt
E̲ILUSE

page 158
サービスコール不正使用（対象スピンロックをロックし
ていない）

【機能】
spnidで指定したスピンロック（対象スピンロック）を返却する．具体的な振舞
いは以下の通り．
対象スピンロックが，unl̲spn／iunl̲spnを呼び出したプロセッサによって取得されている状態である場合には，ロックを返却し，スピンロックを取得されていない状態とする．また，CPUロックフラグをクリアし，CPUロック解除状態へ遷移する．
対象スピンロックが，取得されていない状態である場合や，他のプロセッサによって取得されている状態である場合には，E̲ILUSEエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲spn
スピンロックの状態参照〔TM〕【C言語API】
ER ercd = ref̲spn(ID spnid, T̲RSPN *pk̲rspn)【パラメータ】
ID
T̲RSPN *spnidpk̲rspn【リターンパラメータ】
ER
ercd

対象スピンロックのID番号
スピンロックの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊スピンロックの現在状態（パケットの内容）
STAT
spnstat
ロック状態【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する
参照操作が許可されていない）
メモリアクセス違反（pk̲rspnが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
spnidで指定したスピンロック（対象スピンロック）の現在状態を参照する．参
照した現在状態は，pk̲rspnで指定したパケットに返される．
spnstatには，対象スピンロックの現在のロック状態を表す次のいずれかの値が返される．
TSPN̲UNL
TSPN̲LOC

0x01U
0x02U

取得されていない状態
取得されている状態【使用上の注意】ref̲spnはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲spnを呼び出し，対象スピンロックの現在状態を参照した直後に割込みが発生した場合，ref̲spnから戻ってきた時には対象スピンロックのngki̲spec‑120.txt

page 159

状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.5 メモリプール管理機能【μITRON4.0仕様との関係】
この仕様では，可変長メモリプール機能はサポートしないこととした．
【仕様決定の理由】
可変長メモリプール機能をサポートしないこととしたのは，メモリ割付けの処
理時間とフラグメンテーションの発生を考えると，最適なメモリ管理アルゴリ
ズムはアプリケーション依存となるため，カーネル内で実現するより，ライブ
ラリとして実現する方が適切と考えたためである．
4.5.1 固定長メモリプール
固定長メモリプールは，生成時に決めたサイズのメモリブロック（固定長メモ
リブロック）を動的に獲得・返却するための同期・通信オブジェクトである．
固定長メモリプールは，固定長メモリプールIDと呼ぶID番号で識別する．
各固定長メモリプールが持つ情報は次の通り．
・固定長メモリプール属性
・待ち行列（固定長メモリブロックの獲得待ち状態のタスクのキュー）
・固定長メモリプール領域
・固定長メモリプール管理領域
・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
待ち行列は，固定長メモリブロックが獲得できるまで待っている状態（固定長
メモリブロックの獲得待ち状態）のタスクが，固定長メモリブロックを獲得できる順序でつながれているキューである．
固定長メモリプール領域は，その中から固定長メモリブロックを割り付けるた
めのメモリ領域である．
固定長メモリプール管理領域は，固定長メモリプール領域中の割当て済みの固定長メモリブロックと未割当てのメモリ領域に関する情報を格納しておくためのメモリ領域である．
保護機能対応カーネルにおいて，固定長メモリプール管理領域は，カーネルの用いるオブジェクト管理領域として扱われる．
固定長メモリプール属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

待ち行列をタスクの優先度順にする

TA̲TPRIを指定しない場合，待ち行列はFIFO順になる．
固定長メモリプール機能に関連するカーネル構成マクロは次の通り．
TNUM̲MPFID

登録できる固定長メモリプールの数（動的生成対応でない
カーネルでは，静的APIによって登録された固定長メモリ
プールの数に一致）ngki̲spec‑120.txt

page 160【μITRON4.0仕様との関係】
固定長メモリプール領域として確保すべき領域のサイズを返すカーネル構成マクロ（TSZ̲MPF）は廃止した．これは，固定長メモリプール領域を確保する方法を定めたことに加えて，サイズが必要な場合には，((blkcnt) *ROUND̲MPF̲T(blksz))で求めることができるためである．
TNUM̲MPFIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲MPF
固定長メモリプールの生成〔S〕
acre̲mpf
固定長メモリプールの生成〔TD〕【静的API】
CRE̲MPF(ID mpfid, { ATR mpfatr, uint̲t blkcnt, uint̲t blksz,
MPF̲T *mpf, void *mpfmb })【C言語API】
ER̲ID mpfid = acre̲mpf(const T̲CMPF *pk̲cmpf)【パラメータ】
ID

mpfid

T̲CMPF *pk̲cmpf生成する固定長メモリプールのID番号（CRE̲MPFの場合）
固定長メモリプールの生成情報を入れたパケッ
トへのポインタ（静的APIを除く）＊固定長メモリプールの生成情報（パケットの内容）
ATR
mpfatr
固定長メモリプール属性
uint̲tblkcnt獲得できる固定長メモリブロックの数
uint̲tblksz
固定長メモリブロックのサイズ（バイト数）
MPF̲T *
mpf
固定長メモリプール領域の先頭番地
void *
mpfmb
固定長メモリプール管理領域の先頭番地【リターンパラメータ】
ER̲ID
mpfid

【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲NOSPT
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲NOMEM
E̲OBJ

生成された固定長メモリプールのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（mpfatrが不正または使用できない，属する保護ドメインかクラスが不正）未サポート機能（mpfmbがサポートされていない値）
パラメータエラー（blkcnt，blksz，mpf，mpfmbが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cmpfが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられる固定長メモリプールIDがない）
メモリ不足（固定長メモリプール領域や固定長メモリプー
ル管理領域が確保できない）
オブジェクト状態エラー（mpfidで指定した固定長メモリ
プールが登録済み：CRE̲MPFの場合）【機能】各パラメータで指定した固定長メモリプール生成情報に従って，固定長メモリ
プールを生成する．mpf，blkcnt，blkszから固定長メモリプール領域が，ngki̲spec‑120.txt

page 161

mpfmb，blkcnt，blkszから固定長メモリプール管理領域がそれぞれ設定され，メモリプール領域全体が未割当ての状態に初期化される．また，待ち行列は空の状態に初期化される．
静的APIにおいては，mpfidはオブジェクト識別名，blkcntとblkszは整数定数式
パラメータ，mpfとmpfmbは一般定数式パラメータである．コンフィギュレータ
は，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
mpfをNULLとした場合，blkcntとblkszから決まるサイズの固定長メモリプール
領域が，コンフィギュレータまたはカーネルにより確保される．
固定長メモリプール領域をアプリケーションで確保する場合には，blkcntとblkszから決まるサイズの固定長メモリプール領域を確保し，mpfにその先頭番地を指定する．固定長メモリプール領域をアプリケーションで確保するために，
次のデータ型とマクロを用意している．
MPF̲T

固定長メモリプール領域を確保するためのデータ型

COUNT̲MPF̲T(blksz)

固定長メモリブロックのサイズがblkszの固定長メモ
リプール領域を確保するために，固定長メモリブロッ
ク1つあたりに必要なMPF̲T型の配列の要素数を求めるマクロ
要素数COUNT̲MPF̲T(blksz)のMPF̲T型の配列のサイズ（blkszを，MPF̲T型のサイズの倍数になるように大きい方に丸めた値）

ROUND̲MPF̲T(blksz)

これらを用いて固定長メモリプール領域を確保する方法は次の通り．
MPF̲T<固定長メモリプール領域の変数名>[(blkcnt) * COUNT̲MPF̲T(blksz)];

この時，mpfには<固定長メモリプール領域の変数名>を指定する．
これ以外の方法で固定長メモリプール領域を確保する場合には，先頭番地がター
ゲット定義の制約に合致しており，上記の配列と同じサイズのメモリ領域を確保しなければならない．mpfにターゲット定義の制約に合致しない先頭番地を指定した時には，E̲PARエラーとなる．
保護機能対応カーネルでmpfをNULLとした場合には，固定長メモリプールと同じ保護ドメインに属し，固定長メモリプールと同じアクセス許可ベクタを持った
メモリオブジェクトの中に，固定長メモリプール領域が確保される．
mpfmbをNULLとした場合，blkcntとblkszの指定に合致したサイズのデータキュー
管理領域を，コンフィギュレータまたはカーネルが確保する．
blkcntとblkszは，0より大きい値でなければならない．
【補足説明】
保護機能対応カーネルにおいて，固定長メモリプール領域をアプリケーションで確保する場合には，固定長メモリプール領域が属する保護ドメインとアクセス権の設定は変更されない．これらを適切に設定することは，アプリケーションの責任である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲MPFのみをサポートする．また，mpfmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．

ngki̲spec‑120.txt

page 162【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲MPFのみをサポートする．また，mpfmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【未決定事項】
mpfmbがNULLでない場合に，固定長メモリプール管理領域をアプリケーションで確保する方法については，今後の課題である．
【μITRON4.0仕様との関係】
μITRON4.0/PX仕様にあわせて，固定長メモリプール生成情報に，mpfmb（固定長メモリプール管理領域の先頭番地）を追加した．また，mpfのデータ型を
MPF̲T *に変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲MPF
割付け可能な固定長メモリプールIDの数の指定〔SD〕【静的API】
AID̲MPF(uint̲t nompf)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nompf

割付け可能な固定長メモリプールIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nompfで指定した数の固定長メモリプールIDを，固定長メモリプールを生成する
サービスコールによって割付け可能な固定長メモリプールIDとして確保する．
nompfは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲MPF
固定長メモリプールのアクセス許可ベクタの設定〔SP〕
sac̲mpf
固定長メモリプールのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲MPF(ID mpfid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲mpf(ID mpfid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

mpfid
p̲acvct

対象固定長メモリプールのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd

正常終了（E̲OK）またはエラーコード

ngki̲spec‑120.txt【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

page 163

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mpfidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲MPFの場合）
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象固定長メモリプールは静的APIで生成された：sac̲mpfの場合，対象固定長メモリ
プールに対してアクセス許可ベクタが設定済み：SAC̲MPF
の場合）

【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．対象固定長メモリプールの固定長メモリプール領域がコンフィギュ
レータまたはカーネルにより確保されたものである場合には，固定長メモリプー
ル領域のアクセス許可ベクタも，各パラメータで指定した値に設定する．
静的APIにおいては，mpfidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲MPFは，対象固定長メモリプールが属する保護ドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲MPF，sac̲mpfをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲MPF，sac̲mpfをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲mpf
固定長メモリプールの削除〔TD〕【C言語API】
ER ercd = del̲mpf(ID mpfid)【パラメータ】
ID

mpfid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象固定長メモリプールのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mpfidが不正）
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する管理操作が許可されていない）
オブジェクト状態エラー（対象固定長メモリプールは静的APIで生成された）ngki̲spec‑120.txt

page 164【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）を削除する．
具体的な振舞いは以下の通り．
対象固定長メモリプールの登録が解除され，その固定長メモリプールIDが未使用の状態に戻される．また，対象固定長メモリプールの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
【使用上の注意】del̲mpfにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲mpfをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲mpfをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲mpf
固定長メモリブロックの獲得〔T〕
pget̲mpf
固定長メモリブロックの獲得（ポーリング）〔T〕
tget̲mpf
固定長メモリブロックの獲得（タイムアウト付き）〔T〕【C言語API】
ER ercd = get̲mpf(ID mpfid, void **p̲blk)
ER ercd = pget̲mpf(ID mpfid, void **p̲blk)
ER ercd = tget̲mpf(ID mpfid, void **p̲blk, TMO tmout)【パラメータ】
ID
void **
TMO

mpfid
p̲blk
tmout

【リターンパラメータ】
ER
ercd
void *
blk【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲TMOUTE̲RLWAI

対象固定長メモリプールのID番号獲得した固定長メモリブロックの先頭番地を入れるメモリ領域へのポインタ
タイムアウト時間（twai̲mpfの場合）

正常終了（E̲OK）またはエラーコード獲得した固定長メモリブロックの先頭番地

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：pget̲mpfを除く）
不正ID番号（mpfidが不正）
パラメータエラー（tmoutが不正：tget̲mpfの場合）
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する通常操作2が許可されていない）
メモリアクセス違反（p̲blkが指すメモリ領域への読出し
アクセスが許可されていない）
ポーリング失敗またはタイムアウト（get̲mpfを除く）
待ち禁止状態または待ち状態の強制解除（pget̲mpfを除ngki̲spec‑120.txt

E̲DLT

page 165く）
待ちオブジェクトの削除または再初期化（pget̲mpfを除く）【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）から固定長メ
モリブロックを獲得し，その先頭番地をblkに返す．具体的な振舞いは以下の通り．
対象固定長メモリプールの固定長メモリプール領域の中に，固定長メモリブロッ
クを割り付けることのできる未割当てのメモリ領域がある場合には，固定長メ
モリブロックが1つ割り付けられ，その先頭番地がblkに返される．
未割当てのメモリ領域がない場合には，自タスクは固定長メモリプールの獲得待ち状態となり，対象固定長メモリプールの待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rel̲mpf
固定長メモリブロックの返却〔T〕【C言語API】
ER ercd = rel̲mpf(ID mpfid, void *blk)【パラメータ】
ID
void *

mpfid
blk【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕

対象固定長メモリプールのID番号
返却する固定長メモリブロックの先頭番地正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mpfidが不正）
パラメータエラー（blkが不正）オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する通常操作1が許可されていない）【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）に，blkで指定した固定長メモリブロックを返却する．具体的な振舞いは以下の通り．
対象固定長メモリプールの待ち行列にタスクが存在する場合には，待ち行列の先頭のタスクが，blkで指定した固定長メモリブロックを獲得し，待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
待ち行列にタスクが存在しない場合には，blkで指定した固定長メモリブロック
は，対象固定長メモリプールのメモリプール領域に返却される．
blkが，対象固定長メモリプールから獲得した固定長メモリブロックの先頭番地でない場合には，E̲PARエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲mpf
固定長メモリプールの再初期化〔T〕【C言語API】
ER ercd = ini̲mpf(ID mpfid)

ngki̲spec‑120.txt【パラメータ】
ID

page 166

mpfid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象固定長メモリプールのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mpfidが不正）
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する管理操作が許可されていない）【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）を再初期化す
る．具体的な振舞いは以下の通り．
対象固定長メモリプールのメモリプール領域全体が未割当ての状態に初期化される．また，対象固定長メモリプールの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
【使用上の注意】ini̲mpfにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
固定長メモリプールを再初期化した場合に，アプリケーションとの整合性を保つのは，アプリケーションの責任である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲mpf
固定長メモリプールの状態参照〔T〕【C言語API】
ER ercd = ref̲mpf(ID mpfid, T̲RMPF *pk̲rmpf)【パラメータ】
ID
T̲RMPF *mpfid
pk̲rmpf【リターンパラメータ】
ER
ercd

対象固定長メモリプールのID番号
固定長メモリプールの現在状態を入れるパケッ
トへのポインタ

正常終了（E̲OK）またはエラーコード＊固定長メモリプールの現在状態（パケットの内容）
ID
wtskid
固定長メモリプールの待ち行列の先頭のタスクのID番号
uint̲tfblkcnt
固定長メモリプール領域の空きメモリ領域に割り付けることができる固定長メモリブロックの数

ngki̲spec‑120.txt【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

page 167

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mpfidが不正）
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する参照操作が許可されていない）
メモリアクセス違反（pk̲rmpfが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）の現在状態を参照する．参照した現在状態は，pk̲rmpfで指定したパケットに返される．
対象固定長メモリプールの待ち行列にタスクが存在しない場合，wtskidには
TSK̲NONE（＝0）が返る．
【使用上の注意】ref̲mpfはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲mpfを呼び出し，対象固定長メモリプールの現在状態を参照
した直後に割込みが発生した場合，ref̲mpfから戻ってきた時には対象固定長メ
モリプールの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.6 時間管理機能
4.6.1 システム時刻管理
システム時刻は，カーネルによって管理され，タイムアウト処理，タスクの遅延，周期ハンドラの起動，アラームハンドラの起動に使用される時刻を管理するカーネルオブジェクトである．システム時刻は，符号無しの整数型である
SYSTIM型で表され，単位はミリ秒である．
システム時刻は，カーネルの初期化時に0に初期化される．タイムティックを通知するためのタイマ割込みが発生する毎にカーネルによって更新され，SYSTIM型で表せる最大値（ULONG̲MAX）を超えると0に戻される．タイムティックの周期は，ターゲット定義である．また，システム時刻の精度はターゲットに依存する．
マルチプロセッサ対応でないカーネルと，マルチプロセッサ対応カーネルでグ
ローバルタイマ方式を用いている場合には，システム時刻は，システムに1つのみ存在する．マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には，システム時刻は，プロセッサ毎に存在する．ローカルタイマ方式とグローバルタイマ方式については，「2.3.4 マルチプロセッサ対応」の節を参照すること．
マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には，
タイムアウト処理とタスクの遅延処理には，待ち解除されるタスクが割り付けられているプロセッサのシステム時刻が用いられる．また，周期ハンドラとアラームハンドラの起動には，それが割り付けられているプロセッサのシステム
時刻が用いられる．これらの処理単位がマイグレーションする場合には，用いられるシステム時刻も変更される．この場合にも，イベントの処理が行われるのは，基準時刻から相対時間によって指定した以上の時間が経過した後となるという原則は維持される．

ngki̲spec‑120.txt

page 168

1回のタイムティックの発生により，複数のイベントの処理を行うべき状況になった場合，それらの処理の間の処理順序は規定されない．
性能評価用システム時刻は，性能評価に使用することを目的とした，システム
時刻よりも精度の高い時刻である．性能評価用システム時刻は，符号無しの整数型であるSYSUTM型で表され，単位はマイクロ秒である．ただし，実際の精度はターゲット依存である．
マルチプロセッサ対応カーネルにおける性能評価用システム時刻の扱いは，ター
ゲット定義とする．
システム時刻管理機能に関連するカーネル構成マクロは次の通り．
TIC̲NUME
TIC̲DENO

タイムティックの周期（単位はミリ秒）の分子
タイムティックの周期（単位はミリ秒）の分母

TOPPERS̲SUPPORT̲GET̲UTM

get̲utmがサポートされている【使用上の注意】
タイムティックを通知するためのタイマ割込みが長時間マスクされた場合（タイマ割込みより優先して実行される割込み処理が長時間続けて実行された場合を含む）や，シミュレーション環境においてシミュレータのプロセスが長時間
スケジュールされなかった場合には，システム時刻が正しく更新されない可能性があるため，注意が必要である．
【μITRON4.0仕様との関係】
システム時刻を設定するサービスコール（set̲tim）を廃止した．また，タイム
ティックを供給する機能は，カーネル内に実現することとし，そのためのサービスコール（isig̲tim）は廃止した．
【μITRON4.0/PX仕様との関係】
システム時刻のアクセス許可ベクタは廃止し，システム状態のアクセス許可ベクタで代替することとした．そのため，システム時刻のアクセス許可ベクタを設定する静的API（SAC̲TIM）は廃止した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲tim
システム時刻の参照〔T〕【C言語API】
ER ercd = get̲tim(SYSTIM *p̲systim)【パラメータ】
SYSTIM *p̲systim【リターンパラメータ】
ER
ercd
SYSTIMsystim【エラーコード】
E̲CTX
E̲OACV〔P〕
E̲MACV〔P〕

システム時刻を入れるメモリ領域へのポインタ

正常終了（E̲OK）またはエラーコード
システム時刻の現在値

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクトアクセス違反（システム状態に対する参照
操作が許可されていない）
メモリアクセス違反（p̲systimが指すメモリ領域への書
込みアクセスが許可されていない）

ngki̲spec‑120.txt

page 169【機能】
システム時刻の現在値を参照する．参照したシステム時刻は，p̲systimで指定したメモリ領域に返される．
マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には，自タスクが割り付けられているプロセッサのシステム時刻の現在値を参照する．
【補足説明】
マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合に，他のプロセッサのシステム時刻の現在値を参照する機能は用意していない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲utm
性能評価用システム時刻の参照〔TI〕【C言語API】
ER ercd = get̲utm(SYSUTM *p̲sysutm)【パラメータ】
SYSUTM *p̲sysutm【リターンパラメータ】
ER
ercd
SYSUTMsysutm【エラーコード】
E̲NOSPT
E̲MACV〔P〕

性能評価用システム時刻を入れるメモリ領域へのポインタ

正常終了（E̲OK）またはエラーコード
性能評価用システム時刻の現在値

未サポート機能（get̲utmがサポートされていない）
メモリアクセス違反（p̲sysutmが指すメモリ領域へ書込
みアクセスが許可されていない）【機能】
性能評価用システム時刻の現在値を参照する．参照した性能評価用システム時
刻は，p̲sysutmで指定したメモリ領域に返される．
get̲utmは，任意の状態から呼び出すことができる．タスクコンテキストからも非タスクコンテキストからも呼び出すことができるし，CPUロック状態であっても呼び出すことができる．
ターゲット定義で，get̲utmがサポートされていない場合がある．get̲utmがサポートされている場合には，TOPPERS̲SUPPORT̲GET̲UTMがマクロ定義される．サ
ポートされていない場合にget̲utmを呼び出すと，E̲NOSPTエラーが返るか，リ
ンク時にエラーとなる．
【使用方法】
get̲utmを使用してプログラムの処理時間を計測する場合には，次の手順を取る．
処理時間を計測したいプログラムの実行直前と実行直後に，get̲utmを用いて性能評価用システム時刻を読み出す．その差を求めることで，対象プログラムの処理時間に，get̲utm自身の処理時間を加えたものが得られる．
マルチプロセッサ対応カーネルにおいては，異なるプロセッサで読み出した性
能評価用システム時刻の差を求めることで，処理時間が正しく計測できるとは限らない．
【使用上の注意】ngki̲spec‑120.txt

page 170

get̲utmは性能評価のための機能であり，その他の目的に使用することは推奨しない．
システム時刻が正しく更新されない状況では，get̲utmは誤った性能評価用シス
テム時刻を返す可能性がある．システム時刻の更新が確実に行われることを保証できない場合には，get̲utmが誤った性能評価用システム時刻を返す可能性を考慮に入れて使用しなければならない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.6.2 周期ハンドラ
周期ハンドラは，指定した周期で起動されるタイムイベントハンドラである．
周期ハンドラは，周期ハンドラIDと呼ぶID番号によって識別する．
各周期ハンドラが持つ情報は次の通り．
・周期ハンドラ属性
・周期ハンドラの動作状態
・次に周期ハンドラを起動する時刻
・拡張情報
・周期ハンドラの先頭番地
・起動周期
・起動位相
・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）
周期ハンドラの起動時刻は，後述する基準時刻から，以下の式で求められる相対時間後である．
起動位相＋起動周期×(n−1)

n＝1,2,…

周期ハンドラの動作状態は，動作している状態と動作していない状態のいずれかをとる．周期ハンドラを動作している状態にすることを動作開始，動作していない状態にすることを動作停止という．
周期ハンドラが動作している状態の場合には，周期ハンドラを起動する時刻になると，周期ハンドラの起動処理が行われる．具体的には，拡張情報をパラメータとして，周期ハンドラが呼び出される．
保護機能対応カーネルにおいて，周期ハンドラが属することのできる保護ドメ
インは，カーネルドメインに限られる．
周期ハンドラ属性には，次の属性を指定することができる．
TA̲STATA̲PHS

0x02U
0x04U

周期ハンドラの生成時に周期ハンドラを動作開始する
周期ハンドラを生成した時刻を基準時刻とする

TA̲STAを指定しない場合，周期ハンドラの生成直後には，周期ハンドラは動作していない状態となる．
TA̲PHSを指定しない場合には，周期ハンドラを動作開始した時刻が，周期ハンドラを起動する時刻の基準時刻となる．TA̲PHSを指定した場合には，周期ハンドラを生成した時刻（静的APIで生成した場合にはカーネルの起動時刻）が，基ngki̲spec‑120.txt

page 171

準時刻となる．
次に周期ハンドラを起動する時刻は，周期ハンドラが動作している状態でのみ有効で，必要に応じて，カーネルの起動時，周期ハンドラの動作開始時，周期ハンドラの起動処理時に設定される．
マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には，
周期ハンドラは，システム時刻管理プロセッサのみが割付け可能プロセッサであるクラスにのみ属することができる．すなわち，周期ハンドラは，システム
時刻管理プロセッサによって実行される．
C言語による周期ハンドラの記述形式は次の通り．
void cyclic̲handler(intptr̲t exinf){
周期ハンドラ本体}
exinfには，周期ハンドラの拡張情報が渡される．
周期ハンドラ機能に関連するカーネル構成マクロは次の通り．
TNUM̲CYCID

登録できる周期ハンドラの数（動的生成対応でないカー
ネルでは，静的APIによって登録された周期ハンドラの数に一致）【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，TA̲PHS属性の周期ハンドラをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，TA̲PHS属性の周期ハンドラをサポートしない．
【μITRON4.0仕様との関係】
TNUM̲CYCIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲CYC
周期ハンドラの生成〔S〕
acre̲cyc
周期ハンドラの生成〔TD〕【静的API】
CRE̲CYC(ID cycid, { ATR cycatr, intptr̲t exinf, CYCHDR cychdr,
RELTIM cyctim, RELTIM cycphs })【C言語API】
ER̲ID cycid = acre̲cyc(const T̲CCYC *pk̲ccyc)【パラメータ】
ID
T̲CCYC *cycidpk̲ccyc

生成する周期ハンドラのID番号（CRE̲CYCの場合）
周期ハンドラの生成情報を入れたパケットへのポインタ（静的APIを除く）＊周期ハンドラの生成情報（パケットの内容）
ATR
cycatr
周期ハンドラ属性
intptr̲t
exinf
周期ハンドラの拡張情報
CYCHDR
cychdr
周期ハンドラの先頭番地
RELTIM
cyctim
周期ハンドラの起動周期

ngki̲spec‑120.txt
RELTIM

page 172

cycphs【リターンパラメータ】
ER̲ID
cycid

【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲OBJ

周期ハンドラの起動位相生成された周期ハンドラのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（cycatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（cychdr，cyctim，cycphsが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲ccycが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられる周期ハンドラIDがない）
オブジェクト状態エラー（cycidで指定した周期ハンドラが登録済み：CRE̲CYCの場合）【機能】各パラメータで指定した周期ハンドラ生成情報に従って，周期ハンドラを生成する．具体的な振舞いは以下の通り．
cycatrにTA̲STAを指定した場合，対象周期ハンドラは動作している状態となる．
次に周期ハンドラを起動する時刻は，サービスコールを呼び出した時刻（静的APIの場合はカーネルの起動時刻）から，cycphsで指定した相対時間後に設定される．
cycatrにTA̲STAを指定しない場合，対象周期ハンドラは動作していない状態に初期化される．
静的APIにおいては，cycidはオブジェクト識別名，cycatr，cyctim，cycphsは整数定数式パラメータ，exinfとcychdrは一般定数式パラメータである．
保護機能対応カーネルにおいて，CRE̲CYCは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，
acre̲cycで，生成する周期ハンドラが属する保護ドメインとしてカーネルドメ
イン以外を指定した場合には，E̲RSATRエラーとなる．
cyctimは，0より大きく，TMAX̲RELTIM以下の値でなければならない．また，
cycphsは，TMAX̲RELTIM以下でなければならない．cycphsにcyctimより大きい値を指定してもよい．
マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で，生成する周期ハンドラの属するクラスの割付け可能プロセッサが，システム時
刻管理プロセッサのみでない場合には，E̲RSATRエラーとなる．
【補足説明】
静的APIにおいて，cycatrにTA̲STAを，cycphsに0を指定した場合，周期ハンドラが最初に呼び出されるのは，カーネル起動後最初のタイムティックになる．
cycphsに1を指定した場合も同じ振舞いとなるため，静的APIでcycatrにTA̲STAが指定されている場合には，cycphsに0を指定することは推奨されず，コンフィ
ギュレータが警告メッセージを出力する．
【TOPPERS/ASPカーネルにおける規定】

ngki̲spec‑120.txt

page 173

ASPカーネルでは，CRE̲CYCのみをサポートする．ただし，TA̲PHS属性の周期ハ
ンドラはサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲CYCのみをサポートする．ただし，TA̲PHS属性の周期ハ
ンドラはサポートしない．
【μITRON4.0仕様との関係】
cychdrのデータ型をCYCHDRに変更した．また，cycphsにcyctimより大きい値を指定した場合の振舞いと，静的APIでcycphsに0を指定した場合の振舞いを規定した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲CYC
割付け可能な周期ハンドラIDの数の指定〔SD〕【静的API】
AID̲CYC(uint̲t nocyc)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

nocyc

割付け可能な周期ハンドラIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
nocycで指定した数の周期ハンドラIDを，周期ハンドラを生成するサービスコー
ルによって割付け可能な周期ハンドラIDとして確保する．
nocycは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲CYC
周期ハンドラのアクセス許可ベクタの設定〔SP〕
sac̲cyc
周期ハンドラのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲cyc(ID cycid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

cycidp̲acvct

対象周期ハンドラのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】

正常終了（E̲OK）またはエラーコード

ngki̲spec‑120.txt
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

page 174
コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲CYCの場合）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象周期ハンドラは静的APIで生成された：sac̲cycの場合，対象周期ハンドラに対して
アクセス許可ベクタが設定済み：SAC̲CYCの場合）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，cycidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲CYCは，対象周期ハンドラが属する保護ドメイン（この仕様ではカーネルド
メインに限られる）の囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲CYC，sac̲cycをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲CYC，sac̲cycをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲cyc
周期ハンドラの削除〔TD〕【C言語API】
ER ercd = del̲cyc(ID cycid)【パラメータ】
ID

cycid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象周期ハンドラのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する管理操作が許可されていない）
オブジェクト状態エラー（対象周期ハンドラは静的APIで生成された）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）を削除する．具体的な振舞ngki̲spec‑120.txt

page 175

いは以下の通り．
対象周期ハンドラの登録が解除され，その周期ハンドラIDが未使用の状態に戻される．対象周期ハンドラが動作している状態であった場合には，動作していない状態にされた後に，登録が解除される．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲cycをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲cycをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sta̲cyc
周期ハンドラの動作開始〔T〕【C言語API】
ER ercd = sta̲cyc(ID cycid)【パラメータ】
ID

cycid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象周期ハンドラのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する
通常操作1が許可されていない）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）を動作開始する．具体的な振舞いは以下の通り．
対象周期ハンドラが動作していない状態であれば，対象周期ハンドラは動作している状態となる．次に周期ハンドラを起動する時刻は，sta̲cycを呼び出して以降の最初の起動時刻に設定される．
対象周期ハンドラが動作している状態であれば，次に周期ハンドラを起動する
時刻の再設定のみが行われる．
【補足説明】TA̲PHS属性でない周期ハンドラの場合，次に周期ハンドラを起動する時刻は，
sta̲cycを呼び出してから，対象周期ハンドラの起動位相で指定した相対時間後に設定される．
対象周期ハンドラがTA̲PHS属性で，動作している状態であれば，次に周期ハンドラを起動する時刻は変化しない．
【μITRON4.0仕様との関係】
TA̲PHS属性でない周期ハンドラにおいて，sta̲cycを呼び出した後，最初に周期ハンドラが起動される時刻を変更した．μITRON4.0仕様では，sta̲cycを呼び出ngki̲spec‑120.txt

page 176

してから周期ハンドラの起動周期で指定した相対時間後となっているが，この仕様では，起動位相で指定した相対時間後とした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
msta̲cyc
割付けプロセッサ指定での周期ハンドラの動作開始〔TM〕【C言語API】
ER ercd = msta̲cyc(ID cycid, ID prcid)【パラメータ】
ID
ID

cycid
prcid

【リターンパラメータ】
ER
ercd【エラーコード】
E̲NOSPT
E̲CTX
E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕

対象周期ハンドラのID番号
周期ハンドラの割付け対象のプロセッサのID番号正常終了（E̲OK）またはエラーコード

未サポート機能（グローバルタイマ方式を用いている場合）コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycid，prcidが不正）
パラメータエラー（対象周期ハンドラはprcidで指定したプロセッサに割り付けられない）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する
通常操作1が許可されていない）【機能】
prcidで指定したプロセッサを割付けプロセッサとして，cycidで指定した周期ハンドラ（対象周期ハンドラ）を動作開始する．具体的な振舞いは以下の通り．
対象周期ハンドラが動作していない状態であれば，対象周期ハンドラの割付け
プロセッサがprcidで指定したプロセッサに変更された後，対象周期ハンドラは動作している状態となる．次に周期ハンドラを起動する時刻は，msta̲cycを呼び出して以降の最初の起動時刻に設定される．
対象周期ハンドラが動作している状態であれば，対象周期ハンドラの割付けプ
ロセッサがprcidで指定したプロセッサに変更された後，次に周期ハンドラを起動する時刻の再設定が行われる．
対象周期ハンドラが実行中である場合には，割付けプロセッサを変更しても，実行中の周期ハンドラを実行するプロセッサは変更されない．対象周期ハンドラが変更後の割付けプロセッサで実行されるのは，次に起動される時からである．
対象周期ハンドラの属するクラスの割付け可能プロセッサが，prcidで指定したプロセッサを含んでいない場合には，E̲PARエラーとなる．
prcidにTPRC̲INI（＝0）を指定すると，対象周期ハンドラの割付けプロセッサを，それが属するクラスの初期割付けプロセッサとする．
グローバルタイマ方式を用いている場合，msta̲cycはE̲NOSPTを返す．
【補足説明】TA̲PHS属性でない周期ハンドラの場合，次に周期ハンドラを起動する時刻は，
msta̲cycを呼び出してから，対象周期ハンドラの起動位相で指定した相対時間

ngki̲spec‑120.txt

page 177後に設定される．
【使用上の注意】msta̲cycで実行中の周期ハンドラの割付けプロセッサを変更した場合，同じ周期ハンドラが異なるプロセッサで同時に実行される可能性がある．特に，対象
周期ハンドラの起動位相が0の場合に，注意が必要である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
stp̲cyc
周期ハンドラの動作停止〔T〕【C言語API】
ER ercd = stp̲cyc(ID cycid)【パラメータ】
ID

cycid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

対象周期ハンドラのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する
通常操作2が許可されていない）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）を動作停止する．具体的な振舞いは以下の通り．
対象周期ハンドラが動作している状態であれば，動作していない状態になる．
対象周期ハンドラが動作していない状態であれば，何も行われずに正常終了する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲cyc
周期ハンドラの状態参照〔T〕【C言語API】
ER ercd = ref̲cyc(ID cycid, T̲RCYC *pk̲rcyc)【パラメータ】
ID
T̲RCYC *cycidpk̲rcyc【リターンパラメータ】
ER
ercd

対象周期ハンドラのID番号
周期ハンドラの現在状態を入れるパケットへのポインタ

正常終了（E̲OK）またはエラーコード＊周期ハンドラの現在状態（パケットの内容）
STAT
cycstat
周期ハンドラの動作状態
RELTIM
lefttim
次に周期ハンドラを起動する時刻までの相対時間
ID
prcid
周期ハンドラの割付けプロセッサのID（マルチプ
ロセッサ対応カーネルの場合）

ngki̲spec‑120.txt【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

page 178

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する
参照操作が許可されていない）
メモリアクセス違反（pk̲rcycが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）の現在状態を参照する．参
照した現在状態は，pk̲rcycで指定したパケットに返される．
cycstatには，対象周期ハンドラの現在の動作状態を表す次のいずれかの値が返される．
TCYC̲STP
TCYC̲STA

0x01U
0x02U

周期ハンドラが動作していない状態
周期ハンドラが動作している状態

対象周期ハンドラが動作している状態である場合には，lefttimに，次に周期ハンドラ起動する時刻までの相対時間が返される．対象周期ハンドラが動作していない状態である場合には，lefttimの値は保証されない．
マルチプロセッサ対応カーネルでは，prcidに，対象周期ハンドラの割付けプロ
セッサのID番号が返される．
【使用上の注意】ref̲cycはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲cycを呼び出し，対象周期ハンドラの現在状態を参照した直後に割込みが発生した場合，ref̲cycから戻ってきた時には対象周期ハンドラの状態が変化している可能性があるためである．
【μITRON4.0仕様との関係】
TCYC̲STPとTCYC̲STAを値を変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.6.3 アラームハンドラ
アラームハンドラは，指定した相対時間後に起動されるタイムイベントハンド
ラである．アラームハンドラは，アラームハンドラIDと呼ぶID番号によって識別する．
各アラームハンドラが持つ情報は次の通り．
・アラームハンドラ属性
・アラームハンドラの動作状態
・アラームハンドラを起動する時刻
・拡張情報
・アラームハンドラの先頭番地
・アクセス許可ベクタ（保護機能対応カーネルの場合）・属する保護ドメイン（保護機能対応カーネルの場合）・属するクラス（マルチプロセッサ対応カーネルの場合）

ngki̲spec‑120.txt

page 179

アラームハンドラの動作状態は，動作している状態と動作していない状態のいずれかをとる．アラームハンドラを動作している状態にすることを動作開始，動作していない状態にすることを動作停止という．
アラームハンドラを起動する時刻は，アラームハンドラを動作開始する時に設定される．
アラームハンドラが動作している状態の場合には，アラームハンドラを起動す
る時刻になると，アラームハンドラの起動処理が行われる．具体的には，まず，アラームハンドラが動作していない状態にされる．その後に，拡張情報をパラメータとして，アラームハンドラが呼び出される．
保護機能対応カーネルにおいて，アラームハンドラが属することのできる保護ドメインは，カーネルドメインに限られる．
マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には，
アラームハンドラは，割付け可能プロセッサがシステム時刻管理プロセッサのみであるクラスにのみ属することができる．すなわち，アラームハンドラは，
システム時刻管理プロセッサによって実行される．
C言語によるアラームハンドラの記述形式は次の通り．
void alarm̲handler(intptr̲t exinf){
アラームハンドラ本体}
exinfには，アラームハンドラの拡張情報が渡される．
アラームハンドラ機能に関連するカーネル構成マクロは次の通り．
TNUM̲ALMID

登録できるアラームハンドラの数（動的生成対応でない
カーネルでは，静的APIによって登録されたアラームハン
ドラの数に一致）【μITRON4.0仕様との関係】
TNUM̲ALMIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲ALM
アラームハンドラの生成〔S〕
acre̲alm
アラームハンドラの生成〔TD〕【静的API】
CRE̲ALM(ID almid, { ATR almatr, intptr̲t exinf, ALMHDR almhdr })【C言語API】
ER̲ID almid = acre̲alm(const T̲CALM *pk̲calm)【パラメータ】
ID

almid

T̲CALM *pk̲calm

生成するアラームハンドラのID番号（CRE̲ALMの場合）
アラームハンドラの生成情報を入れたパケット
へのポインタ（静的APIを除く）＊アラームハンドラの生成情報（パケットの内容）
ATR
almatr
アラームハンドラ属性
intptr̲t
exinf
アラームハンドラの拡張情報
ALMHDR
almhdr
アラームハンドラの先頭番地

ngki̲spec‑120.txt

page 180【リターンパラメータ】
ER̲ID
almid

【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲OBJ

生成されたアラームハンドラのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（almatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（almhdrが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲calmが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるアラームハンドラIDがない）
オブジェクト状態エラー（almidで指定したアラームハン
ドラが登録済み：CRE̲ALMの場合）【機能】各パラメータで指定したアラームハンドラ生成情報に従って，アラームハンド
ラを生成する．対象アラームハンドラは，動作していない状態に初期化される．
静的APIにおいては，almidはオブジェクト識別名，almatrは整数定数式パラメー
タ，exinfとalmhdrは一般定数式パラメータである．
保護機能対応カーネルにおいて，CRE̲ALMは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，
acre̲almで，生成するアラームハンドラが属する保護ドメインとしてカーネル
ドメイン以外を指定した場合には，E̲RSATRエラーとなる．
マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で，生成するアラームハンドラの属するクラスの割付け可能プロセッサが，システ
ム時刻管理プロセッサのみでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲ALMのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲ALMのみをサポートする．
【μITRON4.0仕様との関係】
almhdrのデータ型をALMHDRに変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑AID̲ALM
割付け可能なアラームハンドラIDの数の指定〔SD〕【静的API】
AID̲ALM(uint̲t noalm)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

noalm

割付け可能なアラームハンドラIDの数

予約属性（属する保護ドメインまたはクラスが不正）ngki̲spec‑120.txt

page 181【機能】
noalmで指定した数のアラームハンドラIDを，アラームハンドラを生成するサービスコールによって割付け可能なアラームハンドラIDとして確保する．
noalmは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲ALM
アラームハンドラのアクセス許可ベクタの設定〔SP〕
sac̲alm
アラームハンドラのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲ALM(ID almid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲alm(ID almid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

almidp̲acvct

対象アラームハンドラのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（almidが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲ALMの場合）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象アラームハンドラは静的
APIで生成された：sac̲almの場合，対象アラームハンドラに対してアクセス許可ベクタが設定済み：SAC̲ALMの場
合）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，almidはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲ALMは，対象アラームハンドラが属する保護ドメイン（この仕様ではカーネ

ngki̲spec‑120.txt

page 182

ルドメインに限られる）の囲みの中に記述しなければならない．そうでない場
合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲ALM，sac̲almをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲ALM，sac̲almをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲alm
アラームハンドラの削除〔TD〕【C言語API】
ER ercd = del̲alm(ID almid)【パラメータ】
ID

almid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象アラームハンドラのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（almidが不正）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する管理操作が許可されていない）
オブジェクト状態エラー（対象アラームハンドラは静的
APIで生成された）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）を削除する．具体的な振舞いは以下の通り．
対象アラームハンドラの登録が解除され，そのアラームハンドラIDが未使用の状態に戻される．対象アラームハンドラが動作している状態であった場合には，登録解除の前に，アラームハンドラが動作していない状態となる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲almをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲almをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sta̲alm
アラームハンドラの動作開始〔T〕
ista̲alm
アラームハンドラの動作開始〔I〕【C言語API】
ER ercd = sta̲alm(ID almid, RELTIM almtim)
ER ercd = ista̲alm(ID almid, RELTIM almtim)【パラメータ】
IDalmid

対象アラームハンドラのID番号

ngki̲spec‑120.txt
RELTIM

page 183

almtim【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕

アラームハンドラの起動時刻（相対時間）

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：sta̲almの場合，タスクコンテキストからの呼出し：ista̲almの場合，CPUロック状態からの呼出し）
不正ID番号（almidが不正）
パラメータエラー（almtimが不正）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する通常操作1が許可されていない：sta̲almの場合）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）を動作開始する．
具体的な振舞いは以下の通り．
対象アラームハンドラが動作していない状態であれば，対象アラームハンドラ
は動作している状態となる．アラームハンドラを起動する時刻は，sta̲almを呼び出してから，almtimで指定した相対時間後に設定される．
対象アラームハンドラが動作している状態であれば，アラームハンドラを起動する時刻の再設定のみが行われる．
almtimは，TMAX̲RELTIM以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
msta̲alm
割付けプロセッサ指定でのアラームハンドラの動作開始〔TM〕
imsta̲alm
割付けプロセッサ指定でのアラームハンドラの動作開始〔IM〕【C言語API】
ER ercd = msta̲alm(ID almid, RELTIM almtim, ID prcid)
ER ercd = imsta̲alm(ID almid, RELTIM almtim, ID prcid)【パラメータ】
ID
RELTIMID

almidalmtimprcid【リターンパラメータ】
ER
ercd【エラーコード】
E̲NOSPT
E̲CTX

E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕

対象アラームハンドラのID番号
アラームハンドラの起動時刻（相対時間）
アラームハンドラの割付け対象のプロセッサの
ID番号

正常終了（E̲OK）またはエラーコード

未サポート機能（グローバルタイマ方式を用いている場合）コンテキストエラー（非タスクコンテキストからの呼出
し：msta̲almの場合，タスクコンテキストからの呼出し：imsta̲almの場合，CPUロック状態からの呼出し）
不正ID番号（almid，prcidが不正）
パラメータエラー（almtimが不正，対象アラームハンド
ラはprcidで指定したプロセッサに割り付けられない）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する通常操作1が許可されていない：msta̲almの場合）

ngki̲spec‑120.txt

page 184【機能】
prcidで指定したプロセッサを割付けプロセッサとして，almidで指定したアラー
ムハンドラ（対象アラームハンドラ）を動作開始する．具体的な振舞いは以下の通り．
対象アラームハンドラが動作していない状態であれば，対象アラームハンドラの割付けプロセッサがprcidで指定したプロセッサに変更された後，対象アラー
ムハンドラは動作している状態となる．アラームハンドラを起動する時刻は，
msta̲almを呼び出してから，almtimで指定した相対時間後に設定される．
対象アラームハンドラが動作している状態であれば，対象アラームハンドラの割付けプロセッサがprcidで指定したプロセッサに変更された後，アラームハン
ドラを起動する時刻の再設定が行われる．
対象アラームハンドラが実行中である場合には，割付けプロセッサを変更しても，実行中のアラームハンドラを実行するプロセッサは変更されない．対象ア
ラームハンドラが変更後の割付けプロセッサで実行されるのは，次に起動される時からである．
対象アラームハンドラの属するクラスの割付け可能プロセッサが，prcidで指定したプロセッサを含んでいない場合には，E̲PARエラーとなる．
prcidにTPRC̲INI（＝0）を指定すると，対象アラームハンドラの割付けプロセッ
サを，それが属するクラスの初期割付けプロセッサとする．
almtimは，TMAX̲RELTIM以下でなければならない．
グローバルタイマ方式を用いている場合，msta̲alm／imsta̲almはE̲NOSPTを返す．
【使用上の注意】msta̲alm／imsta̲almで実行中のアラームハンドラの割付けプロセッサを変更した場合，同じアラームハンドラが異なるプロセッサで同時に実行される可能性がある．特に，almtimに0を指定する場合に，注意が必要である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
stp̲alm
アラームハンドラの動作停止〔T〕
istp̲alm
アラームハンドラの動作停止〔I〕【C言語API】
ER ercd = stp̲alm(ID almid)
ER ercd = istp̲alm(ID almid)【パラメータ】
ID

almid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

対象アラームハンドラのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：stp̲almの場合，タスクコンテキストからの呼出し：
istp̲almの場合，CPUロック状態からの呼出し）ngki̲spec‑120.txt
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

page 185
不正ID番号（almidが不正）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する通常操作2が許可されていない：stp̲almの場合）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）を動作停止する．
具体的な振舞いは以下の通り．
対象アラームハンドラが動作している状態であれば，動作していない状態となる．対象アラームハンドラが動作していない状態であれば，何も行われずに正常終了する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲alm
アラームハンドラの状態参照〔T〕【C言語API】
ER ercd = ref̲alm(ID almid, T̲RALM *pk̲ralm)【パラメータ】
ID
T̲RALM *almidpk̲ralm【リターンパラメータ】
ER
ercd

対象アラームハンドラのID番号
アラームハンドラの現在状態を入れるパケット
へのポインタ

正常終了（E̲OK）またはエラーコード＊アラームハンドラの現在状態（パケットの内容）
STAT
almstatアラームハンドラの動作状態
RELTIM
lefttim
アラームハンドラを起動する時刻までの相対時間
ID
prcid
アラームハンドラの割付けプロセッサのID（マルチプロセッサ対応カーネルの場合）【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（almidが不正）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する参照操作が許可されていない）
メモリアクセス違反（pk̲ralmが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）の現在状態を参照
する．参照した現在状態は，pk̲ralmで指定したパケットに返される．
almstatには，対象アラームハンドラの現在の動作状態を表す次のいずれかの値が返される．
TALM̲STPTALM̲STA

0x01U
0x02U

アラームハンドラが動作していない状態
アラームハンドラが動作している状態

対象アラームハンドラが動作している状態である場合には，lefttimに，アラー
ムハンドラ起動する時刻までの相対時間が返される．対象アラームハンドラが動作していない状態である場合には，lefttimの値は保証されない．

ngki̲spec‑120.txt

page 186

マルチプロセッサ対応カーネルでは，prcidに，対象アラームハンドラの割付け
プロセッサのID番号が返される．
【使用上の注意】ref̲almはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲almを呼び出し，対象アラームハンドラの現在状態を参照した直後に割込みが発生した場合，ref̲almから戻ってきた時には対象アラームハ
ンドラの状態が変化している可能性があるためである．
【μITRON4.0仕様との関係】
TALM̲STPとTALM̲STAを値を変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.6.4 オーバランハンドラ
オーバランハンドラは，タスクが使用したプロセッサ時間が，指定した時間を超えた場合に起動されるタイムイベントハンドラである．オーバランハンドラ
は，システムで1つのみ登録することができる．
オーバランハンドラ機能に関連して，各タスクが持つ情報は次の通り．
・オーバランハンドラの動作状態
・残りプロセッサ時間
オーバランハンドラの動作状態は，タスク毎に，動作している状態と動作していない状態のいずれかをとる．残りプロセッサ時間は，オーバランハンドラが動作している状態の時に，タスクが使用できる残りのプロセッサ時間を表す．
タスクが実行中は，タスクが使用したプロセッサ時間の分だけ残りプロセッサ時間が減少し，残りプロセッサ時間が0になると（これをオーバランと呼ぶ），
オーバランハンドラが起動される．
タスクが使用したプロセッサ時間には，そのタスク自身とタスク例外処理ルー
チン，それらから呼び出したサービルコール（拡張サービスコールを含む）の実行時間を含む．一方，タスクの実行中に起動されたカーネル管理の割込みハ
ンドラ（割込みサービスルーチン，周期ハンドラ，アラームハンドラ，オーバ
ランハンドラの実行時間を含む）とカーネル管理のCPU例外ハンドラの実行時間は含まないが，割込みハンドラおよびCPU例外ハンドラの呼出し／復帰にかかる
時間と，割込みの出入口処理の一部の実行時間は含んでしまう．また，タスクの実行中に起動されたカーネル管理外の割込みハンドラとカーネル管理外のCPU例外ハンドラの実行時間も含む．
プロセッサ時間は，符号無しの整数型であるOVRTIM型で表し，単位はマイクロ秒とする．ただし，プロセッサ時間には，OVRTIM型に格納できる任意の値を指定できるとは限らず，指定できる値にターゲット定義の上限がある場合がある．
プロセッサ時間に指定できる最大値は，構成マクロTMAX̲OVRTIMに定義されている．また，タスクが使用したプロセッサ時間の計測精度はターゲット依存である．
保護機能対応カーネルにおいて，オーバランハンドラは，カーネルドメインに属する．
ターゲット定義で，オーバランハンドラ機能がサポートされていない場合がある．オーバランハンドラ機能がサポートされている場合には，
TOPPERS̲SUPPORT̲OVRHDRがマクロ定義される．サポートされていない場合にオー
バランハンドラ機能のサービスコールを呼び出すと，E̲NOSPTエラーが返るか，リンク時にエラーとなる．

ngki̲spec‑120.txt

page 187

オーバランハンドラ機能に用いるデータ型は次の通り．
OVRTIM

プロセッサ時間（符号無し整数，単位はマイクロ秒，ulong̲tに定義）

オーバランハンドラ属性に指定できる属性はない．そのためオーバランハンド
ラ属性には，TA̲NULLを指定しなければならない．
C言語によるオーバランハンドラの記述形式は次の通り．
void overrun̲handler(ID tskid, intptr̲t exinf){
オーバランハンドラ本体}
tskidにはオーバランを起こしたタスクのID番号が，exinfにはそのタスクの拡張情報が，それぞれ渡される．
オーバランハンドラ機能に関連するカーネル構成マクロは次の通り．
TMAX̲OVRTIM

プロセッサ時間に指定できる最大値

TOPPERS̲SUPPORT̲OVRHDR

オーバランハンドラ機能がサポートされている【使用上の注意】
マルチプロセッサ対応カーネルでは，オーバランハンドラが異なるプロセッサで同時に実行される可能性があるので，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，オーバランハンドラをサポートしない．ただし，オーバラン
ハンドラ機能拡張パッケージを用いると，オーバランハンドラ機能を追加することができる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，オーバランハンドラをサポートしない．
【μITRON4.0仕様との関係】
OVRTIMの時間単位は，μITRON4.0仕様では実装定義としていたが，この仕様ではマイクロ秒と規定した．
TMAX̲OVRTIMは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑DEF̲OVRオーバランハンドラの定義〔S〕
def̲ovr
オーバランハンドラの定義〔TD〕【静的API】
DEF̲OVR({ ATR ovratr, OVRHDR ovrhdr })【C言語API】
ER ercd = def̲ovr(const T̲DOVR *pk̲dovr)【パラメータ】

ngki̲spec‑120.txt
T̲DOVR *page 188

pk̲dovr

オーバランハンドラの定義情報を入れたパケッ
トへのポインタ（静的APIを除く）＊オーバランハンドラの定義情報（パケットの内容）
ATR
ovratrオーバランハンドラ属性
OVRHDR
ovrhdrオーバランハンドラの先頭番地【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲OACV〔sP〕
E̲MACV〔sP〕
E̲PAR
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（ovratrが不正または使用できない，属する保護ドメインかクラスが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dovrが指すメモリ領域への読出しアクセスが許可されていない）
パラメータエラー（ovrhdrが不正）
オブジェクト状態エラー（条件については機能説明を参照すること）【機能】
各パラメータで指定したオーバランハンドラ定義情報に従って，オーバランハ
ンドラを定義する．ただし，def̲ovrにおいてpk̲dovrをNULLにした場合には，
オーバランハンドラの定義を解除する．
静的APIにおいては，ovratrは整数定数式パラメータ，ovrhdrは一般定数式パラメータである．
オーバランハンドラを定義する場合（DEF̲OVRの場合およびdef̲ovrにおいて
pk̲dovrをNULL以外にした場合）で，すでにオーバランハンドラが定義されている場合には，E̲OBJエラーとなる．
保護機能対応カーネルにおいて，DEF̲OVRは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，
def̲ovrでオーバランハンドラを定義する場合には，オーバランハンドラの属する保護ドメインを設定する必要はなく，オーバランハンドラ属性にTA̲DOM(domid)を指定した場合にはE̲RSATRエラーとなる．ただし，
TA̲DOM(TDOM̲SELF)を指定した場合には，指定が無視され，E̲RSATRエラーは検出されない．
マルチプロセッサ対応カーネルでは，DEF̲OVRは，クラスの囲みの外に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，def̲ovr
でオーバランハンドラを定義する場合には，オーバランハンドラの属するクラスを設定する必要はなく，オーバランハンドラ属性にTA̲CLS(clsid)を指定した
場合にはE̲RSATRエラーとなる．ただし，TA̲CLS(TCLS̲SELF)を指定した場合には，指定が無視され，E̲RSATRエラーは検出されない．
オーバランハンドラの定義を解除する場合（def̲ovrにおいてpk̲dovrをNULLにした場合）で，オーバランハンドラが定義されていない場合には，E̲OBJエラーとなる．
オーバランハンドラの定義を解除すると，オーバランハンドラの動作状態は，すべてのタスクに対して動作していない状態となる．

ngki̲spec‑120.txt

page 189【使用上の注意】def̲ovrによりオーバランハンドラの定義を解除する場合，サービスコールの処
理時間およびカーネル内での割込み禁止時間が，タスクの総数に比例して長くなる．特に，タスクの総数が多い場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルのオーバランハンドラ機能拡張パッケージでは，DEF̲OVRのみをサポートする．
【μITRON4.0仕様との関係】
ovrhdrのデータ型をOVRHDRに変更した．
def̲ovrによって定義済みのオーバランハンドラを再定義しようとした場合に，
E̲OBJエラーとすることにした．オーバランハンドラの定義を変更するには，一度定義を解除してから，再度定義する必要がある．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sta̲ovr
オーバランハンドラの動作開始〔T〕
ista̲ovr
オーバランハンドラの動作開始〔I〕【C言語API】
ER ercd = sta̲ovr(ID tskid, OVRTIM ovrtim)
ER ercd = ista̲ovr(ID tskid, OVRTIM ovrtim)【パラメータ】ID
OVRTIMtskid
ovrtim【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲PAR
E̲OBJ

対象タスクのID番号
対象タスクの残りプロセッサ時間

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：sta̲ovrの場合，タスクコンテキストからの呼出し：ista̲ovrの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない：sta̲ovrの場合）
パラメータエラー（ovrtimが不正）
オブジェクト状態エラー（オーバランハンドラが定義されていない）【機能】
tskidで指定したタスク（対象タスク）に対して，オーバランハンドラの動作を開始する．具体的な振舞いは以下の通り．
対象タスクに対するオーバランハンドラの動作状態は，動作している状態とな
り，残りプロセッサ時間は，ovrtimに指定した時間に設定される．対象タスクに対してオーバランハンドラが動作している状態であれば，残りプロセッサ時間の設定のみが行われる．
sta̲ovrにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．

ngki̲spec‑120.txt

page 190

ovrtimは，0より大きく，TMAX̲OVRTIM以下の値でなければならない．
【μITRON4.0仕様との関係】
ista̲ovrは，μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
stp̲ovr
オーバランハンドラの動作停止〔T〕
istp̲ovr
オーバランハンドラの動作停止〔I〕【C言語API】
ER ercd = stp̲ovr(ID tskid)
ER ercd = istp̲ovr(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

対象タスクのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：stp̲ovrの場合，タスクコンテキストからの呼出し：
istp̲ovrの場合，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない：stp̲ovrの場合）
オブジェクト状態エラー（オーバランハンドラが定義されていない）【機能】
tskidで指定したタスク（対象タスク）に対して，オーバランハンドラの動作を停止する．具体的な振舞いは以下の通り．
対象タスクに対するオーバランハンドラの動作状態は，動作していない状態となる．対象タスクに対してオーバランハンドラが動作していない状態であれば，何も行われずに正常終了する．
stp̲ovrにおいてtskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【μITRON4.0仕様との関係】
istp̲ovrは，μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲ovr
オーバランハンドラの状態参照〔T〕【C言語API】
ER ercd = ref̲ovr(ID tskid, T̲ROVR *pk̲rovr)【パラメータ】
ID
T̲ROVR *tskid
pk̲rovr【リターンパラメータ】

対象タスクのID番号オーバランハンドラの現在状態を入れるパケッ
トへのポインタngki̲spec‑120.txt
ERpage 191

ercd

正常終了（E̲OK）またはエラーコード＊タスクの現在状態（パケットの内容）
STAT
ovrstatオーバランハンドラの動作状態
OVRTIM
leftotm
残りプロセッサ時間【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する参照操作が許可されていない）
メモリアクセス違反（pk̲rovrが指すメモリ領域への書込
みアクセスが許可されていない）
オブジェクト状態エラー（オーバランハンドラが定義されていない）【機能】
tskidで指定したタスク（対象タスク）に対するオーバランハンドラの現在状態を参照する．参照した現在状態は，pk̲rovrで指定したメモリ領域に返される．
ovrstatには，対象タスクに対するオーバランハンドラの動作状態を表す次のいずれかの値が返される．
TOVR̲STPTOVR̲STA

0x01U
0x02U

オーバランハンドラが動作していない状態
オーバランハンドラが動作している状態

対象タスクに対してオーバランハンドラが動作している状態の場合には，leftotmに，オーバランハンドラが起動されるまでの残りプロセッサ時間が返される．オーバランハンドラが起動される直前には，leftotmに0が返される可能性がある．オーバランハンドラが動作していない状態の場合には，leftotmの値は保証されない．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【使用上の注意】ref̲ovrはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲ovrを呼び出し，対象オーバランハンドラの現在状態を参照
した直後に割込みが発生した場合，ref̲ovrから戻ってきた時には対象オーバラ
ンハンドラの状態が変化している可能性があるためである．
【未決定事項】
マルチプロセッサ対応カーネルにおいて，対象タスクが，自タスクが割付けられたプロセッサと異なるプロセッサに割り付けられている場合に，leftotmを参照できるとするかどうかは，今後の課題である．
【μITRON4.0仕様との関係】
TOVR̲STPとTOVR̲STAを値を変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.7 システム状態管理機能
システム状態管理機能は，特定のオブジェクトに関連しないシステムの状態をngki̲spec‑120.txt

page 192

変更／参照するための機能である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲SYS
システム状態のアクセス許可ベクタの設定〔SP〕
sac̲sys
システム状態のアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲SYS({ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲sys(const ACVCT *p̲acvct)【パラメータ】
ACVCT *

p̲acvct

アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（属する保護ドメインかクラスが不正：SAC̲SYSの場合）
オブジェクトアクセス違反（カーネルドメイン以外からの呼出し）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（システム状態のアクセス許可
ベクタが設定済み：SAC̲SYSの場合）【機能】
システム状態のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，acptn1〜acptn4は整数定数式パラメータである．
SAC̲SYSは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲SYS，sac̲sysをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲SYS，sac̲sysをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rot̲rdq
タスクの優先順位の回転〔T〕
irot̲rdq
タスクの優先順位の回転〔I〕

ngki̲spec‑120.txt

page 193【C言語API】
ER ercd = rot̲rdq(PRI tskpri)
ER ercd = irot̲rdq(PRI tskpri)【パラメータ】
PRI

tskpri【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲PAR
E̲OACV〔P〕

回転対象の優先度（対象優先度）

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：rot̲rdqの場合，タスクコンテキストからの呼出し：
irot̲rdqの場合，CPUロック状態からの呼出し）
パラメータエラー（tskpriが不正）オブジェクトアクセス違反（システム状態に対する通常
操作1が許可されていない）【機能】
tskpriで指定した優先度（対象優先度）を持つ実行できる状態のタスクの中で，最も優先順位が高いタスクを，同じ優先度のタスクの中で最も優先順位が低い状態にする．対象優先度を持つ実行できる状態のタスクが無いか1つのみの場合には，何も行われずに正常終了する．
rot̲rdqにおいて，tskpriにTPRI̲SELF（＝0）を指定すると，自タスクのベース
優先度が対象優先度となる．
tskpriは，TPRI̲SELFであるか（rot̲rdqの場合のみ），TMIN̲TPRI以上，
TMAX̲TPRI以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
mrot̲rdq
プロセッサ指定でのタスクの優先順位の回転〔TM〕
imrot̲rdq
プロセッサ指定でのタスクの優先順位の回転〔IM〕【C言語API】
ER ercd = mrot̲rdq(PRI tskpri, ID prcid)
ER ercd = imrot̲rdq(PRI tskpri, ID prcid)【パラメータ】
PRI
ID

tskpriprcid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲ID
E̲PAR
E̲OACV〔P〕

回転対象の優先度（対象優先度）
優先順位の回転対象とするプロセッサのID番号正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：mrot̲rdqの場合，タスクコンテキストからの呼出し：imrot̲rdqの場合，CPUロック状態からの呼出し）
不正ID番号（prcidが不正）
パラメータエラー（tskpriが不正）オブジェクトアクセス違反（システム状態に対する通常
操作1が許可されていない）【機能】
prcidで指定したプロセッサにおける，tskpriで指定した優先度（対象優先度）
を持つ実行できる状態のタスクの中で，最も優先順位が高いタスクを，同じ優ngki̲spec‑120.txt

page 194

先度のタスクの中で最も優先順位が低い状態にする．対象優先度を持つ実行できる状態のタスクが無いか1つのみの場合には，何も行われずに正常終了する．
mrot̲rdqにおいて，tskpriにTPRI̲SELF（＝0）を指定すると，自タスクのベース優先度が対象優先度となる．
tskpriは，TPRI̲SELFであるか（mrot̲rdqの場合のみ），TMIN̲TPRI以上，
TMAX̲TPRI以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，mrot̲rdq，imrot̲rdqをサポートしない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲tid
実行状態のタスクIDの参照〔T〕
iget̲tid
実行状態のタスクIDの参照〔I〕【C言語API】
ER ercd = get̲tid(ID *p̲tskid)
ER ercd = iget̲tid(ID *p̲tskid)【パラメータ】ID *p̲tskid【リターンパラメータ】
ER
ercd
ID
tskid
【エラーコード】
E̲CTX

E̲MACV〔P〕

タスクIDを入れるメモリ領域へのポインタ

正常終了（E̲OK）またはエラーコード
タスクID

コンテキストエラー（非タスクコンテキストからの呼出
し：get̲tidの場合，タスクコンテキストからの呼出し：
iget̲tidの場合，CPUロック状態からの呼出し）
メモリアクセス違反（p̲tskidが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
実行状態のタスク（get̲tidの場合には自タスク）のID番号を参照する．参照したタスクIDは，p̲tskidで指定したメモリ領域に返される．
iget̲tidにおいて，実行状態のタスクがない場合には，TSK̲NONE（＝0）が返される．
マルチプロセッサ対応カーネルにおいては，サービスコールを呼び出した処理
単位を実行しているプロセッサにおいて実行状態のタスクのID番号を参照する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑get̲did
実行状態のタスクが属する保護ドメインIDの参照〔TP〕【C言語API】
ER ercd = get̲did(ID *p̲domid)【パラメータ】ID *p̲domid【リターンパラメータ】

保護ドメインIDを入れるメモリ領域へのポインタ

ngki̲spec‑120.txt
ER
ID【エラーコード】
E̲CTX
E̲MACV

page 195

ercd
domid

正常終了（E̲OK）またはエラーコード
保護ドメインID

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
メモリアクセス違反（p̲domidが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
実行状態のタスク（自タスク）が属する保護ドメインのID番号を参照する．参照した保護ドメインIDは，p̲domidで指定したメモリ領域に返される．
マルチプロセッサ対応カーネルにおいては，サービスコールを呼び出した処理
単位を実行しているプロセッサにおいて実行状態のタスクが属する保護ドメイ
ンのID番号を参照する．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，get̲didをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，get̲didをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑get̲pid
割付けプロセッサのID番号の参照〔TM〕
iget̲pid
割付けプロセッサのID番号の参照〔IM〕【C言語API】
ER ercd = get̲pid(ID *p̲prcid)
ER ercd = iget̲pid(ID *p̲prcid)【パラメータ】ID *p̲prcid【リターンパラメータ】
ER
ercd
ID
prcid
【エラーコード】
E̲CTX

E̲MACV〔P〕

プロセッサIDを入れるメモリ領域へのポインタ

正常終了（E̲OK）またはエラーコード
プロセッサID

コンテキストエラー（非タスクコンテキストからの呼出
し：get̲pidの場合，タスクコンテキストからの呼出し：
iget̲pidの場合，CPUロック状態からの呼出し）
メモリアクセス違反（p̲prcidが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
サービスコールを呼び出した処理単位の割付けプロセッサのID番号を参照する．
参照したプロセッサIDは，p̲prcidで指定したメモリ領域に返される．
【使用上の注意】
タスクは，get̲pidを用いて，自タスクの割付けプロセッサを正しく参照できるとは限らない．これは，get̲pidを呼び出し，自タスクの割付けプロセッサのID番号を参照した直後に割込みが発生した場合，get̲pidから戻ってきた時には割付けプロセッサが変化している可能性があるためである．

ngki̲spec‑120.txt

page 196【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，get̲pid，iget̲pidをサポートしない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
loc̲cpu
CPUロック状態への遷移〔T〕
iloc̲cpu
CPUロック状態への遷移〔I〕【C言語API】
ER ercd = loc̲cpu()
ER ercd = iloc̲cpu()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲OACV〔P〕

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：loc̲cpuの場合，タスクコンテキストからの呼出し：
iloc̲cpuの場合）
オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない：loc̲cpuの場合）【機能】
CPUロックフラグをセットし，CPUロック状態へ遷移する．CPUロック状態で呼び出した場合には，何も行われずに正常終了する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
unl̲cpu
CPUロック状態の解除〔T〕
iunl̲cpu
CPUロック状態の解除〔I〕【C言語API】
ER ercd = unl̲cpu()
ER ercd = iunl̲cpu()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

E̲OACV〔P〕

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：unl̲cpuの場合，タスクコンテキストからの呼出し：
iunl̲cpuの場合）
オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない：unl̲cpuの場合）【機能】
CPUロックフラグをクリアし，CPUロック解除状態へ遷移する．CPUロック解除状
態で呼び出した場合には，何も行われずに正常終了する．

ngki̲spec‑120.txt

page 197

マルチプロセッサ対応カーネルにおいて，unl̲cpu／iunl̲cpuを呼び出したプロセッサによって取得されている状態となっているスピンロックがある場合には，
unl̲cpu／iunl̲cpuによってCPUロック解除状態に遷移しない（何も行われずに正常終了する）．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
dis̲dsp ディスパッチの禁止〔T〕【C言語API】
ER ercd = dis̲dsp()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲OACV〔P〕

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクトアクセス違反（システム状態に対する通常
操作1が許可されていない）【機能】
ディスパッチ禁止フラグをセットし，ディスパッチ禁止状態へ遷移する．ディ
スパッチ禁止状態で呼び出した場合には，何も行われずに正常終了する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ena̲dsp
ディスパッチの許可〔T〕【C言語API】
ER ercd = ena̲dsp()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲OACV〔P〕

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクトアクセス違反（システム状態に対する通常
操作1が許可されていない）【機能】
ディスパッチ禁止フラグをクリアし，ディスパッチ許可状態へ遷移する．ディスパッチ許可状態で呼び出した場合には，何も行われずに正常終了する．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sns̲ctx
コンテキストの参照〔TI〕【C言語API】
bool̲t state = sns̲ctx()【パラメータ】なし

ngki̲spec‑120.txt

page 198【リターンパラメータ】
bool̲t state

コンテキスト【機能】
実行中のコンテキストを参照する．具体的な振舞いは以下の通り．
sns̲ctxを非タスクコンテキストから呼び出した場合にはtrue，タスクコンテキ
ストから呼び出した場合にはfalseが返る．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sns̲loc
CPUロック状態の参照〔TI〕【C言語API】
bool̲t state = sns̲loc()【パラメータ】
なし【リターンパラメータ】
bool̲t state

CPUロックフラグ【機能】CPUロックフラグを参照する．具体的な振舞いは以下の通り．
sns̲locをCPUロック状態で呼び出した場合にはtrue，CPUロック解除状態で呼び出した場合にはfalseが返る．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sns̲dsp
ディスパッチ禁止状態の参照〔TI〕【C言語API】
bool̲t state = sns̲dsp()【パラメータ】
なし【リターンパラメータ】
bool̲t state

ディスパッチ禁止フラグ【機能】
ディスパッチ禁止フラグを参照する．具体的な振舞いは以下の通り．
sns̲dspをディスパッチ禁止状態で呼び出した場合にはtrue，ディスパッチ許可
状態で呼び出した場合にはfalseが返る．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sns̲dpn
ディスパッチ保留状態の参照〔TI〕【C言語API】
bool̲t state = sns̲dpn()【パラメータ】
なし【リターンパラメータ】
bool̲t state【機能】

ディスパッチ保留状態

ngki̲spec‑120.txt

page 199

ディスパッチ保留状態であるか否かを参照する．具体的な振舞いは以下の通り．
sns̲dpnをディスパッチ保留状態で呼び出した場合にはtrue，ディスパッチ保留
状態でない状態で呼び出した場合にはfalseが返る．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sns̲ker
カーネル非動作状態の参照〔TI〕【C言語API】
bool̲t state = sns̲ker()【パラメータ】
なし【リターンパラメータ】
bool̲tstate

カーネル非動作状態【機能】
カーネルが動作中であるか否かを参照する．具体的な振舞いは以下の通り．
sns̲kerをカーネルの初期化完了前（初期化ルーチン実行中を含む）または終了
処理開始後（終了処理ルーチン実行中を含む）に呼び出した場合にはtrue，カー
ネルの動作中に呼び出した場合にはfalseが返る．
【使用方法】
sns̲kerは，カーネルが動作している時とそうでない時で，処理内容を変えたい
場合に使用する．sns̲kerがtrueを返した場合，他のサービスコールを呼び出す
ことはできない．sns̲kerがtrueを返す時に他のサービスコールを呼び出した場
合の動作は保証されない．
【使用上の注意】
どちらの条件でtrueが返るか間違いやすいので注意すること．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ext̲ker
カーネルの終了〔TI〕【C言語API】
ER ercd = ext̲ker()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲OACV〔P〕

エラーコードオブジェクトアクセス違反（カーネルドメイン以外から
の呼出し）

【機能】
カーネルを終了する．具体的な振舞いについては，「2.9.2 システム終了手順」

ngki̲spec‑120.txt

page 200の節を参照すること．
ext̲kerが正常に処理された場合，ext̲kerからはリターンしない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲sys
システムの状態参照〔T〕【C言語API】
ER ercd = ref̲sys(T̲RSYS *pk̲rsys)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ref̲sysをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ref̲sysをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.8 メモリオブジェクト管理機能
メモリオブジェクトは，保護機能対応カーネルにおいてアクセス保護の対象とする連続したメモリ領域である．メモリオブジェクトは，その先頭番地によって識別する．
保護機能対応でないカーネルでは，メモリオブジェクト管理機能をサポートしない．
各メモリオブジェクトが持つ情報は次の通り．
・先頭番地
・サイズ
・メモリオブジェクト属性
・アクセス許可ベクタ
・属する保護ドメイン
・属するクラス（マルチプロセッサ対応カーネルの場合）
メモリオブジェクトの先頭番地とサイズには，ターゲット定義の制約が課せられる．
メモリオブジェクト属性には，次の属性を指定することができる．
TA̲NOWRITETA̲NOREADTA̲NOEXECTA̲UNCACHE

0x01U
0x02U
0x04U
0x08U

書込みアクセス禁止
読出しアクセス禁止
実行アクセス禁止
キャッシュ禁止

メモリオブジェクトに対して書込みアクセスできるのは，メモリオブジェクト
属性に書込みアクセス禁止が指定されておらず，アクセス許可ベクタにより書込みアクセスが許可されている場合のみである．また，読出しアクセスおよび
実行アクセスに関しても同様である．
ただし，ターゲットハードウェアの制約によって，指定された属性を実現できngki̲spec‑120.txt

page 201

ない場合には，次のように扱われる．TA̲NOWRITE／TA̲NOREAD／TA̲NOEXECの属性によって指定したアクセス禁止が実現できない場合には，指定した属性が無視される．どのような場合にどの属性の指定が無視されるかは，ターゲット定義である．また，キャッシュ禁止にできないメモリオブジェクトに対してTA̲UNCACHE属性を指定した場合には，E̲RSATRエラーとなる．
また，ターゲットによっては，ターゲット定義のメモリオブジェクト属性を指定できる場合がある．ターゲット定義のメモリオブジェクト属性として，次の属性を予約している．
TA̲WTHROUGH

ライトスルーキャッシュを用いる【補足説明】
この仕様では，メモリオブジェクトが属するクラスは，ATT̲MOD／ATA̲MODにおいて，セクションが配置されるメモリリージョンを決定する以外には使用されない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，メモリオブジェクト管理機能をサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，メモリオブジェクト管理機能をサポートしない．
【μITRON4.0/PX仕様との関係】
値が0のメモリオブジェクト属性（TA̲RW，TA̲CACHE）は，デフォルトの扱いにして廃止した．TA̲ROはTA̲NOWRITEに改名し，TA̲NOREADとTA̲NOEXECを追加した．
また，TA̲UNCACHEの値を変更し，ターゲット定義のメモリオブジェクト属性としてTA̲WTHROUGHを予約した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ATT̲SEC
セクションの登録〔SP〕
ATA̲SEC
セクションの登録（アクセス許可ベクタ付き）〔SP〕【静的API】
ATT̲SEC("セクション名", { ATR mematr, "メモリリージョン名" })ATA̲SEC("セクション名", { ATR mematr, "メモリリージョン名" },{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })【パラメータ】"セクション名"
ATR
mematr"メモリリージョン名"登録するセクションを指定する文字列
メモリオブジェクト属性
セクションを配置するメモリリージョンを指定する文字列＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【エラーコード】
E̲RSATR
E̲PAR

予約属性（mematrが不正または使用できない，属するクラスが不正）
パラメータエラー（セクション名，メモリリージョン名が不正）ngki̲spec‑120.txt

page 202【機能】
各パラメータで指定した情報に従って，指定したセクションをカーネルに登録する．具体的な振舞いは以下の通り．
各オブジェクトモジュール中に含まれるセクション名で指定したセクションが，メモリリージョン名で指定したメモリリージョンに配置され，メモリオブジェ
クトとして登録される．登録されるメモリオブジェクトには，mematrで指定したメモリオブジェクト属性が設定される．ATA̲SECの場合には，登録されるメモ
リオブジェクトのアクセス許可ベクタ（4つのアクセス許可パターンの組）が，acptn1〜acptn4で指定した値に設定される．
登録されるメモリオブジェクトと同じ保護ドメインに属し，メモリオブジェク
ト属性とアクセス許可ベクタがすべて一致するメモリオブジェクトがある場合には，1つのメモリオブジェクトにまとめて登録される場合がある．
セクション名とメモリリージョン名は文字列パラメータ，mematr，acptn1〜
acptn4は整数定数式パラメータである．
ATT̲MOD／ATA̲MODがサポートされているターゲットでは，セクション名として，標準のセクションを指定することはできない．指定した場合には，E̲PARエラーとなる．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様に定義されていない静的APIである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ATT̲MOD
オブジェクトモジュールの登録〔SP〕
ATA̲MOD
オブジェクトモジュールの登録（アクセス許可ベクタ付き）〔SP〕【静的API】
ATT̲MOD("オブジェクトモジュール名")
ATA̲MOD("オブジェクトモジュール名",{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })【パラメータ】"オブジェクトモジュール名"

登録するオブジェクトモジュールを指定する文字列＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【エラーコード】
E̲RSATRE̲NOSPT

予約属性（属するクラスが不正）未サポート機能（ATT̲MOD／ATA̲MODがサポートされてい
ない）

【機能】
各パラメータで指定した情報に従って，指定したオブジェクトモジュールをカーネルに登録する．具体的な振舞いは以下の通り．
オブジェクトモジュール名で指定したオブジェクトモジュール中に含まれる標準のセクションが，それぞれ，ターゲット定義でセクション毎に定まるメモリ

ngki̲spec‑120.txt

page 203

リージョンに配置され，メモリオブジェクトとして登録される．登録されるメ
モリオブジェクトには，ターゲット定義でセクション毎に定まるメモリオブジェ
クト属性が設定される．ATA̲MODの場合には，登録されるメモリオブジェクトのアクセス許可ベクタ（4つのアクセス許可パターンの組）が，acptn1〜acptn4で指定した値に設定される．
マルチプロセッサ対応カーネルでは，各セクションが配置されるメモリリージョ
ンは，メモリオブジェクトが属するクラスとセクション毎に，ターゲット定義で定められる．
登録されるメモリオブジェクトと同じ保護ドメインに属し，メモリオブジェク
ト属性とアクセス許可ベクタがすべて一致するメモリオブジェクトがある場合には，1つのメモリオブジェクトにまとめて登録される場合がある．
オブジェクトモジュール名は文字列パラメータ，acptn1〜acptn4は整数定数式
パラメータである．
ターゲット定義で，ATT̲MOD／ATA̲MODがサポートされていない場合がある．
【補足説明】
各セクションが配置されるメモリリージョンとそれに設定されるメモリオブジェ
クト属性は，例えば，プログラムコードを含むセクションであれば，フラッシュ
メモリのメモリリージョンに配置し，書込みアクセス禁止のメモリオブジェク
ト属性が設定されるというように，ターゲットシステム毎に定められる．
ATT̲MOD／ATA̲MODでは，標準のセクション以外は配置・登録されない．標準のセクション以外のセクションを配置・登録するためには，ATT̲SEC/ATA̲SECを用いる必要がある．
【μITRON4.0/PX仕様との関係】
オブジェクトモジュール中に含まれるセクションの配置場所が，ターゲット定義でセクション毎に定まるメモリリージョンであることを明確化した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ATT̲MEM
メモリオブジェクトの登録〔SP〕
ATA̲MEM
メモリオブジェクトの登録（アクセス許可ベクタ付き）〔SP〕
att̲mem
メモリオブジェクトの登録〔TPD〕【静的API】
ATT̲MEM({ ATR mematr, void *base, SIZE size })ATA̲MEM({ ATR mematr, void *base, SIZE size },{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = att̲mem(const T̲AMEM *pk̲amem)【パラメータ】
T̲AMEM *pk̲amem

メモリオブジェクトの登録情報を入れたパケッ
トへのポインタ（静的APIを除く）＊メモリオブジェクトの登録情報（パケットの内容）
ATR
mematr
メモリオブジェクト属性
void *
base
登録するメモリ領域の先頭番地
SIZE
size
登録するメモリ領域のサイズ（バイト数）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン

ngki̲spec‑120.txt
ACPTN
ACPTN
ACPTN

page 204

acptn2
acptn3
acptn4【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲NOSPT
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

通常操作2のアクセス許可パターン
管理操作のアクセス許可パターン
参照操作のアクセス許可パターン

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（mematrが不正または使用できない，属する保護ドメインかクラスが不正）未サポート機能（条件はターゲット定義）
パラメータエラー（base，sizeが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲amemが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（登録済みのメモリオブジェク
トとメモリ領域が重なる）【機能】
各パラメータで指定したメモリオブジェクト登録情報に従って，メモリオブジェ
クトを登録する．具体的な振舞いは以下の通り．
baseとsizeで指定したメモリ領域が，メモリオブジェクトとして登録される．
登録されるメモリオブジェクトには，mematrで指定したメモリオブジェクト属
性が設定される．ATA̲MEMの場合には，登録されるメモリオブジェクトのアクセ
ス許可ベクタ（4つのアクセス許可パターンの組）が，acptn1〜acptn4で指定した値に設定される．
静的APIにおいては，mematr，base，size，acptn1〜acptn4は整数定数式パラメー
タである．
ターゲット定義で，この機能により登録できるメモリオブジェクトが属する保護ドメインや登録できる数に制限がある場合がある．
baseやsizeに，ターゲット定義の制約に合致しない先頭番地やサイズを指定した時には，E̲PARエラーとなる．また，sizeが0の場合には，E̲PARエラーとなる．
登録しようとしたメモリオブジェクトが，登録済みのメモリオブジェクトとメ
モリ領域が重なる場合には，E̲OBJエラーとなる．
【使用上の注意】
ATT̲MEM／ATA̲MEMは，ユーザタスクからメモリ空間にマッピングされたI/O領域にアクセスできるようにするために使用することを想定した静的APIである．メ
モリ領域に対しては，ATT̲SEC／ATA̲SECかATT̲MOD／ATA̲MODを使用することを推奨する．
【μITRON4.0/PX仕様との関係】
アクセス許可ベクタを指定してメモリオブジェクトを登録するサービスコール（ata̲mem）は廃止した．
baseやsizeがターゲット定義の制約に合致しない場合，μITRON4.0/PX仕様ではターゲット定義の制約に合致するようにメモり領域を広げることとしていたが，この仕様ではE̲PARエラーとなることとした．

ngki̲spec‑120.txt

page 205‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sac̲mem
メモリオブジェクトのアクセス許可ベクタの設定〔TPD〕【C言語API】
ER ercd = sac̲mem(const void *base, const ACVCT *p̲acvct)【パラメータ】
void *ACVCT *

basep̲acvct

メモリオブジェクトの先頭番地
アクセス許可ベクタを入れたパケットへのポインタ＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
パラメータエラー（baseが不正）オブジェクト未登録（baseで指定した番地を含むメモリ
オブジェクトが登録されていない）
オブジェクトアクセス違反（対象メモリオブジェクトに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象メモリオブジェクトは静的APIで登録された）【機能】baseで指定したメモリオブジェクト（対象メモリオブジェクト）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIによって登録したメモリオブジェクトは，アクセス許可ベクタを設定することができない．アクセス許可ベクタを設定しようとした場合には，E̲OBJエ
ラーとなる．
baseに，メモリオブジェクトの先頭番地以外を指定した場合には，E̲PARエラーとなる．
【μITRON4.0/PX仕様との関係】
静的APIによって登録したメモリオブジェクトは，アクセス許可ベクタを設定することができないこととした．
μITRON4.0/PX仕様では，baseはメモリオブジェクトに含まれる番地を指定するものとしていたが，この仕様では，メモリオブジェクトの先頭番地でなければならないものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
det̲mem
メモリオブジェクトの登録解除〔TPD〕【C言語API】

ngki̲spec‑120.txt

page 206

ER ercd = det̲mem(const void *base)【パラメータ】
void *

base

メモリオブジェクトの先頭番地【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
パラメータエラー（baseが不正）オブジェクト未登録（baseで指定される番地を含むメモ
リオブジェクトが登録されていない）
オブジェクトアクセス違反（対象メモリオブジェクトに対する管理操作が許可されていない）
オブジェクト状態エラー（対象メモリオブジェクトは静的APIで登録された）【機能】baseで指定したメモリオブジェクト（対象メモリオブジェクト）を登録解除する．
静的APIによって登録したメモリオブジェクトは，登録を解除することができな
い．登録を解除しようとした場合には，E̲OBJエラーとなる．
baseに，メモリオブジェクトの先頭番地以外を指定した場合には，E̲PARエラーとなる．
【μITRON4.0/PX仕様との関係】
静的APIによって登録したメモリオブジェクトは，登録を解除することができないこととした．
μITRON4.0/PX仕様では，baseはメモリオブジェクトに含まれる番地を指定するものとしていたが，この仕様では，メモリオブジェクトの先頭番地でなければならないものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
prb̲mem
メモリ領域に対するアクセス権のチェック〔TP〕【C言語API】
ER̲BOOL ercd = prb̲mem(const void *base, SIZE size,
ID domid, ID taskid, MODE pmmode)【パラメータ】
void *
SIZE
ID
ID
MODE

base
size
domid
tskid
pmmode【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

メモリ領域の先頭番地
メモリ領域のサイズ（バイト数）
アクセス元の保護ドメインのID番号アクセス元のタスクのID番号
アクセスモード

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）ngki̲spec‑120.txt
E̲ID
E̲PAR
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

page 207
不正ID番号（domid，tskidが不正）
パラメータエラー（base，size，pmmodeが不正）オブジェクト未登録（baseで指定される番地を含むメモ
リオブジェクトが登録されていない）
オブジェクトアクセス違反（対象メモリ領域を含むメモ
リオブジェクトに対する参照操作が許可されていない）
メモリアクセス違反（対象メモリ領域へのアクセスが許可されていない）
オブジェクト状態エラー（対象メモリ領域がメモリオブジェクトの境界を越えている）【機能】
baseとsizeで指定したメモリ領域（対象メモリ領域）がタスクのユーザスタッ
ク領域でない場合には，domidで指定した保護ドメインから対象メモリ領域に対して，pmmodeで指定した種別のアクセスが許可されているかをチェックする．
対象メモリ領域がタスクのユーザスタック領域である場合には，tskidで指定したタスクから対象メモリ領域に対して，pmmodeで指定した種別のアクセスが許可されているかをチェックする．アクセスが許可されている場合にtrue，そうでない場合にfalseが返る．
pmmodeには，TPM̲WRITE（＝0x01U），TPM̲READ（＝0x02U），TPM̲EXEC（＝0x04U）のいずれか，またはそれらの内のいくつかのビット毎論理和（C言語の"￨"）を指定することができる．TPM̲WRITE，TPM̲READ，TPM̲EXECを指定した場
合には，それぞれ，読出しアクセス，書込みアクセス，実行アクセスが許可されているかをチェックする．また，いくつかのビット毎論理和を指定した場合には，それらに対応した種別のアクセスがすべて許可されているかをチェックする．
対象メモリ領域がタスクのユーザスタック領域でない場合に，domidにTDOM̲SELF（＝0）を指定すると，自タスクの属する保護ドメインからアクセスが許可されているかをチェックする．自タスクがカーネルドメインに属する場
合には，常にtrueが返る．
対象メモリ領域がタスクのユーザスタック領域である場合に，tskidに
TSK̲SELF（＝0）を指定すると，自タスクからアクセスが許可されているかをチェックする．自タスクがカーネルドメインに属する場合には，常にtrueが返る．
sizeが0の場合には，E̲PARエラーとなる．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様では，TPM̲EXECは定義されていない．また，TPM̲WRITEとTPM̲READの値を変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲mem
メモリオブジェクトの状態参照〔TP〕【C言語API】
ER ercd = ref̲mem(const void *base, T̲RMEM *pk̲rmem)☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.9 割込み管理機能
割込み処理のプログラムは，割込みサービスルーチン（ISR）として実現することを推奨する．割込みサービスルーチンをカーネルに登録する場合には，まず，

ngki̲spec‑120.txt

page 208

割込みサービスルーチンの登録対象となる割込み要求ラインの属性を設定しておく必要がある．割込みサービスルーチンは，カーネル内の割込みハンドラを経由して呼び出される．
ただし，カーネルが用意する割込みハンドラで対応できないケースに対応する
ために，アプリケーションで割込みハンドラを用意することも可能である．この場合にも，割込みハンドラをカーネルに登録する前に，割込みハンドラの登録対象となる割込みハンドラ番号に対応する割込み要求ラインの属性を設定しておく必要がある．
割込み要求ラインの属性を設定する際に指定する割込み要求ライン属性には，次の属性を指定することができる．
TA̲ENAINTTA̲EDGE

0x01U
0x02U

割込み要求禁止フラグをクリア
エッジトリガターゲットによっては，ターゲット定義の割込み要求ライン属性を指定できる場合がある．ターゲット定義の割込み要求ライン属性として，次の属性を予約している．
TA̲POSEDGETA̲NEGEDGETA̲BOTHEDGETA̲LOWLEVELTA̲HIGHLEVELTA̲BROADCAST

ポジティブエッジトリガ
ネガティブエッジトリガ
両エッジトリガ
ローレベルトリガ
ハイレベルトリガ
すべてのプロセッサで割込みを処理（マルチプロセッ
サ対応カーネルの場合）

割込みサービスルーチンは，カーネルが実行を制御する処理単位である．割込
みサービスルーチンは，割込みサービスルーチンIDと呼ぶID番号によって識別する．
1つの割込み要求ラインに対して複数の割込みサービスルーチンを登録した場合，それらの割込みサービスルーチンは，割込みサービスルーチン優先度の高い順にすべて呼び出される．割込みサービスルーチン優先度が同じ場合には，登録した順（静的APIにより登録した場合には，割込みサービスルーチンを生成する
APIをコンフィギュレーションファイル中に記述した順）で呼び出される．
保護機能対応カーネルにおいて，割込みサービスルーチンが属することのできる保護ドメインは，カーネルドメインに限られる．
割込みサービスルーチン属性に指定できる属性はない．そのため割込みサービ
スルーチン属性には，TA̲NULLを指定しなければならない．
C言語による割込みサービスルーチンの記述形式は次の通り．
void interrupt̲service̲routine(intptr̲t exinf){
割込みサービスルーチン本体}
exinfには，割込みサービスルーチンの拡張情報が渡される．
割込みハンドラは，カーネルが実行を制御する処理単位である．割込みハンド
ラは，割込みハンドラ番号と呼ぶオブジェクト番号によって識別する．
保護機能対応カーネルにおいて，割込みハンドラは，カーネルドメインに属す
る．

ngki̲spec‑120.txt

page 209

割込みハンドラを登録する際に指定する割込みハンドラ属性には，ターゲット
定義で，次の属性を指定することができる．
TA̲NONKERNEL

0x02U

カーネル管理外の割込み

TA̲NONKERNELを指定しない場合，カーネル管理の割込みとなる．
C言語による割込みハンドラの記述形式は次の通り．
void interrupt̲handler(void){
割込みハンドラ本体}
割込み管理機能に関連するカーネル構成マクロは次の通り．
TMIN̲INTPRI
TMAX̲INTPRI

割込み優先度の最小値（最高値）
割込み優先度の最大値（最低値，＝‑1）

TMIN̲ISRPRI
TMAX̲ISRPRI

割込みサービスルーチン優先度の最小値（＝1）
割込みサービスルーチン優先度の最大値

TOPPERS̲SUPPORT̲DIS̲INT
TOPPERS̲SUPPORT̲ENA̲INT

dis̲intがサポートされている
ena̲intがサポートされている【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，割込みサービスルーチン優先度の最大値（＝TMAX̲ISRPRI）
は16に固定されている．ただし，タスク優先度拡張パッケージでは，TMAX̲ISRPRIを256に拡張する．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，割込みサービスルーチン優先度の最大値（＝TMAX̲ISRPRI）
は16に固定されている．
【μITRON4.0仕様との関係】
割込み要求ラインの属性，割込み優先度，割込みサービスルーチン優先度は，
μITRON4.0仕様にない概念であり，TMIN̲INTPRI，TMAX̲INTPRI，TMIN̲ISRPRI，
TMAX̲ISRPRIは，μITRON4.0仕様に定義のないカーネル構成マクロである．また，TA̲NONKERNELは，μITRON4.0仕様に定義のない割込みハンドラ属性である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CFG̲INT
割込み要求ラインの属性の設定〔S〕
cfg̲int
割込み要求ラインの属性の設定〔TD〕【静的API】
CFG̲INT(INTNO intno, { ATR intatr, PRI intpri })【C言語API】
ER ercd = cfg̲int(INTNO intno, const T̲CINT *pk̲cint)【パラメータ】
INTNO
T̲CINT *intnopk̲cint

割込み番号
割込み要求ラインの属性の設定情報を入れたパケットへのポインタ（静的APIを除く）

ngki̲spec‑120.txt

page 210＊割込み要求ラインの属性の設定情報（パケットの内容）
ATR
intatr
割込み要求ライン属性
PRI
intpri
割込み優先度【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲OACV〔sP〕
E̲MACV〔sP〕
E̲PAR
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（intatrが不正または使用できない，属する保護ドメインかクラスが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cintが指すメモリ領域への読出しアクセスが許可されていない）
パラメータエラー（intno，intpriが不正）オブジェクト状態エラー（対象割込み要求ラインに対してすでに属性が設定されている：CFG̲INTの場合，カーネ
ル管理の割込みか否かとintpriの値が整合していない）【機能】
intnoで指定した割込み要求ライン（対象割込み要求ライン）に対して，各パラ
メータで指定した属性を設定する．
対象割込み要求ラインの割込み要求禁止フラグは，intatrにTA̲ENAINTを指定した場合にクリアされ，指定しない場合にセットされる．
静的APIにおいては，intno，intatr，intpriは整数定数式パラメータである．
cfg̲intにおいて，ターゲット定義で，複数の割込み要求ラインの割込み優先度
が連動して設定される場合がある．
CFG̲INTにおいて，対象割込み要求ラインに対してすでに属性が設定されている場合（言い換えると，同じ割込み番号に対するCFG̲INTが複数ある場合）には，
E̲OBJエラーとなる．
intpriに指定できる値は，基本的には，TMIN̲INTPRI以上，TMAX̲INTPRI以下の値である．ターゲット定義の拡張で，カーネル管理外の割込み要求ラインに対しても属性を設定できる場合には，TMIN̲INTPRIよりも小さい値を指定することができる．このように拡張されている場合，カーネル管理外の割込み要求ラインを対象として，intpriにTMIN̲INTPRI以上の値を指定した場合には，E̲OBJエ
ラーとなる．逆に，カーネル管理の割込み要求ラインを対象として，intpriがTMIN̲INTPRIよりも小さい値である場合にも，E̲OBJエラーとなる．
対象割込み要求ラインに対して，設定できない割込み属性をintatrに指定した
場合にはE̲RSATRエラー，設定できない割込み優先度をintpriに指定した場合にはE̲PARエラーとなる．ここで，設定できない割込み属性／割込み優先度には，ターゲット定義の制限によって設定できない値も含む．
マルチプロセッサ対応カーネルで，CFG̲INTの記述が，対象割込み要求ラインに対して登録された割込みサービスルーチン（または対象割込み番号に対応する
割込みハンドラ番号に対して登録された割込みハンドラ）と異なるクラスの囲み中にある場合には，E̲RSATRエラーとなる．
【補足説明】

ngki̲spec‑120.txt

page 211

ターゲット定義の制限によって設定できない割込み属性／割込み優先度は，主にターゲットハードウェアの制限から来るものである．例えば，対象割込み要求ラインに対して，トリガモードや割込み優先度が固定されていて，変更できないケースが考えられる．
cfg̲intにおいて，ターゲット定義で，複数の割込み要求ラインの割込み優先度
が連動して設定されるのは，ターゲットハードウェアの制限により，異なる割込み要求ラインに対して，同一の割込み優先度しか設定できないケースに対応するための仕様である．この場合，CFG̲INTにおいては，同一の割込み優先度しか設定できない割込み要求ラインに対して異なる割込み優先度を設定した場合には，E̲PARエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CFG̲INTのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CFG̲INTのみをサポートする．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていない静的APIおよびサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲ISR
割込みサービスルーチンの生成〔S〕
ATT̲ISR
割込みサービスルーチンの追加〔S〕
acre̲isr
割込みサービスルーチンの生成〔TD〕【静的API】
CRE̲ISR(ID isrid, { ATR isratr, intptr̲t exinf,
INTNO intno, ISR isr, PRI isrpri })ATT̲ISR({ ATR isratr, intptr̲t exinf, INTNO intno, ISR isr, PRI isrpri })【C言語API】
ER̲ID isrid = acre̲isr(const T̲CISR *pk̲cisr)【パラメータ】
ID

isrid

T̲CISR *pk̲cisr

対象割込みサービスルーチンのID番号（CRE̲ISRの場合）
割込みサービスルーチンの生成情報を入れたパケットへのポインタ（静的APIを除く）＊割込みサービスルーチンの生成情報（パケットの内容）
ATR
isratr
割込みサービスルーチン属性
intptr̲t
exinf
割込みサービスルーチンの拡張情報
INTNO
intno
割込みサービスルーチンを登録する割込み番号
ISR
isr
割込みサービスルーチンの先頭番地
PRI
isrpri
割込みサービスルーチン優先度【リターンパラメータ】
ER̲ID
isrid

【エラーコード】
E̲CTX〔s〕
E̲RSATR

生成された割込みサービスルーチンのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（isratrが不正または使用できない，属する保護ドメインかクラスが不正）ngki̲spec‑120.txt
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲NOID〔s〕
E̲OBJ

page 212
パラメータエラー（intno，isr，isrpriが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cisrが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられる割込みサービスルーチンIDがない）
オブジェクト状態エラー（isridで指定した割込みサービ
スルーチンが登録済み：CRE̲ISRの場合，その他の条件については機能説明を参照すること）【機能】
各パラメータで指定した割込みサービスルーチン生成情報に従って，割込みサー
ビスルーチンを生成する．
ATT̲ISRによって生成された割込みサービスルーチンは，ID番号を持たない．
intnoで指定した割込み要求ラインの属性が設定されていない場合には，E̲OBJ
エラーとなる．また，intnoで指定した割込み番号に対応する割込みハンドラ番号に対して，割込みハンドラを定義する機能（DEF̲INH，def̲inh）によって割込みハンドラが定義されている場合にも，E̲OBJエラーとなる．さらに，intno
でカーネル管理外の割込みを指定した場合にも，E̲OBJエラーとなる．
静的APIにおいては，isridはオブジェクト識別名，isratr，intno，isrpriは整数定数式パラメータ，exinfとisrは一般定数式パラメータである．
保護機能対応カーネルにおいて，CRE̲ISRおよびATT̲ISRは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，acre̲isrで，生成する割込みサービスルーチンが属する保護ドメ
インとしてカーネルドメイン以外を指定した場合には，E̲RSATRエラーとなる．
マルチプロセッサ対応カーネルで，生成する割込みサービスルーチンの属するクラスの割付け可能プロセッサが，intnoで指定した割込み要求ラインが接続されたプロセッサの集合に含まれていない場合には，E̲RSATRエラーとなる．また，
intnoで指定した割込み要求ラインに対して登録済みの割込みサービスルーチンがある場合に，生成する割込みサービスルーチンがそれと異なるクラスに属す
る場合にも，E̲RSATRエラーとなる．
isrpriは，TMIN̲ISRPRI以上，TMAX̲ISRPRI以下でなければならない．
静的APIにおいて，isrが不正である場合にE̲PARエラーが検出されるか否かは，ターゲット定義である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ATT̲ISRのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ATT̲ISRのみをサポートする．
【μITRON4.0仕様との関係】
割込みサービスルーチンの生成情報に，isrpri（割込みサービスルーチンの割
込み優先度）を追加した．CRE̲ISRは，μITRON4.0仕様に定義されていない静的
APIである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑120.txt
AID̲ISR

page 213

割付け可能な割込みサービスルーチンIDの数の指定〔SD〕【静的API】
AID̲ISR(uint̲t noisr)【パラメータ】
uint̲t【エラーコード】
E̲RSATR

noisr

割付け可能な割込みサービスルーチンIDの数

予約属性（属する保護ドメインまたはクラスが不正）【機能】
noisrで指定した数の割込みサービスルーチンIDを，割込みサービスルーチンを生成するサービスコールによって割付け可能な割込みサービスルーチンIDとして確保する．
noisrは整数定数式パラメータである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲ISR
割込みサービスルーチンのアクセス許可ベクタの設定〔SP〕
sac̲isr
割込みサービスルーチンのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲ISR(ID isrid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲isr(ID isrid, const ACVCT *p̲acvct)【パラメータ】
ID
ACVCT *

isridp̲acvct

対象割込みサービスルーチンのID番号
アクセス許可ベクタを入れたパケットへのポインタ（静的APIを除く）＊アクセス許可ベクタ（パケットの内容）
ACPTN
acptn1
通常操作1のアクセス許可パターン
ACPTN
acptn2
通常操作2のアクセス許可パターン
ACPTN
acptn3
管理操作のアクセス許可パターン
ACPTN
acptn4
参照操作のアクセス許可パターン【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲ID
E̲RSATRE̲NOEXS〔D〕
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（isridが不正）予約属性（属する保護ドメインかクラスが不正：SAC̲ISRの場合）
オブジェクト未登録（対象割込みサービスルーチンが未登録）
オブジェクトアクセス違反（対象割込みサービスルーチ
ンに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象割込みサービスルーチン
は静的APIで生成された：sac̲isrの場合，対象割込みサーngki̲spec‑120.txt

page 214
ビスルーチンに対してアクセス許可ベクタが設定済み：
SAC̲ISRの場合）【機能】
isridで指定した割込みサービスルーチン（対象割込みサービスルーチン）のア
クセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
静的APIにおいては，isridはオブジェクト識別名，acptn1〜acptn4は整数定数
式パラメータである．
SAC̲ISRは，対象割込みサービスルーチンが属する保護ドメイン（この仕様ではカーネルドメインに限られる）の囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲ISR，sac̲isrをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲ISR，sac̲isrをサポートしない．
【未決定事項】
割込みサービスルーチンのアクセス許可ベクタを設けず，システム状態のアク
セス許可ベクタでアクセス保護する方法も考えられる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲isr
割込みサービスルーチンの削除〔TD〕【C言語API】
ER ercd = del̲isr(ID isrid)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲isrをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲isrをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲isr
割込みサービスルーチンの状態参照〔T〕【C言語API】
ER ercd = ref̲isr(ID isrid, T̲RISR *pk̲risr)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ref̲isrをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ref̲isrをサポートしない．

ngki̲spec‑120.txt

page 215‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
DEF̲INH
割込みハンドラの定義〔S〕
def̲inh
割込みハンドラの定義〔TD〕【静的API】
DEF̲INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })【C言語API】
ER ercd = def̲inh(INHNO inhno, const T̲DINH *pk̲dinh)【パラメータ】
INHNO
T̲DINH *inhnopk̲dinh

割込みハンドラ番号
割込みハンドラの定義情報を入れたパケットへのポインタ（静的APIを除く）＊割込みハンドラの定義情報（パケットの内容）
ATR
inhatr
割込みハンドラ属性
INTHDR
inthdr
割込みハンドラの先頭番地【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATRE̲OACV〔sP〕
E̲MACV〔sP〕
E̲PAR
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（inhatrが不正または使用できない，属する保護ドメインかクラスが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dinhが指すメモリ領域への読出しアクセスが許可されていない）
パラメータエラー（inhno，inthdrが不正）
オブジェクト状態エラー（条件については機能説明を参照すること）【機能】
inhnoで指定した割込みハンドラ番号（対象割込みハンドラ番号）に対して，各パラメータで指定した割込みハンドラ定義情報に従って，割込みハンドラを定義する．ただし，def̲inhにおいてpk̲dinhをNULLにした場合には，対象割込み
ハンドラ番号に対する割込みハンドラの定義を解除する．
静的APIにおいては，inhnoとinhatrは整数定数式パラメータ，inthdrは一般定
数式パラメータである．
割込みハンドラを定義する場合（DEF̲INHの場合およびdef̲inhにおいて
pk̲dinhをNULL以外にした場合）には，次のエラーが検出される．
対象割込みハンドラ番号に対応する割込み要求ラインの属性が設定されていな
い場合には，E̲OBJエラーとなる．また，対象割込みハンドラ番号に対してすでに割込みハンドラが定義されている場合と，対象割込みハンドラ番号に対応する割込み番号を対象に割込みサービスルーチンが登録されている場合にも，
E̲OBJエラーとなる．
ターゲット定義の拡張で，カーネル管理外の割込みに対しても割込みハンドラを定義できる場合には，次のエラーが検出される．カーネル管理外の割込みハ
ンドラを対象として，inhatrにTA̲NONKERNELを指定しない場合には，E̲OBJエラーとなる．逆に，カーネル管理の割込みハンドラを対象として，inhatrにngki̲spec‑120.txt

page 216

TA̲NONKERNELを指定した場合にも，E̲OBJエラーとなる．また，ターゲット定義
でカーネル管理外に固定されている割込みハンドラがある場合には，それを対象割込みハンドラに指定して，inhatrにTA̲NONKERNELを指定しない場合には，
E̲RSATRエラーとなる．逆に，ターゲット定義でカーネル管理に固定されている
割込みハンドラがある場合には，それを対象割込みハンドラに指定して，
inhatrにTA̲NONKERNELを指定した場合には，E̲RSATRエラーとなる．
保護機能対応カーネルにおいて，DEF̲INHは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，
def̲inhで割込みハンドラを定義する場合には，割込みハンドラの属する保護ドメインを設定する必要はなく，割込みハンドラ属性にTA̲DOM(domid)を指定した
場合にはE̲RSATRエラーとなる．ただし，TA̲DOM(TDOM̲SELF)を指定した場合には，指定が無視され，E̲RSATRエラーは検出されない．
マルチプロセッサ対応カーネルで，登録する割込みハンドラの属するクラスの初期割付けプロセッサが，その割込みが要求されるプロセッサでない場合には，
E̲RSATRエラーとなる．
割込みハンドラの定義を解除する場合（def̲inhにおいてpk̲dinhをNULLにした場合）で，対象割込みハンドラ番号に対して割込みハンドラが定義されていな
い場合には，E̲OBJエラーとなる．
静的APIにおいて，inthdrが不正である場合にE̲PARエラーが検出されるか否か
は，ターゲット定義である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，DEF̲INHのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，DEF̲INHのみをサポートする．
【μITRON4.0仕様との関係】
inthdrのデータ型をINTHDRに変更した．
def̲inhによって定義済みの割込みハンドラを再定義しようとした場合に，
E̲OBJエラーとすることにした．割込みハンドラの定義を変更するには，一度定義を解除してから，再度定義する必要がある．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
dis̲int
割込みの禁止〔T〕【C言語API】
ER ercd = dis̲int(INTNO intno)【パラメータ】
INTNO

intno

【リターンパラメータ】
ER
ercd【エラーコード】
E̲NOSPT
E̲CTX
E̲PAR

割込み番号

正常終了（E̲OK）またはエラーコード

未サポートエラー（dis̲intがサポートされていない）
コンテキストエラー（非タスクコンテキストからの呼出し）パラメータエラー（intnoが不正，intnoで指定した割込
み要求ラインに対して割込み要求禁止フラグをセットすngki̲spec‑120.txt

E̲OACV〔P〕
E̲OBJ

page 217
ることはできない）
オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない）
オブジェクト状態エラー（intnoで指定した割込み要求ラインに対して割込み属性が設定されていない）【機能】
intnoで指定した割込み要求ライン（対象割込み要求ライン）の割込み要求禁止
フラグをセットする．
ターゲット定義で，dis̲intがサポートされていない場合がある．dis̲intがサポートされている場合には，TOPPERS̲SUPPORT̲DIS̲INTがマクロ定義される．サ
ポートされていない場合にdis̲intを呼び出すと，E̲NOSPTエラーが返るか，リ
ンク時にエラーとなる．
【μITRON4.0仕様との関係】
μITRON4.0仕様で実装定義としていたintnoの意味を標準化した．
CPUロック状態でも呼び出せるものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ena̲int
割込みの許可〔T〕【C言語API】
ER ercd = ena̲int(INTNO intno)【パラメータ】
INTNO

intno

【リターンパラメータ】
ER
ercd【エラーコード】
E̲NOSPT
E̲CTX
E̲PAR

E̲OACV〔P〕
E̲OBJ

割込み番号

正常終了（E̲OK）またはエラーコード

未サポートエラー（ena̲intがサポートされていない）
コンテキストエラー（非タスクコンテキストからの呼出し）パラメータエラー（intnoが不正，intnoで指定した割込
み要求ラインに対して割込み要求禁止フラグをクリアすることはできない）
オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない）
オブジェクト状態エラー（intnoで指定した割込み要求ラインに対して割込み属性が設定されていない）【機能】
intnoで指定した割込み要求ライン（対象割込み要求ライン）の割込み要求禁止
フラグをクリアする．
ターゲット定義で，ena̲intがサポートされていない場合がある．ena̲intがサポートされている場合には，TOPPERS̲SUPPORT̲ENA̲INTがマクロ定義される．サ
ポートされていない場合にena̲intを呼び出すと，E̲NOSPTエラーが返るか，リ
ンク時にエラーとなる．
【μITRON4.0仕様との関係】
μITRON4.0仕様で実装定義としていたintnoの意味を標準化した．

ngki̲spec‑120.txt

page 218

CPUロック状態でも呼び出せるものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲int
割込み要求ラインの参照〔T〕【C言語API】
ER ercd = ref̲int(INTNO intno, T̲RINT *pk̲rint)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ref̲intをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ref̲intをサポートしない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
chg̲ipm
割込み優先度マスクの変更〔T〕【C言語API】
ER ercd = chg̲ipm(PRI intpri)【パラメータ】
PRI

intpri【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲PAR
E̲OACV〔P〕

割込み優先度マスク

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
パラメータエラー（intpriが不正）オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない）【機能】
割込み優先度マスクを，intpriで指定した値に変更する．
intpriは，TMIN̲INTPRI以上，TIPM̲ENAALL以下でなければならない．ただし，ターゲット定義の拡張として，TMIN̲INTPRIよりも小さい値を指定できる場合がある．
【補足説明】
割込み優先度マスクをTIPM̲ENAALLに変更した場合，ディスパッチ保留状態が解除され，ディスパッチが起こる可能性がある．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，サービスコールの名称およびパラメータの名称が実装定義となっているサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑120.txt
get̲ipm

page 219

割込み優先度マスクの参照〔T〕【C言語API】
ER ercd = get̲ipm(PRI *p̲intpri)【パラメータ】
PRI *p̲intpri【リターンパラメータ】
ER
ercd
PRI
intpri【エラーコード】
E̲CTX
E̲OACV〔P〕

割込み優先度マスクを入れるメモリ領域へのポインタ

エラーコード割込み優先度マスク

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクトアクセス違反（システム状態に対する参照
操作が許可されていない）【機能】
割込み優先度マスクの現在値を参照する．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，サービスコールの名称およびパラメータの名称が実装定義となっているサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.10 CPU例外管理機能
CPU例外ハンドラは，カーネルが実行を制御する処理単位である．CPU例外ハン
ドラは，CPU例外ハンドラ番号と呼ぶオブジェクト番号によって識別する．
保護機能対応カーネルにおいて，CPU例外ハンドラは，カーネルドメインに属す
る．
CPU例外ハンドラ属性に指定できる属性はない．そのためCPU例外ハンドラ属性には，TA̲NULLを指定しなければならない．
C言語によるCPU例外ハンドラの記述形式は次の通り．
void cpu̲exception̲handler(void *p̲excinf){
CPU例外ハンドラ本体}
p̲excinfには，CPU例外の情報を記憶しているメモリ領域の先頭番地が渡される．
これは，CPU例外ハンドラ内で，CPU例外発生時の状態を参照する際に必要となる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
DEF̲EXC
CPU例外ハンドラの定義〔S〕
def̲exc
CPU例外ハンドラの定義〔TD〕【静的API】
DEF̲EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })【C言語API】

ngki̲spec‑120.txt

page 220

ER ercd = def̲exc(EXCNO excno, const T̲DEXC *pk̲dexc)【パラメータ】
EXCNO
T̲DEXC *excno
pk̲dexc

CPU例外ハンドラ番号
CPU例外ハンドラの定義情報を入れたパケットへのポインタ（静的APIを除く）＊CPU例外ハンドラの定義情報（パケットの内容）
ATR
excatr
CPU例外ハンドラ属性
EXCHDR
exchdr
CPU例外ハンドラの先頭番地【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（excatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（excno，exchdrが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dexcが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（定義済みのCPU例外ハンドラ番号に対する再定義，未定義のCPU例外ハンドラ番号に対す
る定義解除）【機能】
excnoで指定したCPU例外ハンドラ番号（対象CPU例外ハンドラ番号）に対して，各パラメータで指定したCPU例外ハンドラ定義情報に従って，CPU例外ハンドラを定義する．ただし，def̲excにおいてpk̲dexcをNULLにした場合には，対象
CPU例外ハンドラ番号に対するCPU例外ハンドラの定義を解除する．
静的APIにおいては，excnoとexcatrは整数定数式パラメータ，exchdrは一般定
数式パラメータである．
CPU例外ハンドラを定義する場合（DEF̲EXCの場合およびdef̲excにおいてpk̲dexcをNULL以外にした場合）で，対象CPU例外ハンドラ番号に対してすでにCPU例外ハンドラが定義されている場合には，E̲OBJエラーとなる．
保護機能対応カーネルにおいて，DEF̲EXCは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，
def̲excでCPU例外ハンドラを定義する場合には，CPU例外ハンドラの属する保護
ドメインを設定する必要はなく，CPU例外ハンドラ属性にTA̲DOM(domid)を指定した場合にはE̲RSATRエラーとなる．ただし，TA̲DOM(TDOM̲SELF)を指定した場
合には，指定が無視され，E̲RSATRエラーは検出されない．
マルチプロセッサ対応カーネルで，登録するCPU例外ハンドラの属するクラスの初期割付けプロセッサが，そのCPU例外が発生するプロセッサでない場合には，
E̲RSATRエラーとなる．
CPU例外ハンドラの定義を解除する場合（def̲excにおいてpk̲dexcをNULLにした場合）で，対象CPU例外ハンドラ番号に対してCPU例外ハンドラが定義されていない場合には，E̲OBJエラーとなる．
静的APIにおいて，exchdrが不正である場合にE̲PARエラーが検出されるか否かngki̲spec‑120.txt

page 221は，ターゲット定義である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，DEF̲EXCのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，DEF̲EXCのみをサポートする．
【μITRON4.0仕様との関係】
def̲excによって，定義済みのCPU例外ハンドラを再定義しようとした場合に，
E̲OBJエラーとすることにした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
xsns̲dpn
CPU例外発生時のディスパッチ保留状態の参照〔TI〕【C言語API】
bool̲t stat = xsns̲dpn(void *p̲excinf)【パラメータ】
void *

p̲excinf【リターンパラメータ】
bool̲tstate

CPU例外の情報を記憶しているメモリ領域の先頭
番地

ディスパッチ保留状態【機能】
CPU例外発生時のディスパッチ保留状態を参照する．具体的な振舞いは以下の通り．
実行中のCPU例外ハンドラの起動原因となったCPU例外が，カーネル管理外のCPU例外でなく，タスクコンテキストで発生し，そのタスクがディスパッチできる状態である場合にfalse，そうでない場合にtrueが返る．
保護機能対応のカーネルにおいて，xsns̲dpnをタスクコンテキストから呼び出した場合には，trueが返る．
p̲excinfには，CPU例外ハンドラに渡されるp̲excinfパラメータをそのまま渡す．
【使用方法】
xsns̲dpnは，CPU例外ハンドラの中で，どのようなリカバリ処理が可能かを判別したい場合に使用する．xsns̲dpnがfalseを返した場合（trueを返した場合ではないので注意すること），非タスクコンテキスト用のサービスコールを用いてCPU例外を起こしたタスクよりも優先度の高いタスクを起動または待ち解除し，
そのタスクでリカバリ処理を行うことができる．ただし，CPU例外を起こしたタスクが最高優先度の場合には，この方法でリカバリ処理を行うことはできない．
【使用上の注意】xsns̲dpnは，E̲CTXエラーを返すことがないために〔TI〕となっているが，CPU
例外ハンドラから呼び出すためのものである．CPU例外ハンドラ以外から呼び出した場合や，p̲excinfに正しい値を渡さなかった場合，xsns̲dpnが返す値は意
味を持たない．
どちらの条件でtrueが返るか間違いやすいので注意すること．

ngki̲spec‑120.txt

page 222【補足説明】
xsns̲dpnがtrueを返す条件中の「カーネル管理外のCPU例外でなく」は，対称性のために記述してあるが，無くても同じ意味である．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
xsns̲xpn
CPU例外発生時のタスク例外処理保留状態の参照〔TI〕【C言語API】
bool̲t stat = xsns̲xpn(void *p̲excinf)【パラメータ】
void *

p̲excinf【リターンパラメータ】
bool̲tstate

CPU例外の情報を記憶しているメモリ領域の先頭番地

タスク例外処理保留状態【機能】
CPU例外発生時のタスク例外処理保留状態を参照する．具体的な振舞いは以下の通り．
実行中のCPU例外ハンドラの起動原因となったCPU例外が，カーネル管理外のCPU例外でなく，タスクコンテキストで発生し，そのタスクがタスク例外処理ルーチンを実行できる状態である場合にfalse，そうでない場合にtrueが返る．
ただし，保護機能対応カーネルにおけるタスク例外実行開始時スタック不正例
外とタスク例外リターン時スタック不正例外に対するCPU例外ハンドラでは，
xsns̲xpnの返値にかかわらず，CPU例外を発生させたタスクにタスク例外処理ルーチンを実行させることはできない．
保護機能対応のカーネルにおいて，xsns̲xpnをタスクコンテキストから呼び出した場合には，trueが返る．
p̲excinfには，CPU例外ハンドラに渡されるp̲excinfパラメータをそのまま渡す．
【使用方法】
xsns̲xpnは，CPU例外ハンドラの中で，どのようなリカバリ処理が可能かを判別したい場合に使用する．xsns̲xpnがfalseを返した場合（trueを返した場合ではないので注意すること），非タスクコンテキスト用のサービスコールを用いてCPU例外を起こしたタスクにタスク例外を要求し，タスク例外処理ルーチンでリカバリ処理を行うことができる．
【使用上の注意】xsns̲xpnは，E̲CTXエラーを返すことがないために〔TI〕となっているが，CPU
例外ハンドラから呼び出すためのものである．CPU例外ハンドラ以外から呼び出した場合や，p̲excinfに正しい値を渡さなかった場合，xsns̲xpnが返す値は意
味を持たない．
どちらの条件でtrueが返るか間違いやすいので注意すること．

ngki̲spec‑120.txt

page 223【補足説明】
xsns̲xpnがtrueを返す条件中の「カーネル管理外のCPU例外でなく」は，ターゲッ
ト定義で，割込み優先度マスクがTMIN̲INTPRIと同じかそれよりも高い状態で発生したCPU例外をカーネル管理外のCPU例外と扱う場合に，意味がある条件である．この場合には，CPU例外がタスクコンテキストで発生し，そのタスクがタス
ク例外処理ルーチンを実行できる状態であっても，割込み優先度マスクをTMIN̲INTPRIと同じかそれよりも高い値に設定していれば，trueが返る．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.11 拡張サービスコール管理機能
拡張サービスコールは，非特権モードで実行される処理単位から，特権モード
で実行すべきルーチンを呼び出すための機能である．特権モードで実行するルー
チンを，拡張サービスコールと呼ぶ．拡張サービスコールは，特権モードで実行される処理単位からも呼び出すことができる．
保護機能対応カーネルにおいて，拡張サービスコールは，カーネルドメインに属する．拡張サービスコールは，それを呼び出す処理単位とは別の処理単位であり，拡張サービスコールからカーネルオブジェクトをアクセスする場合には，
拡張サービスコールがアクセスの主体となる．そのため，拡張サービスコール
からは，すべてのカーネルオブジェクトに対して，すべての種別のアクセスを行うことが許可される．
保護機能対応でないカーネルでは，非特権モードと特権モードの区別がないため，拡張サービスコール管理機能をサポートしない．
C言語による拡張サービスコールの記述形式は次の通り．
ER̲UINT extended̲svc(ID cdmid, intptr̲t par1, intptr̲t par2,
intptr̲t par3, intptr̲t par4, intptr̲t par5){
拡張サービスコール本体}
cdmidには，拡張サービスコールを呼び出した処理単位が属する保護ドメインのID番号が渡される．すなわち，拡張サービスコールから呼び出した場合にはTDOM̲KERNEL（＝‑1）が，タスク本体（拡張サービスコールを除く）から呼び出した場合にはそのタスク（自タスク）の属する保護ドメインIDが渡される．
par1〜par5には，拡張サービスコールに対するパラメータが渡される．
拡張サービスコール管理機能に関連するカーネル構成マクロは次の通り．
TMAX̲FNCD

拡張サービスコールの機能番号の最大値（動的生成対応
カーネルでは，登録できる拡張サービスコールの数に一
致）【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，拡張サービスコール管理機能をサポートしない．
【TOPPERS/FMPカーネルにおける規定】

ngki̲spec‑120.txt

page 224

FMPカーネルでは，拡張サービスコール管理機能をサポートしない．
【未決定事項】
動的生成対応カーネルにおいてTMAX̲FNCDを設定する方法については，現時点では未決定である．
【μITRON4.0仕様との関係】
この仕様では，拡張サービスコールに対するパラメータを，intptr̲t型のパラメータ5個に固定した．
拡張サービスコールに，それを呼び出した処理単位が属する保護ドメインのID
番号を渡す機能を追加した．
TMAX̲FNCDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
DEF̲SVC
拡張サービスコールの定義〔SP〕
def̲svc
拡張サービスコールの定義〔TPD〕【静的API】
DEF̲SVC(FN fncd, { ATR svcatr, EXTSVC extsvc, SIZE stksz })【C言語API】
ER ercd = def̲svc(FN fncd, const T̲DSVC *pk̲dsvc)【パラメータ】
FN
T̲DSVC *fncd
pk̲dsvc

拡張サービスコールの機能コード
拡張サービスコールの定義情報を入れたパケッ
トへのポインタ（静的APIを除く）＊拡張サービスコールの定義情報（パケットの内容）
ATR
svcatr
拡張サービスコール属性
EXTSVCextsvc拡張サービスコールの先頭番地
SIZE
stksz
拡張サービスコールで使用するスタックサイズ【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX〔s〕
E̲RSATR
E̲PAR
E̲OACV〔sP〕
E̲MACV〔sP〕
E̲OBJ

正常終了（E̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（svcatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（fncd，extsvcが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dsvcが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（定義済みの機能コードに対す
る再定義，未定義の機能コードに対する定義解除）【機能】
fncdで指定した機能コード（対象機能コード）に対して，各パラメータで指定した拡張サービスコール定義情報に従って，拡張サービスコールを定義する．
ただし，def̲svcにおいてpk̲dsvcをNULLにした場合には，対象機能コードに対する拡張サービスコールの定義を解除する．

ngki̲spec‑120.txt

page 225

静的APIにおいては，fncd，svcatr，stkszは整数定数式パラメータ，svchdrは一般定数式パラメータである．
拡張サービスコールを定義する場合（DEF̲SVCの場合およびdef̲svcにおいて
pk̲dsvcをNULL以外にした場合）で，対象機能コードに対してすでに拡張サービ
スコールが定義されている場合には，E̲OBJエラーとなる．
DEF̲SVCは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，def̲svcで拡張サービスコールを定義する場合には，拡張サービスコールの属する保護ドメインを設定する必要はなく，拡張サービスコール属性にTA̲DOM(domid)を指定した場合にはE̲RSATRエラーとなる．ただし，TA̲DOM(TDOM̲SELF)を指定した場合には，指定が無視され，
E̲RSATRエラーは検出されない．
マルチプロセッサ対応カーネルでは，DEF̲SVCは，クラスの囲みの外に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．また，def̲svc
で拡張サービスコールを定義する場合には，拡張サービスコールの属するクラスを設定する必要はなく，拡張サービスコール属性にTA̲CLS(clsid)を指定した
場合にはE̲RSATRエラーとなる．ただし，TA̲CLS(TCLS̲SELF)を指定した場合には，指定が無視され，E̲RSATRエラーは検出されない．
拡張サービスコールの定義を解除する場合（def̲svcにおいてpk̲dsvcをNULLにした場合）で，対象機能コードに対して拡張サービスコールが定義されていな
い場合には，E̲OBJエラーとなる．
拡張サービスコールの機能コードには，正の値を用いる．fncdが0または負の値の場合には，E̲PARエラーとなる．また，fncdがTMAX̲FNCDよりも大きい場合にも，E̲PARエラーとなる．
【μITRON4.0仕様との関係】
拡張サービスコールの定義情報に，stksz（拡張サービスコールで使用するスタックサイズ）を追加した．
extsvcのデータ型を，EXTSVCに変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
cal̲svc
拡張サービスコールの呼出し〔TIP〕【C言語API】
ER̲UINT ercd = cal̲svc(FN fcnd, intptr̲t par1, intptr̲t par2,
intptr̲t par3, intptr̲t par4, intptr̲t par5)【パラメータ】
FN
intptr̲t
intptr̲t
intptr̲t
intptr̲t
intptr̲t

fncd
par1
par2
par3
par4
par5

呼び出す拡張サービスコールの機能コード
拡張サービスコールへの第1パラメータ
拡張サービスコールへの第2パラメータ
拡張サービスコールへの第3パラメータ
拡張サービスコールへの第4パラメータ
拡張サービスコールへの第5パラメータ【リターンパラメータ】
ER̲UINT
ercd【エラーコード】
E̲SYS
E̲RSFN

正常終了（正の値または0）またはエラーコード

システムエラー（拡張サービスコールのネストレベルが上限を超える）
予約機能コード（fncdが不正．fncdに対して拡張サービngki̲spec‑120.txt

page 226

スコールが定義されていない）
E̲NOMEM
メモリ不足（スタックの残り領域が不足）＊その他，拡張サービスコールが返すエラーコードがそのまま返る．
【機能】
fncdで指定した機能コードの拡張サービスコールを，par1，par2，…，par5をパラメータとして呼び出し，拡張サービスコールの返値を返す．
fncdが不正な値である場合や，fncdで指定した機能コードに対して拡張サービ
スコールが定義されていない場合には，E̲RSFNエラーとなる．
また，タスクコンテキストから呼び出した場合には，次のエラーが検出される．
スタックの残り領域が，拡張サービスコールで使用するスタックサイズよりも小さい場合には，E̲NOMEMエラーとなる．また，拡張サービスコールのネストレ
ベルが上限（255）を超える場合には，E̲SYSエラーが返る．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，cal̲svcでカーネルのサービスコールを呼び出せるかどうかは実装定義としているが，この仕様では，カーネルのサービスコールを呼び出せないこととした．
拡張サービスコールが呼び出される時に，スタックの残り領域のサイズをチェックする機能を追加した．
拡張サービスコールに対するパラメータを，intptr̲t型のパラメータ5個に固定し，cal̲svcから返るエラー（E̲SYS，E̲RSFN，E̲NOMEM）について規定した．
【仕様決定の理由】
パラメータの型と数を固定したのは，型チェックを厳密にできるようにし，パラメータをコンパイラやコーリングコンベンションによらずに正しく渡せるよ
うにするためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.12 システム構成管理機能
システム構成管理機能には，非タスクコンテキスト用スタック領域を設定する
機能，初期化ルーチンと終了処理ルーチンを登録する機能，カーネルのコンフィ
ギュレーション情報やバージョン情報を参照する機能が含まれる．
非タスクコンテキスト用スタック領域は，非タスクコンテキストで実行される
処理単位が用いるスタック領域である．
保護機能対応カーネルにおいて，非タスクコンテキスト用のスタック領域は，カーネルの用いるオブジェクト管理領域と同様に扱われる．
初期化ルーチンは，カーネルが実行を制御する処理単位で，カーネルの動作開始の直前に，カーネル非動作状態で実行される．
保護機能対応カーネルにおいて，初期化ルーチンは，カーネルドメインに属す
る．
初期化ルーチン属性に指定できる属性はない．そのため初期化ルーチン属性には，TA̲NULLを指定しなければならない．
C言語による初期化ルーチンの記述形式は次の通り．

ngki̲spec‑120.txt

page 227

void initialization̲routine(intptr̲t exinf){
初期化ルーチン本体}
exinfには，初期化ルーチンの拡張情報が渡される．
終了処理ルーチンは，カーネルが実行を制御する処理単位で，カーネルの動作
終了の直後に，カーネル非動作状態で実行される．
保護機能対応カーネルにおいて，終了処理ルーチンは，カーネルドメインに属する．
終了処理ルーチン属性に指定できる属性はない．そのため終了処理ルーチン属
性には，TA̲NULLを指定しなければならない．
C言語による終了処理ルーチンの記述形式は次の通り．
void termination̲routine(intptr̲t exinf){
終了処理ルーチン本体}
exinfには，終了処理ルーチンの拡張情報が渡される．
【μITRON4.0仕様との関係】
非タスクコンテキスト用スタック領域の設定と，終了処理ルーチンは，
μITRON4.0仕様に規定されていない機能である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
DEF̲ICS
非タスクコンテキスト用スタック領域の設定〔S〕【静的API】
DEF̲ICS({ SIZE istksz, STK̲T *istk })【パラメータ】＊非タスクコンテキスト用スタック領域の設定情報
SIZE
istksz
非タスクコンテキスト用スタック領域のサイズ（バイト数）
STK̲T
istk
非タスクコンテキスト用スタック領域の先頭番地【エラーコード】
E̲RSATR
E̲PAR
E̲NOMEM
E̲OBJ

予約属性（属する保護ドメインかクラスが不正）
パラメータエラー（istksz，istkが不正）
メモリ不足（非タスクコンテキスト用スタック領域が確保できない）
オブジェクト状態エラー（非タスクコンテキスト用スタッ
ク領域がすでに設定されている）【機能】
各パラメータで指定した非タスクコンテキスト用スタック領域の設定情報に従って，非タスクコンテキスト用スタック領域を設定する．
istkszは整数定数式パラメータ，istkは一般定数式パラメータである．コンフィ
ギュレータは，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．

ngki̲spec‑120.txt

page 228

istkをNULLとした場合，istkszで指定したサイズのスタック領域を，コンフィ
ギュレータが確保する．istkszにターゲット定義の制約に合致しないサイズを指定した時には，ターゲット定義の制約に合致するようにサイズを大きい方に丸めて確保する．
スタック領域をアプリケーションで確保する場合には，istkszで指定したサイズのスタック領域を確保し，istkにその先頭番地を指定する．スタック領域を
アプリケーションで確保するために用意しているデータ型とマクロについては，
CRE̲TSKの機能説明を参照すること．
DEF̲ICSにより非タスクコンテキスト用スタック領域を設定しない場合，ターゲッ
ト定義のデフォルトのサイズのスタック領域を，コンフィギュレータが確保する．
マルチプロセッサ対応カーネルでは，非タスクコンテキスト用スタック領域はプロセッサ毎に確保する必要がある．DEF̲ICSにより設定する非タスクコンテキ
スト用スタック領域は，DEF̲ICSの記述をその囲みの中に含むクラスの初期割付
けプロセッサが使用する．そのプロセッサに対してすでに非タスクコンテキス
ト用スタック領域が設定されている場合には，E̲OBJエラーとなる．
保護機能対応カーネルにおいて，DEF̲ICSは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
istkやistkszにターゲット定義の制約に合致しない先頭番地やサイズを指定した時には，E̲PARエラーとなる．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていない静的APIである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ATT̲INI
初期化ルーチンの追加〔S〕【静的API】
ATT̲INI({ ATR iniatr, intptr̲t exinf, INIRTN inirtn })【パラメータ】＊初期化ルーチンの追加情報
ATR
iniatr
初期化ルーチン属性
intptr̲t
exinf
初期化ルーチンの拡張情報
INIRTN
inirtn
初期化ルーチンの先頭番地【エラーコード】
E̲RSATR
E̲PAR

予約属性（iniatrが不正または使用できない，属する保護ドメインが不正）
パラメータエラー（inirtnが不正）【機能】
各パラメータで指定した初期化ルーチン追加情報に従って，初期化ルーチンを追加する．
iniatrは整数定数式パラメータ，exinfとinirtnは一般定数式パラメータである．
保護機能対応カーネルにおいて，ATT̲INIは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
inirtnが不正である場合にE̲PARエラーが検出されるか否かは，ターゲット定義

ngki̲spec‑120.txt

page 229

である．
【補足説明】
マルチプロセッサ対応カーネルでは，クラスに属さないグローバル初期化ルー
チンはマスタプロセッサで実行され，クラスに属するローカル初期化ルーチン
はそのクラスの初期割付けプロセッサにより実行される．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ATT̲TER
終了処理ルーチンの追加〔S〕【静的API】
ATT̲TER({ ATR teratr, intptr̲t exinf, TERRTN terrtn })【パラメータ】＊終了処理ルーチンの追加情報
ATR
teratr
終了処理ルーチン属性
intptr̲t
exinf
終了処理ルーチンの拡張情報
TERRTN
terrtn
終了処理ルーチンの先頭番地【エラーコード】
E̲RSATR
E̲PAR

予約属性（teratrが不正または使用できない，属する保護ドメインが不正）
パラメータエラー（terrtnが不正）【機能】
各パラメータで指定した終了処理ルーチン追加情報に従って，終了処理ルーチ
ンを追加する．
teratrは整数定数式パラメータ，exinfとterrtnは一般定数式パラメータである．
保護機能対応カーネルにおいて，ATT̲TERは，カーネルドメインの囲みの中に記述しなければならない．そうでない場合には，E̲RSATRエラーとなる．
terrtnが不正である場合にE̲PARエラーが検出されるか否かは，ターゲット定義である．
【補足説明】
マルチプロセッサ対応カーネルでは，クラスに属さないグローバル終了処理ルー
チンはマスタプロセッサで実行され，クラスに属するローカル終了処理ルーチ
ンはそのクラスの初期割付けプロセッサにより実行される．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていない静的APIである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲cfg
コンフィギュレーション情報の参照〔T〕【C言語API】
ER ercd = ref̲cfg(T̲RCFG *pk̲rcfg)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ref̲cfgをサポートしない．

ngki̲spec‑120.txt

page 230【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ref̲cfgをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲ver
バージョン情報の参照〔T〕【C言語API】
ER ercd = ref̲ver(T̲RVER *pk̲rver)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ref̲verをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ref̲verをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

第５章 リファレンス
5.1 サービスコール一覧(1) タスク管理機能
ER̲ID tskid = acre̲tsk(const T̲CTSK *pk̲ctsk)
ER ercd = sac̲tsk(ID tskid, const ACVCT *p̲acvct)
ER ercd = del̲tsk(ID tskid)
ER ercd = act̲tsk(ID tskid)
ER ercd = iact̲tsk(ID tskid)
ER ercd = mact̲tsk(ID tskid, ID prcid)
ER ercd = imact̲tsk(ID tskid, ID prcid)
ER̲UINT actcnt = can̲act(ID tskid)
ER ercd = mig̲tsk(ID tskid, ID prcid)
ER ercd = ext̲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 = get̲inf(intptr̲t *p̲exinf)
ER ercd = ref̲tsk(ID tskid, T̲RTSK *pk̲rtsk)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔I〕
〔TM〕
〔IM〕
〔T〕
〔TM〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕

(2) タスク付属同期機能
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 = dis̲wai(ID tskid)
ER ercd = idis̲wai(ID tskid)
ER ercd = ena̲wai(ID tskid)
ER ercd = iena̲wai(ID tskid)

〔T〕
〔T〕
〔T〕
〔I〕
〔T〕
〔T〕
〔I〕
〔T〕
〔T〕
〔TP〕
〔IP〕
〔TP〕
〔IP〕

ngki̲spec‑120.txt

page 231

ER ercd = dly̲tsk(RELTIM dlytim)〔T〕(3) タスク例外処理機能
ER ercd = def̲tex(ID tskid, const 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̲t state = sns̲tex()
ER ercd = ref̲tex(ID tskid, T̲RTEX *pk̲rtex)

〔TD〕
〔T〕
〔I〕
〔T〕
〔T〕
〔TI〕
〔T〕

(4) 同期・通信機能
セマフォ
ER̲ID semid = acre̲sem(const T̲CSEM *pk̲csem)
ER ercd = sac̲sem(ID semid, const ACVCT *p̲acvct)
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 = ini̲sem(ID semid)
ER ercd = ref̲sem(ID semid, T̲RSEM *pk̲rsem)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔I〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕

イベントフラグER̲ID flgid = acre̲flg(const T̲CFLG *pk̲cflg)
ER ercd = sac̲flg(ID flgid, const ACVCT *p̲acvct)
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 = ini̲flg(ID flgid)
ER ercd = ref̲flg(ID flgid, T̲RFLG *pk̲rflg)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔I〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕

データキューER̲ID dtqid = acre̲dtq(const T̲CDTQ *pk̲cdtq)
ER ercd = sac̲dtq(ID dtqid, const ACVCT *p̲acvct)
ER ercd = del̲dtq(ID dtqid)
ER ercd = snd̲dtq(ID dtqid, intptr̲t data)
ER ercd = psnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = ipsnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = tsnd̲dtq(ID dtqid, intptr̲t data, TMO tmout)
ER ercd = fsnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = ifsnd̲dtq(ID dtqid, intptr̲t data)
ER ercd = rcv̲dtq(ID dtqid, intptr̲t *p̲data)
ER ercd = prcv̲dtq(ID dtqid, intptr̲t *p̲data)
ER ercd = trcv̲dtq(ID dtqid, intptr̲t *p̲data, TMO tmout)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔T〕
〔I〕
〔T〕
〔T〕
〔I〕
〔T〕
〔T〕
〔T〕

ngki̲spec‑120.txt

page 232

ER ercd = ini̲dtq(ID dtqid)
ER ercd = ref̲dtq(ID dtqid, T̲RDTQ *pk̲rdtq)

〔T〕
〔T〕

優先度データキュー
ER̲ID pdqid = acre̲pdq(const T̲CPDQ *pk̲cpdq)〔TD〕
ER ercd = sac̲pdq(ID pdqid, const ACVCT *p̲acvct)〔TPD〕
ER ercd = del̲pdq(ID pdqid)〔TD〕
ER ercd = snd̲pdq(ID pdqid, intptr̲t data, PRI datapri)〔T〕
ER ercd = psnd̲pdq(ID pdqid, intptr̲t data, PRI datapri)〔T〕
ER ercd = ipsnd̲pdq(ID pdqid, intptr̲t data, PRI datapri)〔I〕
ER ercd = tsnd̲pdq(ID pdqid, intptr̲t data,〔T〕
PRI datapri, TMO tmout)
ER ercd = rcv̲pdq(ID pdqid, intptr̲t *p̲data, PRI *p̲datapri)〔T〕
ER ercd = prcv̲pdq(ID pdqid, intptr̲t *p̲data, PRI *p̲datapri) 〔T〕
ER ercd = trcv̲pdq(ID pdqid, intptr̲t *p̲data,〔T〕
PRI *p̲datapri, TMO tmout)
ER ercd = ini̲pdq(ID pdqid)〔T〕
ER ercd = ref̲pdq(ID pdqid, T̲RPDQ *pk̲rpdq)〔T〕
メールボックスER̲ID mbxid = acre̲mbx(const 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 = ini̲mbx(ID mbxid)
ER ercd = ref̲mbx(ID mbxid, T̲RMBX *pk̲rmbx)

〔TDp〕
〔TDp〕
〔Tp〕
〔Tp〕
〔Tp〕
〔Tp〕
〔Tp〕
〔Tp〕

ミューテックスER̲ID mtxid = acre̲mtx(const T̲CMTX *pk̲cmtx)
ER ercd = sac̲mtx(ID mtxid, const ACVCT *p̲acvct)
ER ercd = del̲mtx(ID mtxid)
ER ercd = loc̲mtx(ID mtxid)
ER ercd = ploc̲mtx(ID mtxid)
ER ercd = tloc̲mtx(ID mtxid, TMO tmout)
ER ercd = unl̲mtx(ID mtxid)
ER ercd = ini̲mtx(ID mtxid)
ER ercd = ref̲mtx(ID mtxid, T̲RMTX *pk̲rmtx)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕

メッセージバッファ☆未完成
スピンロックER̲ID spnid = acre̲spn(const T̲CSPN *pk̲cspn)
ER ercd = sac̲spn(ID spnid, const ACVCT *p̲acvct)
ER ercd = del̲spn(ID spnid)
ER ercd = loc̲spn(ID spnid)
ER ercd = iloc̲spn(ID spnid)
ER ercd = try̲spn(ID spnid)
ER ercd = itry̲spn(ID spnid)
ER ercd = unl̲spn(ID spnid)
ER ercd = iunl̲spn(ID spnid)〔TMD〕〔TPMD〕
〔TMD〕
〔TM〕
〔IM〕
〔TM〕
〔IM〕
〔TM〕
〔IM〕

ngki̲spec‑120.txt

page 233

ER ercd = ref̲spn(ID spnid, T̲RSPN *pk̲rspn)〔TM〕(5) メモリプール管理機能
固定長メモリプール
ER̲ID mpfid = acre̲mpf(const T̲CMPF *pk̲cmpf)
ER ercd = sac̲mpf(ID mpfid, const ACVCT *p̲acvct)
ER ercd = del̲mpf(ID mpfid)
ER ercd = get̲mpf(ID mpfid, void **p̲blk)
ER ercd = pget̲mpf(ID mpfid, void **p̲blk)
ER ercd = tget̲mpf(ID mpfid, void **p̲blk, TMO tmout)
ER ercd = rel̲mpf(ID mpfid, void *blk)
ER ercd = ini̲mpf(ID mpfid)
ER ercd = ref̲mpf(ID mpfid, T̲RMPF *pk̲rmpf)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕

(6) 時間管理機能
システム時刻管理
ER ercd = get̲tim(SYSTIM *p̲systim)
ER ercd = get̲utm(SYSUTM *p̲sysutm)

〔T〕
〔TI〕

周期ハンドラER̲ID cycid = acre̲cyc(const T̲CCYC *pk̲ccyc)
ER ercd = sac̲cyc(ID cycid, const ACVCT *p̲acvct)
ER ercd = del̲cyc(ID cycid)
ER ercd = sta̲cyc(ID cycid)
ER ercd = msta̲cyc(ID cycid, ID prcid)
ER ercd = stp̲cyc(ID cycid)
ER ercd = ref̲cyc(ID cycid, T̲RCYC *pk̲rcyc)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔TM〕
〔T〕
〔T〕

アラームハンドラ
ER̲ID almid = acre̲alm(const T̲CALM *pk̲calm)
ER ercd = sac̲alm(ID almid, const ACVCT *p̲acvct)
ER ercd = del̲alm(ID almid)
ER ercd = sta̲alm(ID almid, RELTIM almtim)
ER ercd = ista̲alm(ID almid, RELTIM almtim)
ER ercd = msta̲alm(ID almid, RELTIM almtim, ID prcid)
ER ercd = imsta̲alm(ID almid, RELTIM almtim, ID prcid)
ER ercd = stp̲alm(ID almid)
ER ercd = istp̲alm(ID almid)
ER ercd = ref̲alm(ID almid, T̲RALM *pk̲ralm)

〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔I〕
〔TM〕
〔IM〕
〔T〕
〔I〕
〔T〕

オーバランハンドラ
ER ercd = def̲ovr(const T̲DOVR *pk̲dovr)
ER ercd = sta̲ovr(ID tskid, OVRTIM ovrtim)
ER ercd = ista̲ovr(ID tskid, OVRTIM ovrtim)
ER ercd = stp̲ovr(ID tskid)
ER ercd = istp̲ovr(ID tskid)
ER ercd = ref̲ovr(ID tskid, T̲ROVR *pk̲rovr)

〔TD〕
〔T〕
〔I〕
〔T〕
〔I〕
〔T〕

(7) システム状態管理機能
ER ercd = sac̲sys(const ACVCT *p̲acvct)〔TPD〕

ngki̲spec‑120.txt

page 234

ER ercd = rot̲rdq(PRI tskpri)
ER ercd = irot̲rdq(PRI tskpri)
ER ercd = mrot̲rdq(PRI tskpri, ID prcid)
ER ercd = imrot̲rdq(PRI tskpri, ID prcid)
ER ercd = get̲tid(ID *p̲tskid)
ER ercd = iget̲tid(ID *p̲tskid)
ER ercd = get̲did(ID *p̲domid)
ER ercd = get̲pid(ID *p̲prcid)
ER ercd = iget̲pid(ID *p̲prcid)
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̲t state = sns̲ctx()
bool̲t state = sns̲loc()bool̲t state = sns̲dsp()bool̲t state = sns̲dpn()bool̲t state = sns̲ker()ER ercd = ext̲ker()ER ercd = ref̲sys(T̲RSYS *pk̲rsys)

〔T〕
〔I〕
〔TM〕
〔IM〕
〔T〕
〔I〕
〔TP〕
〔TM〕
〔IM〕
〔T〕
〔I〕
〔T〕
〔I〕
〔T〕
〔T〕
〔TI〕
〔TI〕
〔TI〕
〔TI〕
〔TI〕
〔TI〕
〔T〕

(8) メモリオブジェクト管理機能
ER ercd = att̲mem(const T̲AMEM *pk̲amem)
ER ercd = sac̲mem(const void *base, const ACVCT *p̲acvct)
ER ercd = det̲mem(const void *base)ER̲BOOL ercd = prb̲mem(const void *base, SIZE size,
ID domid, ID taskid, MODE pmmode)
ER ercd = ref̲mem(const void *base, T̲RMEM *pk̲rmem)

〔TPD〕
〔TPD〕
〔TPD〕
〔TP〕
〔TP〕

(9) 割込み管理機能
ER ercd = cfg̲int(INTNO intno, const T̲CINT *pk̲cint)
ER̲ID isrid = acre̲isr(const T̲CISR *pk̲cisr)
ER ercd = sac̲isr(ID isrid, const ACVCT *p̲acvct)
ER ercd = del̲isr(ID isrid)
ER ercd = ref̲isr(ID isrid, T̲RISR *pk̲risr)
ER ercd = def̲inh(INHNO inhno, const T̲DINH *pk̲dinh)ER ercd = dis̲int(INTNO intno)
ER ercd = ena̲int(INTNO intno)
ER ercd = ref̲int(INTNO intno, T̲RINT *pk̲rint)
ER ercd = chg̲ipm(PRI intpri)
ER ercd = get̲ipm(PRI *p̲intpri)

〔TD〕
〔TD〕
〔TPD〕
〔TD〕
〔T〕
〔TD〕
〔T〕
〔T〕
〔T〕
〔T〕
〔T〕

(10) CPU例外管理機能
ER ercd = def̲exc(EXCNO excno, const T̲DEXC *pk̲dexc)
bool̲t stat = xsns̲dpn(void *p̲excinf)bool̲t stat = xsns̲xpn(void *p̲excinf)

〔TD〕
〔TI〕
〔TI〕

(11) 拡張サービスコール管理機能
ER ercd = def̲svc(FN fncd, const T̲DSVC *pk̲dsvc)〔TPD〕
ER̲UINT ercd = cal̲svc(FN fcnd, intptr̲t par1, intptr̲t par2,〔TIP〕
intptr̲t par3, intptr̲t par4, intptr̲t par5)

ngki̲spec‑120.txt

page 235(12) システム構成管理機能
ER ercd = ref̲cfg(T̲RCFG *pk̲rcfg)
ER ercd = ref̲ver(T̲RVER *pk̲rver)

〔T〕
〔T〕

5.2 静的API一覧(1) タスク管理機能＊保護機能対応でないカーネルの場合
CRE̲TSK(ID tskid, { ATR tskatr, intptr̲t exinf, TASK task,
PRI itskpri, SIZE stksz, STK̲T *stk })＊保護機能対応カーネルの場合
CRE̲TSK(ID tskid, { ATR tskatr, intptr̲t exinf, TASK task,
PRI itskpri, SIZE stksz, STK̲T *stk,
SIZE sstksz, STK̲T *sstk })※ sstkszおよびsstkの記述は省略することができる．
AID̲TSK(uint̲t notsk)
SAC̲TSK(ID tskid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔S〕

〔SP〕

〔SD〕
〔SP〕

(2) タスク付属同期機能なし(3) タスク例外処理機能
DEF̲TEX(ID tskid, { ATR texatr, TEXRTN texrtn })〔S〕(4) 同期・通信機能
セマフォ
CRE̲SEM(ID semid, { ATR sematr, uint̲t isemcnt, uint̲t maxsem })〔S〕
AID̲SEM(uint̲t nosem)〔SD〕
SAC̲SEM(ID semid, { ACPTN acptn1, ACPTN acptn2,〔SP〕
ACPTN acptn3, ACPTN acptn4 })イベントフラグ
CRE̲FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })AID̲FLG(uint̲t noflg)
SAC̲FLG(ID flgid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔S〕
〔SD〕
〔SP〕

データキュー
CRE̲DTQ(ID dtqid, { ATR dtqatr, uint̲t dtqcnt, void *dtqmb })AID̲DTQ(uint̲t nodtq)
SAC̲DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔S〕
〔SD〕
〔SP〕

優先度データキュー
CRE̲PDQ(ID pdqid, { ATR pdqatr, uint̲t pdqcnt,〔S〕
PRI maxdpri, void *pdqmb })ngki̲spec‑120.txt

page 236

AID̲PDQ(uint̲t nopdq)
SAC̲PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔SD〕
〔SP〕

メールボックス
CRE̲MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })AID̲MBX(uint̲t nombx)

〔Sp〕
〔SpD〕

ミューテックス
CRE̲MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })AID̲MTX(uint̲t nomtx)
SAC̲MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔S〕
〔SD〕
〔SP〕

メッセージバッファ☆未完成
スピンロック
CRE̲SPN(ID spnid, { ATR spnatr })AID̲SPN(uint̲t nospn)
SAC̲SPN(ID spnid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔SM〕
〔SMD〕
〔SPM〕

(5) メモリプール管理機能
固定長メモリプール
CRE̲MPF(ID mpfid, { ATR mpfatr, uint̲t blkcnt, uint̲t blksz,
MPF̲T *mpf, void *mpfmb })AID̲MPF(uint̲t nompf)
SAC̲MPF(ID mpfid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })

〔S〕
〔SD〕
〔SP〕

(6) 時間管理機能
周期ハンドラ
CRE̲CYC(ID cycid, { ATR cycatr, intptr̲t exinf, CYCHDR cychdr, 〔S〕
RELTIM cyctim, RELTIM cycphs })AID̲CYC(uint̲t nocyc)〔SD〕
SAC̲CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2,〔SP〕
ACPTN acptn3, ACPTN acptn4 })アラームハンドラ
CRE̲ALM(ID almid, { ATR almatr, intptr̲t exinf, ALMHDR almhdr })〔S〕
AID̲ALM(uint̲t noalm)〔SD〕
SAC̲ALM(ID almid, { ACPTN acptn1, ACPTN acptn2,〔SP〕
ACPTN acptn3, ACPTN acptn4 })オーバランハンドラ
DEF̲OVR({ ATR ovratr, OVRHDR ovrhdr })〔S〕

ngki̲spec‑120.txt

page 237(7) システム状態管理機能
SAC̲SYS({ ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })〔SP〕(8) メモリオブジェクト管理機能
ATT̲SEC("セクション名", { ATR mematr, "メモリリージョン名" })〔SP〕
ATA̲SEC("セクション名", { ATR mematr, "メモリリージョン名" },〔SP〕{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })ATT̲MOD("オブジェクトモジュール名")〔SP〕
ATA̲MOD("オブジェクトモジュール名",〔SP〕{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })ATT̲MEM({ ATR mematr, void *base, SIZE size })〔SP〕
ATA̲MEM({ ATR mematr, void *base, SIZE size },〔SP〕{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })(9) 割込み管理機能
CFG̲INT(INTNO intno, { ATR intatr, PRI intpri })〔S〕
CRE̲ISR(ID isrid, { ATR isratr, intptr̲t exinf,〔S〕
INTNO intno, ISR isr, PRI isrpri })ATT̲ISR({ ATR isratr, intptr̲t exinf,〔S〕
INTNO intno, ISR isr, PRI isrpri })AID̲ISR(uint̲t noisr)〔SD〕
SAC̲ISR(ID isrid, { ACPTN acptn1, ACPTN acptn2,〔SP〕
ACPTN acptn3, ACPTN acptn4 })DEF̲INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })〔S〕(10) CPU例外管理機能
DEF̲EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })〔S〕(11) 拡張サービスコール管理機能
DEF̲SVC(FN fncd, { ATR svcatr, EXTSVC svcrtn, SIZE stksz })〔SP〕(12) システム構成管理機能
DEF̲ICS({ SIZE istksz, STK̲T *istk })ATT̲INI({ ATR iniatr, intptr̲t exinf, INIRTN inirtn })ATT̲TER({ ATR teratr, intptr̲t exinf, TERRTN terrtn })5.3 データ型
5.3.1 TOPPERS共通データ型
int8̲tuint8̲t
int16̲tuint16̲t
int32̲tuint32̲t
int64̲tuint64̲t
int128̲t
uint128̲t

符号付き8ビット整数（オプション，C99準拠）
符号無し8ビット整数（オプション，C99準拠）
符号付き16ビット整数（C99準拠）
符号無し16ビット整数（C99準拠）
符号付き32ビット整数（C99準拠）
符号無し32ビット整数（C99準拠）
符号付き64ビット整数（オプション，C99準拠）
符号無し64ビット整数（オプション，C99準拠）
符号付き128ビット整数（オプション，C99準拠）
符号無し128ビット整数（オプション，C99準拠）

〔S〕
〔S〕
〔S〕

ngki̲spec‑120.txt
int̲least8̲t
uint̲least8̲t

page 238
8ビット以上の符号付き整数（C99準拠）
int̲least8̲t型と同じサイズの符号無し整数（C99準拠）

float32̲t
double64̲t

IEEE754準拠の32ビット単精度浮動小数点数（オプション）
IEEE754準拠の64ビット倍精度浮動小数点数（オプション）

bool̲tchar̲tint̲tuint̲tlong̲tulong̲t

真偽値（trueまたはfalse）
符号無しの文字型（unsigned charと一致）
16ビット以上の符号付き整数
int̲t型と同じサイズの符号無し整数
32ビット以上かつint̲t型以上のサイズの符号付き整数
long̲t型と同じサイズの符号無し整数

intptr̲t
uintptr̲t

ポインタを格納できるサイズの符号付き整数（C99準拠）
intptr̲t型と同じサイズの符号無し整数（C99準拠）

FN
ER
ID
ATR
STAT
MODE
PRI
SIZE

機能コード（符号付き整数，int̲tに定義）
エラーコード（符号付き整数，int̲tに定義）
オブジェクトのID番号（符号付き整数，int̲tに定義）
オブジェクト属性（符号無し整数，uint̲tに定義）
オブジェクトの状態（符号無し整数，uint̲tに定義）
サービスコールの動作モード（符号無し整数，uint̲tに定義）
優先度（符号付き整数，int̲tに定義）
メモリ領域のサイズ（符号無し整数，ポインタを格納できるサイズの符号無し整数型に定義）

TMO
RELTIM
SYSTIM
SYSUTM

タイムアウト指定（符号付き整数，単位はミリ秒，int̲tに定義）
相対時間（符号無し整数，単位はミリ秒，uint̲tに定義）
システム時刻（符号無し整数，単位はミリ秒，ulong̲tに定義）
性能評価用システム時刻（符号無し整数，単位はマイクロ秒，
ulong̲tに定義）

FP

プログラムの起動番地（型の定まらない関数ポインタ）

ER̲BOOL
ER̲ID

エラーコードまたは真偽値（符号付き整数，int̲tに定義）
エラーコードまたはID番号（符号付き整数，int̲tに定義，
負のID番号は格納できない）
エラーコードまたは符号無し整数（符号付き整数，int̲tに定義，符号無し整数を格納する場合の有効ビット数はuint̲tより1ビット短い）ER̲UINT

ACPTN

アクセス許可パターン（符号無し32ビット整数，uint32̲tに定義）

typedef struct acvct {ACPTN
acptn1;
ACPTN
acptn2;
ACPTN
acptn3;
ACPTN
acptn4;} ACVCT;/* アクセス許可ベクタ *//* 通常操作1のアクセス許可パターン *//* 通常操作2のアクセス許可パターン *//* 管理操作のアクセス許可パターン *//* 参照操作のアクセス許可パターン */5.3.2 カーネルの使用するデータ型
TEXPTNFLGPTNOVRTIM
INTNO
INHNO

タスク例外要因のビットパターン（符号無し整数，uint̲tに定義）
イベントフラグのビットパターン（符号無し整数，uint̲tに定義）
プロセッサ時間（符号無し整数，単位はマイクロ秒，ulong̲tに定義）
割込み番号（符号無し整数，uint̲tに定義）
割込みハンドラ番号（符号無し整数，uint̲tに定義）

ngki̲spec‑120.txt

page 239

EXCNO

CPU例外ハンドラ番号（符号無し整数，uint̲tに定義）

TASK
TEXRTNCYCHDRALMHDROVRHDRISR
INTHDR
EXCHDR
INIRTNTERRTN

タスクのメインルーチン（関数ポインタ）
タスク例外処理ルーチン（関数ポインタ）
周期ハンドラ（関数ポインタ）
アラームハンドラ（関数ポインタ）
オーバランハンドラ（関数ポインタ）
割込みサービスルーチン（関数ポインタ）
割込みハンドラ（関数ポインタ）
CPU例外ハンドラ（関数ポインタ）
初期化ルーチン（関数ポインタ）
終了処理ルーチン（関数ポインタ）

STK̲T
MPF̲T

スタック領域を確保するためのデータ型
固定長メモリプール領域を確保するためのデータ型

typedef struct t̲msg {struct t̲msg*pk̲next;} T̲MSG;/* メールボックスのメッセージヘッダ */typedef struct t̲msg̲pri {T̲MSG
msgque;PRI
msgpri;} T̲MSG̲PRI;/* 優先度付きメッセージヘッダ *//* メッセージヘッダ *//* メッセージ優先度 */5.3.3 カーネルの使用するパケット形式(1) タスク管理機能
タスクの生成情報のパケット形式
typedef struct t̲ctsk {ATRtskatr;/* タスク属性 */intptr̲t
exinf;/* タスクの拡張情報 */
TASK
task;
/* タスクのメインルーチンの先頭番地 */PRI
itskpri;/* タスクの起動時優先度 */SIZEstksz;/* タスクのスタック領域のサイズ */STK̲T *
stk;/* タスクのスタック領域の先頭番地 *//* 以下は，保護機能対応カーネルの場合 */SIZEsstksz;/* タスクのシステムスタック領域のサイズ */STK̲T *
sstk;/* タスクのシステムスタック領域の先頭番地 */} T̲CTSK;
タスクの現在状態のパケット形式
typedef struct t̲rtsk {STAT
tskstat;/* タスク状態 */PRI
tskpri;/* タスクの現在優先度 */PRI
tskbpri;/* タスクのベース優先度 */STAT
tskwait;/* 待ち要因 */ID
wobjid;/* 待ち対象のオブジェクトのID */TMO
lefttmo;/* タイムアウトするまでの時間 */uint̲tactcnt;/* 起動要求キューイング数 */uint̲twupcnt;/* 起床要求キューイング数 *//* 以下は，保護機能対応カーネルの場合 */bool̲ttexmsk;/* タスク例外マスク状態か否か */bool̲twaifbd;/* 待ち禁止状態か否か */uint̲tsvclevel;/* 拡張サービスコールのネストレベル */ngki̲spec‑120.txt

page 240/* 以下は，マルチプロセッサ対応カーネルの場合 */ID
prcid;/* 割付けプロセッサのID */ID
actprc/* 次の起動時の割付けプロセッサのID */} T̲RTSK;(2) タスク付属同期機能なし(3) タスク例外処理機能
タスク例外処理ルーチンの定義情報のパケット形式
typedef struct t̲dtex {ATR
texatr;TEXRTN
texrtn;} T̲DTEX;/* タスク例外処理ルーチン属性 *//* タスク例外処理ルーチンの先頭番地 */タスク例外処理の現在状態のパケット形式
typedef struct t̲rtex {STAT
texstat;
TEXPTN
pndptn;} T̲RTEX;/* タスク例外処理の状態 *//* 保留例外要因 */(4) 同期・通信機能
セマフォの生成情報のパケット形式
typedef struct t̲csem {ATR
sematr;uint̲tisemcnt;
uint̲tmaxsem;} T̲CSEM;/* セマフォ属性 *//* セマフォの初期資源数 *//* セマフォの最大資源数 */セマフォの現在状態のパケット形式
typedef struct t̲rsem {IDwtskid;uint̲tsemcnt;} T̲RSEM;/* セマフォの待ち行列の先頭のタスクのID番号 *//* セマフォの資源数 */

イベントフラグの生成情報のパケット形式
typedef struct t̲cflg {ATRsematr;FLGPTN
iflgptn;} T̲CFLG;/* イベントフラグ属性 *//* イベントフラグの初期ビットパターン */イベントフラグの現在状態のパケット形式
typedef struct t̲rflg {IDwtskid;FLGPTN} T̲RFLG;

flgptn;/* イベントフラグの待ち行列の先頭のタス
クのID番号 *//* イベントフラグのビットパターン */データキューの生成情報のパケット形式

ngki̲spec‑120.txt

page 241

typedef struct t̲cdtq {ATR
dtqatr;uint̲tdtqcnt;void *
dtqmb;} T̲CDTQ;/* データキュー属性 *//* データキュー管理領域に格納できるデータ数 *//* データキュー管理領域の先頭番地 */データキューの現在状態のパケット形式
typedef struct t̲rdtq {IDstskid;ID

rtskid;uint̲tsdtqcnt;/* データキューの送信待ち行列の先頭のタ
スクのID番号 *//* データキューの受信待ち行列の先頭のタ
スクのID番号 *//* データキュー管理領域に格納されているデータの数 */

} T̲RDTQ;
優先度データキューの生成情報のパケット形式
typedef struct t̲cpdq {ATR
pdqatr;uint̲tpdqcnt;PRI

maxdpri;

void *} T̲CPDQ;

pdqmb;/* 優先度データキュー属性 *//* 優先度データキュー管理領域に格納できるデータ数 *//* 優先度データキューに送信できるデータ
優先度の最大値 *//* 優先度データキュー管理領域の先頭番地 */優先度データキューの現在状態のパケット形式
typedef struct t̲rpdq {IDstskid;ID

rtskid;uint̲tspdqcnt;/* 優先度データキューの送信待ち行列の先頭のタスクのID番号 *//* 優先度データキューの受信待ち行列の先頭のタスクのID番号 *//* 優先度データキュー管理領域に格納されているデータの数 */} T̲RPDQ;
メールボックスの生成情報のパケット形式
typedef struct t̲cmbx {ATR
mbxatr;PRI
maxmpri;
void *

mprihd;/* メールボックス属性 *//* 優先度メールボックスに送信できるメッ
セージ優先度の最大値 *//* 優先度別のメッセージキューヘッダ領域の先頭番地 */

} T̲CMBX;
メールボックスの現在状態のパケット形式
typedef struct t̲rmbx {ID
wtskid;T̲MSG} T̲RMBX;*pk̲msg;/* メールボックスの待ち行列の先頭のタスクのID番号 *//* メッセージキューの先頭につながれたメッ
セージの先頭番地 */ngki̲spec‑120.txt

page 242

ミューテックスの生成情報のパケット形式
typedef struct t̲rmtx {ATR
mtxatr;PRI
ceilpri;} T̲RMTX;/* ミューテックス属性 *//* ミューテックスの上限優先度 */ミューテックスの現在状態のパケット形式
typedef struct t̲rmtx {IDhtskid;ID

wtskid;/* ミューテックスをロックしているタス
クのID番号 *//* ミューテックスの待ち行列の先頭のタ
スクのID番号 */} T̲RMTX;
メッセージバッファの生成情報のパケット形式☆未完成
メッセージバッファの現在状態のパケット形式☆未完成
スピンロックの生成情報のパケット形式
typedef struct t̲cspn {ATR
spnatr;} T̲CSPN;/* スピンロック属性 */スピンロックの現在状態のパケット形式
typedef struct t̲rspn {STAT
spnstat} T̲RSPN;/* スピンロックのロック状態 */(5) メモリプール管理機能
固定長メモリプールの生成情報のパケット形式
typedef struct t̲cmpf {ATR
mpfatr;uint̲tblkcnt;uint̲tblksz;
MPF̲T *
mpf;
void *
mpfmb;} T̲CMPF;/* 固定長メモリプール属性 *//* 獲得できる固定長メモリブロックの数 *//* 固定長メモリブロックのサイズ *//* 固定長メモリプール領域の先頭番地 *//* 固定長メモリプール管理領域の先頭番地 */固定長メモリプールの現在状態のパケット形式
typedef struct t̲rmpf {IDwtskid;uint̲t} T̲RMPF;

fblkcnt;/* 固定長メモリプールの待ち行列の先頭のタスクのID番号 *//* 固定長メモリプール領域の空きメモリ領
域に割り付けることができる固定長メモ
リブロックの数 */ngki̲spec‑120.txt

page 243(6) 時間管理機能
周期ハンドラの生成情報のパケット形式
typedef struct t̲ccyc {ATR
cycatr;intptr̲t
exinf;CYCHDR
cychdr;RELTIM
cyctim;RELTIM
cycphs;} T̲CCYC;/* 周期ハンドラ属性 *//* 周期ハンドラの拡張情報 *//* 周期ハンドラの先頭番地 *//* 周期ハンドラの起動周期 *//* 周期ハンドラの起動位相 */周期ハンドラの現在状態のパケット形式
typedef struct t̲rcyc {STAT
cycstat;
RELTIM
lefttim;/* 周期ハンドラの動作状態 *//* 次に周期ハンドラを起動する時刻までの相対時間 *//* 以下は，マルチプロセッサ対応カーネルの場合 */ID
prcid;/* 割付けプロセッサのID */} T̲RCYC;
アラームハンドラの生成情報のパケット形式
typedef struct t̲calm {ATR
almatr;intptr̲t
exinf;
ALMHDR
almhdr;} T̲CALM;/* アラームハンドラ属性 *//* アラームハンドラの拡張情報 *//* アラームハンドラの先頭番地 */アラームハンドラの現在状態のパケット形式
typedef struct t̲ralm {STAT
almstat;
RELTIM
lefttim;/* アラームハンドラの動作状態 *//* アラームハンドラを起動する時刻までの相対時間 *//* 以下は，マルチプロセッサ対応カーネルの場合 */ID
prcid;/* 割付けプロセッサのID */} T̲RALM;
オーバランハンドラの定義情報のパケット形式
typedef struct t̲dovr {ATR
ovratr;OVRHDR
ovrhdr;} T̲DOVR;/* オーバランハンドラ属性 *//* オーバランハンドラの先頭番地 */オーバランハンドラの現在状態のパケット形式
typedef struct t̲rovr {STAT
ovrstat;OVRTIM leftotm;} T̲ROVR;(7) システム状態管理機能
システムの現在状態のパケット形式/* オーバランハンドラの動作状態 *//* 残りプロセッサ時間 */ngki̲spec‑120.txt

page 244☆未完成(8) メモリオブジェクト管理機能
メモリオブジェクトの登録情報のパケット形式
typedef struct t̲amem {ATR
mematrvoid *
base
SIZE
size
} T̲AMEM;/* メモリオブジェクト属性 *//* 登録するメモリ領域の先頭番地 *//* 登録するメモリ領域のサイズ（バイト数）*/

メモリオブジェクトの現在状態のパケット形式☆未完成(9) 割込み管理機能
割込み要求ラインの属性の設定情報のパケット形式
typedef struct t̲cint {ATR
intatr;PRI
intpri;} T̲CINT;/* 割込み要求ライン属性 *//* 割込み優先度 */割込みサービスルーチンの生成情報のパケット形式
typedef struct t̲cisr {ATR
isratr;intptr̲t
exinf;
INTNO
intno;ISR
PRI} T̲CISR;

isr;
isrpri;/* 割込みサービスルーチン属性 *//* 割込みサービスルーチンの拡張情報 *//* 割込みサービスルーチンを登録する割込
み番号 *//* 割込みサービスルーチンの先頭番地 *//* 割込みサービスルーチン優先度 */割込みサービスルーチンの現在状態のパケット形式☆未完成
割込みハンドラの定義情報のパケット形式
typedef struct t̲dinh {ATR
inhatr;
INTHDR
inthdr;} T̲DINH;/* 割込みハンドラ属性 *//* 割込みハンドラの先頭番地 */割込み要求ラインの現在状態のパケット形式☆未完成(10) CPU例外管理機能
CPU例外ハンドラの定義情報のパケット形式
typedef struct t̲dexc {ATR
excatr;/* CPU例外ハンドラ属性 */ngki̲spec‑120.txt
EXCHDR} T̲DEXC;

page 245
exchdr;/* CPU例外ハンドラの先頭番地 */(11) 拡張サービスコール管理機能
拡張サービスコールの定義情報のパケット形式
typedef struct t̲dsvc {ATR
svcatr
EXTSVC
svcrtnSIZE
stksz/* 拡張サービスコール属性 *//* 拡張サービスコールの先頭番地 *//* 拡張サービスコールで使用するスタック
サイズ */} T̲DSVC;(12) システム構成管理機能
コンフィギュレーション情報のパケット形式☆未完成
バージョン情報のパケット形式☆未完成
5.4 定数とマクロ
5.4.1 TOPPERS共通定数(1) 一般定数
NULL

無効ポインタ

true
false

1
0

真
偽

E̲OK

0

正常終了

(2) 整数型に格納できる最大値と最小値
INT8̲MAX
INT8̲MINUINT8̲MAX
INT16̲MAX
INT16̲MIN
UINT16̲MAX
INT32̲MAX
INT32̲MIN
UINT32̲MAX
INT64̲MAX
INT64̲MIN
UINT64̲MAX
INT128̲MAX
INT128̲MIN
UINT128̲MAX

int8̲tに格納できる最大値（オプション，C99準拠）
int8̲tに格納できる最小値（オプション，C99準拠）
uint8̲tに格納できる最大値（オプション，C99準拠）
int16̲tに格納できる最大値（C99準拠）
int16̲tに格納できる最小値（C99準拠）
uint16̲tに格納できる最大値（C99準拠）
int32̲tに格納できる最大値（C99準拠）
int32̲tに格納できる最小値（C99準拠）
uint32̲tに格納できる最大値（C99準拠）
int64̲tに格納できる最大値（オプション，C99準拠）
int64̲tに格納できる最小値（オプション，C99準拠）
uint64̲tに格納できる最大値（オプション，C99準拠）
int128̲tに格納できる最大値（オプション，C99準拠）
int128̲tに格納できる最小値（オプション，C99準拠）
uint128̲tに格納できる最大値（オプション，C99準拠）

INT̲LEAST8̲MAX
INT̲LEAST8̲MIN
UINT̲LEAST8̲MAX

int̲least8̲tに格納できる最大値（C99準拠）
int̲least8̲tに格納できる最小値（C99準拠）
uint̲least8̲tに格納できる最大値（C99準拠）

ngki̲spec‑120.txt

page 246

INT̲MAX
INT̲MIN
UINT̲MAX
LONG̲MAX
LONG̲MINULONG̲MAX

int̲tに格納できる最大値（C90準拠）
int̲tに格納できる最小値（C90準拠）
uint̲tに格納できる最大値（C90準拠）
long̲tに格納できる最大値（C90準拠）
long̲tに格納できる最小値（C90準拠）
ulong̲tに格納できる最大値（C90準拠）

FLOAT32̲MIN

float32̲tに格納できる最小の正規化された正の浮動小数点数（オプション）
float32̲tに格納できる表現可能な最大の有限浮動小数点数（オプション）
double64̲tに格納できる最小の正規化された正の浮動小数点数（オプション）
double64̲tに格納できる表現可能な最大の有限浮動小数点数（オプション）

FLOAT32̲MAX
DOUBLE64̲MIN
DOUBLE64̲MAX(3) 整数型のビット数
CHAR̲BIT

char型のビット数（C90準拠）(4) オブジェクト属性
TA̲NULL

0U

オブジェクト属性を指定しない(5) タイムアウト指定
TMO̲POL
TMO̲FEVR
TMO̲NBLK

0
‑1
‑2

ポーリング
永久待ち
ノンブロッキング(6) アクセス許可パターン
TACP̲KERNELTACP̲SHARED

0U
0U

カーネルドメインのみにアクセスを許可
すべての保護ドメインにアクセスを許可

5.4.2 TOPPERS共通マクロ(1) 整数定数を作るマクロINT8̲C(val)
UINT8̲C(val)
INT16̲C(val)
UINT16̲C(val)
INT32̲C(val)
UINT32̲C(val)
INT64̲C(val)
UINT64̲C(val)
INT128̲C(val)
UINT128̲C(val)int̲least8̲t型の定数を作るマクロ（C99準拠）
uint̲least8̲t型の定数を作るマクロ（C99準拠）
int16̲t型の定数を作るマクロ（C99準拠）
uint16̲t型の定数を作るマクロ（C99準拠）
int32̲t型の定数を作るマクロ（C99準拠）
uint32̲t型の定数を作るマクロ（C99準拠）
int64̲t型の定数を作るマクロ（オプション，C99準拠）
uint64̲t型の定数を作るマクロ（オプション，C99準拠）
int128̲t型の定数を作るマクロ（オプション，C99準拠）
uint128̲t型の定数を作るマクロ（オプション，C99準拠）

UINT̲C(val)ULONG̲C(val)uint̲t型の定数を作るマクロ
ulong̲t型の定数を作るマクロ(2) 型に関する情報を取り出すためのマクロ
offsetof(structure, field)

構造体structure中のフィールドfieldのバイト位置を返すマクロ（C90準拠）

ngki̲spec‑120.txt

page 247alignof(type)型typeのアラインメント単位を返すマクロ

ALIGN̲TYPE(addr, type)

番地addrが型typeに対してアラインしているかどうかを返すマクロ(3) assertマクロ
assert(exp)expが成立しているかを検査するマクロ（C90準拠）(4) コンパイラの拡張機能のためのマクロ
inlineInlineasm
Asm
throw()
NoReturn

インライン関数
ファイルローカルなインライン関数
インラインアセンブラ
インラインアセンブラ（最適化抑止）
例外を発生しない関数
リターンしない関数(5) エラーコード生成・分解マクロ
ERCD(mercd, sercd)

メインエラーコードmercdとサブエラーコードsercdから，エラーコードを生成するためのマクロ

MERCD(ercd)

エラーコードercdからメインエラーコードを抽出するためのマクロ
エラーコードercdからサブエラーコードを抽出するためのマクロ

SERCD(ercd)(6) アクセス許可パターン生成マクロ
TACP(domid)

domidで指定される保護ドメインに属する処理単位のみにアクセスを許可するアクセス許可パターン

5.4.3 カーネル共通定数(1) オブジェクト属性
TA̲TPRI

0x01U

タスクの待ち行列をタスクの優先度順に

0
‑1
‑2

自タスクの属する保護ドメイン
カーネルドメイン
無所属（保護ドメインに属さない）(2) 保護ドメインID
TDOM̲SELF
TDOM̲KERNELTDOM̲NONE(3) その他のカーネル共通定数
TCLS̲SELF

0

自タスクの属するクラス

TPRC̲NONE
TPRC̲INI

00

割付けプロセッサの指定がない
初期割付けプロセッサ

TSK̲SELF
TSK̲NONE00

自タスク指定該当するタスクがない

TPRI̲SELF
TPRI̲INI

00

自タスクのベース優先度の指定
タスクの起動時優先度の指定

ngki̲spec‑120.txt
TIPM̲ENAALL

page 248
0

割込み優先度マスク全解除

5.4.4 カーネル共通マクロ(1) オブジェクト属性を作るマクロTA̲DOM(domid)TA̲CLS(clsid)

domidで指定される保護ドメインに属する
clsidで指定されるクラスに属する(2) サービスコールの呼出し方法を指定するマクロ
SVC̲CALL(svc)

svcで指定されるサービスコールを関数呼出しによって呼び出すための名称

5.4.5 カーネルの機能毎の定数(1) タスク管理機能
TA̲ACTTA̲FPU

0x02U

タスクの生成時にタスクを起動する
FPUレジスタをコンテキストに含める

TTS̲RUNTTS̲RDYTTS̲WAITTS̲SUSTTS̲WAS
TTS̲DMT

0x01U
0x02U
0x04U
0x08U
0x0cU
0x10U

実行状態
実行可能状態
待ち状態
強制待ち状態
二重待ち状態
休止状態

TTW̲SLP
TTW̲DLY
TTW̲SEM
TTW̲FLG
TTW̲SDTQ
TTW̲RDTQ
TTW̲SPDQ
TTW̲RPDQ
TTW̲MTX
TTW̲MBX
TTW̲MPF

0x0001U 起床待ち
0x0002U 時間経過待ち
0x0004U セマフォの資源獲得待ち
0x0008U イベントフラグ待ち
0x0010U データキューへの送信待ち
0x0020U データキューからの受信待ち
0x0100U 優先度データキューへの送信待ち
0x0200U 優先度データキューからの受信待ち
0x0080U ミューテックスのロック待ち状態
0x0040U メールボックスからの受信待ち
0x2000U 固定長メモリブロックの獲得待ち

TA̲FPUの値は，ターゲット定義とする．
(3) タスク例外処理機能
TTEX̲ENA
TTEX̲DIS

0x01U
0x02U

タスク例外処理許可状態
タスク例外処理禁止状態

TA̲WMULTA̲CLR

0x02U
0x04U

複数のタスクが待つのを許す
タスクの待ち解除時にイベントフラグをクリアする

TWF̲ORW
TWF̲ANDW

0x01U
0x02U

イベントフラグのOR待ちモード
イベントフラグのAND待ちモード(4) 同期・通信機能
イベントフラグ

メールボックスngki̲spec‑120.txt

TA̲MPRI

page 249

0x02U

メッセージキューをメッセージの優先度順にする

0x01U
0x02U

取得されていない状態
取得されている状態

TA̲STATA̲PHS

0x02U
0x04U

周期ハンドラの生成時に周期ハンドラを動作開始する
周期ハンドラを生成した時刻を基準時刻とする

TCYC̲STP
TCYC̲STA

0x01U
0x02U

周期ハンドラが動作していない状態
周期ハンドラが動作している状態

0x01U
0x02U

アラームハンドラが動作していない状態
アラームハンドラが動作している状態

0x01U
0x02U

オーバランハンドラが動作していない状態
オーバランハンドラが動作している状態

スピンロック
TSPN̲UNL
TSPN̲LOC(6) 時間管理機能
周期ハンドラアラームハンドラ
TALM̲STPTALM̲STA
オーバランハンドラ
TOVR̲STPTOVR̲STA(8) メモリオブジェクト管理機能
TA̲NOWRITETA̲NOREADTA̲NOEXECTA̲UNCACHETA̲WTHROUGH

0x01U
0x02U
0x04U
0x08U

書込みアクセス禁止
読出しアクセス禁止
実行アクセス禁止
キャッシュ禁止
ライトスルーキャッシュを用いる

TPM̲WRITE
TPM̲READ
TPM̲EXEC

0x01U
0x02U
0x04U

書込みアクセス権のチェック
読出しアクセス権のチェック
実行アクセス権のチェック

TA̲WTHROUGHの値は，ターゲット定義とする．
(9) 割込み管理機能
TA̲ENAINTTA̲EDGETA̲POSEDGETA̲NEGEDGETA̲BOTHEDGETA̲LOWLEVELTA̲HIGHLEVEL

0x01U
0x02U

割込み要求禁止フラグをクリア
エッジトリガポジティブエッジトリガ
ネガティブエッジトリガ
両エッジトリガ
ローレベルトリガ
ハイレベルトリガ

TA̲NONKERNEL

0x02U

カーネル管理外の割込みTA̲POSEDGE，TA̲NEGEDGE，TA̲BOTHEDGE，TA̲LOWLEVEL，TA̲HIGHLEVELの値は，ターゲット定義とする．
5.4.6 カーネルの機能毎のマクロngki̲spec‑120.txt

page 250(1) タスク管理機能
COUNT̲STK̲T(sz)

サイズszのスタック領域を確保するために必要な
STK̲T型の配列の要素数を求めるマクロ
要素数COUNT̲STK̲T(sz)のSTK̲T型の配列のサイズ（szを，STK̲T型のサイズの倍数になるように大きい方に丸めた値）

ROUND̲STK̲T(sz)(5) メモリプール管理機能
COUNT̲MPF̲T(blksz)

ROUND̲MPF̲T(blksz)

固定長メモリブロックのサイズがblkszの固定長メモ
リプール領域を確保するために，固定長メモリブロッ
ク1つあたりに必要なMPF̲T型の配列の要素数を求めるマクロ
要素数COUNT̲MPF̲T(blksz)のMPF̲T型の配列のサイズ（blkszを，MPF̲T型のサイズの倍数になるように大きい方に丸めた値）

5.5 構成マクロ5.5.1 TOPPERS共通構成マクロ(1) 相対時間の範囲
TMAX̲RELTIM

相対時間に指定できる最大値

5.5.2 カーネル共通構成マクロ(1) サポートする機能
TOPPERS̲SUPPORT̲PROTECTTOPPERS̲SUPPORT̲MULTI̲PRC
TOPPERS̲SUPPORT̲DYNAMIC̲CRE

保護機能対応のカーネル
マルチプロセッサ対応のカーネル
動的生成対応のカーネル(2) 優先度の範囲
TMIN̲TPRI
TMAX̲TPRI

タスク優先度の最小値（＝1）
タスク優先度の最大値(3) プロセッサの数
TNUM̲PRCID

プロセッサの数(4) 特殊な役割を持ったプロセッサ
TOPPERS̲MASTER̲PRCID
TOPPERS̲SYSTIM̲PRCID

マスタプロセッサのID番号
システム時刻管理プロセッサのID番号(5) タイマ方式
TOPPERS̲SYSTIM̲LOCALTOPPERS̲SYSTIM̲GLOBAL

ローカルタイマ方式の場合にマクロ定義
グローバルタイマ方式の場合にマクロ定義(6) バージョン情報
TKERNEL̲MAKER
TKERNEL̲PRID

カーネルのメーカコード（＝0x0118）
カーネルの識別番号

ngki̲spec‑120.txt

page 251

TKERNEL̲SPVER
TKERNEL̲PRVER

カーネル仕様のバージョン番号
カーネルのバージョン番号

5.5.3 カーネルの機能毎の構成マクロ(1) タスク管理機能
TMAX̲ACTCNT

タスクの起動要求キューイング数の最大値

TNUM̲TSKID

登録できるタスクの数（動的生成対応でないカーネルでは，静的APIによって登録されたタスクの数に一致）(2) タスク付属同期機能
TMAX̲WUPCNT

タスクの起床要求キューイング数の最大値(3) タスク例外処理機能
TBIT̲TEXPTN

タスク例外要因のビット数（TEXPTNの有効ビット数）(4) 同期・通信機能
セマフォ
TMAX̲MAXSEM

セマフォの最大資源数の最大値

TNUM̲SEMID

登録できるセマフォの数（動的生成対応でないカーネル
では，静的APIによって登録されたセマフォの数に一致）

イベントフラグ
TBIT̲FLGPTN

イベントフラグのビット数（FLGPTNの有効ビット数）

TNUM̲FLGID

登録できるイベントフラグの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたイベントフラグの数に一致）

データキュー
TNUM̲DTQID

登録できるデータキューの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたデータキューの数に一致）

優先度データキュー
TMIN̲DPRI
TMAX̲DPRI

データ優先度の最小値（＝1）
データ優先度の最大値

TNUM̲PDQID

登録できる優先度データキューの数（動的生成対応でないカーネルでは，静的APIによって登録された優先度デー
タキューの数に一致）

メールボックス
TMIN̲MPRI
TMAX̲MPRI

メッセージ優先度の最小値（＝1）
メッセージ優先度の最大値

TNUM̲MBXID

登録できるメールボックスの数（動的生成対応でないカー

ngki̲spec‑120.txt

page 252
ネルでは，静的APIによって登録されたメールボックスの数に一致）

ミューテックス
TNUM̲MTXID

登録できるミューテックスの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたミューテックスの数に一致）

スピンロックTNUM̲SPNID

登録できるスピンロックの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたミューテックスの数に一致）(5) メモリプール管理機能
固定長メモリプール
TNUM̲MPFID

登録できる固定長メモリプールの数（動的生成対応でない
カーネルでは，静的APIによって登録された固定長メモリ
プールの数に一致）(6) 時間管理機能
システム時刻管理
TIC̲NUME
TIC̲DENO

タイムティックの周期（単位はミリ秒）の分子
タイムティックの周期（単位はミリ秒）の分母

TOPPERS̲SUPPORT̲GET̲UTM

get̲utmがサポートされている

周期ハンドラTNUM̲CYCID

登録できる周期ハンドラの数（動的生成対応でないカー
ネルでは，静的APIによって登録された周期ハンドラの数に一致）

アラームハンドラ
TNUM̲ALMID

登録できるアラームハンドラの数（動的生成対応でない
カーネルでは，静的APIによって登録されたアラームハン
ドラの数に一致）オーバランハンドラ
TMAX̲OVRTIM

プロセッサ時間に指定できる最大値

TOPPERS̲SUPPORT̲OVRHDR(7) システム状態管理機能なし(8) メモリオブジェクト管理機能なし

オーバランハンドラ機能がサポートされているngki̲spec‑120.txt

page 253(9) 割込み管理機能
TMIN̲INTPRI
TMAX̲INTPRI

割込み優先度の最小値（最高値）
割込み優先度の最大値（最低値，＝‑1）

TMIN̲ISRPRI
TMAX̲ISRPRI

割込みサービスルーチン優先度の最小値（＝1）
割込みサービスルーチン優先度の最大値

TOPPERS̲SUPPORT̲DIS̲INT
TOPPERS̲SUPPORT̲ENA̲INT

dis̲intがサポートされている
ena̲intがサポートされている(10) CPU例外管理機能なし(11) 拡張サービスコール管理機能
TNUM̲FNCD

登録できる拡張サービスコールの数（動的生成対応でないカーネルでは，静的APIによって登録された拡張サービ
スコールの数に一致）(12) システム構成管理機能なし
5.6 エラーコード一覧(1) メインエラーコード
E̲SYS
E̲NOSPT
E̲RSFNE̲RSATR
E̲PAR
E̲ID
E̲CTX
E̲MACVE̲OACVE̲ILUSEE̲NOMEME̲NOIDE̲NORESE̲OBJ
E̲NOEXSE̲QOVRE̲RLWAIE̲TMOUT
E̲DLT
E̲CLS
E̲WBLKE̲BOVR

‑5
‑9
‑10
‑11
‑17
‑18
‑25
‑26
‑27
‑28
‑33
‑34
‑35
‑41
‑42
‑43
‑49
‑50
‑51
‑52
‑57
‑58

システムエラー
未サポート機能
予約機能コード
予約属性
パラメータエラー
不正ID番号
コンテキストエラー
メモリアクセス違反
オブジェクトアクセス違反
サービスコール不正使用
メモリ不足
ID番号不足資源不足
オブジェクト状態エラー
オブジェクト未登録
キューイングオーバフロー
待ち禁止状態または待ち状態の強制解除
ポーリング失敗またはタイムアウト
待ちオブジェクトの削除または再初期化
待ちオブジェクトの状態変化
ノンブロッキング受付け
バッファオーバフロー

5.7 機能コード一覧‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
‑0
‑1
‑2
‑3
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑120.txt
‑0x01
‑0x05
‑0x09
‑0x0d
‑0x11
‑0x15
‑0x19
‑0x1d
‑0x21
‑0x25
‑0x29
‑0x2d
‑0x31
‑0x35
‑0x39
‑0x3d
‑0x41
‑0x45
‑0x49
‑0x4d
‑0x51
‑0x55
‑0x59
‑0x5d
‑0x61
‑0x65
‑0x69
‑0x6d
‑0x71
‑0x75
‑0x79
‑0x7d
‑0x81
‑0x85
‑0x89
‑0x8d
‑0x91
‑0x95
‑0x99
‑0x9d
‑0xa1
‑0xa5
‑0xa9
‑0xad
‑0xb1
‑0xb5
‑0xb9
‑0xbd
‑0xc1
‑0xc5
‑0xc9
‑0xcd
‑0xd1
‑0xd5
‑0xd9
‑0xdd
‑0xe1
‑0xe5

予約
act̲tskter̲tsk
slp̲tsk
can̲wupdis̲wai
sus̲tskras̲texsns̲texsig̲semtwai̲semset̲flg
pol̲flg
snd̲dtqfsnd̲dtq
trcv̲dtq
snd̲pdqrcv̲pdqsnd̲mbx
loc̲mtxsnd̲mbfprcv̲mbf
get̲mpf
get̲timsta̲cycsta̲almsta̲ovrsac̲sysget̲didloc̲cpu
dis̲dspsns̲dspatt̲memref̲memcfg̲intchg̲ipmxsns̲dpn
ref̲cfg
予約
予約
予約
ini̲pdqini̲mpf
予約ref̲tskref̲pdqref̲mpf
ref̲spnacre̲tsk
acre̲pdq
acre̲mpf
acre̲spn
del̲tskdel̲pdqdel̲mpf
del̲spnsac̲tsk
sac̲pdq

page 254
予約
iact̲tsk
chg̲pritslp̲tsk
rel̲waiidis̲wairsm̲tskiras̲tex
ref̲texisig̲sem予約
iset̲flgtwai̲flg
psnd̲dtq
ifsnd̲dtq
予約
psnd̲pdq
prcv̲pdq
rcv̲mbx
ploc̲mtx
psnd̲mbf
trcv̲mbf
pget̲mpf
get̲utmstp̲cycista̲almista̲ovr
ref̲sys予約
iloc̲cpu
ena̲dspsns̲dpndet̲mem
予約
dis̲int
get̲ipmxsns̲xpn
ref̲ver
予約
予約
ini̲semini̲mbx
予約
予約
ref̲semref̲mbx
ref̲cyc予約
acre̲semacre̲mbx
acre̲cyc
予約
del̲semdel̲mbx
del̲cyc予約
sac̲sem
予約

予約
can̲act
get̲pri
wup̲tskirel̲waiena̲wai
dly̲tsk
dis̲tex
予約
wai̲sem
予約
clr̲flg
予約
ipsnd̲dtq
rcv̲dtq
予約
ipsnd̲pdq
trcv̲pdq
prcv̲mbx
tloc̲mtx
tsnd̲mbf
予約tget̲mpf
予約
予約
stp̲almstp̲ovrrot̲rdqget̲tidunl̲cpu
sns̲ctx
sns̲kersac̲mem
予約
ena̲int
予約
予約
予約
予約
予約
ini̲flg
ini̲mtx
予約
予約
ref̲flg
ref̲mtxref̲alm
予約
acre̲flgacre̲mtx
acre̲alm
予約del̲flgdel̲mtxdel̲alm
予約
sac̲flgsac̲mtx

予約ext̲tskget̲infiwup̲tsk
予約
iena̲wai予約
ena̲tex予約
pol̲sem
予約
wai̲flg
予約
tsnd̲dtq
prcv̲dtq
予約tsnd̲pdq
予約trcv̲mbx
unl̲mtxrcv̲mbf予約
rel̲mpf
ref̲ovr
予約
istp̲alm
istp̲ovr
irot̲rdq
iget̲tidiunl̲cpu
sns̲locext̲kerprb̲mem
予約ref̲int
予約
予約
予約
予約
予約
ini̲dtqini̲mbf
予約
予約
ref̲dtqref̲mbfref̲isr
予約
acre̲dtq
acre̲mbf
acre̲isr
予約
del̲dtqdel̲mbfdel̲isr予約
sac̲dtqsac̲mbfngki̲spec‑120.txt

page 255‑0xe9
sac̲mpf
sac̲cycsac̲almsac̲isr‑0xed
sac̲spn
予約
予約
予約
‑0xf1
def̲texdef̲ovrdef̲inhdef̲exc‑0xf5
def̲svc
予約
予約
予約
‑0xf9
予約
予約
予約
予約
‑0xfd
予約
予約
予約
予約
‑0x101mact̲tsk
imact̲tsk
mig̲tsk
予約‑0x105msta̲cyc
予約
msta̲alm
imsta̲alm‑0x109mrot̲rdq
imrot̲rdq
get̲pid
iget̲pid‑0x10d
予約
予約
予約
予約‑0x111loc̲spniloc̲spn
try̲spnitry̲spn‑0x115unl̲spniunl̲spn
予約
予約‑0x119
予約
予約
予約
予約‑0x11d
予約
予約
予約
予約‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【μITRON4.0仕様との関係】
サービスコールの機能コードを割り当てなおした．
5.8 カーネルオブジェクトに対するアクセスの種別‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
オブジェクトの種類
通常操作1
通常操作2
管理操作
参照操作
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
メモリオブジェクト
書込み
読出し
det̲memref̲mem実行sac̲memprb̲mem‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
タスク
act̲tskter̲tskdel̲tskget̲primact̲tsk
chg̲prisac̲tsk
ref̲tsk
can̲actrel̲waidef̲texref̲texmig̲tsksus̲tskref̲ovr
wup̲tsk
rsm̲tsk
can̲wupdis̲waiena̲wairas̲texsta̲ovr
stp̲ovr‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
セマフォ
sig̲semwai̲semdel̲semref̲sempol̲semini̲semtwai̲semsac̲sem‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
イベントフラグset̲flg
wai̲flgdel̲flg
ref̲flg
clr̲flg
pol̲flg
ini̲flgtwai̲flg
sac̲flg‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
データキューsnd̲dtqrcv̲dtqdel̲dtqref̲dtqpsnd̲dtq
prcv̲dtq
ini̲dtqtsnd̲dtq
trcv̲dtqsac̲dtqfsnd̲dtq‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
優先度データキューsnd̲pdqrcv̲pdqdel̲pdqref̲pdq
psnd̲pdq
prcv̲pdq
ini̲pdqtsnd̲pdq
trcv̲pdq
sac̲pdq‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ミューテックス
loc̲mtx‑
del̲mtxref̲mtxploc̲mtx
ini̲mtx

ngki̲spec‑120.txt

page 256tloc̲mtxsac̲mtx‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
スピンロック
loc̲spn‑del̲spnref̲spntry̲spnsac̲spnunl̲spn‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
固定長メモリプール
get̲mpfrel̲mpf
del̲mpf
ref̲mpf
pget̲mpf
ini̲mpf
tget̲mpf
sac̲mpf‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
周期ハンドラsta̲cycstp̲cycdel̲cycref̲cycmsta̲cycsac̲cyc‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
アラームハンドラ
sta̲almstp̲almdel̲alm
ref̲almmsta̲almsac̲alm‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
割込みサービスルーチン ‑‑del̲isrref̲isrsac̲isr‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
システム状態rot̲rdq
loc̲cpuacre̲yyy
get̲timmrot̲rdq
unl̲cpu
att̲memget̲ipmdis̲dspdis̲int
cfg̲intref̲sysena̲dspena̲int
def̲inhref̲intchg̲ipmdef̲exc
ref̲cfg
def̲svc
ref̲verdef̲ovr‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
すべての保護ドメインから呼び出すことができるサービスコール：
・自タスクへの操作（ext̲tsk，get̲inf，slp̲tsk，tslp̲tsk，dly̲tsk，
dis̲tex，ena̲tex）
・タスク例外状態参照（sns̲tex）
・性能評価用システム時刻の参照（get̲utm）
・システム状態参照（get̲tid，get̲did，get̲pid，sns̲ctx，sns̲loc，
sns̲dsp，sns̲dpn，sns̲ker）
・CPU例外発生時の状態参照（xsns̲dpn，xsns̲xpn）
・拡張サービスコールの呼出し（cal̲svc）
カーネルドメインのみから呼び出すことができるサービスコール：・システム状態のアクセス許可ベクタの設定（sac̲sys）
・カーネルの終了（ext̲ker）
・非タスクコンテキスト専用のサービスコール
アクセス許可ベクタによるアクセス保護を行わないサービスコール：
・ミューテックスのロック解除（unl̲mtx）【補足説明】
xsns̲dpnとxsns̲xpnは，エラーコードを返さないために，すべての保護ドメイ
ンから呼び出すことができるサービスコールとしているが，タスクコンテキス
トから呼び出した場合には必ずtrueが返ることとしており，実質的にはカーネ
ルドメインのみから呼び出すことができる．
unl̲mtxは，アクセス許可ベクタによるアクセス保護を行わないサービスコールとしているが，ミューテックスをロックしたタスク以外が呼び出すとE̲ILUSEエngki̲spec‑120.txt

page 257

ラーとなるため，実質的には対象ミューテックスの通常操作1としてアクセス保護されているとみなすことができる（ミューテックスのロック中にアクセス許可ベクタを変更した場合の振舞いは異なる）．
【μITRON4.0/PX仕様との関係】
get̲priは，μITRON4.0/PX仕様ではタスクに対する通常操作1としていたのを，タスクに対する参照操作に変更した．また，get̲ipm（μITRON4.0/PX仕様では
get̲ixx）をシステム状態に対する通常操作2から参照操作に，sac̲sysをシステ
ム状態に対する管理操作からカーネルドメインのみから呼び出すことができる
サービスコールに変更した．システム時刻に対するアクセス許可ベクタは廃止
し，get̲timはシステム状態に対する参照操作とした．
5.9 省略名の元になった英語
5.9.1 サービスコールと静的APIの名称の中のxxxの元になった英語
xxx
元になった英語‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
act
activate
ata
attach with access control vector
att
attachcalcall
cancancelcfg
configurechgchange
clr
clear
cre
createdef
definedeldeletedet
detachdisdisable
dly
delay
ena
enable
ext
exit
get
get
ini
initialize
loc
lock
mig
migrate
pol
poll
prb
probe
ras
raise
rcv
receiverefreferencerel
releaserot
rotatersm
resumesac
set access control vector
set
set
sig
signal
slp
sleep
snd
send
sns
sense
sta
start
stp
stop
sus
suspendterterminatetry
tryngki̲spec‑120.txt
unl
wai
wup

page 258

unlockwait
wake up

5.9.2 サービスコールと静的APIの名称の中のyyyの元になった英語
yyy
元になった英語‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
act
activationalm
alarm handler
cfg
configuration
cpu
CPU
ctx
context
cyc
cyclic handler
diddomain ID
dpn
dispatch pending
dsp
dispatchdtq
data queue
exc
exception
flg
eventflag
ics
interrupt context stack
inf
information
inh
interrupt handler
ini
initilization
int
interrupt
ipm
interrupt priority mask
isrinterrupt service routinekerkernelloc
lock
mbf
message buffer
mbx
mailboxmpf
fixed‑sized memory poolmem
memorymodmodule
mtx
mutex
ovr
overrun handler
pdq
priority data queue
pid
processor ID
pri
priority
rdq
ready queue
sec
sectionsem
semaphorespn
spin locksys
systemsvc
service callterterminationtextask exceptiontidtask ID
tim
time
tsk
task
utm
time in micro secondverversion
wai
wait
wup
wake up
5.9.3 サービスコールの名称の中のzの元になった英語z

元になった英語ngki̲spec‑120.txt

page 259‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
aautomatic ID assignment
f
force
i
interruptmmultiprocessorppollttimeoutx
exception
以上

,

,

周辺

図2-1. 想定ᵸᶪ᷏ᷧᷚᶸᶹᶴ構成

起動
実行
実行可能状態
READY

状態
状態

実行状態
RUNNING待
解除

待

広義 待 状態
待 状態
WAITING
強制待再開

二重待 状態WAITINGSUSPENDED
待 解除
強制待

強制待

強制待 状態SUSPENDED

再開

起動
強制終了

休止状態
DORMANT
生成

強制終了
終了

削除

未登録状態
NON-EXISTENT
図2-2. ᷑᷋᷁ᶍ状態遷移

終了 削除

実行可能状態
READY

実行状態
RUNNING

保留

実行状態
(

保留解除

保留状態)

待

待 解除

待 状態
WAITING
強制待

強制待

再開

再開

二重待 状態WAITINGSUSPENDED
待 解除
強制待
再開

起動
強制終了

強制待

強制待 状態
実行継続中

強制待 状態SUSPENDED
保留解除

休止状態
DORMANT
生成

強制終了
終了

削除

未登録状態
NON-EXISTENT

終了 削除

図2-3. 過渡的ᶉ状態ᶡ含ᶠᵾ᷑᷋᷁ᶍ状態遷移

割込 要求

割込 要求

割込 番号
(intno)

周辺

周辺

割込 要求

IRC
変換

変換

変換

割込 要求
禁止

割込 要求
禁止

割込 要求
禁止

割込
優先度設定

割込
優先度設定

割込
優先度設定

割込 優先度
(IPM)
割込
優先度比較

割込
優先度比較

割込
優先度比較

割込 選択
CPU

全割込

割込 受付

割込
番号
(inhno)
割込

割込

対応

割込

毎 持 範囲割込(ISR)
割込
ID (isrid)

割込
(ISR)

図2-4. TOPPERS標準割込ᶞ処理᷽ᷴᷙᶍ概念図

割込
番号(inhno)12IRC0x0n 04

0x0n 03

0x0n 02

0x0n 01

IRC

0x02 04

0x02 03

0x02 02

0x02 01

0x01 04

0x01 03

0x01 02

0x0n 02

0x0n 01

0x00 04

0x00 03

0x02 02

0x02 01

0x01 02

0x01 01

割込 番号(intno)0x01 01

割込 要求

IRC

IRC

n

図2-5. ᷽᷿ᷰᷓᷩᷕ᷇᷍対応ᶽ᷽᳐ᷟᶊᵩᵰᶪ割込ᶞ番号ᶇ割込ᶞᷡḅᷛ᷻番号

実行開始

毎
初期化処理

実行開始

毎
初期化処理

共有
初期化処理
同期
初期化処理 分岐

初期化処理 分岐自身 初期化
静的API 処理自身 初期化
静的API 処理
同期

初期化
実行
同期
初期化
実行

初期化
実行
同期

動作状態
遷移

動作開始

動作状態
遷移

動作開始

図2-6. ᷽᷿ᷰᷓᷩᷕ᷇᷍対応ᶽ᷽᳐ᷟᶊᵩᵰᶪ᷉᷋ᷘᷲ初期化ᶍ流ᶫ

終了
呼 出
終了
呼出
非動作状態
遷移
他
終了 要求
終了処理 開始

終了処理 開始

非動作状態
遷移

非動作状態
遷移
同期

終了処理
実行

終了処理
実行

終了処理
実行
同期

終了処理
実行
同期
依存 終了処理依存 終了処理依存 終了処理

図2-7. ᷽᷿ᷰᷓᷩᷕ᷇᷍対応ᶽ᷽᳐ᷟᶊᵩᵰᶪ᷉᷋ᷘᷲ終了処理ᶍ流ᶫsystem.cfg

cfg1_out.c

計算用
1

C言語

C
関連
cfg1_out.syms

cfg1_out.srec

計算
2

結果

kernel_cfg.ckernel_cfg.h

構成 初期化
構成 初期化C関連他
system.srec

system.syms

3※

名中 斜体 部分 例

図2-8. ᷅ḅᷧᶵ᷷᷀᷾᳐᷑ᶍ処理᷽ᷴᷙcfg1_out.syms

cfg1_out.srec

計算
2

結果

kernel_cfg.ckernel_cfg.h

構成 初期化
構成 初期化C関連他
system.srec

system.syms

3

kernel_cfg.ckernel_cfg.h

構成 初期化
構成 初期化C関連他

system.srec

system.syms

4※

名中 斜体 部分 例

図2-9. 最終的ᶉ᷿᷊᷽᷷᳐ᷛᷴ᳐ᶍᷣ᷋3ᶆᶍ生成