ngki̲spec‑110.txt

page 1

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

ngki̲spec‑110.txt

page 22.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.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 カーネル管理外のCPU例外
2.5.11 カーネル管理外の状態
2.5.12 処理単位とシステム状態
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.8 CPU例外処理モデル
2.8.1 CPU例外処理の流れ
2.8.2 CPU例外ハンドラから呼び出せるサービスコール
2.9 システムの初期化と終了
2.9.1 システム初期化手順
2.9.2 システム終了手順
2.10 オブジェクトの登録とその解除
2.10.1 ID番号で識別するオブジェクト
2.10.2 オブジェクト番号で識別するオブジェクト
2.10.3 識別番号を持たないオブジェクト
2.10.4 オブジェクト生成に必要なメモリ領域
2.11 オブジェクトのアクセス保護（☆未完成）
2.12 システムコンフィギュレーション手順
2.12.1 システムコンフィギュレーションファイル
2.12.2 静的APIの文法とパラメータ

ngki̲spec‑110.txt

page 32.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 カーネル共通構成マクロ
第３章 システムインタフェースレイヤAPI仕様
3.1 システムインタフェースレイヤの概要
3.2 SILヘッダファイル
3.3 全割込みロック状態の制御
3.4 微少時間待ち
3.5 エンディアンの取得
3.6 メモリ空間アクセス関数
3.7 I/O空間アクセス関数
3.8 プロセッサIDの参照
第４章 カーネルAPI仕様
4.1 タスク管理機能
4.2 タスク付属同期機能
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 アラームハンドラ

ngki̲spec‑110.txt

page 44.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.5 構成マクロ5.5.1 TOPPERS共通構成マクロ
5.5.2 カーネル共通構成マクロ
5.5.3 カーネルの機能毎の構成マクロ
5.6 エラーコード一覧
5.7 機能コード一覧
5.8 カーネルオブジェクトに対するアクセスの種別

第１章 TOPPERS新世代カーネルの概要
TOPPERS新世代カーネルとは，TOPPERSプロジェクトにおいてITRON仕様をベースとして開発している一連のリアルタイムカーネルの総称である．この章では，
TOPPERS新世代カーネル仕様の設計方針と，それに属する各カーネルの適用対象
領域と設計方針について述べる．
1.1 TOPPERS新世代カーネル仕様の設計方針
TOPPERS新世代カーネル仕様を設計するにあたり，次の方針を設定する．
(1) μITRON4.0仕様をベースに拡張・改良を加える
TOPPERS新世代カーネル仕様は，多くの技術者の尽力により作成され，多くの実
装・使用実績があるμITRON4.0仕様をベースとする．ただし，μITRON4.0仕様の策定時以降の状況の変化を考慮し，μITRON4.0仕様で不十分と考えられる点については積極的に拡張・改良する．μITRON4.0仕様への準拠性にはこだわらない．
(2) ソフトウェアの再利用性を重視する
μITRON4.0仕様の策定時点と比べると，組込みソフトウェアの大規模化が進展している一方で，ハードウェアの性能向上も著しい．そのため，ソフトウェアの再利用性を向上させるためには，少々のオーバヘッドは許容される状況にある．
そこで，TOPPERS新世代カーネル仕様では，μITRON4.0仕様においてオーバヘッngki̲spec‑110.txt

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

ngki̲spec‑110.txt

page 6

いが，すべてのプロセッサでバイナリコードを共有することから，同じバイナ
リコードを実行できることが必要である．
FMPカーネルでは，タスクを実行するプロセッサを静的に決定するのが基本であり，カーネルは自動的に負荷分散する機能を持たないが，タスクをマイグレー
ションさせるサービスコールを備えている．これを用いて，アプリケーション
で動的な負荷分散を実現することが可能である．
FMPカーネルの機能は，ASPカーネルと同様に，カーネル内で動的なメモリ管理が不要な範囲に留める．

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

ngki̲spec‑110.txt

page 7

TOPPERS新世代カーネルは，アプリケーションプログラムの再利用性を向上させるために，ターゲットハードウェアや開発環境の違いをできる限り隠蔽することを目指している．ただし，ターゲットハードウェアや開発環境の制限によって実現できない機能が生じたり，逆にターゲットハードウェアの特徴を活かす
ためには機能拡張が不可欠になる場合がある．また，同一のターゲットハード
ウェアであっても，アプリケーションシステムによって使用方法が異なる場合があり，ターゲットシステム毎に仕様の細部に違いが生じることは避けられない．
そこで，TOPPERS新世代カーネルの仕様は，ターゲットシステムによらずに定めるターゲット非依存（target‑independent）の規定と，ターゲットシステム毎に定めるターゲット定義（target‑defined）の規定に分けて記述する．この仕様書は，ターゲット非依存の規定について記述するものであり，この仕様書で「ターゲット定義」とした事項は，ターゲットシステム毎に用意するドキュメ
ントにおいて規定する．
また，この仕様書でターゲット非依存に規定した事項であっても，ターゲット
ハードウェアや開発環境の制限によって実現できない場合や，実現するための
オーバヘッドが大きくなる場合には，この仕様書の規定を逸脱する場合がある．
このような場合には，ターゲットシステム毎に用意するドキュメントでその旨を明記する．
2.1.3 想定するソフトウェア構成
この仕様では，アプリケーションシステムを構成するソフトウェアを，アプリ
ケーションプログラム（以下，単にアプリケーションと呼ぶ），システムサー
ビス，カーネルの3階層に分けて考える（図2‑1）．カーネルとシステムサービ
スをあわせて，ソフトウェアプラットフォームと呼ぶ．
カーネルは，コンピュータの持つ最も基本的なハードウェア資源であるプロセッ
サ，メモリ，タイマを抽象化し，上位階層のソフトウェア（アプリケーション
およびシステムサービス）に論理的なプログラム実行環境を提供するソフトウェ
アである．
システムサービスは，各種の周辺デバイスを抽象化するソフトウェアで，ファイルシステムやネットワークプロトコルスタック，各種のデバイスドライバなどが含まれる．
また，この仕様では，プロセッサと各種の周辺デバイスの接続方法を隠蔽するためのソフトウェア階層として，システムインタフェースレイヤ（SIL）を規定
する．
システムインタフェースレイヤ，カーネル，各種のシステムサービス（これらをモジュールと呼ぶ）を，上位階層のソフトウェアから使うためのインタフェー
スを，API（Application Programming Interface）と呼ぶ．
この仕様書では，第3章においてシステムインタフェースレイヤのAPI仕様を，第4章においてカーネルのAPI仕様を規定する．システムサービスのAPI仕様は，
システムサービス毎の仕様書で規定される．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，カーネルとアプリケーションの中間にあるソフトウェア
をソフトウェア部品と呼んでいたが，TOPPERS組込みコンポーネントシステム（TECS）においてはカーネルもソフトウェア部品の1つと捉えることから，この仕様ではシステムサービスと呼ぶことにした．
2.1.4 想定するプログラミング言語

ngki̲spec‑110.txt

page 8

この仕様書における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）と呼ぶ場合もある．
(2) コールバック
下位階層のソフトウェアから，上位階層のソフトウェアを呼び出すインタフェー
スをコールバック（callback）と呼ぶ．
(3) 静的API
オブジェクトの生成情報や初期状態などを定義するために，システムコンフィ
ギュレーションファイル中に記述するインタフェースを，静的API（staticAPI）と呼ぶ．
(4) 構成マクロ
下位階層のソフトウェアに関する各種の情報を取り出すために，上位階層のソ
フトウェアが用いるマクロを，構成マクロ（configuration macro）と呼ぶ．
2.2.2 パラメータとリターンパラメータ
サービスコールやコールバックに渡すデータをパラメータ（parameter），それらが返すデータをリターンパラメータ（return parameter）と呼ぶ．また，静的APIに渡すデータもパラメータと呼ぶ．
オブジェクトを生成するサービスコールなど，パラメータの数が多い場合やター
ゲット定義のパラメータを追加する可能性がある場合には，複数のパラメータを1つの構造体に入れ，その領域へのポインタをパラメータとして渡す．また，
パラメータのサイズが大きい場合にも，パラメータを入れた領域へのポインタをパラメータとして渡す場合がある．
C言語APIでは，リターンパラメータは，関数の返値とするか，リターンパラメー
タを入れる領域へのポインタをパラメータとして渡すことで実現する．オブジェ
クトの状態を参照するサービスコールなど，リターンパラメータの数が多い場
合やターゲット定義のリターンパラメータを追加する可能性がある場合には，複数のリターンパラメータを1つの構造体に入れて返すこととし，その領域へのポインタをパラメータとして渡す．
複数のパラメータまたはリターンパラメータを入れるための構造体を，パケット（packet）と呼ぶ．

ngki̲spec‑110.txt

page 9

サービスコールやコールバックに，パケットを置く領域へのポインタやリター
ンパラメータを入れる領域へのポインタを渡す場合，別に規定がない限りは，
サービスコールやコールバックの処理が完了した後は，それらの領域を参照す
ることはなく，別の目的に使用できる．
2.2.3 返値とエラーコード
一部の例外を除いて，サービスコールおよびコールバックの返値は，処理が正常終了したかを表す符号付き整数とする．処理が正常終了した場合には，E̲OK（＝0）または正の値が返るものとし，値の意味はサービスコールまたはコール
バック毎に定める．処理が正常終了しなかった場合には，その原因を表す負の値が返る．処理が正常終了しなかった原因を表す値を，エラーコード（errorcode）と呼ぶ．
エラーコードは，いずれも負の値のメインエラーコードとサブエラーコードで構成される．メインエラーコードとサブエラーコードからエラーコードを構成するマクロと，エラーコードからメインエラーコードとサブエラーコードを抽出するマクロが用意されている（「2.14.5 TOPPERS共通マクロ」の節を参照）．
メインエラーコードの名称・意味・値は，カーネルとシステムサービスで共通に定める（「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 ヘッダファイル
カーネルやシステムサービスを用いるために必要な定義を含むファイル．
【補足説明】
ヘッダファイルは，複数回インクルードしてもエラーにならないように対処するのが原則である．具体的には，ヘッダファイルの先頭で特定の識別子（例えngki̲spec‑110.txt

page 10ば，kernel.hなら"TOPPERS̲KERNEL̲H"）をマクロ定義し，ヘッダファイルの内
容全体をその識別子が定義されていない場合のみ有効とする条件ディレクティ
ブを付加する．
2.3 主な概念
2.3.1 オブジェクトと処理単位(1) オブジェクト
カーネルまたはシステムサービスが管理対象とするソフトウェア資源を，オブジェクト（object）と呼ぶ．特に，カーネルが管理対象とするソフトウェア資源を，カーネルオブジェクト（kernel object）と呼ぶ．
オブジェクトは，種類毎に，番号によって識別する．カーネルまたはシステムサービスで，オブジェクトに対して任意に識別番号を付与できる場合には，1から連続する正の整数値でオブジェクトを識別する．この場合に，オブジェクトの識別番号を，オブジェクトのID番号（ID number）と呼ぶ．そうでない場合，
すなわちカーネルまたはシステムサービスの内部または外部からの条件によって識別番号が決まる場合には，オブジェクトの識別番号を，オブジェクト番号（object number）と呼ぶ．識別する必要のないオブジェクトには，識別番号を付与しない場合がある．
オブジェクト属性（object attribute）は，オブジェクトの動作モードや初期状態を定めるもので，オブジェクトの登録時に指定する．オブジェクト属性にTA̲XXXXが指定されている場合，そのオブジェクトを，TA̲XXXX属性のオブジェ
クトと呼ぶ．複数の属性を指定する場合には，オブジェクト属性を渡すパラメー
タに，指定する属性値のビット毎論理和（C言語の"￨"）を渡す．また，指定すべきオブジェクト属性がない場合には，TA̲NULLを指定する．
(2) 処理単位
オブジェクトの中には，プログラムが対応付けられるものがある．プログラムが対応付けられるオブジェクト（または，対応付けられるプログラム）を，処理単位（processing unit）と呼ぶ．処理単位に対応付けられるプログラムは，
アプリケーションまたはシステムサービスで用意し，カーネルが実行制御する．
処理単位の実行を要求することを起動（activate），処理単位の実行を開始することを実行開始（start）と呼ぶ．
拡張情報（extended information）は，処理単位が呼び出される時にパラメータとして渡される情報で，処理単位の登録時に指定する．拡張情報は，カーネ
ルやシステムサービスの動作には影響しない．
(3) タスクカーネルが実行順序を制御するプログラムの並行実行の単位をタスク（task）と呼ぶ．タスクは，処理単位の1つである．
サービスコールの機能説明において，サービスコールを呼び出したタスクを，
自タスク（invoking task）と呼ぶ．
(4) ディスパッチとスケジューリング
プロセッサが実行するタスクを切り換えることを，タスクディスパッチまたは
単にディスパッチ（dispatching）と呼ぶ．それに対して，次に実行すべきタス
クを決定する処理を，タスクスケジューリングまたは単にスケジューリング
（scheduling）と呼ぶ．

ngki̲spec‑110.txt

page 11

ディスパッチが起こるべき状態（すなわち，スケジューリングによって，現在実行しているタスクとは異なるタスクが，実行すべきタスクに決定されている状態）となっても，何らかの理由でディスパッチを行わないことを，ディスパッ
チの保留（pend dispatching）という．ディスパッチを行わない理由が解除された時点で，ディスパッチが起こる．
(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型で表し，単位はミリ秒とする．
イベントを発生させるシステム時刻を絶対値で指定する方法は用意されておらず，一般には，基準となるシステム時刻（典型的には，サービスコールを呼び出したシステム時刻）からの相対時間（relative time）によって指定する．相対時間は，符号無しの整数型であるRELTIM型で表し，単位はシステム時刻と同一，すなわちミリ秒とする．

ngki̲spec‑110.txt

page 12

相対時間には，少なくとも，16ビットの符号無しの整数型（uint16̲t型）に格納できる任意の値を指定することができるが，RELTIM型（uint̲t型に定義される）に格納できる任意の値を指定できるとは限らない．相対時間に指定できる最大値は，構成マクロTMAX̲RELTIMに定義されている．
イベントを発生させるシステム時刻を相対時間によって指定した場合，イベン
トの処理が行われるのは，基準時刻から相対時間によって指定した以上の時間が経過した後となる．
逆に，イベントの発生するシステム時刻を絶対値で参照する方法は用意されておらず，一般には，基準となるシステム時刻（典型的には，サービスコールを呼び出したシステム時刻）からの相対時間によって参照する．
イベントを発生させるシステム時刻が相対時間によって返された場合，イベン
トの処理が行われるのは，基準時刻から相対時間として返された以上の時間が経過した後となる．
【補足説明】
相対時間に0を指定した場合，基準時刻後の最初のタイムティックでイベントの処理が行われる．また，1を指定した場合，基準時刻後の2回目のタイムティッ
クでイベントの処理が行われる．これは，基準時刻後の最初のタイムティック
は，基準時刻の直後に発生する可能性があるため，ここでイベントの処理を行うと，基準時刻からの経過時間が1以上という仕様を満たせないためである．
同様に，相対時間として0が返された場合，基準時刻後の最初のタイムティック
でイベントの処理が行われる．また，1が返された場合，基準時刻後の2回目のタイムティックでイベントの処理が行われる．
(3) タイムアウトとポーリング
サービスコールの中で待ち状態が指定した時間以上継続した場合に，サービス
コールの処理を取りやめて，サービスコールからリターンすることを，タイムアウト（timeout）という．タイムアウトしたサービスコールからは，E̲TMOUT
エラーが返る．
タイムアウトを起こすまでの時間（タイムアウト時間）は，符号付きの整数型であるTMO型で表し，単位はシステム時刻と同一，すなわちミリ秒とする．タイ
ムアウト時間に正の値を指定した場合には，タイムアウトを起こすまでの相対時間を表す．すなわち，タイムアウトの処理が行われるのは，サービスコール
を呼び出してから指定した以上の時間が経過した後となる．
ポーリング（polling）を行うサービスコールとは，サービスコールの中で待ち状態に遷移すべき状況になった場合に，サービスコールの処理を取りやめてリターンするサービスコールのことをいう．ここで，サービスコールの処理を取りやめてリターンすることを，ポーリングに失敗したという．ポーリングに失敗したサービスコールからは，E̲TMOUTエラーが返る．
ポーリングを行うサービスコールでは，待ち状態に遷移することはないのが原則である．そのため，ポーリングを行うサービスコールは，ディスパッチ保留状態であっても呼び出すことができる．ただし，サービスコールの中で待ち状態に遷移する状況が複数ある場合，ある状況でポーリング動作をしても，他の状況では待ち状態に遷移する場合がある．このような場合の振舞いは，該当するサービスコール毎に規定する．
タイムアウト付きのサービスコールは，別に規定がない限りは，タイムアウト
時間にTMO̲POL（＝0）を指定した場合にはポーリングを行い，TMO̲FEVR（＝‑1）
を指定した場合にはタイムアウトを起こさないものとする．

ngki̲spec‑110.txt

page 13

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

ngki̲spec‑110.txt

page 14を防ぐアクセス保護機能を提供する．
アクセス制御の用語では，処理単位が主体（subject），カーネルオブジェクトが対象（object）ということになる．
(2) メモリオブジェクト
保護機能対応カーネルにおいては，メモリ領域をカーネルオブジェクトとして扱い，アクセス保護の対象とする．カーネルがアクセス保護の対象とする一連のメモリ領域を，メモリオブジェクト（memory object）と呼ぶ．メモリオブジェ
クトは，互いに重なりあうことはない．
メモリオブジェクトは，その先頭番地により識別する．言い換えると，先頭番地がオブジェクト番号となる．
メモリオブジェクトの先頭番地とサイズには，ターゲットハードウェアでメモリ保護が実現できるように，ターゲット定義の制約が課せられる．
(3) 保護ドメイン
保護機能を提供するために用いるカーネルオブジェクトの集合を，保護ドメイン（protection domain）と呼ぶ．保護ドメインは，保護ドメインIDと呼ぶID番
号によって識別する．
カーネルオブジェクトは，たかだか1つの保護ドメインに属する．処理単位は，いずれか1つの保護ドメインに属さなければならないのに対して，それ以外のカー
ネルオブジェクトは，いずれの保護ドメインにも属さないことができる．いずれの保護ドメインにも属さないカーネルオブジェクトを，無所属のカーネルオ
ブジェクト（independent kernel object）と呼ぶ．
カーネルオブジェクトの属する保護ドメインは，オブジェクトの登録時に決定し，登録後に変更することはできない．
処理単位がカーネルオブジェクトにアクセスできるかどうかは，処理単位が属する保護ドメインにより決まる．すなわち，カーネルオブジェクトに対するア
クセス権は，処理単位ではなく，保護ドメイン単位で管理される．
【補足説明】
タスクのスタック領域は，処理単位がカーネルオブジェクトにアクセスできるかどうかは処理単位が属する保護ドメインにより決まるという原則の例外である．
(4) カーネルドメインとユーザドメイン
システムには，カーネルドメイン（kernel domain）と呼ばれる保護ドメインが1つ存在する．カーネルドメインに属する処理単位は，プロセッサの特権モードで実行される．また，すべてのカーネルオブジェクトに対して，すべての種別のアクセスを行うことが許可される．
カーネルドメイン以外の保護ドメインを，ユーザドメイン（user domain）と呼
ぶ．ユーザドメインに属する処理単位は，サービスコールを呼び出さない限りはプロセッサの非特権モードで実行される．また，カーネルオブジェクトに対するアクセスを制限することができる．
ユーザドメインには，1から連続する正の整数値の保護ドメインIDが付与される．
カーネルドメインの保護ドメインIDは，TDOM̲KERNEL（＝‑1）である．

ngki̲spec‑110.txt

page 15【補足説明】
保護機能対応でないカーネルは，カーネルドメインのみをサポートしているとみなすこともできる．
【μITRON4.0/PX仕様との関係】
μITRON4.0/PX仕様のシステムドメイン（system domain）は，現時点ではサポートしない．システムドメインは，それに属する処理単位が，プロセッサの特権
モードで実行され，カーネルオブジェクトに対するアクセスを制限することができる保護ドメインである．
(5) システムタスクとユーザタスク
カーネルドメインに属するタスクをシステムタスク（system task），ユーザド
メインに属するタスクをユーザタスク（user task）と呼ぶ．
【補足説明】
特権モードで実行されるタスクをシステムタスク，非特権モードで実行されるタスクをユーザタスクと定義する方法もあるが，ユーザタスクであっても，サービスコールの実行中は特権モードで実行されるため，上記の定義とした．
μITRON4.0/PX仕様のシステムドメインに属するタスクは，システムタスクと呼ぶことになる．
(6) アクセス許可パターンとアクセス許可ベクタ
あるカーネルオブジェクトに対するある種別のアクセスが，どの保護ドメインに属する処理単位に許可されているかを表現するビットパターンを，アクセス
許可パターン（access permission pattern）と呼ぶ．アクセス許可パターンの各ビットは，1つの保護ドメインに対応する．
アクセス許可パターンは，符号無し整数に定義されるデータ型（ACPTN）で保持する．そのため，2つのアクセス許可パターンのビット毎論理和（C言語の"￨"）を求めることで，アクセスを許可されている保護ドメインの和集合（union）を得ることができる．また，2つのアクセス許可パターンのビット毎論理積（C言語の"&"）を求めることで，アクセスを許可されている保護ドメインの積集合（intersection）を得ることができる．
カーネルオブジェクトに対するアクセスは，カーネルオブジェクトの種類毎に，通常操作1，通常操作2，管理操作，参照操作の4つの種別に分類されている．あるカーネルオブジェクトに対する4つの種別のアクセスに関するアクセス許可パ
ターンをひとまとめにしたものを，アクセス許可ベクタ（access permission
vector）と呼ぶ．
2.3.4 マルチプロセッサ対応
この節では，マルチプロセッサ対応に関連する主な概念について説明する．この節の内容は，マルチプロセッサ対応カーネルにのみ適用される．
(1) クラス
マルチプロセッサに対応するために用いるカーネルオブジェクトの集合を，クラス（class）と呼ぶ．クラスは，クラスIDと呼ぶID番号によって識別する．
カーネルオブジェクトは，いずれか1つのクラスに属する．カーネルオブジェク
トの属するクラスは，オブジェクトの登録時に決定し，登録後に変更することngki̲spec‑110.txt

page 16はできない．
【補足説明】
処理単位を実行するプロセッサを静的に決定する機能分散型のマルチプロセッ
サシステムでは，プロセッサ毎にクラスを設ける方法が典型的である．それに対して，対称型のマルチプロセッサシステムで，処理単位のマイグレーションを許す場合には，プロセッサ毎のクラスに加えて，どのプロセッサでも実行できるクラスを（システム中に1つまたは初期割付けプロセッサ毎に）設ける方法が典型的である．
カーネルオブジェクトはいずれか1つのクラスに属するという原則に関わらず，
以下のオブジェクトはいずれのクラスにも属さない．
・拡張サービスコールルーチン
・グローバル初期化ルーチン
・グローバル終了処理ルーチン
マルチプロセッサ対応でないカーネルは，カーネルによって規定された1つのクラスのみをサポートしているとみなすこともできる．
(2) プロセッサたかだか1つの処理単位のみを同時に実行できるハードウェアの単位を，プロセッサ（processor）と呼ぶ．プロセッサは，プロセッサIDと呼ぶID番号によって識別する．
複数のプロセッサを持つシステム構成をマルチプロセッサ（multiprocessor）と呼び，同時に複数の処理単位を実行することができる．
システムの初期化時と終了時に特別な役割を果たすプロセッサを，マスタプロ
セッサ（master processor）と呼び，システムに1つ存在する．どのプロセッサをマスタプロセッサとするかは，ターゲット定義である．マスタプロセッサ以
外のプロセッサを，スレーブプロセッサ（slave processor）と呼ぶ．なお，カーネル動作状態では，マスタプロセッサとスレーブプロセッサの振舞いに違いはない．
(3) 処理単位の割付けとマイグレーション
処理単位は，後述のマイグレーションが発生しない限りは，いずれか1つのプロセッサに割り付けられて実行される．処理単位を実行するプロセッサを，割付
けプロセッサと呼ぶ．また，処理単位が登録時に割り付けられるプロセッサを，初期割付けプロセッサと呼ぶ．
処理単位によっては，処理単位の登録後に，割付けプロセッサを変更することが可能である．処理単位の登録後に割付けプロセッサを変更することを，処理単位のマイグレーション（migration）と呼ぶ．
割付けプロセッサを変更できる処理単位に対しては，処理単位を割り付けることができるプロセッサ（これを，割付け可能プロセッサと呼ぶ）を制限することができる．
(4) クラスの持つ属性とカーネルオブジェクト
タスクの初期割付けプロセッサや割付け可能プロセッサなど，カーネルオブジェ
クトをマルチプロセッサ上で実現する際に設定すべき属性は，そのカーネルオ
ブジェクトが属するクラスによって定まる．

ngki̲spec‑110.txt

page 17

各クラスが持ち，それに属するカーネルオブジェクトに適用される属性は，次の通りである．
・初期割付けプロセッサ・割付け可能プロセッサ（複数のプロセッサを指定可能，初期割付けプロセッ
サを含む）
・コントロールブロックの配置場所
・その他に必要なメモリ領域（タスクのスタック領域やデータキューのデー
タキュー管理領域など）の配置場所
・その他の管理情報（ロック単位など）使用できるクラスのID番号とその属性は，ターゲット定義である．
【仕様決定の理由】
クラスを導入することで，カーネルオブジェクト毎に上記の属性を設定できる
ようにしなかったのは，これらの属性をアプリケーション設計者が個別に設定するよりも，ターゲット依存部の実装者が有益な組み合わせをあらかじめ用意
しておく方が良いと考えたためである．
(5) ローカルタイマ方式とグローバルタイマ方式
システム時刻の管理方式として，プロセッサ毎にシステム時刻を持つローカル
タイマ方式と，システム全体で1つのシステム時刻を持つグローバルタイマ方式の2つの方式がある．どちらの方式を用いることができるかは，ターゲット定義
である．
ローカルタイマ方式では，プロセッサ毎のシステム時刻は，それぞれのプロセッ
サが更新する．異なるプロセッサのシステム時刻を同期させる機能は，カーネ
ルでは用意しない．
グローバルタイマ方式では，システム中の1つのプロセッサがシステム時刻を更新する．これを，システム時刻管理プロセッサと呼ぶ．どのプロセッサをシス
テム時刻管理プロセッサとするかは，ターゲット定義である．
【補足説明】
システム時刻管理プロセッサが，マスタプロセッサと一致している必要はない．
【未決定事項】
ローカルタイマ方式の場合に，プロセッサ毎に異なるタイムティックの周期を設定したい場合が考えられるが，現時点の実装ではサポートしておらず，
TIC̲NUMEとTIC̲DENOの扱いも未決定であるため，今後の課題とする．
2.4 処理単位の種類と実行順序
2.4.1 処理単位の種類
カーネルが実行を制御する処理単位の種類は次の通りである．
(a) タスク(a.1) タスク例外処理ルーチン(b) 割込みハンドラ(b.1) 割込みサービスルーチン(b.2) タイムイベントハンドラ(c) CPU例外ハンドラ(d) 拡張サービスコールルーチン

ngki̲spec‑110.txt

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

page 19

サでローカル初期化ルーチンが実行される．また，終了処理ルーチンには，クラスに属さないグローバル終了処理ルーチンと，クラスに属するローカル終了
処理ルーチンがある．ローカル終了処理ルーチンが各プロセッサで実行された
後に，マスタプロセッサでグローバル終了処理ルーチンが実行される．
2.4.3 カーネル処理の不可分性
カーネルのサービスコール処理やディスパッチャ，割込みハンドラとCPU例外ハンドラの出入口処理などのカーネル処理は不可分に実行されるのが基本である．
実際には，カーネル処理の途中でアプリケーションが実行されることは許されており，アプリケーションがサービスコールを用いて観測できる範囲で，カーネル処理が不可分に実行された場合と同様に振る舞えばよい．これを，カーネ
ル処理の不可分性という．
【補足説明】
1つのサービスコールにより複数のタスクが実行できる状態になる場合，新しく実行状態となるべきタスクへのディスパッチは，すべてのタスクの状態遷移が完了した後に行われる．例えば，低優先度のタスクAが発行したサービスコール
により，中優先度のタスクBと高優先度のタスクCがこの順で待ち解除される場
合，タスクBとタスクCが待ち解除された後に，タスクCへのディスパッチが行われる．
2.4.4 処理単位を実行するプロセッサ
マルチプロセッサ対応カーネルでは，処理単位を実行するプロセッサ（割付けプロセッサ）は，それが属するクラスの初期割付けプロセッサと割付け可能プ
ロセッサから，次のように決まる．
タスク，周期ハンドラ，アラームハンドラは，いずれかのクラスに属さなければならなず，登録時に，そのクラスの初期割付けプロセッサに割り付けられる．
また，割付けプロセッサを変更するサービスコール（mact̲tsk／imact̲tsk，
mig̲tsk，msta̲cyc，msta̲alm／imsta̲alm）によって，割付けプロセッサを，クラスの割付け可能プロセッサのいずれかに変更することができる．
割込みハンドラ，CPU例外ハンドラ，ローカル初期化ルーチン，ローカル終了処
理ルーチンは，いずれかのクラスに属さなければならず，そのクラスの初期割
付けプロセッサで実行される．クラスの割付け可能プロセッサの情報は用いな
い．
割込みサービスルーチンは，いずれかのクラスに属さなければならず，そのクラスの割付け可能プロセッサのいずれか（オプション設定によりすべて）で実行される．クラスの初期割付けプロセッサの情報は用いない．
以上を整理すると，次の表の通りとなる．この表の中で，「○」はその情報を使用することを，「ー」はその情報を使用しないことを示す．
初期割付けプロセッサ
割付け可能プロセッサ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
タスク（タスク例外処理○○
ルーチンを含む）‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
割込みハンドラ○ー
割込みサービスルーチンー○
周期ハンドラ○○アラームハンドラ○○‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CPU例外ハンドラ○ーngki̲spec‑110.txt

page 20‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ローカル初期化ルーチン○ー
ローカル終了処理ルーチン○ー‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
拡張サービスコールルーチン，グローバル初期化ルーチン，グローバル終了処
理ルーチンは，いずれのクラスにも属さない．拡張サービスコールルーチンは，それを呼び出した処理単位の割付けプロセッサによって実行される．グローバ
ル初期化ルーチンとグローバル終了処理ルーチンは，マスタプロセッサによって実行される．
【未決定事項】
オーバランハンドラを実行するプロセッサについては，今後の課題である．
2.5 システム状態とコンテキスト
2.5.1 カーネル動作状態と非動作状態
カーネルの初期化が完了した後，カーネルの終了処理が開始されるまでの間を，カーネル動作状態と呼ぶ．それ以外の状態，すなわちカーネルの初期化完了前（初期化ルーチンの実行中を含む）と終了処理開始後（終了処理ルーチンの実
行中を含む）を，カーネル非動作状態と呼ぶ．
カーネル非動作状態では，原則として，NMIを除くすべての割込みがマスクされる．
カーネル非動作状態では，システムインタフェースレイヤのAPIとsns̲ker（カーネル非動作状態の参照）のみを呼び出すことができ，その他のサービスコールを呼び出すことはできない．カーネル非動作状態で，その他のサービスコール
を呼び出した場合の動作は，保証されない．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，カーネル動作状態かカー
ネル非動作状態のいずれかの状態を取る．
2.5.2 タスクコンテキストと非タスクコンテキスト
処理単位が実行される環境（用いるスタック領域やプロセッサの動作モードなど）をコンテキストと呼ぶ．
カーネル動作状態において，処理単位が実行されるコンテキストは，タスクコ
ンテキストと非タスクコンテキストに分類される．
タスク（タスク例外処理ルーチンを含む）が実行されるコンテキストは，タス
クコンテキストに分類される．また，タスクコンテキストから呼び出した拡張サービスコールルーチンが実行されるコンテキストは，タスクコンテキストに分類される．
割込みハンドラ（割込みサービスルーチンおよびタイムイベントハンドラを含む）とCPU例外ハンドラが実行されるコンテキストは，非タスクコンテキストに分類される．また，非タスクコンテキストから呼び出した拡張サービスコール
ルーチンが実行されるコンテキストは，非タスクコンテキストに分類される．
タスクコンテキストからは，非タスクコンテキスト専用のサービスコールを呼び出すことはできない．逆に，非タスクコンテキストからは，タスクコンテキ
スト専用のサービスコールを呼び出すことはできない．いずれも，呼び出した
場合にはE̲CTXエラーとなる．

ngki̲spec‑110.txt

page 212.5.3 カーネルの振舞いに影響を与える状態
カーネル動作状態において，プロセッサは，カーネルの振舞いに影響を与える状態として，次の状態を持つ．
・全割込みロックフラグ（全割込みロック状態と全割込みロック解除状態）
・CPUロックフラグ（CPUロック状態とCPUロック解除状態）
・割込み優先度マスク（割込み優先度マスク全解除状態と全解除でない状態）
・ディスパッチ禁止フラグ（ディスパッチ禁止状態とディスパッチ許可状態）
これらの状態は，それぞれ独立な状態である．すなわち，プロセッサは上記の状態の任意の組合せを取ることができ，それぞれの状態を独立に変化させることができる．
2.5.4 全割込みロック状態と全割込みロック解除状態
プロセッサは，NMIを除くすべての割込みをマスクするための全割込みロックフ
ラグを持つ．全割込みロックフラグがセットされた状態を全割込みロック状態，クリアされた状態を全割込みロック解除状態と呼ぶ．すなわち，全割込みロッ
ク状態では，NMIを除くすべての割込みがマスクされる．
全割込みロック状態では，システムインタフェースレイヤのAPIとsns̲ker（カーネル非動作状態の参照），ext̲ker（カーネルの終了）のみを呼び出すことができ，その他のサービスコールを呼び出すことはできない．全割込みロック状態
で，その他のサービスコールを呼び出した場合の動作は，保証されない．また，
全割込みロック状態では，実行中の処理単位からリターンしてはならない．リ
ターンした場合の動作は保証されない．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，全割込みロックフラグを持つ．すなわち，プロセッサ毎に，全割込みロック状態か全割込みロック解
除状態のいずれかの状態を取る．
2.5.5 CPUロック状態とCPUロック解除状態
プロセッサは，カーネル管理の割込み（「2.5.9 カーネル管理外の割込み」の節を参照）をすべてマスクするためのCPUロックフラグを持つ．CPUロックフラ
グがセットされた状態をCPUロック状態，クリアされた状態をCPUロック解除状態と呼ぶ．すなわち，CPUロック状態では，すべてのカーネル管理の割込みがマスクされ，ディスパッチが保留される．
NMI以外にカーネル管理外の割込みを設けない場合には，全割込みロックフラグとCPUロックフラグの機能は同一となるが，両フラグは独立に存在する．
CPUロック状態で呼び出すことができるサービスコールは次の通り．
・システムインタフェースレイヤのAPI・loc̲cpu／iloc̲cpu，unl̲cpu／iunl̲cpu・unl̲spn／iunl̲spn（マルチプロセッサ対応カーネルのみ）
・dis̲int，ena̲int，chg̲ipm，get̲ipm
・sns̲yyy，xsns̲yyy（CPU例外ハンドラからのみ）
・get̲utm
・ext̲tsk，ext̲ker
CPUロック状態で，その他のサービスコールを呼び出した場合には，E̲CTXエラーとなる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，CPUロックフラグを持つ．
すなわち，プロセッサ毎に，CPUロック状態かCPUロック解除状態のいずれかのngki̲spec‑110.txt

page 22

状態を取る．
【補足説明】
マルチプロセッサ対応カーネルにおいて，あるプロセッサがCPUロック状態にある間は，そのプロセッサにおいてのみ，すべてのカーネル管理の割込みがマスクされ，ディスパッチが保留される．それに対して他のプロセッサにおいては，
割込みはマスクされず，ディスパッチも起こるため，CPUロック状態を使って他のプロセッサで実行される処理単位との排他制御を実現することはできない．
2.5.6 割込み優先度マスク
プロセッサは，割込み優先度を基準に割込みをマスクするための割込み優先度
マスクを持つ．割込み優先度マスクがTIPM̲ENAALL（＝0）の時は，いずれの割込み要求もマスクされない．この状態を割込み優先度マスク全解除状態と呼ぶ．
割込み優先度マスクがTIPM̲ENAALL（＝0）以外の時は，割込み優先度マスクと同じかそれより低い割込み優先度を持つ割込みはマスクされ，ディスパッチは保留される．この状態を割込み優先度マスクが全解除でない状態と呼ぶ．
割込み優先度マスクが全解除でない状態では，別に規定がない限りは，自タス
クを広義の待ち状態に遷移させる可能性のあるサービスコールを呼び出すことはできない．呼び出した場合には，E̲CTXエラーとなる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，割込み優先度マスクを持つ．
2.5.7 ディスパッチ禁止状態とディスパッチ許可状態
プロセッサは，ディスパッチを保留するためのディスパッチ禁止フラグを持つ．
ディスパッチ禁止フラグがセットされた状態をディスパッチ禁止状態，クリアされた状態をディスパッチ許可状態と呼ぶ．すなわち，ディスパッチ禁止状態
では，ディスパッチは保留される．
ディスパッチ禁止状態では，別に規定がない限りは，自タスクを広義の待ち状態に遷移させる可能性のあるサービスコールを呼び出すことはできない．呼び出した場合には，E̲CTXエラーとなる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，ディスパッチ禁止フラグを持つ．すなわち，プロセッサ毎に，ディスパッチ禁止状態かディスパッチ
許可状態のいずれかの状態を取る．
【補足説明】
マルチプロセッサ対応カーネルにおいて，あるプロセッサがディスパッチ禁止状態にある間は，そのプロセッサにおいてのみ，ディスパッチが保留される．
それに対して他のプロセッサにおいては，ディスパッチが起こるため，ディス
パッチ禁止状態を使って他のプロセッサで実行されるタスクとの排他制御を実現することはできない．
2.5.8 ディスパッチ保留状態
非タスクコンテキストの実行中，全割込みロック状態，CPUロック状態，割込み
優先度マスクが全解除でない状態，ディスパッチ禁止状態では，ディスパッチ
が保留される．これらの状態を総称して，ディスパッチ保留状態と呼ぶ．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，ディスパッチ保留状態
かそうでない状態のいずれかの状態を取る．

ngki̲spec‑110.txt

page 23

2.5.9 カーネル管理外の割込み
高い割込み応答性を求められるアプリケーションでは，カーネル内で割込みをマスクすることにより，割込み応答性の要求を満たせなくなる場合がある．このような要求に対応するために，カーネル内では，ある割込み優先度よりも高い割込み優先度を持つ割込みをマスクしないこととしている．言い換えると，カーネルは，ある割込み優先度以下の（それと同じかより低い）割込み優先度を持つ割込みのみを管理し，それよりも高い割込み優先度を持つ割込みは管理
しない．
カーネルが管理する割込みをカーネル管理の割込み，カーネルが管理しない割込みをカーネル管理外の割込みと呼ぶ．NMIは，カーネル管理外の割込みとして扱う．カーネル管理外の割込みの設定方法については，「2.7.7 カーネル管理
外の割込みの設定方法」の節を参照すること．
カーネル管理外の割込みによって起動される割込みハンドラを，カーネル管理
外の割込みハンドラと呼ぶ．カーネル管理外の割込みハンドラからは，システ
ムインタフェースレイヤのAPIとsns̲ker（カーネル非動作状態の参照），
ext̲ker（カーネルの終了）のみを呼び出すことができ，その他のサービスコー
ルを呼び出すことはできない．カーネル管理外の割込みハンドラから，その他のサービスコールを呼び出した場合の動作は，保証されない．
【補足説明】
カーネル管理外の割込みには，カーネル内の割込み出入口処理を経由せずに割込みハンドラを実行できるという意義も考えられるが，この仕様では，カーネ
ル内でマスクされないという意義のみを実現するものと位置づけている．これは，すべての割込みが同じアドレスに分岐するプロセッサでは，カーネル内の割込み出入口処理を経由せずに割込みハンドラを実行することができるとは限らないためである．
カーネル内の割込み出入口処理を経由せずに割込みハンドラを実行する仕組みについては，割込みハンドラの直接呼出しと呼び，ターゲット依存でサポートしてもよいこととする．
2.5.10 カーネル管理外のCPU例外
カーネル内のクリティカルセクションの実行中（これを，カーネル実行中と呼ぶ），全割込みロック状態，CPUロック状態，カーネル管理外の割込みハンドラ
実行中のいずれかで発生したCPU例外を，カーネル管理外のCPU例外と呼ぶ．また，それによって起動されるCPU例外ハンドラを，カーネル管理外のCPU例外ハンドラと呼ぶ．さらに，カーネル管理外のCPU例外ハンドラ実行中に発生したCPU例外も，カーネル管理外のCPU例外に含める．
カーネル管理外のCPU例外ハンドラからは，システムインタフェースレイヤのAPIとsns̲ker（カーネル非動作状態の参照），ext̲ker（カーネルの終了），
xsns̲dpn（CPU例外発生時のディスパッチ保留状態の参照），xsns̲xpn（CPU例
外発生時のタスク例外処理保留状態の参照）のみを呼び出すことができ，その他のサービスコールを呼び出すことはできない．カーネル管理外のCPU例外ハン
ドラから，その他のサービスコールを呼び出した場合の動作は，保証されない．
【補足説明】
カーネル管理外のCPU例外は，カーネル管理外の割込みと異なり，特定のCPU例
外をカーネル外とするわけではない．同じCPU例外であっても，CPU例外が起こる状況によって，カーネル管理となる場合とカーネル管理外となる場合がある．
2.5.11 カーネル管理外の状態

ngki̲spec‑110.txt

page 24

全割込みロック状態，カーネル管理外の割込みハンドラ実行中，カーネル管理
外のCPU例外ハンドラ実行中を総称して，カーネル管理外の状態と呼ぶ．
すでに述べた通り，カーネル管理外の状態では，いくつかの例外的なサービス
コールを除いては，システムインタフェースレイヤのAPIのみを呼び出すことができる．カーネル管理外の状態から，その他のサービスコールを呼び出した場
合の動作は，保証されない．
カーネル管理外の状態では，少なくとも，カーネル管理の割込みはマスクされている．カーネル管理外の割込み（の一部）もマスクされている場合もある．
保護機能対応カーネルでは，カーネル管理外の状態になるのは，特権モードで実行している間に限られる．
2.5.12 処理単位とシステム状態
各処理単位が実行開始されるシステム状態の条件（実行開始条件），各処理単位の実行開始時にカーネルによって行われるシステム状態の変更処理（実行開始時処理），各処理単位からのリターン前（または終了前）にアプリケーショ
ンが設定しておくべきシステム状態（リターン前または終了前），各処理単位
からのリターン時（または終了時）にカーネルによって行われるシステム状態の変更処理（リターン時処理または終了時処理）は，次の表の通りである．
CPUロック
割込み優先度ディスパッチ
タスク例外
フラグ
マスク
禁止フラグ
禁止フラグ
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【タスク】
実行開始条件解除
全解除
許可−
実行開始時処理 そのまま
そのまま
そのまま
禁止する(*7)
終了前
原則解除(*1)
原則全解除(*1) 原則許可(*1)
任意
終了時処理
解除する
全解除する
許可する
−
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【タスク例外処理ルーチン】
実行開始条件解除
任意
任意
許可
実行開始時処理 そのまま
そのまま
そのまま
禁止する
リターン前
原則解除(*1)
原則元に(*1)
原則元に(*1)
原則禁止(*1)
リターン時処理 解除する(*4)
元に戻す(*4)
元に戻す(*4)
許可する‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【割込みハンドラ，割込みサービスルーチン，タイムイベントハンドラ】
実行開始条件解除
自優先度より低い 任意
任意
実行開始時処理 そのまま自優先度に(*2) そのまま
そのまま
リターン前
原則解除(*1)
変更不可(*3)
変更不可(*3)
変更不可(*3)
リターン時処理 解除する
元に戻す(*5)
そのままそのまま‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【CPU例外ハンドラ】
実行開始条件
任意
任意
任意
任意
実行開始時処理 そのまま(*6)
そのまま
そのまま
そのまま
リターン前
原則元に(*1)
変更不可(*3)
変更不可(*3)
変更不可(*3)
リターン時処理 元に戻す
元に戻す(*5)
そのままそのまま‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑【拡張サービスコールルーチン】
実行開始条件
任意
任意
任意
任意
実行開始時処理 そのまま
そのまま
そのまま
そのまま
リターン前
任意
任意
任意
任意
リターン時処理 そのまま
そのまま
そのまま
そのまま
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
この表の中で「原則(*1)」とは，処理単位からのリターン前（または終了前）

ngki̲spec‑110.txt

page 25に，アプリケーションが指定された状態に設定しておくことが原則であるが，この原則に従わなくても，リターン時（または終了時）にカーネルによって状態が設定されるため，支障がないことを意味する．
「自優先度に(*2)」 とは，割込みハンドラと割込みサービスルーチンの場合にはそれを要求した割込みの割込み優先度，周期ハンドラとアラームハンドラの場合にはタイマ割込みの割込み優先度，オーバランハンドラの場合にはオーバ
ランタイマ割込みの割込み優先度に変更することを意味する．
「変更不可(*3)」 とは，その処理単位中で，そのシステム状態を変更するAPIが用意されていないことを示す．
保護機能対応カーネルでは，タスク例外処理ルーチンからのリターン時にカーネルによって行われるシステム状態の変更処理(*4)は，タスクにそれぞれの状
態変更を許可している場合にのみ行われる．ここでカーネルは，元の状態に戻す処理を実現するために，元の状態をユーザスタック上に保存する．アプリケー
ションがユーザスタック上に保存された状態を書き換えた場合，タスク例外処
理ルーチンからのリターン時に，書き換えた状態に変更される（すなわち，元に戻されるとは限らない）．
タスク実行開始時のタスク例外禁止フラグの変更処理(*7)は，正確には，タス
ク起動時に行われる処理である．タスク例外禁止フラグは，タスクが休止状態の時（すなわち，タスクの起動前と終了後）は無効である．
【仕様決定の理由】
保護機能対応カーネルにおいて，タスク例外処理ルーチンからのリターン時のシステム状態の変更処理(*4)が，タスクに状態変更を許可している場合にのみ行われるのは，タスクがユーザスタック上の状態を書き換えることで，許可していない状態変更を起こせてしまうことを防止するためである．タスクに状態変更を許可していない場合には，タスク例外処理ルーチン中で状態を変更できないため，カーネルによって元の状態に戻す必要がない．
割込みハンドラや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）

ngki̲spec‑110.txt

page 26

タスクを実行できる条件が，プロセッサが使用できるかどうかを除いて，揃っている状態．実行できる状態は，さらに，実行状態と実行可能状態に分類される．
(a.1) 実行状態（running）
タスクが実行されている状態．または，そのタスクの実行中に，割込みまたはCPU例外により非タスクコンテキストの実行が開始され，かつ，タスクコンテキ
ストに戻った後に，そのタスクの実行を再開するという状態．
(a.2) 実行可能状態（ready）
タスク自身は実行できる状態にあるが，それよりも優先順位の高いタスクが実行状態にあるために，そのタスクが実行されない状態．
(b) 休止状態（dormant）
タスクが実行すべき処理がない状態．タスクの実行を終了した後，次に起動するまでの間は，タスクは休止状態となっている．タスクが休止状態にある時には，タスクの実行を再開するための情報（実行再開番地やレジスタの内容など）は保存されていない．
(c) 広義の待ち状態（blocked）
タスクが，処理の途中で実行を止められている状態．タスクが広義の待ち状態にある時には，タスクの実行を再開するための情報（実行再開番地やレジスタの内容など）は保存されており，タスクが実行を再開する時には，広義の待ち状態に遷移する前の状態に戻される．広義の待ち状態は，さらに，（狭義の）待ち状態，強制待ち状態，二重待ち状態に分類される．
(c.1) （狭義の）待ち状態（waiting）
タスクが何らかの条件が揃うのを待つために，自ら実行を止めている状態．
(c.2) 強制待ち状態（suspended）
他のタスクによって，強制的に実行を止められている状態．ただし，自タスクを強制待ち状態にすることも可能である．
(c.3) 二重待ち状態（waiting‑suspended）
待ち状態と強制待ち状態が重なった状態．すなわち，タスクが何らかの条件が揃うのを待つために自ら実行を止めている時に，他のタスクによって強制的に実行を止められている状態．
単にタスクが「待ち状態である」といった場合には，二重待ち状態である場合を含み，「待ち状態でない」といった場合には，二重待ち状態でもないことを意味する．また，単にタスクが「強制待ち状態である」といった場合には，二重待ち状態である場合を含み，「強制待ち状態でない」といった場合には，二重待ち状態でもないことを意味する．
(d) 未登録状態（non‑existent）
タスクをカーネルに登録していない仮想的な状態．タスクの生成前と削除後は，タスクは未登録状態にあるとみなす．
カーネルによっては，これらのタスク状態以外に，過渡的な状態が存在する場

ngki̲spec‑110.txt

page 27

合がある．過渡的な状態については，「2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち」の節を参照すること．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，タスクが未登録状態になることはない．また，上記のタスク
状態以外の過渡的な状態になることもない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，タスクが未登録状態になることはない．上記のタスク状態以外の過渡的な状態として，タスクが強制待ち状態［実行継続中］になることがある．詳しくは，「2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち」の節を参照すること．
2.6.2 タスクの状態遷移
タスクの状態遷移を図2‑2に示す．
未登録状態のタスクをカーネルに登録することを，タスクを生成する（create）という．生成されたタスクは，休止状態に遷移する．また，タスク生成時の属性指定により，生成と同時にタスクを起動し，実行できる状態にすることもできる．逆に，登録されたタスクを未登録状態に遷移させることを，タスクを削除する（delete）という．
休止状態のタスクを，実行できる状態にすることを，タスクを起動する（activate）という．起動されたタスクは，実行できる状態になる．逆に，起動された状態のタスクを，休止状態（または未登録状態）に遷移させることを，
タスクを終了する（terminate）という．
実行できる状態になったタスクは，まずは実行可能状態に遷移するが，そのタスクの優先順位が実行状態のタスクよりも高い場合には，ディスパッチ保留状
態でない限りはただちにディスパッチが起こり，実行状態へ遷移する．この時，それまで実行状態であったタスクは実行可能状態に遷移する．この時，実行状態に遷移したタスクは，実行可能状態に遷移したタスクをプリエンプトしたという．逆に，実行可能状態に遷移したタスクは，プリエンプトされたという．
タスクを待ち解除するとは，タスクが待ち状態（二重待ち状態を除く）であれば実行できる状態に，二重待ち状態であれば強制待ち状態に遷移させることをいう．また，タスクを強制待ちから再開するとは，タスクが強制待ち状態（二重待ち状態を除く）であれば実行できる状態に，二重待ち状態であれば待ち状態に遷移させることをいう．
2.6.3 タスクのスケジューリング規則
実行できるタスクは，優先順位の高いものから順に実行される．すなわち，ディスパッチ保留状態でない限りは，実行できるタスクの中で最も高い優先順位を持つタスクが実行状態となり，他は実行可能状態となる．
タスクの優先順位は，タスクの優先度とタスクが実行できる状態になった順序から，次のように定まる．優先度の異なるタスクの間では，優先度の高いタス
クが高い優先順位を持つ．優先度が同一のタスクの間では，先に実行できる状態になったタスクが高い優先順位を持つ．すなわち，同じ優先度を持つタスク
は，FCFS（First Come First Served）方式でスケジューリングされる．ただし，
サービスコールの呼出しにより，同じ優先度を持つタスク間の優先順位を変更することも可能である．
最も高い優先順位を持つタスクが変化した場合には，ディスパッチ保留状態で

ngki̲spec‑110.txt

page 28

ない限りはただちにディスパッチが起こり，最も高い優先順位を持つタスクが実行状態となる．ディスパッチ保留状態においては，実行状態のタスクは切り換わらず，最も高い優先順位を持つタスクは実行可能状態にとどまる．
マルチプロセッサ対応カーネルでは，プロセッサ毎に，上記のスケジューリン
グ規則を適用して，タスクスケジューリングを行う．すなわち，プロセッサがディスパッチ保留状態でない限りは，そのプロセッサに割り付けられた実行できるタスクの中で最も高い優先順位を持つタスクが実行状態となり，他は実行可能状態となる．そのため，実行状態のタスクは，プロセッサ毎に存在する．
2.6.4 待ち行列と待ち解除の順序
タスクが待ち解除される順序の管理のために，待ち状態のタスクがつながれているキューを，待ち行列と呼ぶ．
待ち行列にタスクをつなぐ順序には，FIFO順とタスクの優先度順がある．どちらの順序でつなぐかは，待ち行列毎に規定される．多くの待ち行列において，どちらの順序でつなぐかを，オブジェクト属性により指定できる．
FIFO順の待ち行列においては，新たに待ち状態に遷移したタスクは待ち行列の最後につながれる．それに対してタスクの優先度順の待ち行列においては，新たに待ち状態に遷移したタスクは，優先度の高い順に待ち行列につながれる．
同じ優先度のタスクが待ち行列につながれている場合には，新たに待ち状態に遷移したタスクが，同じ優先度のタスクの中で最後につながれる．
待ち解除の条件がタスクによって異なる場合には，待ち行列の先頭のタスクは待ち解除の条件を満たさないが，後方のタスクが待ち解除の条件を満たす場合がある．このような場合の振舞いとして，次の2つのケースがある．どちらの振舞いをするかは，待ち行列毎に規定される．
(a) 待ち解除の条件を満たしたタスクの中で，待ち行列の前方につながれたものから順に待ち解除される．すなわち，待ち行列の前方に待ち解除の条件を満たさないタスクがあっても，後方のタスクが待ち解除の条件を満たしていれば，先に待ち解除される．
(b) タスクの待ち解除は，待ち行列につながれている順序で行われる．すなわ
ち，待ち行列の前方に待ち解除の条件を満たさないタスクがあると，後方のタスクが待ち解除の条件を満たしても，待ち解除されない．
ここで，(b)の振舞いをする待ち行列においては，待ち行列につながれたタスクの強制終了，タスク優先度の変更（待ち行列がタスクの優先度順の場合のみ），待ち状態の強制解除が行われた場合に，タスクの待ち解除が起こることがある．
具体的には，これらの操作により新たに待ち行列の先頭になったタスクが，待ち解除の条件を満たしていれば，ただちに待ち解除される．さらに，この待ち解除により新たに待ち行列の先頭になったタスクに対しても，同じ処理が繰り返される．
2.6.5 タスク例外処理マスク状態と待ち禁止状態
保護機能対応カーネルにおいて，ユーザタスクについては特権モードで実行している間（特権モードを実行している間に，実行可能状態や広義の待ち状態になっている場合を含む．また，サービスコールを呼び出して，実行可能状態や広義の待ち状態になっている場合も含む），システムタスクについては拡張サー
ビスコールを実行している間（拡張サービスコールを実行している間に，実行可能状態や広義の待ち状態になっている場合を含む）は，タスク例外処理ルー
チンの実行は開始されない．これらの状態を，タスク例外処理マスク状態と呼ぶ．

ngki̲spec‑110.txt

page 29

タスクは，タスク例外処理マスク状態である時に，基本的なタスク状態と重複して，待ち禁止状態になることができる．
待ち禁止状態とは，タスクが待ち状態に入ることが一時的に禁止された状態である．待ち禁止状態にあるタスクが，サービスコールを呼び出して待ち状態に遷移しようとした場合，サービスコールはE̲RLWAIエラーとなる．
タスクを待ち禁止状態に遷移させるサービスコールは，対象タスクがタスク例
外処理マスク状態である場合に，対象タスクを待ち禁止状態に遷移させる．その後，タスクがタスク例外処理マスク状態でなくなる時点（ユーザタスクについては特権モードから戻る時点，システムタスクについて拡張サービスコール
からリターンする時点）で，待ち禁止状態が解除される．また，タスクの待ち禁止状態を解除するサービスコールによっても，待ち禁止状態を解除することができる．
【仕様決定の理由】
タスク例外処理ルーチンでは，タスクの本体のための例外処理（例えば，タスクに対して終了要求があった時の処理）を行うことを想定しており，タスクから呼び出した拡張サービスコールのための例外処理を行うことをは想定していない．そのため，拡張サービスコールを実行している間にタスク例外処理が要求された場合に，すぐにタスク例外処理ルーチンを実行すると，拡張サービス
コールのための例外処理が行われないことになる．
また，ユーザタスクの場合には，特権モードを実行中にタスク例外処理ルーチ
ンを実行すると，システムスタックに情報を残したまま非特権モードに戻ることになる．この状態で，タスク例外処理ルーチンから大域脱出すると，システ
ムスタック上に不要な情報が残ってしまう．
これらの理由から，タスクが拡張サービスコールを実行している間は，タスク
例外処理マスク状態とし，タスク例外処理ルーチンの実行を開始しないこととする．さらに，ユーザタスクについては，特権モードを実行している間（拡張サービスコールを実行している間を含む）を，タスク例外処理マスク状態とする．
対象タスクに，タスク例外処理ルーチンをすみやかに実行させたい場合には，
タスク例外処理の要求に加えて，待ち状態の強制解除を行う（必要に応じて，強制待ち状態からの再開も行う）．保護機能対応でないカーネルにおいては，
この方法により，対象タスクが正常に待ち解除されるのを待たずに，タスク例
外処理ルーチンを実行させることができる．
それに対して，保護機能対応カーネルにおいては，対象タスクがタスク例外処理マスク状態で実行している間は，タスク例外処理ルーチンの実行が開始されない．そのため，対象タスクに対して待ち状態の強制解除を行っても，その後に対象タスクが待ち状態に入ると，タスク例外処理ルーチンがすみやかに実行されないことになる．
待ち禁止状態は，この問題を解決するために導入したものである．タスク例外
処理の要求（ras̲tex／iras̲tex）に加えて，待ち禁止状態への遷移（dis̲wai／
idis̲wai）と待ち状態の強制解除（rel̲wai／irel̲wai）をこの順序で行うこと
で，対象タスクが正常に待ち解除されるのを待たずに，タスク例外処理ルーチ
ンを実行させることができる．
タスク例外処理マスク状態を，ユーザタスクについても拡張サービスコールを実行している間とせず，特権モードで実行している間とした理由は，拡張サービスコールを実行している間とした場合に次のような問題があるためである．
ユーザタスクが，ソフトウェア割込みにより自タスクを待ち状態に遷移させる

ngki̲spec‑110.txt

page 30

サービスコールを呼び出した直後に割込みが発生し，その割込みハンドラの中で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仕様との互換性がなくなっている．
この仕様では，待ち状態の強制解除と待ち禁止状態への遷移を別々のサービス
コールで行うこととした．これにより，待ち状態を強制解除するサービスコー
ルの仕様が，μITRON4.0仕様と互換になっている．一方，μITRON4.0/PX仕様とは互換性がない．
2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち
ディスパッチ保留状態において，実行状態のタスクを強制待ち状態へ遷移させるサービスコールを呼び出した場合，実行状態のタスクの切換えは，ディスパッ
チ保留状態が解除されるまで保留される．
この間，それまで実行状態であったタスクは，実行状態と強制待ち状態の間の過渡的な状態にあると考える．この状態を，強制待ち状態［実行継続中］と呼ぶ．一方，ディスパッチ保留状態が解除された後に実行すべきタスクは，実行可能状態にとどまる．
タスクが強制待ち状態［実行継続中］にある時に，ディスパッチ保留状態が解除されると，ただちにディスパッチが起こり，タスクは強制待ち状態に遷移す
る．
過渡的な状態も含めたタスクの状態遷移を図2‑3に示す．
タスクが強制待ち状態［実行継続中］である時の具体的な扱いは，必要になった時に規定するものとする．
なお，TOPPERS新世代カーネルでは，ディスパッチ保留状態において，実行状態のタスクを強制終了させるサービスコールはサポートしていない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ディスパッチ保留状態において実行状態のタスクを強制待ち状態へ遷移させるサービスコールはサポートしていないため，タスクが強制待ち状態［実行継続中］になることはない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ディスパッチ保留状態において実行状態のタスクを強制待ち状態へ遷移させるサービスコールを，他のプロセッサから呼び出すことができるため，タスクが強制待ち状態［実行継続中］になる場合がある．

ngki̲spec‑110.txt

page 31

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

page 32

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

ngki̲spec‑110.txt

page 33

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

ngki̲spec‑110.txt

page 34

システム全体で共通に持つ．
割込み番号は，割込み要求ラインを識別するための番号であることから，割込
み要求ラインが複数のプロセッサに接続されている場合でも，1つの割込み要求
ラインには1つの割込み番号を付与する．逆に，複数のプロセッサが同じ種類のデバイスを持っている場合でも，別のデバイスからの割込み要求ラインには異なる割込み番号を付与する（図2‑5）．
割込みサービスルーチンは，登録対象の割込み要求ラインが接続されたプロセッ
サのいずれによっても実行することができる．割込みサービスルーチンが属するクラスの割付け可能プロセッサは，登録対象の割込み要求ラインが接続されたプロセッサの集合に含まれていなければならない．また，同一の割込み要求
ラインに対して登録する割込みサービスルーチンは，同一のクラスに属していなければならない．
それに対して，割込みハンドラはプロセッサ毎に登録する．そのため，同じ割込み要求に対応する割込みハンドラであっても，プロセッサ毎に異なる割込み
ハンドラ番号を付与する（図2‑5）．割込みハンドラが属するクラスの初期割付
けプロセッサは，割込みが要求されるプロセッサと一致していなければならない．
【補足説明】
割込み番号と割込みハンドラ番号の付与方法はターゲット定義であるが，複数のプロセッサに接続された割込み要求ラインに対しては，割込み番号の上位ビットを0とし，1つのプロセッサのみに接続された割込み要求ラインに対しては，割込み番号の上位ビットに接続されたプロセッサのID番号を含める方法が考えられる．また，割込みハンドラ番号の上位ビットに，その割込みハンドラを実行するプロセッサのID番号を含める方法が考えられる（図2‑5）．
2.7.7 カーネル管理外の割込みの設定方法
NMI以外にカーネル管理外の割込みを設けるか（設けられるようにするか）どうかは，ターゲット定義である．具体的には，次の3つの方法のいずれかが採用される．
(a‑1) NMI以外にカーネル管理外の割込みを設けない(a‑2) カーネル構築時に特定の割込みをカーネル管理外にすると決める
これら場合には，カーネル管理外とする割込みはカーネル構築時（ターゲット
依存部の実装時やカーネルのコンパイル時）に決まるため，カーネル管理外とする割込みをアプリケーション側で設定する必要はない．ここで，カーネル管理外とされた割込みに対して，カーネルのAPIにより割込みハンドラを登録できるかや，割込み要求ラインの属性を設定できるかは，ターゲット定義である．
割込みハンドラを登録できる場合には，それを定義するAPIにおいて，カーネル
管理外であることを示す割込みハンドラ属性（TA̲NONKERNEL）を指定する．また，割込み要求ラインの属性を設定できる場合には，設定する割込み優先度を
TMIN̲INTPRIよりも高い値とする．
(b) カーネル管理外とする割込みをアプリケーションで設定できるようにする
この場合には，カーネル管理外とする割込みの設定は，次の方法で行う．まず，カーネル管理外の割込みハンドラを定義するAPIにおいて，カーネル管理外であることを示す割込みハンドラ属性（TA̲NONKERNEL）を指定する．また，カーネル管理外とする割込みの割込み要求ラインに対して設定する割込み優先度を，
TMIN̲INTPRIよりも高い値とする．
いずれの場合にも，カーネル管理の割込みの割込み要求ラインに対して設定すngki̲spec‑110.txt

page 35

る割込み優先度は，TMIN̲INTPRIより高い値であってはならない．
2.8 CPU例外処理モデル
プロセッサが検出するCPU例外の種類や，CPU例外検出時のプロセッサの振舞い
は，プロセッサによって大きく異なる．そのため，CPU例外ハンドラをターゲッ
トハードウェアに依存せずに記述することは，少なくとも現時点では困難である．そこでこの仕様では，CPU例外の処理モデルを厳密に標準化するのではなく，ターゲットハードウェアに依存せずに決められる範囲で規定する．
2.8.1 CPU例外処理の流れ
アプリケーションは，プロセッサが検出するCPU例外の種類毎に，CPU例外ハンドラを登録することができる．プロセッサがCPU例外の発生を検出すると，カーネル内の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例外が発生

ngki̲spec‑110.txt

page 36

するプロセッサのID番号を含める方法が考えられる．
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)の方法によるリカバリ処理が可能である．
xsns̲dpnとxsns̲xpnのいずれのサービスコールもtrueを返した場合，そのCPU例
外ハンドラからは，xsns̲dpnとxsns̲xpnに加えて，システムインタフェースレ
イヤのAPIとsns̲ker（カーネル非動作状態の参照），ext̲ker（カーネルの終了）
のみを呼び出すことができ，その他のサービスコールを呼び出すことはできな
い．いずれのサービスコールもtrueを返したにもかかわらず，その他のサービ
スコールを呼び出した場合の動作は，保証されない．この場合には，(b)と(c)の方法によるリカバリ処理は行うことはできず，(a)または(d)の方法によるリカバリ処理を行うしかないことになる．
カーネル管理外のCPU例外ハンドラにおいては，xsns̲dpnとxsns̲xpnのいずれのサービスコールもtrueを返す．
ターゲットシステムによっては，xsns̲xpnがfalseを返すべき状態であっても，それを正確に判断するために大きいオーバヘッドがかかる場合には，安全側に倒してtrueを返す場合がある．具体的には，CPU例外がタスクコンテキストで発生し，そのタスクがタスク例外処理ルーチンを実行できる状態であっても，そのタスクが割込み優先度マスクをTMIN̲INTPRIまたはそれよりも高い値に設定している場合には，trueを返す場合がある．
2.9 システムの初期化と終了
2.9.1 システム初期化手順
システムのリセット後，最初に実行するプログラムを，スタートアップモジュー
ルと呼ぶ．スタートアップモジュールはカーネルの管理外であり，アプリケー
ションで用意するのが基本であるが，スタートアップモジュールで行うべき処理を明確にするために，カーネルの配布パッケージの中に，標準のスタートアッ
プモジュールが用意されている．
標準のスタートアップモジュールは，プロセッサのモードとスタックポインタ
等の初期化，NMIを除くすべての割込みのマスク（全割込みロック状態と同等の状態にする），ターゲットシステム依存の初期化フックの呼出し，BSSセクショ
ンのクリア，DATAセクションの初期化，ソフトウェア環境（ライブラリなど）
依存の初期化フックの呼出しを行った後，カーネルの初期化処理へ分岐する．
ここで呼び出すターゲットシステム依存の初期化フックでは，リセット後に速やかに行うべき初期化処理を行うことが想定されている．

ngki̲spec‑110.txt

page 37

マルチプロセッサ対応カーネルでは，すべてのプロセッサがスタートアップモ
ジュールを実行し，カーネルの初期化処理へ分岐する．ただし，共有リソースの初期化処理（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‑110.txt

page 38

サでカーネルを終了させるサービスコールを呼び出すと，そのプロセッサがカー
ネル動作状態から非動作状態に遷移した後，他のプロセッサに対してカーネル
終了処理の開始を要求する．複数のプロセッサから，カーネルを終了させるサー
ビスコール（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）によってカーネルに登録する．オブジェクトを追加する
静的APIによって登録されたオブジェクトはID番号を持たないため，ID番号を指定して操作することができない．
オブジェクトを生成する静的API（CRE̲YYY）は，生成するオブジェクトにID番
号を割り付け，ID番号を指定するパラメータとして記述した識別名を，割り付けたID番号にマクロ定義する．同じ識別名のオブジェクトが生成済みの場合には，E̲OBJエラーとなる．

ngki̲spec‑110.txt

page 39

オブジェクトを生成するサービスコール（acre̲yyy）は，割付け可能なID番号の数を指定する静的API（AID̲YYY）によって確保されたID番号の中から，使用されていないID番号を1つ選び，生成するオブジェクトに割り付ける．割り付けたID番号は，サービスコールの返値としてアプリケーションに通知する．使用
されていないID番号が残っていない場合には，E̲NOIDエラーとなる．
オブジェクトを生成するサービスコールによって登録したオブジェクトは，オ
ブジェクトを削除するサービスコール（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仕様との関係】
アクセス許可ベクタを指定してオブジェクトを登録する機能（CRA̲YYY，
cra̲yyy，acra̲yyy，ATA̲YYY，ata̲yyy）を廃止し，オブジェクトの登録後にアクセス許可ベクタを設定する静的API（SAC̲YYY）をサポートすることとした．
【仕様決定の理由】
ID番号を指定してオブジェクトを生成するサービスコール（cre̲yyy）とアクセ
ス許可ベクタを指定してオブジェクトを登録するサービスコール（cra̲yyy，acra̲yyy，ata̲yyy）を廃止したのは，必要性が低いと考えたためである．

ngki̲spec‑110.txt

page 40

静的APIについても，サービスコールに整合するよう変更した．
2.10.2 オブジェクト番号で識別するオブジェクト
オブジェクト番号で識別するオブジェクトは，オブジェクトを定義する静的
API（DEF̲YYY）またはサービスコール（def̲yyy）によってカーネルに登録する．
オブジェクトを定義するサービスコール（def̲yyy）によって登録したオブジェ
クトは，同じサービスコールによって登録を解除することができる．登録解除
したオブジェクト番号は，オブジェクト登録前の状態に戻され，同じオブジェ
クト番号に対して新たにオブジェクトを定義することができる．登録解除されていないオブジェクト番号に対して再度オブジェクトを登録しようとした場合には，E̲OBJエラーとなる．
オブジェクトを定義する静的APIによって登録したオブジェクトは，登録を解除することができない．登録を解除しようとした場合には，E̲OBJエラーとなる．
なお，動的生成対応カーネル以外では，オブジェクトを定義するサービスコール（def̲yyy）はサポートされない．
【μITRON4.0仕様との関係】
この仕様では，オブジェクトの定義を変更したい場合には，一度登録解除した
後に，新たにオブジェクトを定義する必要がある．また，オブジェクトを定義
する静的APIによって登録したオブジェクトは，この仕様では，登録解除できないこととした．
2.10.3 識別番号を持たないオブジェクト
識別する必要がないために，識別番号を持たないオブジェクトは，オブジェク
トを追加する静的API（ATT̲YYY）によってカーネルに登録する．
2.10.4 オブジェクト生成に必要なメモリ領域
カーネルオブジェクトを生成する際に必要なメモリ領域の中で，サイズが変化するものについては，カーネルオブジェクトを生成する静的APIおよびサービス
コールに，使用するメモリ領域の先頭番地を渡すパラメータを設けている．このパラメータをNULLとすることは，必要なメモリ領域をコンフィギュレータまたはカーネルが確保することを意味する．
【未決定事項】
動的生成対応カーネルにおけるメモリ領域の確保方法，特に保護機能との関連については，今後の課題である．
2.11 オブジェクトのアクセス保護☆未完成
2.11.1 デフォルトのアクセス保護2.12 システムコンフィギュレーション手順
2.12.1 システムコンフィギュレーションファイル
カーネルやシステムサービスが管理するオブジェクトの生成情報や初期状態などを記述するファイルを，システムコンフィギュレーションファイル（system
configuration file）と呼ぶ．また，システムコンフィギュレーションファイ

ngki̲spec‑110.txt

page 41

ルを解釈して，カーネルやシステムサービスの構成・初期化情報を含むファイルなどを生成するツールを，コンフィギュレータ（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のパラメータは，次の3種類に分類される．
(a) オブジェクト識別名

ngki̲spec‑110.txt

page 42

オブジェクトのID番号を指定するパラメータ．オブジェクトの名称を表す単一の識別名のみを記述することができる．
コンフィギュレータは，オブジェクト生成のための静的API（CRE̲YYY）を処理する際に，オブジェクトにID番号を割り付け，構成・初期化ヘッダファイルに，指定された識別名を割り付けたID番号にマクロ定義するC言語プリプロセッサのディレクティブ（#define）を生成する．
オブジェクト生成以外の静的APIが，オブジェクトのID番号をパラメータに取る
場合（カーネルの静的APIでは，DEF̲TEXのtskidパラメータのみがこれに該当）には，パラメータとして記述する識別名は，生成済みのオブジェクトの名称を表す識別名でなければならない．そうでない場合には，コンフィギュレータがエラーを報告する．
静的APIの整数定数式パラメータの記述に，オブジェクト識別名を使用することはできない．
(b) 整数定数式パラメータ
オブジェクト番号や機能コード，オブジェクト属性，サイズや数，優先度など，整数値を指定するパラメータ．プログラムが配置されるアドレスに依存せずに値の決まる整数定数式を記述することができる．
(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）中に含めたい可能性のあるパラメータを(C)としていた．
それに対して，この仕様におけるコンフィギュレータの処理モデル（「2.12.5
コンフィギュレータの処理モデル」の節を参照）では，コンフィギュレータのパス2において定数式パラメータの値を知ることができるため，(B)〜(D)の区別をする必要がない．そのため，静的APIのパラメータは基本的には(b)とし，パス2で値を知ることのできない定数式パラメータのみを(c)としている．
2.12.3 保護ドメインの指定
保護機能対応カーネルでは，オブジェクトを登録する静的API等を，そのオブジェ
クトが属する保護ドメインの囲みの中に記述する．無所属のオブジェクトを登録する静的APIは，保護ドメインの囲みの外に記述する．保護ドメインに属すべngki̲spec‑110.txt

page 43

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

page 44

サ対応でないカーネルでクラスの囲みを記述した場合や，クラスの囲みの中にクラスの囲みを記述した場合には，コンフィギュレータがエラーを報告する．
なお，保護機能とマルチプロセッサの両方に対応するカーネルでは，保護ドメ
インの囲みとクラスの囲みはどちらが外側になっていてもよい．
【仕様決定の理由】
クラスに属すべきオブジェクトを登録する静的API等をクラスの囲みの外に記述した場合のエラーコードをE̲RSATRとしたのは，オブジェクトを動的に登録する
APIにおいては，オブジェクトの属するクラスを，オブジェクト属性によって指定するためである．
2.12.5 コンフィギュレータの処理モデル
コンフィギュレータは，次の3つのパスにより，システムコンフィギュレーショ
ンファイルを解釈し，構成・初期化情報を含むファイルなどを生成する（図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の整数定数式パラメータに不正がある場合には，この段階でエラーが検出される．
パス2で生成されたこれらのファイルを，他のソースファイルとあわせてコンパ
イルし，アプリケーションのロードモジュールを生成する．また，それをSレコー
ドフォーマットの形（system.srec）に変換し，ロードモジュール中の各シンボ
ルとアドレスの対応表を含むシンボルファイル（system.syms）を生成する．
コンフィギュレータのパス3では，パス1で生成されたオブジェクトファイルを
Sレコードフォーマットの形に変換したものとシンボルファイル，パス2で生成されたロードモジュールをSレコードフォーマットの形に変換したものとシンボ
ルファイルから，静的APIパラメータの値などを取り出し，妥当性のチェックを行う．静的APIの一般定数式パラメータに不正がある場合には，この段階でエラーが検出される．

ngki̲spec‑110.txt

page 45【μITRON4.0仕様との関係】
コンフィギュレータの処理モデルは全面的に変更した．
2.12.6 静的APIのパラメータに関するエラー検出
静的APIのパラメータに関するエラー検出は，同じものがサービスコールとして呼ばれた場合と同等とすることを原則とする．言い換えると，サービスコール
によっても検出できないエラーは，静的APIにおいても検出しない．静的APIの機能説明中の「E̲XXXXXエラーとなる」または「E̲XXXXXエラーが返る」という記述は，コンフィギュレータがそのエラーを検出することを意味する．
ただし，エラーの種類によっては，サービスコールと同等のエラー検出を行うことが難しいため，そのようなものについては例外とする．例えば，メモリ不足をコンフィギュレータによって検出するのは容易ではない．
逆に，オブジェクト属性については，サービスコールより強力なエラーチェッ
クを行える可能性がある．例えば，タスク属性にTA̲STAと記述されている場合，サービスコールではエラーを検出できないが，コンフィギュレータでは検出できる可能性がある．ただし，このようなエラー検出を完全に行おうとするとコンフィギュレータが複雑になるため，このようなエラーを検出することは必須とせず，検出できた場合には警告として報告する．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，静的APIのパラメータに関するエラー検出について規定されていない．
2.12.7 オブジェクトのID番号の指定
コンフィギュレータのオプション機能として，アプリケーション設計者がオブジェクトのID番号を指定するための次の機能を用意する．
コンフィギュレータのオプション指定により，オブジェクト識別名とID番号の対応表を含むファイルを渡すと，コンフィギュレータはそれに従ってオブジェ
クトにID番号を割り付ける．それに従ったID番号割付けができない場合（ID番
号に抜けができる場合など）には，コンフィギュレータはエラーを報告する．
またコンフィギュレータは，オプション指定により，オブジェクト識別名とコンフィギュレータが割り付けたID番号の対応表を含むファイルを，コンフィギュ
レータに渡すファイルと同じフォーマットで生成する．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，オブジェクト生成のための静的APIのID番号を指定するパラメータに整数値を記述できるため，このような機能は用意されていない．
2.13 TOPPERSネーミングコンベンション
この節では，TOPPERSソフトウェアのAPIの構成要素の名称に関するネーミング
コンベンションについて述べる．このネーミングコンベンションは，モジュール間のインタフェースに関わる名称に適用することを想定しているが，モジュール内部の名称に適用してもよい．
2.13.1 モジュール識別名
異なるモジュールのAPIの構成要素の名称が衝突することを避けるために，各モ
ジュールに対して，それを識別するためのモジュール識別名を定める．モジューngki̲spec‑110.txt

page 46

ル識別名は，英文字と数字で構成し，2〜8文字程度の長さとする．
カーネルのモジュール識別名は"kernel"，システムインタフェースレイヤのモ
ジュール識別名は"sil"とする．
APIの構成要素の名称には，モジュール識別名を含めることを原則とするが，カーネルのAPIなど，頻繁に使用されて衝突のおそれが少ない場合には，モジュール
識別名を含めない名称を使用する．
以下では，モジュール識別名の英文字を英小文字としたものをwww，英大文字としたものをWWWと表記する．
2.13.2 データ型名
各サイズの整数型など，データの意味を定めない基本データ型の名称は，英小文字，数字，"̲"で構成する．データ型であることを明示するために，末尾が"̲t"である名称とする．
複合データ型やデータの意味を定めるデータ型の名称は，英大文字，数字，"̲"で構成する．データ型であることを明示するために，先頭が"T̲"または末尾が"̲T"である名称とする場合もある．
データ型の種類毎に，次のネーミングコンベンションを定める．
(A) パケットのデータ型
T̲CYYYT̲DYYYT̲RYYYT̲WWW̲CYYY
T̲WWW̲DYYY
T̲WWW̲RYYY

acre̲yyyに渡すパケットのデータ型
def̲yyyに渡すパケットのデータ型
ref̲yyyに渡すパケットのデータ型
www̲acre̲yyyに渡すパケットのデータ型
www̲def̲yyyに渡すパケットのデータ型
www̲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といった名称とする．
(B) コールバック
コールバックの名称は，サービスコールのネーミングコンベンションに従う．
2.13.4 変数名
変数（const修飾子のついたものを含む）の名称は，英小文字，数字，"̲"で構ngki̲spec‑110.txt

page 47

成する．データ型が異なる変数には，異なる名称を付けることを原則とする．
変数の名称に関して，次のガイドラインを設ける．
〜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̲〜
ppk̲〜

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

変数の種類毎に，次のネーミングコンベンションを定める．
(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は，

ngki̲spec‑110.txt

page 48定数の種類またはデータ型を表す．同じパラメータまたはリターンパラメータに用いられる定数の名称については，UUを同一にすることを原則とする．
また，定数の名称に関して，次のガイドラインを設ける．
TA̲〜
TSZ̲〜
TBIT̲〜
TMAX̲〜
TMIN̲〜

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

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

2.13.7 静的API名
静的APIの名称は，英大文字，数字，"̲"で構成し，対応するサービスコールの名称中の英小文字を英大文字で置き換えたものとする．対応するサービスコー
ルがない場合には，サービスコールのネーミングコンベンションに従って定めた名称中の英小文字を英大文字で置き換えたものとする．
2.13.8 ファイル名
ファイルの名称は，英小文字，数字，"̲"，"."で構成する．英大文字と英小文
字を区別しないファイルシステムに対応するために，英大文字は使用しない．
また，"‑"も使用しない．
ファイルの種類毎に，次のネーミングコンベンションを定める．
(A) ヘッダファイル
モジュールを用いるために必要な定義を含むヘッダファイルは，そのモジュー
ルのモジュール識別名の末尾に".h"を付加した名前（すなわち，www.h）とする．
2.13.9 モジュール内部の名称の衝突回避
モジュール内部の名称が，他のモジュール内部の名称と衝突することを避けるために，次のガイドラインを設ける．
モジュール内部に閉じて使われる関数や変数などの名称で，オブジェクトファ

ngki̲spec‑110.txt

page 49

イルのシンボル表に登録されて外部から参照できる名称は，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ヘッ
ダファイル（sil.h）からインクルードされるため，これらのファイルをインクルードする場合には，TOPPERS共通ヘッダファイルを直接インクルードする必要はない．
2.14.2 TOPPERS共通データ型
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ngki̲spec‑110.txt

ID
ATR
STAT
MODE
PRI
SIZE

page 50に定義）
オブジェクトの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
ACVCT

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

ここで，データ型が「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は使用できないものとする．
ACVCTは，ACPTNを用いて次のように定義される．
typedef struct acvct {ACPTN
acptn1;
ACPTN
acptn2;
ACPTN
acptn3;
ACPTN
acptn4;} ACVCT;/* 通常操作1のアクセス許可パターン *//* 通常操作2のアクセス許可パターン *//* 管理操作のアクセス許可パターン *//* 参照操作のアクセス許可パターン */【μ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に代わるデータ型
は用意しないことにした．

ngki̲spec‑110.txt

page 51

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を用いることにした．
(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

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

ngki̲spec‑110.txt

page 52

UINT̲MAX
LONG̲MAX
LONG̲MINULONG̲MAX

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共通エラーコード
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

コンテキストエラー
メモリアクセス違反
オブジェクトアクセス違反
サービスコール不正使用

ngki̲spec‑110.txt

page 53(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共通マクロ(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) 型に関する情報を取り出すためのマクロngki̲spec‑110.txt

page 54

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で指定される保護ドメインに属する処理単位だ
けにアクセスを許可するアクセス許可パターン

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

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

2.15 カーネル共通定義
カーネルの複数の機能で共通に用いる定義を，カーネル共通定義と呼ぶ．
2.15.1 カーネルヘッダファイル
カーネルを用いるために必要な定義は，カーネルヘッダファイル（kernel.h）
およびそこからインクルードされるファイルに含まれている．カーネルを用いる場合には，カーネルヘッダファイルをインクルードする．
ただし，カーネルを用いるために必要な定義の中で，コンフィギュレータによっngki̲spec‑110.txt

page 55て生成されるものは，カーネル構成・初期化ヘッダファイル（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
TDOM̲KERNELTDOM̲NONE

0‑1‑2

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

0

自タスクの属するクラス

TPRC̲INI

0

初期割付けプロセッサ

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カーネルにおける規定】

ngki̲spec‑110.txt

page 56

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は，コンフィギュレータによって検出される．
2.15.3 カーネル共通構成マクロ(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) 特殊な役割を持ったプロセッサ
マルチプロセッサ対応カーネルでは，特殊な役割を持ったプロセッサを知るた
めのマクロとして，次の構成マクロを用意している．
TOPPERS̲MASTER̲PRCID
TOPPERS̲SYSTIM̲PRCID

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

ローカルタイマ方式の場合にマクロ定義
グローバルタイマ方式の場合にマクロ定義

ngki̲spec‑110.txt

page 57(5) バージョン情報
TKERNEL̲MAKER
TKERNEL̲PRID
TKERNEL̲SPVER
TKERNEL̲PRVER

カーネルのメーカコード（＝0x0118）
カーネルの識別番号
カーネル仕様のバージョン番号
カーネルのバージョン番号

カーネルのメーカコード（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 全割込みロック状態の制御

ngki̲spec‑110.txt

page 58

デバイスを扱うプログラムの中では，すべての割込み（NMIを除く，以下同じ）をマスクしたい場合がある．カーネルで制御できるCPUロック状態は，カーネル
管理外の割込み（NMI以外にカーネル管理外の割込みがあるかはターゲット定義）をマスクしないため，このような場合に用いることはできない．
そこで，SILでは，すべての割込みをマスクする全割込みロック状態を制御するための以下の機能を用意している．
(1) SIL̲PRE̲LOC
全割込みロック状態の制御に必要な変数を宣言するマクロ．通常は，型と変数名を並べたもので，最後に";"を含まない．SIL̲LOC̲INT，SIL̲UNL̲INTを用いる
関数またはブロックの先頭の変数宣言部に記述しなければならない．
(2) SIL̲LOC̲INT()
全割込みロックフラグをセットすることで，NMIを除くすべての割込みをマスクし，全割込みロック状態に遷移する．
(3) SIL̲UNL̲INT()
全割込みロックフラグを，対応するSIL̲LOC̲INTを実行する前の状態に戻す．
全割込みロック状態の制御機能の使用例は次の通り．
{
SIL̲PRE̲LOC;
SIL̲LOC̲INT();// この間はNMIを除くすべての割込みがマスクされる．
// この間にサービスコールを呼び出してはならない（一部例外あり）．
SIL̲UNL̲INT();}
なお，全割込みロック状態で呼び出せるサービスコールなどの制限事項については，「2.5.4 全割込みロック状態と全割込みロック解除状態」の節を参照す
ること．
3.4 微少時間待ち
デバイスをアクセスする際に，微少な時間待ちを入れなければならない場合がある．そのような場合に，NOP命令をいくつか入れるなどの方法で対応すると，ポータビリティを損なうことになる．そこで，SILでは，微少な時間待ちを行う
ための以下の機能を用意している．
(1) void sil̲dly̲nse(ulong̲t dlytim)
dlytimで指定された以上の時間（単位はナノ秒），ループなどによって待つ．
指定した値によっては，指定した時間よりもかなり長く待つ場合があるので注意すること．
3.5 エンディアンの取得
プロセッサのバイトエンディアンを取得するためのマクロとして，SILでは，以下のマクロを定義している．
(1) SIL̲ENDIAN̲BIG，SIL̲ENDIAN̲LITTLE

ngki̲spec‑110.txt

page 59

ビッグエンディアンプロセッサではSIL̲ENDIAN̲BIGを，リトルエンディアンプ
ロセッサではSIL̲ENDIAL̲LITTLEを，マクロ定義している．
3.6 メモリ空間アクセス関数
メモリ空間にマッピングされたデバイスレジスタや，デバイスとの共有メモリ
をアクセスするために，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)ngki̲spec‑110.txt

page 60

memで指定されるアドレスにdataで指定される値を32ビット単位で書き込む．
(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.7 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.8 プロセッサIDの参照
マルチプロセッサシステムにおいては，プログラムがどのプロセッサで実行されているかを参照するために，以下の関数を用意している．
(1) void sil̲get̲pid(ID *p̲prcid)

ngki̲spec‑110.txt

page 61

この関数を呼び出したプログラムを実行しているプロセッサのID番号を参照し，
p̲prcidで指定したメモリ領域に返す．
【使用上の注意】
タスクは，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はサポートされない．
〔M〕はマルチプロセッサ対応カーネルのみでサポートされているAPIを示す．
マルチプロセッサ対応でないカーネルでは，このAPIはサポートされない．
〔D〕は動的生成対応カーネルのみでサポートされているAPIを示す．動的生成
対応でないカーネルでは，このAPIはサポートされない．
また，エラーコードが返るカーネルの種類を表すために，次の記号を用いる．
〔P〕は保護機能対応カーネルのみで返るエラーコードを示す．保護機能対応でないカーネルでは，このエラーコードは返らない．
〔D〕は動的生成対応カーネルのみで返るエラーコードを示す．動的生成対応でないカーネルでは，このエラーコードは返らない．
【μITRON4.0仕様との関係】
TOPPERS共通データ型に従い，パラメータのデータ型を次の通り変更した．これ
らの変更については，個別のAPI仕様では記述しない．
INT → int̲t
UINT → uint̲t
VP → void *VP̲INT → intptr̲tngki̲spec‑110.txt

page 62【μITRON4.0/PX仕様との関係】
ID番号で識別するオブジェクトのアクセス許可ベクタをデフォルト以外に設定する場合には，オブジェクトを生成した後に設定することとし，アクセス許可
ベクタを設定する静的API（SAC̲YYY）を新設した．逆に，アクセス許可ベクタを指定してオブジェクトを生成する機能（CRA̲YYY，cra̲yyy，acra̲yyy）は廃止した．これらの変更については，個別のAPI仕様では記述しない．
【未決定事項】
保護機能対応・動的生成対応カーネルにおいて，オブジェクトを生成するサービスコールに対してオブジェクトの属するドメインの指定する方法，マルチプ
ロセッサ対応・動的生成対応カーネルにおいて，オブジェクトを生成するサービスコールに対してオブジェクトの属するクラスを指定する方法は，今後の課題である．
4.1 タスク管理機能
タスクは，プログラムの並行実行の単位で，カーネルが実行を制御する処理単位である．タスクは，タスクIDと呼ぶID番号によって識別する．
タスク管理機能に関連して，各タスクが持つ情報は次の通り．
・タスク属性・タスク状態・ベース優先度・現在優先度・起動要求キューイング数・拡張情報・メインルーチンの先頭番地
・起動時優先度・スタック領域・システムスタック領域（保護機能対応カーネルの場合）・アクセス許可ベクタ（保護機能対応カーネルの場合）
タスクのベース優先度は，タスクの現在優先度を決定するために使われる優先度であり，タスクの起動時に起動時優先度に初期化される．
タスクの現在優先度は，タスクの実行順位を決定するために使われる優先度であり，単にタスクの優先度ともいう．タスクがミューテックスをロックしていない間は，タスクの現在優先度はベース優先度に一致する．ミューテックスをロックしている間のタスクの現在優先度については，「4.4.6 ミューテックス」の節を参照すること．
タスクの起動要求キューイング数は，処理されていないタスクの起動要求の数であり，タスクの生成時に0に初期化される．
システムスタック領域は，保護機能対応カーネルにおいて，タスクが呼び出したサービスコール（拡張サービスコールを含む）を実行するために用いるスタッ
ク領域である．
タスク属性には，次の属性を指定することができる．
TA̲ACT

0x01U

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

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

ngki̲spec‑110.txt

page 63TA̲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），タスクの状態を参照するサービスコールの簡易版（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 })【C言語API】
ER̲ID tskid = acre̲tsk(const T̲CTSK *pk̲ctsk)【パラメータ】
ID
T̲CTSK *tskid
pk̲ctsk

生成するタスクのID番号（CRE̲TSKの場合）
タスクの生成情報を入れたパケットへのポイン
タ（静的APIを除く）

ngki̲spec‑110.txt

page 64＊タスクの生成情報（パケットの内容）
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
E̲RSATR
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲NOID
E̲NOMEM
E̲OBJ

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

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

ngki̲spec‑110.txt

page 65

stkをNULLとした場合，stkszで指定したサイズのスタック領域が，コンフィギュ
レータまたはカーネルにより確保される．stkszにターゲットシステムの制約に合致しないサイズを指定した時には，ターゲットシステムの制約に合致するよ
うに大きい方に丸めたサイズで確保される．
stkがNULLでない場合，stkszで指定したサイズのスタック領域を，アプリケー
ションで確保する．スタック領域をアプリケーションで確保するために，次のデータ型とマクロを用意している．
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エラーとなる．
ただし，保護機能対応カーネルにおけるユーザタスクの場合には，この方法でターゲットシステムの制約に合致する先頭番地とサイズとなるとは限らない．
この場合，スタック領域をアプリケーションで確保する方法は，ターゲット依存となる．
保護機能対応カーネルにおける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を加えた値が，ターゲットシステムの制約に合致しないサngki̲spec‑110.txt

page 66

イズになる時には，ターゲットシステムの制約に合致するように大きい方に丸めたサイズで確保される．
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 *に変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

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

ngki̲spec‑110.txt

page 67【機能】
tskidで指定したタスク（対象タスク）のアクセス許可ベクタ（4つのアクセス
許可パターンの組）を，各パラメータで指定した値に設定する．
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̲NOEXSE̲OACV〔P〕
E̲OBJ

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

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

ngki̲spec‑110.txt
iact̲tsk

page 68

タスクの起動〔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)
ER ercd = imact̲tsk(ID tskid, ID prcid)【パラメータ】
ID
ID

tskid
prcid

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

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

ngki̲spec‑110.txt
E̲CTX

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

page 69
コンテキストエラー（非タスクコンテキストからの呼出
し：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で実行されることはない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，mact̲tsk，imact̲tskをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
can̲act
タスク起動要求のキャンセル〔T〕【C言語API】
ER̲UINT actcnt = can̲act(ID tskid)【パラメータ】
IDtskid【リターンパラメータ】
ER̲UINT
actcnt

対象タスクのID番号

キューイングされていた起動要求の数（正の値ngki̲spec‑110.txt

page 70または0）またはエラーコード【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，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
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，対象タスクが自タスク
でディスパッチ保留状態からの呼出し）
不正ID番号（tskid，prcidが不正）
パラメータエラー（対象タスクはprcidで指定したプロセッサに割り付けられない）
オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作1が許可されていない）
オブジェクト状態エラー（対象タスクが自タスクと異なるプロセッサに割り付けられている）【機能】
tskidで指定したタスクの割付けプロセッサを，prcidで指定したプロセッサに変更する．具体的な振舞いは以下の通り．
対象タスクが，自タスクが割り付けられたプロセッサに割り付けられている場
合には，対象タスクをprcidで指定したプロセッサに割り付ける．対象タスクが実行できる状態の場合には，prcidで指定したプロセッサに割り付けられた同じ
優先度のタスクの中で，最も優先順位が低い状態となる．
対象タスクが，自タスクが割付けられたプロセッサと異なるプロセッサに割り付けられている場合には，E̲OBJエラーとなる．

ngki̲spec‑110.txt

page 71

tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
ディスパッチ保留状態で，対象タスクを自タスクとしてmig̲tskを呼び出すと，
E̲CTXエラーとなる．
prcidにTPRC̲INI（＝0）を指定すると，対象タスクの割付けプロセッサを，それが属するクラスの初期割付けプロセッサに変更する．
【補足説明】
この仕様では，タスクをマイグレーションさせることができるのは，そのタス
クと同じプロセッサに割り付けられたタスクのみである．そのため，CPUロック
状態やディスパッチ禁止状態を用いて，他のタスクへのディスパッチが起こらないようにすることで，自タスクが他のプロセッサへマイグレーションされるのを防ぐことができる．
対象タスクが，最初からprcidで指定したプロセッサに割り付けられている場合には，割付けプロセッサの変更は起こらないが，優先順位が同一優先度のタスクの中で最低となる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ext̲tsk
自タスクの終了〔T〕【C言語API】
ER ercd = ext̲tsk()【パラメータ】
なし【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

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

ngki̲spec‑110.txt
ter̲tsk

page 72

タスクの強制終了〔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エラーとなる．また，対象タスク
が自タスクの場合には，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

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

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

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

page 73

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（tskidが不正）
パラメータエラー（tskpriが不正）オブジェクト未登録（対象タスクが未登録）
オブジェクトアクセス違反（対象タスクに対する通常操作2が許可されていない）
サービスコール不正使用（☆未完成）
オブジェクト状態エラー（対象タスクが休止状態）【機能】
tskidで指定したタスク（対象タスク）のベース優先度を，tskpriで指定した優先度に変更する．具体的な振舞いは以下の通り．
対象タスクが休止状態でない場合には，対象タスクのベース優先度が，tskpri
で指定した優先度に変更される．
☆未完成
対象タスクが休止状態である場合には，E̲OBJエラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．また，
tskpriにTPRI̲INI（＝0）を指定すると，対象タスクのベース優先度が，起動時優先度に変更される．
☆未完成（E̲ILUSEの条件）
tskpriは，TPRI̲INIであるか，TMIN̲TPRI以上，TMAX̲TPRI以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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が指すメモリ領域への書
込みアクセスが許可されていない）
オブジェクト状態エラー（対象タスクが休止状態）

ngki̲spec‑110.txt

page 74

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【リターンパラメータ】
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タスクの起床要求キューイング数ngki̲spec‑110.txt

page 75bool̲ttexmskbool̲twaifbduint̲tsvclevel

ID

prcid

【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

タスクがタスク例外マスク状態か否か（保護機能対応カーネルの場合）タスクが待ち禁止状態か否か（保護機能対応カー
ネルの場合）
タスクの拡張サービスコールのネストレベル（保護機能対応カーネルの場合）
タスクの割付けプロセッサのID（マルチプロセッ
サ対応カーネルの場合）

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

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

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

対象タスクが休止状態でない場合には，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番号が返される．
対象タスクが待ち状態でない場合や，起床待ち状態または時間経過待ち状態でngki̲spec‑110.txt

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

ngki̲spec‑110.txt

page 77

4.2 タスク付属同期機能
タスク付属同期機能は，タスクとタスクの間，または非タスクコンテキストの処理とタスクの間で同期を取るために，タスク単独で持っている機能である．
タスク付属同期機能に関連して，各タスクが持つ情報は次の通り．
・起床要求キューイング数
タスクの起床要求キューイング数は，処理されていないタスクの起床要求の数であり，タスクの起動時に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

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

ngki̲spec‑110.txt

page 78

自タスクの起床要求キューイング数が0でない場合には，起床要求キューイング
数から1が減ぜられる．起床要求キューイング数が0の場合には，自タスクは起床待ち状態となる．
【補足説明】
自タスクの起床要求キューイング数が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エラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
can̲wup
タスク起床要求のキャンセル〔T〕【C言語API】
ER̲UINT wupcnt = can̲wup(ID tskid)【パラメータ】
IDtskid

対象タスクのID番号

ngki̲spec‑110.txt

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し，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が返る．

ngki̲spec‑110.txt

page 80

対象タスクが待ち状態でない場合には，E̲OBJエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sus̲tsk
強制待ち状態への遷移〔T〕【C言語API】
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エラーとなる．
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‑110.txt

E̲OBJ

page 81
作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エラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，dis̲waiをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，dis̲waiをサポートしない．

ngki̲spec‑110.txt

page 82【補足説明】
dis̲waiは，対象タスクの待ち解除は行わない．対象タスクを待ち禁止状態にすることに加えて待ち解除したい場合には，dis̲waiを呼び出した後に，rel̲wai
を呼び出せばよい．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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エラーとなる．
tskidにTSK̲SELF（＝0）を指定すると，自タスクが対象タスクとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ena̲waiをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ena̲waiをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
dly̲tsk
自タスクの遅延〔T〕【C言語API】
ER ercd = dly̲tsk(RELTIM dlytim)【パラメータ】
RELTIM

dlytim【リターンパラメータ】

遅延時間

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

E̲PAR
E̲RLWAI

page 83ercd

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し）パラメータエラー（dlytimが不正）待ち禁止状態または待ち状態の強制解除【機能】
dlytimで指定した時間，自タスクを遅延させる．具体的な振舞いは以下の通り．
自タスクは，dlytimで指定した時間が経過するまでの間，時間経過待ち状態となる．dly̲tskを呼び出してからdlytimで指定した相対時間後に，自タスクは待ち解除され，dly̲tskからE̲OKが返る．
dlytimは，TMAX̲RELTIM以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.3 タスク例外処理機能
タスク例外処理ルーチンは，カーネルが実行を制御する処理単位で，タスクと同一のコンテキスト内で実行される．タスク例外処理ルーチンは，各タスクに1つのみ登録できるため，タスクIDによって識別する．
タスク例外処理機能に関連して，各タスクが持つ情報は次の通り．
・タスク例外処理ルーチン属性
・タスク例外処理禁止フラグ
・保留例外要因
・タスク例外処理ルーチンの先頭番地
タスク例外処理ルーチン属性に指定できる属性はない．そのため，タスク例外
処理ルーチン属性には，TA̲NULLを指定しなければならない．
タスクは，タスク例外処理ルーチンの実行を保留するためのタスク例外処理禁止フラグを持つ．タスク例外処理禁止フラグがセットされた状態をタスク例外
処理禁止状態，クリアされた状態をタスク例外処理許可状態と呼ぶ．タスク例
外処理禁止フラグは，タスクの起動時に，セットした状態に初期化される．
タスクの保留例外要因は，タスクに対して要求された例外要因を蓄積するためのビットマップであり，タスクの起動時に0に初期化される．
タスク例外処理ルーチンは，「タスク例外処理許可状態である」「保留例外要因が0でない」「タスクが実行状態である」「タスクコンテキストが実行されている」の4つの条件が揃った場合に実行が開始される．さらに，保護機能対応カー
ネルにおいては，「タスク例外処理マスク状態でない」「CPUロック状態でない」の2つの条件が追加される．タスク例外処理マスク状態については，「2.6.5 タ
スク例外処理マスク状態と待ち禁止状態」の節を参照すること．
タスク例外処理ルーチンの実行が開始される時，タスク例外処理禁止フラグはセットされ，保留例外要因は0にクリアされる．
タスク例外処理機能に用いるデータ型は次の通り．
TEXPTN

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

page 84

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

タスク例外要因のビット数（TEXPTNの有効ビット数）【補足説明】
タスク例外処理ルーチンの実行開始条件の内，「CPUロック状態でない」が保護機能対応カーネルのみに適用されるものとしているのは，保護機能対応でない
カーネルでは，CPUロック状態で他の条件が揃うことはないためである．保護機
能対応カーネルでは，CPUロック状態で拡張サービスコールからリターンした場
合（より厳密には，タスク例外処理マスク状態が解除された場合）に，CPUロッ
ク状態で他の条件が揃うことになる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，タスク例外要因のビット数（TBIT̲TEXPTN）は16以上である．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，タスク例外要因のビット数（TBIT̲TEXPTN）は16以上である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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
E̲ID
E̲NOEXS〔D〕

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

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

ngki̲spec‑110.txt
E̲OACV〔P〕
E̲MACV〔P〕
E̲RSATR
E̲PAR
E̲OBJ

page 85
オブジェクトアクセス違反（対象タスクに対する管理操作が許可されていない）
メモリアクセス違反（pk̲dtexが指すメモリ領域への読出しアクセスが許可されていない）
予約属性（texatrが不正または使用できない）
パラメータエラー（texrtnが不正）オブジェクト状態エラー（タスク例外処理ルーチンを定義済みのタスクに対する定義，タスク例外処理ルーチン
を未定義のタスクに対する解除，対象タスクは静的APIで生成された）【機能】
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においてpk̲dtexを
NULLにした場合）で，対象タスクに対してタスク例外処理ルーチンが定義されていない場合には，E̲OBJエラーとなる．
【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)【パラメータ】
IDtskid

対象タスクのID番号

ngki̲spec‑110.txt
TEXPTN

page 86

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

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

要求するタスク例外処理のタスク例外要因

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

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

【機能】
tskidで指定したタスク（対象タスク）に対して，rasptnで指定したタスク例外
要因のタスク例外処理を要求する．対象タスクの保留例外要因が，それまでの値とrasptnで指定した値のビット毎論理和（C言語の"￨"）に更新される．
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〕【C言語API】
ER ercd = ena̲tex()【パラメータ】なし

ngki̲spec‑110.txt

page 87【リターンパラメータ】
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【リターンパラメータ】
ER
ercd

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

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

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

page 88
し，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には，対象タスクの現在の保留例外要因が返される．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4 同期・通信機能【μITRON4.0仕様との関係】
この仕様では，ランデブ機能はサポートしていない．今後の検討により，ランデブ機能をサポートすることに変更する可能性もある．
4.4.1 セマフォ
セマフォは，資源の数を表す0以上の整数値を取るカウンタ（資源数）を介して，排他制御やイベント通知を行うためのカーネルオブジェクトである．セマフォの資源数から1を減ずることを資源の獲得，資源数に1を加えることを資源の返却と呼ぶ．セマフォは，セマフォIDと呼ぶID番号によって識別する．
各セマフォが持つ情報は次の通り．
・セマフォ属性
・資源数（の現在値）
・待ち行列（セマフォの資源獲得待ち状態のタスクのキュー）
・初期資源数（資源数の初期値）
・最大資源数（資源数が取りうる最大値）
・アクセス許可ベクタ（保護機能対応カーネルの場合）
待ち行列は，セマフォの資源が獲得できるまで待っている状態（セマフォの資源獲得待ち状態）のタスクが，資源を獲得できる順序でつながれているキューである．
セマフォの初期資源数は，セマフォを生成または再初期化した際の，資源数の初期値である．また，セマフォの最大資源数は，資源数が取りうる最大値である．資源数が最大資源数に一致している時に資源を返却しようとすると，
E̲QOVRエラーとなる．
セマフォ属性には，次の属性を指定することができる．

ngki̲spec‑110.txt

TA̲TPRI

page 89

0x01U

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

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

セマフォの最大資源数の最大値

TNUM̲SEMID

登録できるセマフォの数（動的生成対応でないカーネル
では，静的APIによって登録されたセマフォの数に一致）

この仕様では，TMAX̲MAXSEMは，UINT̲MAX（uint̲tに格納できる最大値）に固定されている．
【μ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
E̲RSATR
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲NOID
E̲OBJ【機能】

生成されたセマフォのID番号（正の値）またはエラーコードコンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（sematrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（isemcnt，maxsemが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲csemが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられるセマフォIDがない：acre̲semの場合）
オブジェクト状態エラー（semidで指定したセマフォが登
録済み：CRE̲SEMの場合）

ngki̲spec‑110.txt

page 90

各パラメータで指定したセマフォ生成情報に従って，セマフォを生成する．生成されたセマフォの資源数は初期資源数に，待ち行列は空の状態に初期化される．
静的APIにおいては，semidはオブジェクト識別名，isemcntとmaxsemは整数定数
式パラメータである．
isemcntは，0以上で，maxsem以下でなければならない．また，maxsemは，1以上で，TMAX̲MAXSEM以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲SEMのみをサポートする．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲SEMのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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)【パラメータ】
ID
ACVCT *

semidp̲acvct

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

【機能】

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

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

ngki̲spec‑110.txt

page 91

semidで指定したセマフォ（対象セマフォ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【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【エラーコード】
E̲CTX
E̲ID
E̲NOEXSE̲OACV〔P〕
E̲OBJ

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

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

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

ngki̲spec‑110.txt
isig̲sem

page 92

セマフォの資源の返却〔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の場合）
キューイングオーバフロー（資源数が最大資源数に一致）【機能】
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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し，ディスパッチ保留状態
からの呼出し：pol̲semを除く）
不正ID番号（semidが不正）
パラメータエラー（tmoutが不正：twai̲semの場合）

ngki̲spec‑110.txt
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲TMOUTE̲RLWAIE̲DLT

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

semid【リターンパラメータ】
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仕様に定義されていないサービスコールである．

ngki̲spec‑110.txt

page 94‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（semidが不正）
オブジェクト未登録（対象セマフォが未登録）
オブジェクトアクセス違反（対象セマフォに対する参照
操作が許可されていない）
メモリアクセス違反（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にする（クリアする）ことを，イベントフラグをクリアするという．イベントフラグによりイベントを通知する側のタスクは，
イベントフラグをセットまたはクリアすることで，イベントの発生を通知する．
イベントフラグによりイベントの通知を受ける側のタスクは，待ちビットパター

ngki̲spec‑110.txt

page 95

ンと待ちモードにより，どのビットがセットされるのを待つかを指定する．待ちモードにTWF̲ORW（＝0x01U）を指定した場合，待ちビットパターンに含まれるいずれかのビットがセットされるのを待つ．待ちモードにTWF̲ANDW（＝0x02U）を指定した場合，待ちビットパターンに含まれるすべてのビットがセットされるのを待つ．この条件を，イベントフラグの待ち解除の条件と呼ぶ．
各イベントフラグが持つ情報は次の通り．
・イベントフラグ属性
・ビットパターン（の現在値）
・待ち行列（イベントフラグ待ち状態のタスクのキュー）・初期ビットパターン（ビットパターンの初期値）
・アクセス許可ベクタ（保護機能対応カーネルの場合）
待ち行列は，イベントフラグが指定した待ち解除の条件を満たすまで待っている状態（イベントフラグ待ち状態）のタスクがつながれているキューである．
待ち行列につながれたタスクの待ち解除は，待ち解除の条件を満たした中で，待ち行列の前方につながれたものから順に行われる（「2.6.4 待ち行列と待ち解除の順序」の節の(a)に該当）．
イベントフラグの初期ビットパターンは，イベントフラグを生成または再初期化した際の，ビットパターンの初期値である．
イベントフラグ属性には，次の属性を指定することができる．
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仕様との関係】

ngki̲spec‑110.txt

page 96

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
イベントフラグ属性
FLGPTN
iflgptn
イベントフラグの初期ビットパターン【リターンパラメータ】
ER̲ID
flgid

【エラーコード】
E̲CTX
E̲RSATRE̲OACV〔P〕
E̲MACV〔P〕
E̲NOIDE̲OBJ

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

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

ngki̲spec‑110.txt
sac̲flg

page 97

イベントフラグのアクセス許可ベクタの設定〔TPD〕【静的API】
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
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象イベントフラグは静的APIで生成された：sac̲flgの場合，対象イベントフラグに対してアクセス許可ベクタが設定済み：SAC̲FLGの場合）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【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)【パラメータ】
ID

flgid【リターンパラメータ】

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

ngki̲spec‑110.txt
ER【エラーコード】
E̲CTX
E̲ID
E̲NOEXSE̲OACV〔P〕
E̲OBJ

page 98ercd

正常終了（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

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

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し：set̲flgの場合，タスクコンテキストからの呼出し：iset̲flgの場合，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対すngki̲spec‑110.txt

page 99
る通常操作1が許可されていない：set̲flgの場合）【機能】
flgidで指定したイベントフラグ（対象イベントフラグ）のsetptnで指定したビットをセットする．具体的な振舞いは以下の通り．
対象イベントフラグのビットパターンは，それまでの値とsetptnで指定した値のビット毎論理和（C言語の"￨"）に更新される．対象イベントフラグの待ち行
列にタスクが存在する場合には，待ち解除の条件を満たしたタスクが，待ち行列の前方につながれたものから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
ただし，対象イベントフラグがTA̲CLR属性である場合には，待ち解除の条件を満たしたタスクを1つ待ち解除した時点で，対象イベントフラグのビットパター
ンが0にクリアされるため，他のタスクが待ち解除されることはない．
【使用上の注意】
対象イベントフラグが，WA̲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で指定したイベントフラグ（対象イベントフラグ）のsetptnで指定したビットをクリアする．対象イベントフラグのビットパターンは，それまでの値とclrptnで指定した値のビット毎論理積（C言語の"&"）に更新される．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
wai̲flg
イベントフラグ待ち〔T〕
pol̲flg
イベントフラグ待ち（ポーリング）〔T〕
twai̲flg
イベントフラグ待ち（タイムアウト付き）〔T〕【C言語API】
ER ercd = wai̲flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p̲flgptn)

ngki̲spec‑110.txt

page 100

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【リターンパラメータ】
ER
ercd【エラーコード】

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

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

page 101
コンテキストエラー（非タスクコンテキストからの呼出
し，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
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（flgidが不正）
オブジェクト未登録（対象イベントフラグが未登録）
オブジェクトアクセス違反（対象イベントフラグに対す
る参照操作が許可されていない）
メモリアクセス違反（pk̲rflgが指すメモリ領域への書込
みアクセスが許可されていない）

ngki̲spec‑110.txt

page 102【機能】
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

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

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

登録できるデータキューの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたデータキューの数に一致）【μITRON4.0仕様との関係】

ngki̲spec‑110.txt

page 103

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
E̲RSATRE̲NOSPT
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲NOID
E̲NOMEM
E̲OBJ

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

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

ngki̲spec‑110.txt

page 104

dtqmbがNULLでない場合に，データキュー管理領域をアプリケーションで確保す
る方法については，今後の課題である．
保護機能対応カーネルにおけるデータキュー管理領域の指定方法と確保方法については，今後の課題である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲DTQのみをサポートする．また，dtqmbにはNULLのみを指定することができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲DTQのみをサポートする．また，dtqmbにはNULLのみを指定することができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【μITRON4.0仕様との関係】
μITRON4.0/PX仕様にあわせて，データキュー生成情報の最後のパラメータを，
dtq（データキュー領域の先頭番地）から，dtqmb（データキュー管理領域の先頭番地）に改名した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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)【パラメータ】
ID
ACVCT *

dtqid
p̲acvct

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象データキューは静的APIで生成された：sac̲dtqの場合，対象データキューに対してngki̲spec‑110.txt

page 105
アクセス許可ベクタが設定済み：SAC̲DTQの場合）【機能】
dtqidで指定したデータキュー（対象データキュー）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【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【エラーコード】
E̲CTX
E̲ID
E̲NOEXSE̲OACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する管理操作が許可されていない）
オブジェクト状態エラー（対象データキューは静的APIで生成された）【機能】
dtqidで指定したデータキュー（対象データキュー）を削除する．具体的な振舞
いは以下の通り．
対象データキューの登録が解除され，そのデータキューIDが未使用の状態に戻される．また，対象データキューの送信待ち行列と受信待ち行列につながれたタスクは，それぞれの待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
データキューの生成時に，データキュー管理領域がカーネルによって確保された場合は，そのメモリ領域が解放される．
【補足説明】
送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため，別の待ち行列で待っていたタスクの間の待ち解除の順序は，規定する必要がな
い．
【使用上の注意】ngki̲spec‑110.txt

page 106del̲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
intptr̲t
TMO

dtqid
data
tmout

対象データキューのID番号
送信データ
タイムアウト時間（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が返る．
対象データキューの受信待ち行列にタスクが存在せず，データキュー管理領域

ngki̲spec‑110.txt

page 107にデータを格納するスペースがある場合には，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
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲ILUSE

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

コンテキストエラー（非タスクコンテキストからの呼出
し：fsnd̲dtqの場合，タスクコンテキストからの呼出し：
ifsnd̲dtqの場合，CPUロック状態からの呼出し）
不正ID番号（dtqidが不正）
オブジェクト未登録（対象データキューが未登録）
オブジェクトアクセス違反（対象データキューに対する
通常操作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】

ngki̲spec‑110.txt

page 108

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
E̲DLT

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

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

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

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

ngki̲spec‑110.txt

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

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

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

page 110ID

rtskiduint̲tsdtqcnt【エラーコード】
E̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕

ID番号
データキューの受信待ち行列の先頭のタスクの
ID番号
データキュー管理領域に格納されているデータの数

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

ngki̲spec‑110.txt

page 111

タキューからデータが受信できるまで待っている状態（優先度データキューからの受信待ち状態）のタスクが，データを受信できる順序でつながれている
キューである．
優先度データキュー属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

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

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

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

TNUM̲PDQID

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

ngki̲spec‑110.txt

page 112＊優先度データキューの生成情報（パケットの内容）
ATR
pdqatr
優先度データキュー属性
uint̲tpdqcnt
優先度データキュー管理領域に格納できるデー
タ数
PRI
maxdpri
優先度データキューに送信できるデータ優先度の最大値
void *
pdqmb
優先度データキュー管理領域の先頭番地【リターンパラメータ】
ER̲ID
pdqid

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

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

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

ngki̲spec‑110.txt

page 113【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲PDQのみをサポートする．また，pdqmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
SAC̲PDQ
優先度データキューのアクセス許可ベクタの設定〔SP〕
sac̲pdq
優先度データキューのアクセス許可ベクタの設定〔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
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（pdqidが不正）
オブジェクト未登録（対象優先度データキューが未登録）
オブジェクトアクセス違反（対象優先度データキューに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象優先度データキューは静的
APIで生成された：sac̲pdqの場合，対象優先度データキュー
に対してアクセス許可ベクタが設定済み：SAC̲PDQの場合）【機能】
pdqidで指定した優先度データキュー（対象優先度データキュー）のアクセス許可ベクタ（4 つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲PDQ，sac̲pdqをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲PDQ，sac̲pdqをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲pdq
優先度データキューの削除〔TD〕

ngki̲spec‑110.txt

page 114【C言語API】
ER ercd = del̲pdq(ID pdqid)【パラメータ】
ID

pdqid【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲ID
E̲NOEXSE̲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〕
ipsnd̲pdq
優先度データキューへの送信（ポーリング）〔I〕

ngki̲spec‑110.txt
tsnd̲pdq

page 115

優先度データキューへの送信（タイムアウト付き）〔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以上で，対象データキューに送信できるデータ優先度の最大値以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rcv̲pdq
優先度データキューからの受信〔T〕

ngki̲spec‑110.txt
prcv̲pdq
trcv̲pdq

page 116

優先度データキューからの受信（ポーリング）〔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‑110.txt

page 117

おらず，送信待ち行列にタスクが存在しない場合には，自タスクは優先度デー
タキューからの受信待ち状態となり，対象優先度データキューの受信待ち行列につながれる．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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
T̲RPDQ *pdqid
pk̲rpdq

対象優先度データキューのID番号
優先度データキューの現在状態を入れるパケッngki̲spec‑110.txt

page 118
トへのポインタ【リターンパラメータ】
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‑110.txt

page 119（メールボックスからの受信待ち状態）のタスクが，メッセージを受信できる順序でつながれているキューである．
メールボックス属性には，次の属性を指定することができる．
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に固定されている．ただし，タスク優先度拡張パッケー
ジでは，TMAX̲MPRIを256に拡張する．
【TOPPERS/FMPカーネルにおける規定】

ngki̲spec‑110.txt

page 120

FMPカーネルでは，メールボックス機能をサポートする．メッセージ優先度の最大値（TMAX̲MPRI）は16に固定されている．
【μITRON4.0仕様との関係】
TNUM̲MBXIDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
CRE̲MBX
メールボックスの生成〔S〕
acre̲mbx
メールボックスの生成〔TD〕【静的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
E̲RSATRE̲NOSPT
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲NOID
E̲NOMEM
E̲OBJ

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

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

ngki̲spec‑110.txt

page 121

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

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mbxidが不正）
オブジェクト未登録（対象メールボックスが未登録）
オブジェクトアクセス違反（対象メールボックスに対する管理操作が許可されていない）
オブジェクト状態エラー（対象メールボックスは静的APIで生成された）【機能】
mbxidで指定したメールボックス（対象メールボックス）を削除する．具体的な振舞いは以下の通り．
対象メールボックスの登録が解除され，そのメールボックスIDが未使用の状態に戻される．また，対象メールボックスの待ち行列につながれたタスクは，待ち行列の先頭のタスクから順に待ち解除される．待ち解除されたタスクには，待ち状態となったサービスコールからE̲DLTエラーが返る．
メールボックスの生成時に，優先度別のメッセージキューヘッダ領域がカーネngki̲spec‑110.txt

page 122

ルによって確保された場合は，そのメモリ領域が解放される．
【使用上の注意】del̲mbxにより複数のタスクが待ち解除される場合，サービスコールの処理時間
およびカーネル内での割込み禁止時間が，待ち解除されるタスクの数に比例して長くなる．特に，多くのタスクが待ち解除される場合，カーネル内での割込み禁止時間が長くなるため，注意が必要である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，del̲mbxをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，del̲mbxをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
snd̲mbx
メールボックスへの送信〔T〕【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〕
E̲OACV〔P〕
E̲MACV〔P〕

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mbxidが不正）
パラメータエラー（メッセージヘッダ中のmsgpriが不正）オブジェクト未登録（対象メールボックスが未登録）
オブジェクトアクセス違反（対象メールボックスに対する通常操作1が許可されていない）
メモリアクセス違反（pk̲msgが指すメモリ領域への読出しアクセスが許可されていない）【機能】
mbxidで指定したメールボックス（対象メールボックス）に，pk̲msgで指定したメッセージを送信する．具体的な振舞いは以下の通り．
対象メールボックスの待ち行列にタスクが存在する場合には，待ち行列の先頭のタスクが，pk̲msgで指定したメッセージを受信し，待ち解除される．待ち解
除されたタスクには，待ち状態となったサービスコールからE̲OKが返る．
対象メールボックスの待ち行列にタスクが存在しない場合には，pk̲msgで指定したメッセージが，メールボックス属性のTA̲MPRI指定の有無によって指定される順序で，メッセージキューにつなぐ．
対象メールボックスがTA̲MPRI属性である場合には，pk̲msgで指定したメッセー
ジの先頭のメッセージヘッダ中のmsgpriフィールドの値が，TMIN̲MPRI以上で，対象メールボックスに送信できるメッセージ優先度の最大値以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑110.txt
rcv̲mbx
prcv̲mbx
trcv̲mbx

page 123

メールボックスからの受信〔T〕
メールボックスからの受信（ポーリング）〔T〕
メールボックスからの受信（タイムアウト付き）〔T〕【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̲OACV〔P〕
E̲MACV〔P〕
E̲TMOUTE̲RLWAI
E̲DLT

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

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

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

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

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

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

page 124

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

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

ngki̲spec‑110.txt
E̲OACV〔P〕
E̲MACV〔P〕

page 125
オブジェクトアクセス違反（対象メールボックスに対す
る参照操作が許可されていない）
メモリアクセス違反（pk̲rmbxが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
mbxidで指定したメールボックス（対象メールボックス）の現在状態を参照する．
参照した現在状態は，pk̲rmbxで指定したパケットに返される．
対象メールボックスの待ち行列にタスクが存在しない場合，wtskidには
TSK̲NONE（＝0）が返る．また，メッセージキューにメッセージがつながれていない場合，pk̲msgにはNULLが返る．
【使用上の注意】ref̲mbxはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲mbxを呼び出し，対象メールボックスの現在状態を参照した
直後に割込みが発生した場合，ref̲mbxから戻ってきた時には対象メールボック
スの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.6 ミューテックス☆未完成
ミューテックス機能に関連するカーネル構成マクロは次の通り．
TNUM̲MTXID

登録できるミューテックスの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたミューテックスの数に一致）【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ミューテックス機能拡張パッケージを用いると，ミューテッ
クス機能を追加することができる．ただし，TA̲INHERIT属性のミューテックス
はサポートしていない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ミューテックス機能をサポートしていない．
【μ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)☆未完成【TOPPERS/ASPカーネルにおける規定】

ngki̲spec‑110.txt

page 126

ASPカーネルのミューテックス機能拡張パッケージでは，CRE̲MTXのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲MTX
ミューテックスのアクセス許可ベクタの設定〔SP〕
sac̲mtx
ミューテックスのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })【C言語API】
ER ercd = sac̲mtx(ID mtxid, const ACVCT *p̲acvct)☆未完成【TOPPERS/ASPカーネルにおける規定】
ASPカーネルのミューテックス機能拡張パッケージでは，SAC̲MTX，sac̲mtxをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑del̲mtx
ミューテックスの削除〔TD〕【C言語API】
ER ercd = del̲mtx(ID mtxid)☆未完成【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)‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
unl̲mtx
ミューテックスのロック解除〔T〕☆未完成【C言語API】
ER ercd = unl̲mtx(ID mtxid)‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ini̲mtx
ミューテックスの初期化〔T〕【C言語API】
ER ercd = ini̲mtx(ID mtxid)☆未完成【μITRON4.0仕様との関係】

ngki̲spec‑110.txt

page 127

μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲mtx
ミューテックスの状態参照〔T〕【C言語API】
ER ercd = ref̲mtx(ID mtxid, T̲RMTX *pk̲rmtx)☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.4.7 メッセージバッファ☆未完成
4.4.8 スピンロック
スピンロックは，マルチプロセッサ対応カーネルにおいて，割込みのマスクとプロセッサ間ロックの取得により，排他制御を行うためのオブジェクトである．
ロックを取得している間は，CPUロック状態となり，すべてのカーネル管理の割込みがマスクされ，ディスパッチが保留される．ロックが他のプロセッサに取得されている場合には，ロックが取得できるまでループによって待つ．ロック取得を待つ間は，割込みをマスクしない．スピンロックは，スピンロックIDと呼ぶID番号によって識別する．
タスクが取得したスピンロックを返却せずに終了した場合や，タスク例外処理
ルーチン，割込みハンドラ，割込みサービスルーチン，タイムイベントハンドラが取得したスピンロックを返却せずにリターンした場合には，カーネルによってスピンロックが返却される．また，スピンロックを取得していない状態で発生したCPU例外によって呼び出されたCPU例外ハンドラが，取得したスピンロッ
クを返却せずにリターンした場合には，カーネルによってスピンロックが返却される．一方，拡張サービスコールルーチンからのリターンでは，スピンロッ
クは返却されない．
各スピンロックが持つ情報は次の通り．
・スピンロック属性
・ロック状態（取得されている状態と取得されていない状態）
・アクセス許可ベクタ（保護機能対応カーネルの場合）
スピンロック属性に指定できる属性はない．そのためスピンロック属性には，
TA̲NULLを指定しなければならない．
スピンロック機能に関連するカーネル構成マクロは次の通り．
TNUM̲SPNID

登録できるスピンロックの数（動的生成対応でないカー
ネルでは，静的APIによって登録されたスピンロックの数に一致）【補足説明】
CPUロック状態では，スピンロックを取得するサービスコールを呼び出すことができないため，スピンロックを取得しているプロセッサが，さらにスピンロックを取得することはできない．そのため，1つの処理単位が，複数のスピンロックを取得した状態になることはできない．
スピンロックを取得した状態でCPU例外が発生した場合，起動されるCPU例外ハ
ンドラはカーネル管理外のCPU例外ハンドラであり（xsns̲dpn，xsns̲xpnともtrueを返す），CPU例外ハンドラ中でiunl̲spnを呼び出してスピンロックを返却ngki̲spec‑110.txt

page 128しようとした場合の動作は保証されない．保証されないにも関わらずiunl̲spnを呼び出した場合には，CPU例外ハンドラからのリターン時に元の状態に戻らない．これは，CPUロック状態の扱いと一貫していないため，注意が必要である．
【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
E̲RSATRE̲OACV〔P〕
E̲MACV〔P〕
E̲NOIDE̲NORESE̲OBJ

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

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

ngki̲spec‑110.txt

page 129

静的APIにおいては，spnidはオブジェクト識別名である．
スピンロックをハードウェアによって実現している場合には，ターゲット定義
で，生成できるスピンロックの数に上限がある．この上限を超えてスピンロックを生成しようとした場合には，E̲NORESエラーとなる．
【補足説明】
スピンロックを動的に生成する場合に，生成できるスピンロックの数の上限は
AID̲SPNによってチェックされるため，acre̲spnでE̲NORESエラーが返ることはない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲SPNのみをサポートする．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）
オブジェクトアクセス違反（対象スピンロックに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象スピンロックは静的APIで生成された：sac̲spnの場合，対象スピンロックに対してアクセス許可ベクタが設定済み：SAC̲SPNの場合）【機能】
spnidで指定したスピンロック（対象スピンロック）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．

ngki̲spec‑110.txt

page 130【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̲NOEXSE̲OACV〔P〕
E̲OBJ

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

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し：loc̲spnの場合，タスクコンテキストからの呼出し：ngki̲spec‑110.txt

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

page 131iloc̲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〕
itry̲spn
スピンロックの取得（ポーリング）〔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〕

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

コンテキストエラー（非タスクコンテキストからの呼出
し：try̲spnの場合，タスクコンテキストからの呼出し：itry̲spnの場合，CPUロック状態からの呼出し）
不正ID番号（spnidが不正）
オブジェクト未登録（対象スピンロックが未登録）

ngki̲spec‑110.txt
E̲OACV〔P〕
E̲OBJ

page 132
オブジェクトアクセス違反（対象スピンロックに対する
通常操作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〕
E̲ILUSE

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

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

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

ngki̲spec‑110.txt

page 133【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

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

E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕【機能】
spnidで指定したスピンロック（対象スピンロック）の現在状態を参照する．参
照した現在状態は，pk̲rspnで指定したパケットに返される．
spnstatには，対象スピンロックの現在のロック状態を表す次のいずれかの値が返される．
TSPN̲UNL
TSPN̲LOC

0x01U
0x02U

取得されていない状態
取得されている状態【使用上の注意】ref̲spnはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲spnを呼び出し，対象スピンロックの現在状態を参照した直後に割込みが発生した場合，ref̲spnから戻ってきた時には対象スピンロックの状態が変化している可能性があるためである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.5 メモリプール管理機能【μITRON4.0仕様との関係】
この仕様では，可変長メモリプール機能はサポートしないこととした．
【仕様決定の理由】
可変長メモリプール機能をサポートしないこととしたのは，メモリ割付けの処
理時間とフラグメンテーションの発生を考えると，最適なメモリ管理アルゴリ
ズムはアプリケーション依存となるため，カーネル内で実現するより，ライブ
ラリとして実現する方が適切と考えたためである．
4.5.1 固定長メモリプール

ngki̲spec‑110.txt

page 134

固定長メモリプールは，生成時に決めたサイズのメモリブロック（固定長メモ
リブロック）を動的に獲得・解放するためのカーネルオブジェクトである．固定長メモリプールは，固定長メモリプールIDと呼ぶID番号で識別する．
各固定長メモリプールが持つ情報は次の通り．
・固定長メモリプール属性
・待ち行列（固定長メモリブロックの獲得待ち状態のタスクのキュー）
・固定長メモリプール領域
・固定長メモリプール管理領域
・アクセス許可ベクタ（保護機能対応カーネルの場合）
待ち行列は，固定長メモリブロックが獲得できるまで待っている状態（固定長
メモリブロックの獲得待ち状態）のタスクが，固定長メモリブロックを獲得できる順序でつながれているキューである．
固定長メモリプール領域は，その中から固定長メモリブロックを割り付けるた
めのメモリ領域である．
固定長メモリプール管理領域は，固定長メモリプール領域中の割当て済みの固定長メモリブロックと未割当てのメモリ領域に関する情報を格納しておくためのメモリ領域である．
固定長メモリプール属性には，次の属性を指定することができる．
TA̲TPRI

0x01U

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

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

登録できる固定長メモリプールの数（動的生成対応でない
カーネルでは，静的APIによって登録された固定長メモリ
プールの数に一致）【μ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の場合）
固定長メモリプールの生成情報を入れたパケッngki̲spec‑110.txt

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

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（mpfatrが不正または使用できない，属する保護ドメインかクラスが不正）未サポート機能（mpfmbがサポートされていない値）
パラメータエラー（blkcnt，blksz，mpf，mpfmbが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cmpfが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられる固定長メモリプールIDがな
い：acre̲mpfの場合）
メモリ不足（固定長メモリプール領域や固定長メモリプー
ル管理領域が確保できない）
オブジェクト状態エラー（mpfidで指定した固定長メモリ
プールが登録済み：CRE̲MPFの場合）【機能】各パラメータで指定した固定長メモリプール生成情報に従って，固定長メモリ
プールを生成する．mpf，blkcnt，blkszから固定長メモリプール領域が，mpfmb，blkcnt，blkszから固定長メモリプール管理領域がそれぞれ設定され，メモリプール領域全体が未割当ての状態に初期化される．また，待ち行列は空の状態に初期化される．
静的APIにおいては，mpfidはオブジェクト識別名，blkcntとblkszは整数定数式
パラメータ，mpfとmpfmbは一般定数式パラメータである．コンフィギュレータ
は，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
mpfをNULLとした場合，blkcntとblkszから決まるサイズの固定長メモリプール
領域を，コンフィギュレータまたはカーネルが確保する．
mpfがNULLでない場合，blkcntとblkszから決まるサイズの固定長メモリプール
領域を，アプリケーションで確保する．固定長メモリプール領域をアプリケー
ションで確保するために，次のデータ型とマクロを用意している．
MPF̲T

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

COUNT̲MPF̲T(blksz)

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

ngki̲spec‑110.txt

page 136
い方に丸めた値）

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

この時，mpfには<固定長メモリプール領域の変数名>を指定する．
これ以外の方法で固定長メモリプール領域を確保する場合には，先頭番地がター
ゲットシステムの制約に合致しており，上記の配列と同じサイズのメモリ領域を確保しなければならない．mpfにターゲットシステムの制約に合致しない先頭
番地を指定した時には，E̲PARエラーとなる．
mpfmbをNULLとした場合，blkcntとblkszの指定に合致したサイズのデータキュー
管理領域を，コンフィギュレータまたはカーネルが確保する．
blkcntとblkszは，0より大きい値でなければならない．
【未決定事項】
mpfmbがNULLでない場合に，固定長メモリプール領域をアプリケーションで確保する方法については，今後の課題である．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，CRE̲MPFのみをサポートする．また，mpfmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲MPFのみをサポートする．また，mpfmbにはNULLのみを渡すことができる．NULL以外を指定した場合には，E̲NOSPTエラーとなる．
【μITRON4.0仕様との関係】
μITRON4.0/PX仕様にあわせて，固定長メモリプール生成情報に，mpfmb（固定長メモリプール管理領域の先頭番地）を追加した．また，mpfのデータ型を
MPF̲T *に変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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
管理操作のアクセス許可パターン

ngki̲spec‑110.txt
ACPTN

page 137

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

参照操作のアクセス許可パターン

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

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

【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【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̲NOEXSE̲OACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（mpfidが不正）
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する管理操作が許可されていない）
オブジェクト状態エラー（対象固定長メモリプールは静的APIで生成された）【機能】
mpfidで指定した固定長メモリプール（対象固定長メモリプール）を削除する．
具体的な振舞いは以下の通り．

ngki̲spec‑110.txt

page 138

対象固定長メモリプールの登録が解除され，その固定長メモリプール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
E̲DLT

【機能】

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

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

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

ngki̲spec‑110.txt

page 139

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)【パラメータ】
ID

mpfid【リターンパラメータ】

対象固定長メモリプールのID番号

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

page 140

ercd

正常終了（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
固定長メモリプール領域の空きメモリ領域に割り付けることができる固定長メモリブロックの数【エラーコード】
E̲CTX
E̲ID

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

page 141
オブジェクト未登録（対象固定長メモリプールが未登録）
オブジェクトアクセス違反（対象固定長メモリプールに対する参照操作が許可されていない）
メモリアクセス違反（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 マルチプロセッサ対応」の節を参照すること．
マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には，
タイムアウト処理とタスクの遅延処理には，待ち解除されるタスクが割り付けられているプロセッサのシステム時刻が用いられる．また，周期ハンドラとアラームハンドラの起動には，それが割り付けられているプロセッサのシステム
時刻が用いられる．これらの処理単位がマイグレーションする場合には，用いられるシステム時刻も変更される．この場合にも，イベントの処理が行われるのは，基準時刻から相対時間によって指定した以上の時間が経過した後となるという原則は維持される．
1回のタイムティックの発生により，複数の処理を行うべき状況になった場合，それらの処理の間の処理順序は規定されない．
性能評価用システム時刻は，性能評価に使用することを目的とした，システム
時刻よりも精度の高い時刻である．性能評価用システム時刻は，符号無しの整数型であるSYSUTM型で表され，単位はマイクロ秒である．ただし，実際の精度

ngki̲spec‑110.txt

page 142はターゲット依存である．
マルチプロセッサ対応カーネルにおける性能評価用システム時刻の扱いは，ター
ゲット定義とする．
システム時刻管理機能に関連するカーネル構成マクロは次の通り．
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が指すメモリ領域への書
込みアクセスが許可されていない）【機能】
システム時刻の現在値を参照する．参照したシステム時刻は，p̲systimで指定したメモリ領域に返される．
マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には，自タスクが割り付けられているプロセッサのシステム時刻の現在値を参照する．
【補足説明】
マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合に，他のプロセッサのシステム時刻の現在値を参照する機能は用意していない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲utm
性能評価用システム時刻の参照〔TI〕

ngki̲spec‑110.txt

page 143【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自身の処理時間を加えたものが得られる．
マルチプロセッサ対応カーネルにおいては，異なるプロセッサで読み出した性
能評価用システム時刻の差を求めることで，処理時間が正しく計測できるとは限らない．
【使用上の注意】get̲utmは性能評価のための機能であり，その他の目的に使用することは推奨しない．
タイマ割込みが長時間禁止されている，タイマ割込みよりも優先度の高い割込み処理が長時間続けて実行された，シミュレーション環境においてシミュレー
タのプロセスが長時間スケジュールされなかったなどの理由で，システム時刻の更新が正しく行えない状況では，get̲utmは誤った性能評価用システム時刻を返す可能性がある．システム時刻の更新が確実に行われることを保証できない
場合には，get̲utmが誤った性能評価用システム時刻を返す可能性を考慮に入れて使用しなければならない．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．

ngki̲spec‑110.txt

page 144‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.6.2 周期ハンドラ
周期ハンドラは，指定した周期で起動されるタイムイベントハンドラである．
周期ハンドラは，周期ハンドラIDと呼ぶID番号によって識別する．
各周期ハンドラが持つ情報は次の通り．
・周期ハンドラ属性
・周期ハンドラの動作状態
・次に周期ハンドラを起動するシステム時刻
・拡張情報
・周期ハンドラの先頭番地
・起動周期
・起動位相
・アクセス許可ベクタ（保護機能対応カーネルの場合）
周期ハンドラの起動時刻は，後述する基準時刻から，以下の式で求められる相対時間後である．
起動位相＋起動周期×(n−1)

n＝1,2,…

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

0x01U
0x02U

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

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

ngki̲spec‑110.txt

page 145}
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
周期ハンドラの起動周期
RELTIM
cycphs
周期ハンドラの起動位相【リターンパラメータ】
ER̲ID
cycid

【エラーコード】
E̲CTX
E̲RSATR
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（cycatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（cychdr，cyctim，cycphsが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲ccycが指すメモリ領域への読出しアクセスが許可されていない）

ngki̲spec‑110.txt
E̲NOID
E̲OBJ

page 146
ID番号不足（割り付けられる周期ハンドラIDがない：
acre̲cycの場合）
オブジェクト状態エラー（cycidで指定した周期ハンドラが登録済み：CRE̲CYCの場合）【機能】各パラメータで指定した周期ハンドラ生成情報に従って，周期ハンドラを生成する．具体的な振舞いは以下の通り．
cycatrにTA̲STAを指定した場合，対象周期ハンドラは動作している状態となる．
次に周期ハンドラを起動するシステム時刻は，静的APIの場合はcycphsで指定したシステム時刻に，サービスコールの場合は呼び出してからcycphsで指定した相対時間後に設定される．
cycatrにTA̲STAを指定しない場合，対象周期ハンドラは動作していない状態に初期化される．
静的APIにおいては，cycidはオブジェクト識別名，cycatr，cyctim，cycphsは整数定数式パラメータ，exinfとcychdrは一般定数式パラメータである．
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カーネルにおける規定】
ASPカーネルでは，CRE̲CYCのみをサポートする．ただし，TA̲PHS属性の周期ハ
ンドラはサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，CRE̲CYCのみをサポートする．ただし，TA̲PHS属性の周期ハ
ンドラはサポートしない．
【μITRON4.0仕様との関係】
cychdrのデータ型をCYCHDRに変更した．また，cycphsにcyctimより大きい値を指定した場合の振舞いと，静的APIでcycphsに0を指定した場合の振舞いを規定した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑SAC̲CYC
周期ハンドラのアクセス許可ベクタの設定〔SP〕
sac̲cyc
周期ハンドラのアクセス許可ベクタの設定〔TPD〕【静的API】
SAC̲CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2,

ngki̲spec‑110.txt

page 147
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̲CTX
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象周期ハンドラは静的APIで生成された：sac̲cycの場合，対象周期ハンドラに対して
アクセス許可ベクタが設定済み：SAC̲CYCの場合）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【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

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

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

E̲ID
E̲NOEXSE̲OACV〔P〕
E̲OBJ

page 148
し，CPUロック状態からの呼出し）
不正ID番号（cycidが不正）
オブジェクト未登録（対象周期ハンドラが未登録）
オブジェクトアクセス違反（対象周期ハンドラに対する管理操作が許可されていない）
オブジェクト状態エラー（対象周期ハンドラは静的APIで生成された）【機能】
cycidで指定した周期ハンドラ（対象周期ハンドラ）を削除する．具体的な振舞
いは以下の通り．
対象周期ハンドラの登録が解除され，その周期ハンドラ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属性の周期ハンドラの場合には，次に周期ハンドラを起動するシステム時刻は変化しない）．

ngki̲spec‑110.txt

page 149【μITRON4.0仕様との関係】
TA̲PHS属性でない周期ハンドラにおいて，sta̲cycを呼び出した後，最初に周期ハンドラが起動される時刻を変更した．μITRON4.0仕様では，sta̲cycを呼び出してから周期ハンドラの起動周期で指定した相対時間後となっているが，この仕様では，起動位相で指定した相対時間後とした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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を呼び出して以降の最初の起動時刻に設定される．TA̲PHS属性でない
周期ハンドラの場合には，msta̲cycを呼び出してから，対象周期ハンドラの起動周期で指定した相対時間後に設定されることになる．
対象周期ハンドラが動作している状態であれば，対象周期ハンドラの割付けプ
ロセッサがprcidで指定したプロセッサに変更された後，次に周期ハンドラを起動するシステム時刻の再設定が行われる（TA̲PHS属性の周期ハンドラの場合には，次に周期ハンドラを起動するシステム時刻は変化しない）．
対象周期ハンドラが実行中である場合には，割付けプロセッサを変更しても，実行中の周期ハンドラを実行するプロセッサは変更されない．対象周期ハンドラが変更後の割付けプロセッサで実行されるのは，次に起動される時からである．
対象周期ハンドラの属するクラスの割付け可能プロセッサが，prcidで指定したプロセッサを含んでいない場合には，E̲PARエラーとなる．
prcidにTPRC̲INI（＝0）を指定すると，対象周期ハンドラの割付けプロセッサngki̲spec‑110.txt

page 150を，それが属するクラスの初期割付けプロセッサとする．
グローバルタイマ方式を用いている場合，msta̲cycはE̲NOSPTを返す．
【使用上の注意】msta̲cycで，実行中の周期ハンドラの割付けプロセッサを変更した場合，同じ
アラームハンドラが異なるプロセッサで同時に実行される可能性がある．特に，
対象周期ハンドラの起動位相が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（マルチプ
ロセッサ対応カーネルの場合）【エラーコード】
E̲CTX

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

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

page 151
し，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‑110.txt

page 152る時に設定され，動作停止する時に設定解除される．
アラームハンドラが動作している状態の場合には，アラームハンドラを起動するシステム時刻になると，アラームハンドラの起動処理が行われる．具体的には，まず，アラームハンドラが動作していない状態にされる．その後に，拡張情報をパラメータとして，アラームハンドラの先頭番地が呼び出される．
マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には，
アラームハンドラは，割付け可能プロセッサがシステム時刻管理プロセッサのみであるクラスにのみ属することができる．すなわち，アラームハンドラは，
システム時刻管理プロセッサによって実行される．
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
アラームハンドラの先頭番地【リターンパラメータ】
ER̲ID
almid

【エラーコード】
E̲CTX

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

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

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

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

page 154

ercd

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（almidが不正）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象アラームハンドラは静的
APIで生成された：sac̲almの場合，対象アラームハンドラに対してアクセス許可ベクタが設定済み：SAC̲ALMの場
合）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【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̲NOEXSE̲OACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（almidが不正）
オブジェクト未登録（対象アラームハンドラが未登録）
オブジェクトアクセス違反（対象アラームハンドラに対する管理操作が許可されていない）
オブジェクト状態エラー（対象アラームハンドラは静的
APIで生成された）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）を削除する．具体的な振舞いは以下の通り．
対象アラームハンドラの登録が解除され，そのアラームハンドラIDが未使用の状態に戻される．対象アラームハンドラが動作している状態であった場合には，

ngki̲spec‑110.txt

page 155

登録解除の前に，アラームハンドラを起動するシステム時刻が設定解除され，動作していない状態となる．
【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)【パラメータ】
ID
RELTIMalmid
almtim【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX

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

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

正常終了（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)【パラメータ】
IDalmid

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

ngki̲spec‑110.txt
RELTIM
ID

page 156

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

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

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

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

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

ngki̲spec‑110.txt
stp̲almistp̲alm

page 157

アラームハンドラの動作停止〔T〕
アラームハンドラの動作停止〔I〕【C言語API】
ER ercd = stp̲alm(ID almid)
ER ercd = istp̲alm(ID almid)【パラメータ】
ID

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

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し：stp̲almの場合，タスクコンテキストからの呼出し：
istp̲almの場合，CPUロック状態からの呼出し）
不正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が指すメモリ領域への書込ngki̲spec‑110.txt

page 158
みアクセスが許可されていない）【機能】
almidで指定したアラームハンドラ（対象アラームハンドラ）の現在状態を参照
する．参照した現在状態は，pk̲ralmで指定したパケットに返される．
almstatには，対象アラームハンドラの現在の動作状態を表す次のいずれかの値が返される．
TALM̲STPTALM̲STA

0x01U
0x02U

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

対象アラームハンドラが動作している状態である場合には，lefttimに，アラー
ムハンドラ起動する時刻までの相対時間が返される．対象アラームハンドラが動作していない状態である場合には，lefttimの値は保証されない．
マルチプロセッサ対応カーネルでは，prcidに，対象アラームハンドラの割付け
プロセッサのID番号が返される．
【使用上の注意】ref̲almはデバッグ時向けの機能であり，その他の目的に使用することは推奨しない．これは，ref̲almを呼び出し，対象アラームハンドラの現在状態を参照した直後に割込みが発生した場合，ref̲almから戻ってきた時には対象アラームハ
ンドラの状態が変化している可能性があるためである．
【μITRON4.0仕様との関係】
TALM̲STPとTALM̲STAを値を変更した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.6.4 オーバランハンドラ☆未完成
C言語によるオーバランハンドラの記述形式は次の通り．
void overrun̲handler(ID tskid, intptr̲t exinf){
オーバランハンドラ本体}
tskidにはオーバランを起こしたタスクのID番号が，exinfにはそのタスクの拡張情報が，それぞれ渡される．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，オーバランハンドラをサポートしていない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，オーバランハンドラをサポートしていない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑DEF̲OVRオーバランハンドラの定義〔S〕
def̲ovr
オーバランハンドラの定義〔TD〕【静的API】

ngki̲spec‑110.txt

page 159

DEF̲OVR({ ATR ovratr, OVRHDR ovrhdr })【C言語API】
ER ercd = def̲ovr(const T̲DOVR *pk̲dovr)☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sta̲ovr
オーバランハンドラの動作開始〔T〕【C言語API】
ER ercd = sta̲ovr(ID tskid, OVRTIM ovrtim)☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
stp̲ovr
オーバランハンドラの動作停止〔T〕【C言語API】
ER ercd = stp̲ovr(ID tskid)☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲ovr
オーバランハンドラの状態参照〔T〕【C言語API】
ER ercd = ref̲ovr(ID tskid, T̲ROVR *pk̲rovr)☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.7 システム状態管理機能☆未完成‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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

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

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

E̲OACV
E̲MACV〔P〕
E̲OBJ

page 160
し，CPUロック状態からの呼出し）
オブジェクトアクセス違反（カーネルドメイン以外からの呼出し）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（システム状態のアクセス許可
ベクタが設定済み）【機能】
システム状態のアクセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，SAC̲SYS，sac̲sysをサポートしない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，SAC̲SYS，sac̲sysをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
rot̲rdq
タスクの優先順位の回転〔T〕
irot̲rdq
タスクの優先順位の回転〔I〕【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で指定した優先度（対象優先度）を持つ実行できる状態のタスクの中で，最も優先順位が高いタスクを，同じ優先度のタスクの中で最も優先順位が低い状態にする．
rot̲rdqにおいて，tskpriにTPRI̲SELF（＝0）を指定すると，自タスクのベース
優先度が対象優先度となる．
tskpriは，TPRI̲SELFであるか（rot̲rdqの場合のみ），TMIN̲TPRI以上，
TMAX̲TPRI以下でなければならない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
mrot̲rdq
プロセッサ指定でのタスクの優先順位の回転〔TM〕
imrot̲rdq
プロセッサ指定でのタスクの優先順位の回転〔IM〕【C言語API】

ngki̲spec‑110.txt

page 161

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で指定した優先度（対象優先度）
を持つ実行できる状態のタスクの中で，最も優先順位が高いタスクを，同じ優先度のタスクの中で最も優先順位が低い状態にする．
mrot̲rdqにおいて，tskpriにTPRI̲SELF（＝0）を指定すると，自タスクのベース優先度が対象優先度となる．
tskpriは，TPRI̲SELFであるか（mrot̲rdqの場合のみ），TMIN̲TPRI以上，
TMAX̲TPRI以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，mrot̲rdq，imrot̲rdqをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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が指すメモリ領域への書込
みアクセスが許可されていない）

ngki̲spec‑110.txt

page 162

実行状態のタスクのID番号を参照する．参照したタスクIDは，p̲tskidで指定したメモリ領域に返される．
iget̲tidにおいて，実行状態のタスクがない場合には，TSK̲NONE（＝0）が返される．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑get̲did
実行状態のタスクの所属する保護ドメインIDの参照〔TP〕【C言語API】
ER ercd = get̲did(ID *p̲domid)【パラメータ】ID *p̲domid【リターンパラメータ】
ER
ercd
ID
domid
【エラーコード】
E̲CTX
E̲MACV

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

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
メモリアクセス違反（p̲domidが指すメモリ領域への書込
みアクセスが許可されていない）【機能】
実行状態のタスク（自タスク）の所属する保護ドメインのID番号を参照する．
参照した保護ドメインIDは，p̲domidで指定したメモリ領域に返される．
【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が指すメモリ領域への書込
みアクセスが許可されていない）

ngki̲spec‑110.txt

page 163【機能】
サービスコールを呼び出した処理単位の割付けプロセッサのID番号を参照する．
参照したプロセッサIDは，p̲prcidで指定したメモリ領域に返される．
【使用上の注意】
タスクは，get̲pidを用いて，自タスクの割付けプロセッサを正しく参照できるとは限らない．これは，get̲pidを呼び出し，自タスクの割付けプロセッサのID番号を参照した直後に割込みが発生した場合，get̲pidから戻ってきた時には割付けプロセッサが変化している可能性があるためである．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，get̲pid，iget̲pidをサポートしない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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̲OK）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し：unl̲cpuの場合，タスクコンテキストからの呼出し：
iunl̲cpuの場合）

ngki̲spec‑110.txt
E̲OACV〔P〕

page 164
オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない：unl̲cpuの場合）【機能】
CPUロックフラグをクリアし，CPUロック解除状態へ遷移する．CPUロック解除状
態で呼び出した場合には何も起こらない．
マルチプロセッサ対応カーネルにおいて，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〕

ngki̲spec‑110.txt

page 165【C言語API】
bool̲t state = sns̲ctx()【パラメータ】
なし【リターンパラメータ】
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()【パラメータ】

ngki̲spec‑110.txt

page 166

なし【リターンパラメータ】
bool̲t state

ディスパッチ保留状態【機能】
ディスパッチ保留状態であるか否かを参照する．具体的な振舞いは以下の通り．
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【エラーコード】

エラーコードngki̲spec‑110.txt
E̲OACV

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

【機能】
カーネルを終了する．具体的な振舞いについては，「2.9.2 システム終了手順」の節を参照すること．
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 メモリオブジェクト管理機能☆未完成
4.9 割込み管理機能
割込み処理のプログラムは，割込みサービスルーチン（ISR）として実現することを推奨する．割込みサービスルーチンをカーネルに登録する場合には，まず，割込みサービスルーチンの登録対象となる割込み要求ラインの属性を設定しておく必要がある．割込みサービスルーチンは，カーネル内の割込みハンドラを経由して呼び出される．
ただし，カーネルが用意する割込みハンドラで対応できないケースに対応する
ために，アプリケーションで割込みハンドラを用意することも可能である．この場合にも，割込みハンドラをカーネルに登録する前に，割込みハンドラの登録対象となる割込みハンドラ番号に対応する割込み要求ラインの属性を設定しておく必要がある．
割込み要求ラインの属性を設定する際に指定する割込み要求ライン属性には，次の属性を指定することができる．
TA̲ENAINTTA̲EDGE

0x01U
0x02U

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

ngki̲spec‑110.txt
TA̲POSEDGETA̲NEGEDGETA̲BOTHEDGETA̲LOWLEVELTA̲HIGHLEVELTA̲BROADCAST

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

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

ngki̲spec‑110.txt

page 169【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，割込みサービスルーチン優先度の最大値（＝TMAX̲ISRPRI）
は16に固定されている．ただし，タスク優先度拡張パッケージでは，TMAX̲ISRPRIを256に拡張する．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，割込みサービスルーチン優先度の最大値（＝TMAX̲ISRPRI）
は16に固定されている．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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を除く）＊割込み要求ラインの属性の設定情報（パケットの内容）
ATR
intatr
割込み要求ライン属性
PRI
intpri
割込み優先度【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲RSATR
E̲PAR
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（intatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（intnoが不正，intpriが不正）オブジェクト状態エラー（対象割込み要求ラインに対してすでに属性が設定されている：CFG̲INTの場合，カーネ
ル管理の割込みか否かとintpriの値が整合していない）【機能】
intnoで指定した割込み要求ライン（対象割込み要求ライン）に対して，各パラ
メータで指定した属性を設定する．
対象割込み要求ラインの割込み要求禁止フラグは，intatrにTA̲ENAINTを指定した場合にクリアされ，指定しない場合にセットされる．
静的APIにおいては，intno，intatr，intpriは整数定数式パラメータである．
cfg̲intにおいて，ターゲット定義で，複数の割込み要求ラインの割込み優先度
が連動して設定される場合がある．
CFG̲INTにおいて，対象割込み要求ラインに対してすでに属性が設定されている場合（言い換えると，同じ割込み番号に対するCFG̲INTが複数ある場合）には，
E̲OBJエラーとなる．

ngki̲spec‑110.txt

page 170

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エラーとなる．
【補足説明】
ターゲット定義の制限によって設定できない割込み属性／割込み優先度は，主にターゲットハードウェアの制限から来るものである．例えば，対象割込み要求ラインに対して，トリガモードや割込み優先度が固定されていて，変更できないケースが考えられる．
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)【パラメータ】

ngki̲spec‑110.txt

page 171

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
E̲RSATR
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲NOIDE̲OBJ

生成された割込みサービスルーチンのID番号（正の値）またはエラーコード

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（isratrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（intno，isr，isrpriが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲cisrが指すメモリ領域への読出しアクセスが許可されていない）
ID番号不足（割り付けられる割込みサービスルーチンIDがない：acre̲isrの場合）
オブジェクト状態エラー（isridで指定した割込みサービ
スルーチンが登録済み：CRE̲ISRの場合，その他の条件については機能説明を参照すること）【機能】
各パラメータで指定した割込みサービスルーチン生成情報に従って，割込みサー
ビスルーチンを生成する．
ATT̲ISRによって生成された割込みサービスルーチンは，ID番号を持たない．
intnoで指定した割込み要求ラインの属性が設定されていない場合には，E̲OBJ
エラーとなる．また，intnoで指定した割込み番号に対応する割込みハンドラ番号に対して，割込みハンドラを定義する機能（DEF̲INH，def̲inh）によって割込みハンドラが定義されている場合にも，E̲OBJエラーとなる．さらに，intno
でカーネル管理外の割込みを指定した場合にも，E̲OBJエラーとなる．
マルチプロセッサ対応カーネルで，生成する割込みサービスルーチンの属するクラスの割付け可能プロセッサが，intnoで指定した割込み要求ラインが接続されたプロセッサの集合に含まれていない場合には，E̲RSATRエラーとなる．また，
intnoで指定した割込み要求ラインに対して登録済みの割込みサービスルーチンがある場合に，生成する割込みサービスルーチンがそれと異なるクラスに属す
る場合にも，E̲RSATRエラーとなる．
isrpriは，TMIN̲ISRPRI以上，TMAX̲ISRPRI以下でなければならない．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ATT̲ISRのみをサポートする．

ngki̲spec‑110.txt

page 172【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，ATT̲ISRのみをサポートする．
【μITRON4.0仕様との関係】
割込みサービスルーチンの生成情報に，isrpri（割込みサービスルーチンの割
込み優先度）を追加した．CRE̲ISRは，μITRON4.0仕様に定義されていない静的
APIである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑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
E̲ID
E̲NOEXS〔D〕
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
不正ID番号（isridが不正）
オブジェクト未登録（対象割込みサービスルーチンが未登録）
オブジェクトアクセス違反（対象割込みサービスルーチ
ンに対する管理操作が許可されていない）
メモリアクセス違反（p̲acvctが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（対象割込みサービスルーチン
は静的APIで生成された：sac̲isrの場合，対象割込みサー
ビスルーチンに対してアクセス許可ベクタが設定済み：
SAC̲ISRの場合）【機能】
isridで指定した割込みサービスルーチン（対象割込みサービスルーチン）のア
クセス許可ベクタ（4つのアクセス許可パターンの組）を，各パラメータで指定した値に設定する．
【TOPPERS/ASPカーネルにおける規定】

ngki̲spec‑110.txt

page 173

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をサポートしていない．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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
割込みハンドラの先頭番地

ngki̲spec‑110.txt

page 174【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲OACV〔P〕
E̲MACV〔P〕
E̲RSATR
E̲PAR
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dinhが指すメモリ領域への読出しアクセスが許可されていない）
予約属性（inhatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（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にTA̲NONKERNELを指定した場合にも，E̲OBJエラーとなる．また，ターゲット定義
でカーネル管理外に固定されている割込みハンドラがある場合には，それを対象割込みハンドラに指定して，inhatrにTA̲NONKERNELを指定しない場合には，
E̲RSATRエラーとなる．逆に，ターゲット定義でカーネル管理に固定されている
割込みハンドラがある場合には，それを対象割込みハンドラに指定して，
inhatrにTA̲NONKERNELを指定した場合には，E̲RSATRエラーとなる．
割込みハンドラの定義を解除する場合（def̲inhにおいてpk̲dinhをNULLにした場合）で，対象割込みハンドラ番号に対して割込みハンドラが定義されていな
い場合には，E̲OBJエラーとなる．
マルチプロセッサ対応カーネルで，登録する割込みハンドラの属するクラスの初期割付けプロセッサが，その割込みが要求されるプロセッサでない場合には，
E̲RSATRエラーとなる．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，DEF̲INHのみをサポートする．

ngki̲spec‑110.txt

page 175【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̲OACV〔P〕
E̲OBJ

割込み番号

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

未サポートエラー（dis̲intがサポートされていない）
コンテキストエラー（非タスクコンテキストからの呼出し）パラメータエラー（intnoが不正，intnoで指定した割込
み要求ラインに対して割込み要求禁止フラグをセットすることはできない）
オブジェクトアクセス違反（システム状態に対する通常
操作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)【パラメータ】

ngki̲spec‑110.txt
INTNO

page 176

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の意味を標準化した．
CPUロック状態でも呼び出せるものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲int
割込み要求ラインの参照〔T〕【C言語API】
ER ercd = ref̲int(ID intid, 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)【パラメータ】

ngki̲spec‑110.txt
PRI

page 177

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

割込み優先度マスク

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

コンテキストエラー（非タスクコンテキストからの呼出し）パラメータエラー（intpriが不正）オブジェクトアクセス違反（システム状態に対する通常
操作2が許可されていない）【機能】
割込み優先度マスクを，intpriで指定した値に変更する．
intpriは，TMIN̲INTPRI以上，TIPM̲ENAALL以下でなければならない．ただし，ターゲット定義の拡張として，TMIN̲INTPRIよりも小さい値を指定できる場合がある．
【補足説明】
割込み優先度マスクをTIPM̲ENAALLに変更した場合，ディスパッチ保留状態が解除され，ディスパッチが起こる可能性がある．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，サービスコールの名称およびパラメータの名称が実装定義となっているサービスコールである．
CPUロック状態でも呼び出せるものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
get̲ipm
割込み優先度マスクの参照〔T〕【C言語API】
ER ercd = get̲ipm(PRI *p̲intpri)【パラメータ】
PRI *p̲intpri【リターンパラメータ】
ER
ercd
PRI
intpri【エラーコード】
E̲CTX
E̲OACV〔P〕

割込み優先度マスクを入れるメモリ領域へのポインタ

エラーコード割込み優先度マスク

コンテキストエラー（非タスクコンテキストからの呼出し）オブジェクトアクセス違反（システム状態に対する参照
操作が許可されていない）【機能】
割込み優先度マスクの現在値を参照する．
【μITRON4.0仕様との関係】
μITRON4.0仕様では，サービスコールの名称およびパラメータの名称が実装定ngki̲spec‑110.txt

page 178

義となっているサービスコールである．
CPUロック状態でも呼び出せるものとした．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.10 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】
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
E̲RSATR
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（excatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（excnoが不正，exchdrが不正）
オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dexcが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（定義済みのCPU例外ハンドラ番号に対する再定義，未定義のCPU例外ハンドラ番号に対す
る定義解除）

ngki̲spec‑110.txt

page 179【機能】
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エラーとなる．
CPU例外ハンドラの定義を解除する場合（def̲excにおいてpk̲dexcをNULLにした場合）で，対象CPU例外ハンドラ番号に対してCPU例外ハンドラが定義されていない場合には，E̲OBJエラーとなる．
マルチプロセッサ対応カーネルで，登録するCPU例外ハンドラの属するクラスの初期割付けプロセッサが，そのCPU例外が発生するプロセッサでない場合には，
E̲RSATRエラーとなる．
【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例外が，タスクコンテキストで発生し，そのタスクがディスパッチできる状態である場合にfalse，そうでない場合にtrueが返る．
保護機能対応のカーネルにおいて，xsns̲dpnをタスクコンテキストから呼び出ngki̲spec‑110.txt

page 180

した場合には，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が返るか間違いやすいので注意すること．
【μ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例外が，タスクコンテキストで発生し，そのタスクがタスク例外処理ルーチンを実行できる状態である場合にfalse，そうでない場合にtrueが返る．
保護機能対応のカーネルにおいて，xsns̲xpnをタスクコンテキストから呼び出した場合には，trueが返る．
p̲excinfには，CPU例外ハンドラに渡されるp̲excinfパラメータをそのまま渡す．
ターゲット定義の制限として，CPU例外がタスクコンテキストで発生し，そのタスクがタスク例外処理ルーチンを実行できる状態であっても，そのタスクが割込み優先度マスクをTMIN̲INTPRI（またはそれよりも高い値）に設定している場
合には，trueが返る場合がある．
【使用方法】

ngki̲spec‑110.txt

page 181xsns̲xpnは，CPU例外ハンドラの中で，どのようなリカバリ処理が可能かを判別したい場合に使用する．xsns̲xpnがfalseを返した場合（trueを返した場合ではないので注意すること），非タスクコンテキスト用のサービスコールを用いてCPU例外を起こしたタスクにタスク例外を要求し，タスク例外処理ルーチンでリカバリ処理を行うことができる．
【使用上の注意】xsns̲xpnは，E̲CTXエラーを返すことがないために〔TI〕となっているが，CPU
例外ハンドラから呼び出すためのものである．CPU例外ハンドラ以外から呼び出した場合や，p̲excinfに正しい値を渡さなかった場合，xsns̲xpnが返す値は意
味を持たない．
どちらの条件でtrueが返るか間違いやすいので注意すること．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていないサービスコールである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.11 拡張サービスコール管理機能
拡張サービスコールは，非特権モードで実行される処理単位から，特権モード
で実行すべきルーチンを呼び出すための機能である．特権モードで実行するルー
チンを，拡張サービスコールルーチンと呼ぶ．拡張サービスコールは，特権モードで実行される処理単位からも呼び出すことができる．
保護機能対応でないカーネルでは，非特権モードと特権モードの区別がないため，拡張サービスコール管理機能をサポートしない．
C言語による拡張サービスコールルーチンの記述形式は次の通り．
ER̲UINT extended̲svc̲routine(ID cdmid, intptr̲t par1, intptr̲t par2,
intptr̲t par3, intptr̲t par4, intptr̲t par5){
拡張サービスコールルーチン本体}
cdmidには，拡張サービスコールを呼び出した処理単位が属する保護ドメインのID番号が渡される．すなわち，拡張サービスコールから呼び出した場合にはTDOM̲KERNEL（＝0）が，タスク本体（拡張サービスコールを除く）から呼び出した場合にはそのタスク（自タスク）の属する保護ドメインIDが渡される．
par1〜par5には，拡張サービスコールルーチンに対するパラメータが渡される．
拡張サービスコール管理機能に関連するカーネル構成マクロは次の通り．
TMAX̲FNCD

拡張サービスコールの機能番号の最大値（動的生成対応
カーネルでは，登録できる拡張サービスコールの数に一致）【μITRON4.0仕様との関係】
この仕様では，拡張サービスコールに対するパラメータを，intptr̲t型のパラメータ5個に固定した．
拡張サービスコールルーチンが呼び出される時に，スタックの残り領域のサイngki̲spec‑110.txt

page 182

ズをチェックする機能を追加した．
TMAX̲FNCDは，μITRON4.0仕様に規定されていないカーネル構成マクロである．
【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，拡張サービスコール管理機能をサポートしていない．
【TOPPERS/FMPカーネルにおける規定】
FMPカーネルでは，拡張サービスコール管理機能をサポートしていない．
【未決定事項】
動的生成対応カーネルにおいてTMAX̲FNCDを設定する方法については，現時点では未決定である．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
DEF̲SVC
拡張サービスコールの定義〔SP〕
def̲svc
拡張サービスコールの定義〔TPD〕【静的API】
DEF̲SVC(FN fncd, { ATR svcatr, EXTSVC svcrtn, SIZE stksz })【C言語API】
ER ercd = def̲svc(FN fncd, const T̲DSVC *pk̲dsvc, SIZE stksz)【パラメータ】
FN
T̲DSVC *fncd
pk̲dsvc

拡張サービスコールの機能コード
拡張サービスコールの定義情報を入れたパケッ
トへのポインタ（静的APIを除く）＊拡張サービスコールの定義情報（パケットの内容）
ATR
svcatr
拡張サービスコール属性
EXTSVC
svcrtn拡張サービスコールルーチンの先頭番地
SIZE
stksz
拡張サービスコールで使用するスタックサイズ【リターンパラメータ】
ER
ercd【エラーコード】
E̲CTX
E̲RSATR
E̲PAR
E̲OACV〔P〕
E̲MACV〔P〕
E̲OBJ

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

コンテキストエラー（非タスクコンテキストからの呼出
し，CPUロック状態からの呼出し）
予約属性（svcatrが不正または使用できない，属する保護ドメインかクラスが不正）
パラメータエラー（fncdが不正，svcrtnが不正）オブジェクトアクセス違反（システム状態に対する管理操作が許可されていない）
メモリアクセス違反（pk̲dsvcが指すメモリ領域への読出しアクセスが許可されていない）
オブジェクト状態エラー（定義済みの機能コードに対す
る再定義，未定義の機能コードに対する定義解除）【機能】
fncdで指定した機能コード（対象機能コード）に対して，各パラメータで指定した拡張サービスコール定義情報に従って，拡張サービスコールを定義する．
ただし，def̲svcにおいてpk̲dsvcをNULLにした場合には，対象機能コードに対する拡張サービスコールの定義を解除する．

ngki̲spec‑110.txt

page 183

静的APIにおいては，fncd，svcatr，stkszは整数定数式パラメータ，svchdrは一般定数式パラメータである．
拡張サービスコールを定義する場合（DEF̲SVCの場合およびdef̲svcにおいて
pk̲dsvcをNULL以外にした場合）で，対象機能コードに対してすでに拡張サービ
スコールが定義されている場合には，E̲OBJエラーとなる．
拡張サービスコールの定義を解除する場合（def̲svcにおいてpk̲dsvcをNULLにした場合）で，対象機能コードに対して拡張サービスコールが定義されていな
い場合には，E̲OBJエラーとなる．
拡張サービスコールの機能コードには，正の値を用いる．fncdが0または負の値の場合には，E̲PARエラーとなる．また，fncdがTMAX̲FNCDよりも大きい場合にも，E̲PARエラーとなる．
【μITRON4.0仕様との関係】
拡張サービスコールの定義情報に，stksz（拡張サービスコールで使用するスタックサイズ）を追加した．
svcrtnのデータ型を，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

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

呼び出す拡張サービスコールの機能コード
拡張サービスコールへの第1パラメータ
拡張サービスコールへの第2パラメータ
拡張サービスコールへの第3パラメータ
拡張サービスコールへの第4パラメータ
拡張サービスコールへの第5パラメータ

正常終了（正の値または0）またはエラーコード【エラーコード】
E̲SYS

システムエラー（拡張サービスコールのネストレベルが上限を超える）
E̲RSFN
予約機能コード（fncdが不正．fncdに対して拡張サービ
スコールが定義されていない）
E̲NOMEM
メモリ不足（スタックの残り領域が不足）＊その他，拡張サービスコールルーチンが返すエラーコードがそのまま返る．

【機能】
fncdで指定した機能コードの拡張サービスコールルーチンを，par1，par2，…，
par5をパラメータとして呼び出し，拡張サービスコールの返値を返す．
fncdが不正な値である場合や，fncdで指定した機能コードに対して拡張サービ
スコールが定義されていない場合には，E̲RSFNエラーとなる．スタックの残り領域が，拡張サービスコールで使用するスタックサイズよりも小さい場合には，
E̲NOMEMエラーとなる．また，拡張サービスコールのネストレベルが上限（255）を超える場合には，E̲SYSエラーが返る．

ngki̲spec‑110.txt

page 184【μITRON4.0仕様との関係】
μITRON4.0仕様では，cal̲svcでカーネルのサービスコールを呼び出せるかどうかは実装定義としているが，この仕様では，カーネルのサービスコールを呼び出せないこととした．また，拡張サービスコールに対するパラメータを，
intptr̲t型のパラメータ5個に固定した．
パラメータの型と数を固定したのは，型チェックを厳密にできるようにし，パラメータをコンパイラやコーリングコンベンションによらずに正しく渡せるよ
うにするためである．
また，cal̲svcから返るエラー（E̲SYS，E̲RSFN，E̲NOMEM）について規定した．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
4.12 システム構成管理機能
初期化ルーチンは，カーネルが実行を制御する処理単位で，カーネルの動作開始前に，カーネル非動作状態で実行される．
初期化ルーチン属性に指定できる属性はない．そのため初期化ルーチン属性には，TA̲NULLを指定しなければならない．
C言語による初期化ルーチンの記述形式は次の通り．
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 })【パラメータ】

ngki̲spec‑110.txt

page 185＊非タスクコンテキスト用スタック領域の設定情報
SIZE
istksz
非タスクコンテキスト用スタック領域のサイズ
STK̲T
istk
非タスクコンテキスト用スタック領域の先頭番地【エラーコード】
E̲RSATR
E̲PAR
E̲NOMEM
E̲OBJ

予約属性（属する保護ドメインかクラスが不正）
パラメータエラー（istkszが不正，istkが不正）
メモリ不足（非タスクコンテキスト用スタック領域が確保できない）
オブジェクト状態エラー（非タスクコンテキスト用スタッ
ク領域がすでに設定されている）【機能】
各パラメータで指定した非タスクコンテキスト用スタック領域の設定情報に従って，非タスクコンテキスト用スタック領域を設定する．
istkszは整数定数式パラメータ，istkは一般定数式パラメータである．コンフィ
ギュレータは，静的APIのメモリ不足（E̲NOMEM）エラーを検出することができない．
istkをNULLとした場合，istkszで指定したサイズのスタック領域を，コンフィ
ギュレータが確保する．istkszにターゲットシステムの制約に合致しないサイズを指定した時には，ターゲットシステムの制約に合致するようにサイズを大きい方に丸めて確保する．
istkがNULLでない場合，istkszで指定したサイズのスタック領域を，アプリケー
ションで確保する．スタック領域をアプリケーションで確保するために用意しているデータ型とマクロについては，CRE̲TSKの機能説明を参照すること．
DEF̲ICSにより非タスクコンテキスト用スタック領域を設定しない場合，ターゲッ
ト定義のデフォルトのサイズのスタック領域を，コンフィギュレータが確保する．
マルチプロセッサ対応カーネルでは，非タスクコンテキスト用スタック領域はプロセッサ毎に確保する必要がある．DEF̲ICSにより設定する非タスクコンテキ
スト用スタック領域は，非タスクコンテキスト用スタック領域が属するクラスの初期割付けプロセッサが使用する．そのプロセッサに対してすでに非タスク
コンテキスト用スタック領域が設定されている場合には，E̲OBJエラーとなる．
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
初期化ルーチンの先頭番地

ngki̲spec‑110.txt【エラーコード】
E̲RSATR
E̲PAR

page 186

予約属性（iniatrが不正または使用できない，属する保護ドメインが不正）
パラメータエラー（inirtnが不正）【機能】
各パラメータで指定した初期化ルーチン追加情報に従って，初期化ルーチンを追加する．
iniatrは整数定数式パラメータ，exinfとinirtnは一般定数式パラメータである．
【補足説明】
マルチプロセッサ対応カーネルでは，クラスに属さないグローバル初期化ルー
チンはマスタプロセッサで実行され，クラスに属するローカル初期化ルーチン
はそのクラスの初期割付けプロセッサにより実行される．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
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は一般定数式パラメータである．
【補足説明】
マルチプロセッサ対応カーネルでは，クラスに属さないグローバル終了処理ルー
チンはマスタプロセッサで実行され，クラスに属するローカル終了処理ルーチ
ンはそのクラスの初期割付けプロセッサにより実行される．
【μITRON4.0仕様との関係】
μITRON4.0仕様に定義されていない静的APIである．
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ref̲cfg
コンフィギュレーション情報の参照〔T〕【C言語API】
ER ercd = ref̲cfg(T̲RCFG *pk̲rcfg)☆未完成ngki̲spec‑110.txt

page 187【TOPPERS/ASPカーネルにおける規定】
ASPカーネルでは，ref̲cfgをサポートしない．
【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)(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)

ngki̲spec‑110.txt

page 188

ER ercd = dis̲wai(ID tskid)
ER ercd = idis̲wai(ID tskid)
ER ercd = ena̲wai(ID tskid)
ER ercd = iena̲wai(ID tskid)
ER ercd = dly̲tsk(RELTIM dlytim)(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)(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)
イベントフラグ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)
データキュー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)ngki̲spec‑110.txt

page 189

ER ercd = prcv̲dtq(ID dtqid, intptr̲t *p̲data)
ER ercd = trcv̲dtq(ID dtqid, intptr̲t *p̲data, TMO tmout)
ER ercd = ini̲dtq(ID dtqid)
ER ercd = ref̲dtq(ID dtqid, T̲RDTQ *pk̲rdtq)
優先度データキュー
ER̲ID pdqid = acre̲pdq(const T̲CPDQ *pk̲cpdq)
ER ercd = sac̲pdq(ID pdqid, const ACVCT *p̲acvct)
ER ercd = del̲pdq(ID pdqid)
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)
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)
ER ercd = ini̲pdq(ID pdqid)
ER ercd = ref̲pdq(ID pdqid, T̲RPDQ *pk̲rpdq)
メールボックス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)
ミューテックス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)
メッセージバッファ☆ 未完成
スピンロック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)

ngki̲spec‑110.txt

page 190

ER ercd = ref̲spn(ID spnid, T̲RSPN *pk̲rspn)(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)(6) 時間管理機能
システム時刻管理
ER ercd = get̲tim(SYSTIM *p̲systim)
ER ercd = get̲utm(SYSUTM *p̲sysutm)
周期ハンドラ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)
アラームハンドラ
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)
オーバランハンドラ
ER ercd = def̲ovr(const T̲DOVR *pk̲dovr)
ER ercd = sta̲ovr(ID tskid, OVRTIM ovrtim)
ER ercd = stp̲ovr(ID tskid)
ER ercd = ref̲ovr(ID tskid, T̲ROVR *pk̲rovr)(7) システム状態管理機能
ER ercd = sac̲sys(const ACVCT *p̲acvct)
ER ercd = rot̲rdq(PRI tskpri)
ER ercd = irot̲rdq(PRI tskpri)

ngki̲spec‑110.txt

page 191

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)(8) メモリオブジェクト管理機能☆未完成(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(ID intid, T̲RINT *pk̲rint)
ER ercd = chg̲ipm(PRI intpri)
ER ercd = get̲ipm(PRI *p̲intpri)(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)(11) 拡張サービスコール管理機能
ER ercd = def̲svc(FN fncd, const T̲DSVC *pk̲dsvc, SIZE stksz)
ER̲UINT ercd = cal̲svc(FN fcnd, intptr̲t par1, intptr̲t par2,
intptr̲t par3, intptr̲t par4, intptr̲t par5)(12) システム構成管理機能
ER ercd = ref̲cfg(T̲RCFG *pk̲rcfg)
ER ercd = ref̲ver(T̲RVER *pk̲rver)
5.2 静的API一覧

ngki̲spec‑110.txt

page 192(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 })SAC̲TSK(ID tskid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })(2) タスク付属同期機能なし(3) タスク例外処理機能
DEF̲TEX(ID tskid, { ATR texatr, TEXRTN texrtn })(4) 同期・通信機能
セマフォ
CRE̲SEM(ID semid, { ATR sematr, uint̲t isemcnt, uint̲t maxsem })SAC̲SEM(ID semid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })イベントフラグ
CRE̲FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })SAC̲FLG(ID flgid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })データキュー
CRE̲DTQ(ID dtqid, { ATR dtqatr, uint̲t dtqcnt, void *dtqmb })SAC̲DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })優先度データキュー
CRE̲PDQ(ID pdqid, { ATR pdqatr, uint̲t pdqcnt, PRI maxdpri, void *pdqmb })SAC̲PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })メールボックス
CRE̲MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })ミューテックス
CRE̲MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })SAC̲MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })メッセージバッファngki̲spec‑110.txt

page 193☆ 未完成
スピンロック
CRE̲SPN(ID spnid, { ATR spnatr })(5) メモリプール管理機能
固定長メモリプール
CRE̲MPF(ID mpfid, { ATR mpfatr, uint̲t blkcnt, uint̲t blksz,
MPF̲T *mpf, void *mpfmb })SAC̲MPF(ID mpfid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })(6) 時間管理機能
周期ハンドラ
CRE̲CYC(ID cycid, { ATR cycatr, intptr̲t exinf, CYCHDR cychdr,
RELTIM cyctim, RELTIM cycphs })SAC̲CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })アラームハンドラ
CRE̲ALM(ID almid, { ATR almatr, intptr̲t exinf, ALMHDR almhdr })SAC̲ALM(ID almid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })オーバランハンドラ
DEF̲OVR({ ATR ovratr, OVRHDR ovrhdr })(7) システム状態管理機能
SAC̲SYS({ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })(8) メモリオブジェクト管理機能☆未完成(9) 割込み管理機能
CFG̲INT(INTNO intno, { ATR intatr, PRI intpri })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 })SAC̲ISR(ID isrid, { ACPTN acptn1, ACPTN acptn2,
ACPTN acptn3, ACPTN acptn4 })DEF̲INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })(10) CPU例外管理機能
DEF̲EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })(11) 拡張サービスコール管理機能

ngki̲spec‑110.txt

page 194

DEF̲SVC(ID tskid, { ATR svcatr, EXTSVC svcrtn })(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準拠）

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

エラーコードまたは真偽値（符号付き整数，int̲tに定義）

ngki̲spec‑110.txt
ER̲ID
ER̲UINT

ACPTN

page 195

エラーコードまたはID番号（符号付き整数，int̲tに定義，
負のID番号は格納できない）
エラーコードまたは符号無し整数（符号付き整数，int̲tに定義，符号無し整数を格納する場合の有効ビット数はuint̲tより1ビット短い）
アクセス許可パターン（符号無し32ビット整数，uint32̲tに定義）

typedef struct acvct {ACPTN
acptn1;
ACPTN
acptn2;
ACPTN
acptn3;
ACPTN
acptn4;} ACVCT;/* アクセス許可ベクタ *//* 通常操作1のアクセス許可パターン *//* 通常操作2のアクセス許可パターン *//* 管理操作のアクセス許可パターン *//* 参照操作のアクセス許可パターン */5.3.2 カーネルの使用するデータ型
TEXPTNFLGPTN
INTNO
INHNO
EXCNO

タスク例外要因のビットパターン（符号無し整数，uint̲tに定義）
イベントフラグのビットパターン（符号無し整数，uint̲tに定義）
割込み番号（符号無し整数，uint̲tに定義）
割込みハンドラ番号（符号無し整数，uint̲tに定義）
CPU例外ハンドラ番号（符号無し整数，uint̲tに定義）

TASK
TEXRTNCYCHDRALMHDRISR
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;/* タスク属性 *//* タスクの拡張情報 *//* タスクのメインルーチンの先頭番地 *//* タスクの起動時優先度 *//* タスクのスタック領域のサイズ */ngki̲spec‑110.txt

page 196

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;/* 拡張サービスコールのネストレベル *//* 以下は，マルチプロセッサ対応カーネルの場合 */ID
prcid;/* 割付けプロセッサの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 {/* セマフォ属性 *//* セマフォの初期資源数 *//* セマフォの最大資源数 */ngki̲spec‑110.txt
IDuint̲t} T̲RSEM;

page 197
wtskid;semcnt;/* セマフォの待ち行列の先頭のタスクのID番号 *//* セマフォの資源数 */

イベントフラグの生成情報のパケット形式
typedef struct t̲cflg {ATRsematr;FLGPTN
iflgptn;} T̲CFLG;/* イベントフラグ属性 *//* イベントフラグの初期ビットパターン */イベントフラグの現在状態のパケット形式
typedef struct t̲rflg {IDwtskid;FLGPTN} T̲RFLG;

flgptn;/* イベントフラグの待ち行列の先頭のタス
クのID番号 *//* イベントフラグのビットパターン */データキューの生成情報のパケット形式
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番号 *//* 優先度データキュー管理領域に格納されているデータの数 */ngki̲spec‑110.txt

page 198} T̲RPDQ;
メールボックスの生成情報のパケット形式
typedef struct t̲cmbx {ATR
mbxatr;PRI
maxmpri;
void *

mprihd;/* メールボックス属性 *//* 優先度メールボックスに送信できるメッ
セージ優先度の最大値 *//* 優先度別のメッセージキューヘッダ領域の先頭番地 */

} T̲CMBX;
メールボックスの現在状態のパケット形式
typedef struct t̲rmbx {ID
wtskid;T̲MSG*pk̲msg;/* メールボックスの待ち行列の先頭のタスクのID番号 *//* メッセージキューの先頭につながれたメッ
セージの先頭番地 */} T̲RMBX;
ミューテックスの生成情報のパケット形式☆未完成
ミューテックスの現在状態のパケット形式☆未完成
メッセージバッファの生成情報のパケット形式☆未完成
メッセージバッファの現在状態のパケット形式☆未完成
スピンロックの生成情報のパケット形式
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;/* 固定長メモリプール属性 *//* 獲得できる固定長メモリブロックの数 *//* 固定長メモリブロックのサイズ *//* 固定長メモリプール領域の先頭番地 */ngki̲spec‑110.txt
void *} T̲CMPF;

page 199
mpfmb;/* 固定長メモリプール管理領域の先頭番地 */固定長メモリプールの現在状態のパケット形式
typedef struct t̲rmpf {IDwtskid;uint̲tfblkcnt;/* 固定長メモリプールの待ち行列の先頭のタスクのID番号 *//* 固定長メモリプール領域の空きメモリ領
域に割り付けることができる固定長メモ
リブロックの数 */} T̲RMPF;(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;
オーバランハンドラの定義情報のパケット形式☆未完成
オーバランハンドラの現在状態のパケット形式

ngki̲spec‑110.txt

page 200☆未完成(7) システム状態管理機能
システムの現在状態のパケット形式☆未完成(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;
EXCHDR
exchdr;} T̲DEXC;/* CPU例外ハンドラ属性 *//* CPU例外ハンドラの先頭番地 */(11) 拡張サービスコール管理機能
拡張サービスコールの定義情報のパケット形式
typedef struct t̲dsvc {ngki̲spec‑110.txt
ATR
EXTSVC
SIZE} T̲DSVC;

page 201
svcatrsvcrtnstksz/* 拡張サービスコール属性 *//* 拡張サービスコールルーチンの先頭番地 *//* 使用するスタックサイズ */(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̲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に格納できる最小の正規化された正の浮動小数点数（オプション）

ngki̲spec‑110.txt

page 202

FLOAT32̲MAX

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

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準拠）

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

ALIGN̲TYPE(addr, type)

アドレスaddrが型typeに対してアライン
しているかどうかを返すマクロ(3) assertマクロ
assert(exp)expが成立しているかを検査するマクロ（C90準拠）

ngki̲spec‑110.txt

page 203(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̲INI

0

初期割付けプロセッサ

TSK̲SELF
TSK̲NONE00

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

TPRI̲SELF
TPRI̲INI

00

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

TIPM̲ENAALL0

割込み優先度マスク全解除

5.4.4 カーネルの機能毎の定数(1) タスク管理機能
TA̲ACTTA̲FPU

0x01U

タスクの生成時にタスクを起動する
FPUレジスタをコンテキストに含める

TTS̲RUN

0x01U

実行状態

ngki̲spec‑110.txt

page 204

TTS̲RDYTTS̲WAITTS̲SUSTTS̲WAS
TTS̲DMT

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待ちモード

0x02U

メッセージキューをメッセージの優先度順にする

0x01U
0x02U

取得されていない状態
取得されている状態

TA̲STATA̲PHS

0x01U
0x02U

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

TCYC̲STP
TCYC̲STA

0x01U
0x02U

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

0x01U
0x02U

アラームハンドラが動作していない状態
アラームハンドラが動作している状態(4) 同期・通信機能
イベントフラグ

メールボックス
TA̲MPRI
スピンロック
TSPN̲UNL
TSPN̲LOC(6) 時間管理機能
周期ハンドラアラームハンドラ
TALM̲STPTALM̲STA

ngki̲spec‑110.txt

page 205(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.5 カーネルの機能毎のマクロ(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) 特殊な役割を持ったプロセッサngki̲spec‑110.txt

page 206

TOPPERS̲MASTER̲PRCID
TOPPERS̲SYSTIM̲PRCID

マスタプロセッサのID番号
システム時刻管理プロセッサのID番号(4) タイマ方式
TOPPERS̲SYSTIM̲LOCALTOPPERS̲SYSTIM̲GLOBAL

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

カーネルのメーカコード（＝0x0118）
カーネルの識別番号
カーネル仕様のバージョン番号
カーネルのバージョン番号

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によって登録されたデータキューの数に一致）ngki̲spec‑110.txt

page 207

TMIN̲DPRI
TMAX̲DPRI

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

TNUM̲PDQID

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

メールボックス
TMIN̲MPRI
TMAX̲MPRI

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

TNUM̲MBXID

登録できるメールボックスの数（動的生成対応でないカー
ネルでは，静的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によって登録されたアラームハン
ドラの数に一致）(7) システム状態管理機能

ngki̲spec‑110.txt

page 208

なし(8) メモリオブジェクト管理機能☆未完成(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番号不足資源不足
オブジェクト状態エラー
オブジェクト未登録
キューイングオーバーフロー
待ち禁止状態または待ち状態の強制解除
ポーリング失敗またはタイムアウト
待ちオブジェクトの削除または再初期化
待ちオブジェクトの状態変化
ノンブロッキング受付け
バッファオーバーフロー

ngki̲spec‑110.txt

page 209

5.7 機能コード一覧‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
‑0
‑1
‑2
‑3
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
‑0x01
予約
予約
予約
予約
‑0x05
act̲tskiact̲tsk
can̲act
ext̲tsk‑0x09
ter̲tskchg̲priget̲priget̲inf‑0x0d
slp̲tsktslp̲tsk
wup̲tskiwup̲tsk‑0x11
can̲wuprel̲waiirel̲wai
予約‑0x15
dis̲waiidis̲waiena̲waiiena̲wai‑0x19
sus̲tsk
rsm̲tsk
dly̲tsk
予約‑0x1d
ras̲texiras̲texdis̲texena̲tex‑0x21
sns̲texref̲tex
予約
予約‑0x25
sig̲semisig̲semwai̲sempol̲sem‑0x29
twai̲sem
予約
予約
予約
‑0x2d
set̲flgiset̲flg
clr̲flg
wai̲flg‑0x31
pol̲flgtwai̲flg
予約
予約
‑0x35
snd̲dtqpsnd̲dtq
ipsnd̲dtq
tsnd̲dtq‑0x39
fsnd̲dtq
ifsnd̲dtq
rcv̲dtqprcv̲dtq‑0x3d
trcv̲dtq
予約
予約
予約
‑0x41
snd̲pdq
psnd̲pdq
ipsnd̲pdq
tsnd̲pdq‑0x45
rcv̲pdqprcv̲pdq
trcv̲pdq
予約‑0x49
snd̲mbxrcv̲mbx
prcv̲mbx
trcv̲mbx‑0x4d
loc̲mtxploc̲mtx
tloc̲mtx
unl̲mtx‑0x51
snd̲mbfpsnd̲mbf
tsnd̲mbf
rcv̲mbf‑0x55
prcv̲mbf
trcv̲mbf
予約
予約
‑0x59
get̲mpf
pget̲mpf
tget̲mpf
rel̲mpf‑0x5d
get̲timget̲utm
予約
予約‑0x61
sta̲cycstp̲cyc
予約
予約‑0x65
sta̲almista̲alm
stp̲almistp̲alm‑0x69
sta̲ovr
stp̲ovrref̲ovr
予約‑0x6d
sac̲sysref̲sysrot̲rdqirot̲rdq‑0x71
get̲did予約
get̲tid
iget̲tid‑0x75
loc̲cpu
iloc̲cpu
unl̲cpuiunl̲cpu‑0x79
dis̲dspena̲dspsns̲ctx
sns̲loc‑0x7d
sns̲dspsns̲dpnsns̲kerext̲ker‑0x81
att̲memdet̲memsac̲memprb̲mem‑0x85
ref̲mem
予約
予約
予約
‑0x89
cfg̲int
dis̲int
ena̲int
ref̲int‑0x8d
chg̲ipmget̲ipm
予約
予約‑0x91
xsns̲dpn
xsns̲xpn
予約
予約
‑0x95
ref̲cfg
ref̲ver
予約
予約
‑0x99
予約
予約
予約
予約
‑0x9d
予約
予約
予約
予約
‑0xa1
予約
ini̲semini̲flg
ini̲dtq‑0xa5
ini̲pdqini̲mbx
ini̲mtx
ini̲mbf‑0xa9
ini̲mpf
予約
予約
予約
‑0xad
予約
予約
予約
予約
‑0xb1
ref̲tskref̲semref̲flg
ref̲dtq‑0xb5
ref̲pdqref̲mbx
ref̲mtxref̲mbf‑0xb9
ref̲mpf
ref̲cycref̲alm
ref̲isr‑0xbd
ref̲spn
予約
予約
予約
‑0xc1
acre̲tsk
acre̲semacre̲flgacre̲dtq‑0xc5
acre̲pdq
acre̲mbx
acre̲mtx
acre̲mbf‑0xc9
acre̲mpf
acre̲cycacre̲almacre̲isr‑0xcd
acre̲spn
予約
予約
予約

ngki̲spec‑110.txt

page 210‑0xd1
del̲tskdel̲semdel̲flgdel̲dtq‑0xd5
del̲pdqdel̲mbx
del̲mtx
del̲mbf‑0xd9
del̲mpf
del̲cycdel̲almdel̲isr‑0xdd
del̲spn
予約
予約
予約
‑0xe1
sac̲tsksac̲semsac̲flgsac̲dtq‑0xe5
sac̲pdq
予約
sac̲mtxsac̲mbf‑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̲memsac̲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‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

ngki̲spec‑110.txt

page 211

優先度データキューsnd̲pdqrcv̲pdqdel̲pdqref̲pdq
psnd̲pdq
prcv̲pdq
ini̲pdqtsnd̲pdq
trcv̲pdq
sac̲pdq‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
メールボックスsnd̲mbxrcv̲mbx
del̲mbx
ref̲mbx
prcv̲mbx
ini̲mbx
trcv̲mbx‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
ミューテックス
loc̲mtx‑
del̲mtxref̲mtxploc̲mtx
ini̲mtxtloc̲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
def̲inhget̲ipmdis̲dspdis̲int
def̲exc
ref̲sysena̲dspena̲intdef̲svc
ref̲intchg̲ipmdef̲ovrref̲cfg
ref̲ver‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
すべての保護ドメインから呼び出すことができるサービスコール：
・自タスクへの操作（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）

ngki̲spec‑110.txt

page 212【補足説明】
xsns̲dpnとxsns̲xpnは，エラーコードを返さないために，すべての保護ドメイ
ンから呼び出すことができるサービスコールとしているが，タスクコンテキス
トから呼び出した場合には必ずtrueが返ることとしており，実質的にはカーネ
ルドメインのみから呼び出すことができる．
unl̲mtxは，アクセス許可ベクタによるアクセス保護を行わないサービスコールとしているが，ミューテックスをロックしたタスク以外が呼び出すとE̲ILUSEエラーとなるため，実質的には対象ミューテックスの通常操作1としてアクセス保護されているとみなすことができる（ミューテックスのロック中にアクセス許可ベクタを変更した場合の振舞いは異なる）．
以上アプリケーションシステム
アプリケーションプログラム
システムサービス
カーネル
システムインタフェースレイヤ
プロセッサ，メモリ，タイマ

周辺デバイス

図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標準割込み処理モデルの概念図

ローカルIRC
ローカルIRC

プロセッサ10x0n⋯01

プロセッサ20x0n⋯04

0x0n⋯03

0x0n⋯02

0x02⋯04

0x02⋯03

0x02⋯02

0x01⋯04

0x01⋯03

0x01⋯02

ローカルIRC0x02⋯01

割込みハンドラ番号(inhno)0x0n⋯02

0x0n⋯01

0x00⋯04

0x00⋯03

0x02⋯02

0x02⋯01

0x01⋯02

0x01⋯01

割込み番号(intno)0x01⋯01

割込み要求ライン

グローバルIRC

プロセッサn

図2-5. マルチプロセッサ対応カーネルに割込み番号と割込みハンドラ番号

マスタープロセッサ

スレーブプロセッサスタートアップ
モジュールの実行開始

スタートアップ
モジュールの実行開始

プロセッサ毎の初期化処理

プロセッサ毎の初期化処理スタートアップ
モジュール

共有リソースの
初期化処理
同期
カーネルの
初期化処理へ分岐

カーネルの初期化処理へ分岐

カーネル自身の初期化と静的APIの処理

カーネル自身の初期化と静的APIの処理
同期

グローバル初期化
ルーチンの実行同期
ローカル初期化
ルーチンの実行

ローカル初期化
ルーチンの実行同期

カーネル動作状態に遷移

カーネル動作状態に遷移

カーネルの動作開始

カーネルの動作開始

図2-6. マルチプロセッサ対応カーネルにおけるシステム初期化の流れ

マスタープロセッサ

スレーブプロセッサ

カーネルを終了させる
サービスコールを呼び出すプロセッサ
カーネルを終了させる
サービスコールの呼出し
カーネル非動作状態に遷移
他のプロセッサにカーネルの終了を要求

カーネルの終了処理の開始

カーネルの終了処理の開始

カーネル非動作状態に遷移

カーネル非動作状態に遷移
同期

ローカル終了処理
ルーチンの実行ローカル終了処理
ルーチンの実行ローカル終了処理
ルーチンの実行同期

グローバル終了処理
ルーチンの実行同期
ターゲットシステム
依存の終了処理ターゲットシステム
依存の終了処理ターゲットシステム
依存の終了処理

図2-7. マルチプロセッサ対応カーネルにおけるシステム終了処理の流れsystem.cfg

システムコンフィギュ
レーションファイル
cfg1_out.c

パラメータ計算用
C言語ファイル

コンフィギュレータ
（パス1）

Cコンパイラ（＋関連ツール）
cfg1_out.syms

cfg1_out.srec

パラメータ計算
結果ファイルコンフィギュレータ
（パス2）

シンボルファイル

kernel_cfg.ckernel_cfg.h

カーネル
構成・初期化ファイル

カーネル構成・初期化
ヘッダファイル

Cコンパイラ（＋関連ツール）

その他のソースファイル，
オブジェクトファイル

system.srec

コンフィギュレータ
（パス3）

ロードモジュール

エラーメッセージ

system.syms

シンボルファイル

※ファイル名中の斜体の部分は例である．

図2-8. コンフィギュレータの処理モデル