TOPPERS 新世代カーネル統合仕様書

バージョン : Release 1.4.0

最終更新 : 2012 年 5月 16 日

このドキュメントは, TOPPERS 新世代カーネルに属する一連のリアルタイムカー ネルの仕様を,統合的に記述するものである.現時点で, TOPPERS/ASP カーネル, TOPPERS/FMP カーネル, TOPPERS/HRP2 カーネル, TOPPERS/SSP カーネルの仕様に 関しては記述が完成しているが,未完成部分も残っている.特に動的生成対応 カーネルについては,仕様検 討が不十分なところが多い.なお,本文中から参 照している図は,ファイルの最後にまとめて掲載してある.

なお, TOPPERS/SSP カーネルは, Release 1.1.0 の時点では,この仕様に準拠し ていない.今後のリリースでは,この仕様に準拠するよう修正される予定であ る.


TOPPERS New Generation Kernel Specification

Copyright (C) 2006 -2012 by Embedded and Real -Time Systems Laboratory Graduate School of Information Science, Nagoya Univ., JAPAN

Copyright (C) 2006 -2012 by TOPPERS Project, Inc., JAPAN

上記著作権者は,以下の (1) ~ (3) の条件を満たす場合に限り,本ドキュメ ント(本ドキュメントを改変したものを含む.以下同じ)を使用・複製 ・改 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.

本ドキュメントは,無保証で提供されているものである.上記著作権者およ び TOPPERS プロジェクトは,本ドキュメントに関して,特定の使用目的に対す る適合性も含めて,いかなる保証も行わない.また,本ドキュメントの利用 により直接的または間接的に生じたいかなる損害に関しても,その責任を負 わない.


○目次

第1章 TOPPERS 新世代カーネルの概要

1.1 TOPPERS 新世代カーネル仕様の位置付け

1.2 TOPPERS 新世代カーネル仕様の設計方針

1.3 TOPPERS/ASP カーネルの適用対象領域と仕様設計方針

1.4 TOPPERS/FMP カーネルの適用対象領域と仕様設計方針

1.5 TOPPERS/HRP2 カーネルの適用対象領域と仕様設計方針

1.6 TOPPERS/SSP カーネルの適用対象領域と仕様設計方針

1.7 TOPPERS/ASP Safety カーネルの適用対象領域と仕様設計方針

第2章 主要な概念と共通定義

2.1 仕様の位置付け

2.1.1 カーネルの機能セット

2.1.2 ターゲット非依存の規定とターゲット定義の規定

2.1.3 想定するソフトウェア構成

2.1.4 想定するハードウェア構成

2.1.5 想定するプログラミング言語

2.2 API の構成要素とコンベンション

2.2.1 API の構成要素

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

2.2.3 返値とエラーコード

2.2.4 機能コード

2.2.5 ヘッダファイル

2.3 主な概念

2.3.1 オブジェクトと処理単位

2.3.2 サービスコールとパラメータ

2.3.3 保護機能

2.3.4 マルチプロセッサ対応

2.3.5 その他

2.4 処理単位の種類と実行

2.4.1 処理単位の種類

2.4.2 処理単位の実行順序

2.4.3 カーネル処理の不可分性

2.4.4 処理単位を実行するプロセッサ

2.5 システム状態とコンテキスト

2.5.1 カーネル動作状態と非動作状態

2.5.2 タスクコンテキストと非タスクコンテキスト

2.5.3 カーネルの振舞いに影響を与える状態

2.5.4 全割込みロック状態と全割込みロック解除状態

2.5.5 CPU ロック状態と CPU ロック解除状態

2.5.6 割込み優先度マスク

2.5.7 ディスパッチ禁止状態とディスパッチ許可状態

2.5.8 ディスパッチ保留状態

2.5.9 カーネル管理外の状態

2.5.10 処理単位の開始・終了とシステム状態

2.6 タスクの状態遷移とスケジューリング規則

2.6.1 基本的なタスク状態

2.6.2 タスクの状態遷移

2.6.3 タスクのスケジューリング規則

2.6.4 待ち行列と待ち解除の順序

2.6.5 タスク例外処理マスク状態と待ち禁 止状態

2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち

2.6.7 制約タスク

2.7 割込み処理モデル

2.7.1 割込み処理の流れ

2.7.2 割込み優先度

2.7.3 割込み要求ラインの属性

2.7.4 割込みを受け付ける条件

2.7.5 割込み番号と割込みハンドラ番号

2.7.6 マルチプロセッサにおける割込み処理

2.7.7 カーネル管理外の割込み

2.7.8 カーネル管理外の割込みの設定方法

2.8 CPU 例外処理モデル

2.8.1 CPU 例外処理の流れ

2.8.2 CPU 例外ハンドラから呼び出せるサービスコール

2.8.3 エミュレートされた CPU 例外ハンドラ

2.8.4 カーネル管理外の CPU 例外

2.9 システムの初期化と終了

2.9.1 システム初期化手順

2.9.2 システム終了手順

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

2.10.1 ID 番号で識別するオブジェクト

2.10.2 オブジェクト番号で識別するオブジェクト

2.10.3 識別番号を持たないオブジェクト

2.10.4 オブジェクト生成に必要なメモリ領域

2.10.5 オブジェクトが属する保護ドメインの設定

2.10.6 オブジェクトが属するクラスの設定

2.10.7 オブジェクトの状態参照

2.11 オブジェクトのアクセス保護

2.11.1 オブジェクトのアクセス保護とアクセス違反の通知

2.11.2 メモリオブジェクトに対す るアクセス許可ベクタの制限

2.11.3 デフォルトのアクセス許可ベクタ

2.11.4 アクセス許可ベクタの設定

2.11.5 カーネルの管理領域のアクセス保護

2.11.6 ユーザタスクのユーザスタック領域

2.12 システムコンフィギュレーション手順

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

2.12.2 静的 API の文法とパラメータ

2.12.3 保護ドメインの指定

2.12.4 クラスの指定

2.12.5 コンフィギュレータの処理モデル

2.12.6 静的 API のパラメータに関するエラー検出

2.12.7 オブジェクトの ID 番号の指定

2.13 TOPPERS ネーミングコンベンション

2.13.1 モジュール識別名

2.13.2 データ型名

2.13.3 関数名

2.13.4 変数名

2.13.5 定数名

2.13.6 マクロ名

2.13.7 静的 API 名

2.13.8 ファイル名

2.13.9 モジュール内部の名称の衝突回避

2.14 TO PPERS 共通定義

2.14.1 TOPPERS 共通ヘッダファイル

2.14.2 TOPPERS 共通データ型

2.14.3 TOPPERS 共通定数

2.14.4 TOPPERS 共通エラーコード

2.14.5 TOPPERS 共通マクロ

2.14.6 TOPPERS 共通構成マクロ

2.15 カーネル共通定義

2.15.1 カーネルヘッダファイル

2.15.2 カーネル共通定数

2.15.3 カーネル共通マクロ

2.15.4 カーネル共通構成マクロ

第3章 システムインタフェースレイヤ API 仕様

3.1 システムインタフェースレイヤの概要

3.2 SIL ヘッダファイル

3.3 全割込みロック状態の制御

3.4 SIL スピンロック

3.5 微少時間待ち

3.6 エンディアンの取得

3.7 メモリ空間アクセス関数

3.8 I/O 空間アクセス関数

3.9 プロセッサ ID の参照

第4章 カーネル 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 アラームハンドラ

4.6.4 オーバランハンドラ

4.7 システム状態管理機能

4.8 メモリオブジェクト管理機能

4.9 割込み管理機能

4.10 CPU 例外管理機能

4.11 拡張サービスコール管理機能

4.12 システム構成管理機能

第5章 リファレンス

5.1 サービスコール一覧

5.2 静的 API 一覧

5.3 データ型

5.3.1 TOPPERS 共通データ型

5.3.2 カーネルの使用するデータ型

5.3.3 カーネルの使用するパケット形式

5.4 定数とマクロ

5.4.1 TOPPERS 共通定数

5.4.2 TOPPERS 共通マクロ

5.4.3 カーネル共通定数

5.4.4 カーネル共通マクロ

5.4.5 カーネルの 機能毎の定数

5.4.6 カーネルの機能毎のマクロ

5.5 構成マクロ

5.5.1 TOPPERS 共通構成マクロ

5.5.2 カーネル共通構成マクロ

5.5.3 カーネルの機能毎の構成マクロ

5.6 エラーコード一覧

5.7 機能コード一覧

5.8 カーネルオブジェクトに対するアクセスの種別

5.9 省略名の元になった英語

5.9.1 サービスコールと静的 API の名称の中の xxx の元になった英語

5.9.2 サービスコールと静的 API の名称の中の yyy の元になった英語

5.9.3 サービスコールの名称の中の zの元になった英語

5.10 バージョン履歴

第1章 TOPPERS 新世代カーネルの概要

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

1.1 TOPPERS 新世代カーネル仕様の位置付け

TOP PERS プロジェクトでは, 2000 年に公開した TOPPERS/JSP カーネルを始めとし て,μ ITRON4.0 仕様およびその保護機能拡張(μ ITRON4.0/PX 仕様)に準拠した リアルタイムカーネルを開発してきた.

μ ITRON4.0 仕様は 1999 年に,μ ITRON4.0/PX 仕様は 2002 年に公表されたが,それ 以降現在までの間に,大きな仕様改訂は実施されていない.その間に,組込み システムおよびソフトウェアのますますの大規模化・複雑化,これまで以上に 高い信頼性・安全性に対する要求,小さい消費エネルギー下での高い性能要求 など,組込みシステム開発を取り巻く状況は刻々変化している.リアルタイム カーネルに対しても,マルチプロセッサへの対応,発展的な保護機能のサポー ト,機能安全対応,省エネルギー制御機能のサポートなど,新しい要求が生じ ている.

TOPPERS プロジェクトでは,リアルタイムカーネルに対するこのような新しい要 求に対応するために,μ ITRON4.0 仕様を発展させる形で, TOPPERS 新世代カーネ ル仕様を策定することになった.

ただし, ITRON 仕様が,各社が開発するリアルタイムカーネルを標準化すること を目的に,リアルタイムカーネルの「標準仕様」を規定することを目指してい るのに対して, TOP PERS 新世代カーネル仕様は, TOPPERS プロジェクトにおいて 開発している一連のリアルタイムカーネルの「実装仕様」を記述するものであ り, ITRON 仕様とは異なる目的・位置付けを持つものである.

1.2 TOPPERS 新世代カーネル仕様の設計方針

TOPPERS 新世代カーネル仕様を設計するにあたり,次の方針を設定する.

  • (1) μ ITRON 4.0 仕様をベースに拡張・改良を加える

    TOPPERS 新世代カーネル仕様は,多くの技術者の尽力により作成され,多くの実 装・使用実績があるμ ITRON4.0 仕様をベースとする.ただし,μ ITRON4.0 仕様 の策定時以降の状況の変化を考慮し,μ ITRON4.0 仕様で不十分と考えられる点 については積極的に拡張・改良する.μ ITRON4.0 仕様への準拠性にはこだわら ない.

  • (2) ソフトウェアの再利用性を重視する

    μ ITRON4.0 仕様の策定時点と比べると,組込みソフトウェアの大規模化が進展 している一方で,ハードウェアの性能向上も著しい.そのため,ソフトウェア の再利用性を向上させるためには,少々のオーバヘッドは許容される状況にあ る.

    そこで, TOPPERS 新世代カーネル仕様では,μ ITRON4.0 仕様においてオーバヘッ ド削減のために実装定義または実装依存としていたような項目についても,ター ゲットシステムに依存する項目とするのではなく,強く規定する方針とする.

  • (3) 高信頼・安全なシステム構築を支援する

    TOPPERS 新世代カーネル仕様は,高信頼・安全な組込みシステム構築を支援する ものとする.

    安全性の面では,アプリケーションプログラムに問題がある場合でも,リーゾ ナブルなオーバヘッドでそれを救済できるなら,救済するような仕様とする. また,アプリケーションプログラムの誤動作を検出する機能や,システムの自 己診断のための機能についても,順次取り込んでいく.

  • (4) アプリケーションシステム構築に必要な機能は積極的に取り込む

    上記の方針を満たした上で,多くのアプリケーションシステムに共通に必要と なる機能については,積極的にカーネルに取り込む.

    カーネル単体の信頼性を向上させるためには,カーネルの機能は少なくした方 が楽である.しかし,アプリケーションシステム構築に必要となる機能は,カー ネルがサポートしていなければアプリケーションプログラムで実現しなければ ならず,システ ム全体の信頼性を考えると,多くのアプリケーションシステム に共通に必要となる機能については,カーネルに取り込んだ方が有利である.

1.3 TOPPERS/ASP カーネルの適用対象領域と仕様設計方針

TOPPERS/ASP カーネル( ASP は, Advanced Standard Profile の略.以下, ASP カー ネル)は, TOPPERS 新世代カーネルの出発点となるリアルタイムカーネルである. 保護機能を持ったカーネルやマルチプロセッサ対応のカーネルは, ASP カーネル を拡張する形で開発する.

ASP カーネルは, 20 年以上に渡る ITRON 仕様の技術開発成果をベースとして,完 成度の高いリアルタイムカーネルを実現するものである.完成度を高めるとい う観点から,カーネル本体の仕様に ついては,枯れた技術で実装できる範囲に 留める.

ASP カーネルの主な適用対象は,高い信頼性・安全性・リアルタイム性を要求さ れる組込みシステムとする.ソフトウェア規模の面では,プログラムサイズ (バイナリコード)が数十 KB ~ 1MB 程度のシステムを主な適用対象とする.それ より大規模なシステムには,保護機能を持ったリアルタイムカーネルを適用す べきと考えられる.

ASP カーネルの機能は,カーネル内で動的なメモリ管理が不要な範囲に留める. これは,高い信頼性・安全性・リアルタイム性を要求される組込みシステムで は,システム稼働中に発生するメモリ不足への対処が難しいためである.この 方針から,カーネルオブジェクトは静的に生成することとし,動的なオブジェ クト生成機能は設けない.ただし,アプリケーションプログラムが動的なメモ リ管理をす るためのカーネル機能である固定長メモリプール機能はサポートす る.

1.4 TOPPERS/FMP カーネルの適用対象領域と仕様設計方針

TOPPERS/FMP カーネル( FMP は, Flexible Multiprocessor Profile の略.以下, FMP カーネル)は, ASP カーネルを,マルチプロセッサ対応に拡張したリアルタ イムカーネルである.

FMP カーネルの適用対象となるターゲットハードウェアは,ホモジニアスなマル チプロセッサシステムである.各プロセッサが全く同一のものである必要はな いが,すべてのプロセッサでバイナリコードを共有することから,同じバイナ リコードを実行できることが必要である.

FMP カーネルでは,タスクを実行するプロセッサを静的に決定するのが基本であ り,カーネル は自動的に負荷分散する機能を持たないが,タスクをマイグレー ションさせるサービスコールを備えている.これを用いて,アプリケーション で動的な負荷分散を実現することが可能である.

FMP カーネルの機能は, ASP カーネルと同様に,カーネル内で動的なメモリ管理 が不要な範囲に留める.

1.5 TOPPERS/HRP2 カーネルの適用対象領域と仕様設計方針

TOPPERS/HRP2 カーネル( HRP は, High Reliable system Profile の略. 2はバー ジョン番号を示す.以下, HRP2 カーネル)は,さらに高い信頼性・安全性を要 求される組込みシステムや,より大規模な組込みシステム向けに適用できるよ うに, ASP カーネルを拡張したリアルタイムカーネルである.

HRP2 カーネルの適用対象となるターゲットハードウェアは,特権 モードと非特 権モードを備え,メモリ保護のために MMU ( Memory Management Unit )または MPU ( Memory Protection Unit )を持つプロセッサを用いたシステムである. HRP2 カーネルの主な適用対象は,ソフトウェア規模の面では,プログラムサイ ズ(バイナリコード)が数百 KB 以上のシステムである.

HRP2 カーネルの機能は, ASP カーネルと同様に,カーネル内で動的なメモリ管理 が不要な範囲に留める.具体的には, ASP カーネルに対して,メモリ保護機能と オブジェクトアクセス保護機能,拡張サービスコール機能,ミューテックス機 能,オーバランハンドラ機能を追加し,メールボックス機能を削除している.

1.6 TOPPERS/SSP カーネルの適用対象領域と仕様設計方針

TOPPERS/SSP カーネル( SSP は, Smallest Set Profile の略.以下, SSP カーネル) は,小規模システムに用いるために, ASP カーネルをベースに可能な限り機能を 絞り込んだリアルタイムカーネルである.

SSP カーネルの機能は,μ ITRON4.0 仕様の「仕様準拠の最低条件」の考え方を踏 襲し,メモリ使用量を最小化するように定めている.具体的には, SSP カーネル においては,タスクは待ち状態を持たない(言い換えると,制約タスクのみを サポートする)のが最大の特徴である.また, ASP カーネルに対して下位互換性 を持つように配慮しているが,システム全体のメモリ使用量を最小化するため に有用な機能は, ASP カーネルに対して追加している.

TOPPERS/SSP カーネルの主な適用対象は,プログラムサイズ(バイナリコード) が数 KB ~数 十 KB 程度の極めて小規模な組込みシステムである.

1.7 TOPPERS/ASP Safety カーネルの適用対象領域と仕様設計方針

TOPPERS/ASP Safety カーネル(以下, ASP Safety カーネル)は,小規模な安全 関連システムに用いるために, ASP カーネルの機能を徹底的な検証が可能な範囲 にサブセット化したものである.メールボックスのように安全性の観点から問 題のある機能や,タスク例外処理機能のように使用頻度に比べて検証にコスト のかかる機能はサポートしない.

ASP Safety カーネルの主な適用対象は,特に高い安全性を要求される組込みシ ステムとする.ソフトウェア規模の面では,プログラムサイズ(バイナリコー ド)が数十 KB ~ 1MB 程度のシステムを主な適用対象とする.それより大規模なシ ステムには,保護機能を持ったカーネルを適用すべきと考えられる.

第2章 主要な概念と共通定義

2.1 仕様の位置付け

この仕様は, TOPPERS 新世代カーネルに属する各カーネルの仕様を,統合的に記 述することを目標としている.また, TOPPERS 新世代カーネル上で動作する各種 のシステムサービスに共通に 適用される事項についても規定する.

2.1.1 カーネルの機能セット

TOPPERS 新世代カーネルは, ASP カーネルをベースとして,保護機能,マルチプ ロセッサ,カーネルオブジェクトの動的生成,機能安全などに対応した一連の カーネルで構成される.

この仕様では, TOPPERS 新世代カーネルを構成する一連のカーネルの仕様を統合 的に記述するが,言うまでもなく,カーネルの種類によってサポートする機能 は異なる.サポートする機能をカーネルの種類毎に記述する方法もあるが,カー ネルの種類はユーザ要求に対応して増える可能性もあり,その度に仕様書を修 正するのは得策ではない.

そこでこの仕様では,サポートする機能を,カーネルの種類毎ではなく,カー ネルの対応する機能セット毎に記述する.具体的には,保護機能を持ったカー ネルを保護機能対応カーネル,マルチプロセッサに対応したカーネルをマルチ プロセッサ対応カーネル,カーネルオブジェクトの動的生成機能を持ったカー ネルを動的生成対応カーネルと呼ぶことにする.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルは,保護機能対応カーネル,マルチプロセッサ対応カーネル,動的 生成対応カーネルのいずれでもない. ただし,動的生成機能拡張パッケージを 用いると,動的生成対応カーネルとなる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルは,マルチプロセッサ対応カーネルであり,保護機能対応カーネル, 動的生成対応カーネルではない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルは ,保護機能対応カーネルであり,マルチプロセッサ対応カーネ ル,動的生成対応カーネルではない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルは,保護機能対応カーネル,マルチプロセッサ対応カーネル,動的 生成対応カーネルのいずれでもない.

【μ ITRON4.0 仕様,μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0 仕様は,カーネルオブジェクトの動的生成機能を持っているが,保 護機能を持っておらず,マルチプロセッサにも対応していない.μ ITRON4.0/PX 仕様は,μ ITRON4.0 仕様に対して保護機能を追加するための仕様であり,カー ネルオブジェクトの動的生成機能と保護機能を持っているが,マルチプロセッ サには対応していない.

2.1.2 ターゲット非依存の規定とターゲット定義の規定

TOPPERS 新世代カーネルは,アプリケーションプログラムの再利用性を向上させ るために,ターゲットハードウェアや開発環境の違いをできる限り隠蔽するこ とを目指している.ただし,ターゲットハードウェアや開発環境の制限によっ て実現できない機能が生じたり,逆にターゲットハードウェアの特徴を活かす ためには機能拡張 が不可欠になる場合がある.また,同一のターゲットハード ウェアであっても,アプリケーションシステムによって使用方法が異なる場合 があり,ターゲットシステム毎に仕様の細部に違いが生じることは避けられな い.

そこで, TOPPERS 新世代カーネルの仕様は,ターゲットシステムによらずに定め るターゲット非依存( target -independent )の規定と,ターゲットシステム毎 に定めるターゲット定義( target -defined )の規定に分けて記述する.この仕 様書は,ターゲット非依存の規定について記述するものであり,この仕様書で 「ターゲット定義」とした事項は,ターゲットシステム毎に用意するドキュメ ントにおいて規定する.

また,この仕様書でターゲット非依存に規定した事項であっても,ターゲット ハードウェアや開発環境の制限によって実現できない場合や,実 現するための オーバヘッドが大きくなる場合には,この仕様書の規定を逸脱する場合がある. このような場合には,ターゲットシステム毎に用意するドキュメントでその旨 を明記する.

2.1.3 想定するソフトウェア構成

この仕様では,アプリケーションシステムを構成するソフトウェアを,アプリ ケーションプログラム(以下,単にアプリケーションと呼ぶ),システムサー ビス,カーネルの 3階層に分けて考える(図 2-1).カーネルとシステムサービ スをあわせて,ソフトウェアプラットフォームと呼ぶ.

カーネルは,コンピュータの持つ最も基本的なハードウェア資源であるプロセッ サ,メモリ,タイマを抽象化し,上位階層のソフトウェア(アプリケーション およびシステムサービス) に論理的なプログラム実行環境を提供するソフトウェ アである.

システムサービスは,各種の周辺デバイスを抽象化するソフトウェアで,ファ イルシステムやネットワークプロトコルスタック,各種のデバイスドライバな どが含まれる.

また,この仕様では,プロセッサと各種の周辺デバイスの接続方法を隠蔽する ためのソフトウェア階層として,システムインタフェースレ イヤ( SIL )を規定 する.

システムインタフェースレイヤ,カーネル,各種のシステムサービス(これら をモジュールと呼ぶ)を,上位階層のソフトウェアから使うためのインタフェー スを, API ( Application Programming Interface )と呼ぶ.

この仕様書では,第 3章においてシステムインタフェースレイヤの API 仕様を, システムサービス毎の仕様書で規定される.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様では,カーネルとアプリケーションの中間にあるソフトウェア をソフトウェア部品と呼んでいたが, TOPPERS 組込みコンポーネントシステム ( TECS )においてはカーネルもソフトウェア部品の 1つと捉えることから,この 仕様ではシステムサービスと呼ぶことにした.

2.1.4 想定するハードウェア構成

この仕様では,カーネルがサポートするハードウェア構成として,以下のこと を想定している.これらに合致しないターゲットハードウェアでカーネルを動 作させることは可能であるが,合致しない部分へ の適応はアプリケーションの 責任になる.

  • (a) メモリ番地は,常に同一のメモリを指すこと(オーバレイのように,異な るメモリを同一のメモリ番地でアクセスすることがないこと).マルチプロセッ サ対応カーネルにおいては,同一のメモリに対しては,各プロセッサから同一 の番地でアクセスできること.
  • (b) マルチプロセッサ対応カーネルにおいては,各プロ セッサが同一の機械語 命令を実行できること.

2.1.5 想定するプログラミング言語

この仕様における API 仕様は, ISO/IEC 9899:1990 (以下, C90 と呼ぶ)または ISO/IEC 9899:1999 (以下, C99 と呼ぶ)に準拠した C言語を,フリースタンディ ング環境で用いることを想定して規定している.

ただし , C90 の規定に加えて,以下のことを仮定している.

  • ・ 16 ビットおよび 32 ビットの整数型があること
  • ・ポインタが格納できるサイズの整数型があること

2.2 API の構成要素とコンベンション

2.2.1 API の構成要素

  • (1) サービスコール

    上位階層のソフトウェアから,下位階層のソフトウェアを呼び出すインタフェー スをサービスコール( service call )と呼ぶ.カーネルのサービスコールを, システムコール( system call )と呼ぶ場合もある.

  • (2) コールバック

    下位階層のソフトウェアから,上位階層のソフトウェアを呼び出すインタフェー スをコールバック( callback )と呼ぶ.

  • (3) 静的 API

    オブジェクトの生成情報や初期状態などを定義するために,システムコンフィ ギュレーションファイル中に記述するインタフェースを,静的 API ( static API )と呼ぶ.

  • (4) 構成マクロ

    下位階層のソフトウェアに関する各種の情報を取り出すために,上位階層のソ フトウェアが用いるマクロを,構成マクロ( configuration macro )と呼ぶ.

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

サービスコールやコールバックに渡すデータをパラメータ( parameter ),それ らが返すデータをリターンパラメータ( return parameter )と呼ぶ.また,静 的 API に渡すデータもパラメータと呼ぶ.

オブジェクトを生成するサービスコールなど,パラメータの数が多い場合やター ゲット定義のパラメータを追加する可能性がある場合には,複数のパラメータ を 1つの構造体に入れ,その領域へのポインタをパラメータとして渡す.また, パラメータのサイズが大きい場合にも,パラメータを入れた領域へのポインタ をパラメータとして渡す場合がある.

C 言語 API では,リターンパラメータは,関 数の返値とするか,リターンパラメー タを入れる領域へのポインタをパラメータとして渡すことで実現する.オブジェ クトの状態を参照するサービスコールなど,リターンパラメータの数が多い場 合やターゲット定義のリターンパラメータを追加する可能性がある場合には, 複数のリターンパラメータを 1つの構造体に入れて返すこととし,その領域への ポインタをパラメータとして渡す.

複数のパ ラメータまたはリターンパラメータを入れるための構造体を,パケッ ト( packet )と呼ぶ.

サービスコールやコールバックに,パケットを置く領域へのポインタやリター ンパラメータを入れる領域へのポインタを渡す場合,別に規定がない限りは, サービスコールやコールバックの処理が完了した後は,それらの領域が参照さ れることはなく,別の目的に使用できる.

2.2.3 返値とエラーコード

一部の例外を除いて,サービスコールおよびコールバックの返値は,処理が正 常終了したかを表す符号付き整数とする.処理が正常終了した場合には, E_OK (= 0)または正の値が返るものとし,値の意味はサービスコールまたはコール バック毎に定める.処理が正常終了しなかった場合には,その原因を表す負の 値が返る.処理が正常終了しなかった原因を表す値を,エラーコード( error code )と呼ぶ.

エラーコードは,いずれも負の値のメインエラーコードとサブエラーコードで 構成される.メインエラーコードとサブエラーコードからエラーコードを構成 するマクロ( ERCD )と,エラーコードからメインエラーコードを取り出すマク ロ( MERCD ),サブエラーコードを取り出すマクロ( SERCD )が用意されている.

メインエラーコードの名称・意味・値は,カーネルとシステムサービスで共通 に定める(「 2.14.4 TOPPERS 共通エラーコード」の節を参照).サービスコー ルおよびコールバックの機能説明中の「 E_XXXXX エラーとなる」または 「 E_XXXXX エラーが返る」という記述は,メインエラーコードとして E_XXXXX が 返ることを意味する.

サブエラーコードは,エラーの原因をより詳細に表すために用いる.カーネル はサブエラーコードを使用せず,サブエラーコードとして常に -1が返る.サブ エラーコードの名称・意味・値は,サブエラーコードを使用するシステムサー ビスの API 仕様において規定する.

サービスコールが負の値のエラーコード(警告を表すものを除く)を返した場 合には,サービスコールによる副作用がないのが 原則である.ただし,そのよ うな実装ができない場合にはこの原則の例外とし,サービスコールの機能説明 にその旨を記述する.

サービスコールが複数のエラーを検出するべき状況では,その内のいずれか 1つ のエラーを示すエラーコードが返る.

コールバックが複数のエラーを検出するべき状況では,その内のいずれか 1つの エラーを示すエラーコードを返せばよい.

なお,静的 API は返値を持たない.静的 API の処理でエラーが検出された場合の 扱いについては,「 2.12.5 コンフィギュレータの処理モデル」の節および 「 2.12.6 静的 API のパラメータに関するエラー検出」の節を参照すること.

2.2.4 機能コード

ソフトウェア割込みによりサービスコールを呼び出す場合などに用いるための サービスコールを識別するための番号を,機能コード( function code )と呼ぶ. 機能コードは符号付きの整数値とし,カーネルのサービスコールには負の値を 割り付け,拡張サービスコールには正の値を用いる.

2.2.5 ヘッダファイル

カーネルやシステムサービスを用いるために必要な定義を含むファイル.

ヘッダファイルは,原則として,複数回 インクルードしてもエラーにならない ように対処されている.具体的には,ヘッダファイルの先頭で特定の識別子 (例えば, kernel.h なら "TOPPERS_KERNEL_H" )がマクロ定義され,ヘッダファ イルの内容全体をその識別子が定義されていない場合のみ有効とする条件ディ レクティブが付加されている.

2.3 主な概念

2.3.1 オブジェクト と処理単位

  • (1) オブジェクト

    カーネルまたはシステムサービスが管理対象とするソフトウェア資源を,オブ ジェクト( object )と呼ぶ.特に,カーネルが管理対象とするソフトウェア資 源を,カーネルオブジェクト( kernel object )と呼ぶ.

    オブジェクトは,種類毎に,番号によって識別する.カーネルまたはシステム サービスで,オブジェクトに対して任意に識別番号を付与できる場合には, 1か ら連続する正の整数値でオブジェクトを識別する.この場合に,オブジェクト の識別番号を,オブジェクトの ID 番号( ID number )と呼ぶ.そうでない場合, すなわちカーネルまたはシステムサービスの内部または外部からの条件によっ て識別番号が決まる場合には,オブジェクトの識別番号を,オブジェクト番号 ( object n umber )と呼ぶ.識別する必要のないオブジェクトには,識別番号を 付与しない場合がある.

    オブジェクト属性( object attribute )は,オブジェクトの動作モードや初期 状態を定めるもので,オブジェクトの登録時に指定する.オブジェクト属性に TA_XXXX が指定されている場合,そのオブジェクトを, TA_XXXX 属性のオブジェ クトと呼ぶ.複数の属性を指定する場合には,オブジェク ト属性を渡すパラメー タに,指定する属性値のビット毎論理和( C言語の "|" )を渡す.また,指定す べきオブジェクト属性がない場合には, TA_NULL を指定する.

  • (2) 処理単位

    オブジェクトの中には,プログラムが対応付けられるものがある.プログラム が対応付けられるオブジェクト(または,対応付けられるプログラム)を,処 理単位( processi ng unit )と呼ぶ.処理単位に対応付けられるプログラムは, アプリケーションまたはシステムサービスで用意し,カーネルが実行制御する.

    処理単位の実行を要求することを起動( activate ),処理単位の実行を開始す ることを実行開始( start )と呼ぶ.

    拡張情報( extended information )は,処理単位が呼び出される時にパラメー タとして渡される情報で,処理単位の登録時に指定する.拡張情報は,カーネ ルやシステムサービスの動作には影響しない.

  • (3) タスク

    カーネルが実行順序を制御するプログラムの並行実行の単位をタスク( task ) と呼ぶ.タスクは,処理単位の 1つである.

    サービスコールの機能説明において,サービスコールを呼び出したタスクを, 自タスク( invoking task )と呼ぶ.拡張サービスコールからサービスコールを 呼び出した場合には,拡張サービスコールを呼び出したタスクが自タスクであ る.

    カーネルには,静的 API により,少なくとも 1つのタスクを登録しなければなら ない.タスクが登録されていない場合には,コンフィギュレータがエラーを報 告する.

    【補足説明 】

    タスクが呼び出した拡張サービスコールが実行されている間は,「サービスコー ルを呼び出した処理単位」は拡張サービスコールであり,「自タスク」とは一 致しない.そのため,保護機能対応カーネルにおいて,「サービスコールを呼 び出した処理単位の属する保護ドメイン」と「自タスクの属する保護ドメイン」 は,異なるものを指す.

  • (4) ディスパッチとスケジューリング

    プロセッサが実行するタスクを切り換えることを,タスクディスパッチまたは 単にディスパッチ( dispatching )と呼ぶ.それに対して,次に実行すべきタス クを決定する処理を,タスクスケジューリングまたは単にスケジューリング ( scheduling )と呼ぶ.

    ディスパッチが起こるべき状態(すなわち,スケジューリングによって,現在 実行しているタスクとは異なるタスクが,実行すべきタスクに決定されている 状態)となっても,何らかの理由でディスパッチを行わないことを,ディスパッ チの保留( 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 型で表し,単位はミリ秒とする.システ ム時刻は,タイムティック( time tick )を通知するためのタイマ割込みが発生 する毎に更新される.

    イベントを発生させる時刻を指定する場合には,基準時刻( base time )からの 相対時間( relative time )によって指定する.基準時刻は,別に規定がない限 りは,相対時間を指定するサービスコールを呼び出した時刻となる.

    相対時間は,符号無しの整数型である RELTIM 型で表し,単位はシステム時刻と 同一,すなわちミリ秒とする.相対時間には,少なくとも, 16 ビットの符号無 しの整数型( uint16_t 型)に格納できる任意の値を指定することができるが, RELTIM 型( uint_t 型に定義される)に格納できる任意の値を指定できるとは限 らない.相対時間に指定できる最大値は,構成マクロ TMAX_RELTIM に定義されて いる.

    イベントを発生させる時刻を相対時間で指定した場合,イベントの処理が行わ れるのは,基準時刻から相対時間によって指定した以 上の時間が経過した後と なる.ただし,基準時刻を定めるサービスコールを呼び出した時に,タイム ティックを通知するためのタイマ割込みがマスクされている場合(タイマ割込 みより優先して実行される割込み処理が実行されている場合を含む)は,相対 時間によって指定した以上の時間が経過した後となることは保証されない.

    イベントが発生する時刻を参照する場合には,基準時刻からの相対時間として 返される.基準時刻は,相対時間を返すサービスコールを呼び出した時刻とな る.

    イベントが発生する時刻が相対時間で返された場合,イベントの処理が行われ るのは,基準時刻から相対時間として返された以上の時間が経過した後となる. ただし,相対時間を返すサービスコールを呼び出した時に,タイムティックを 通知するためのタイマ割込みがマスクされている場合(タイマ割込みより優先 して実行される割込み処理が実行されている場合を含む)は,相対時間として 返された以上の時間が経過した後となることは保証されない.

    【補足説明】

    相対時間に 0を指定した場合,基準時刻後の最初のタイムティックでイベントの 処理が行われる.また, 1を指定した場合,基準時刻後の 2回目以降のタイム ティックでイベントの処理が行われる.これは,基準時刻後の最初のタイム ティックは,基準時刻の直後に発生する可能性があるため,ここでイベントの 処理を行うと,基準時刻からの経過時間が 1以上という仕様を満たせないためで ある.

    同様に,相対時間として 0が返された場合,基準時刻後の最初のタイムティック でイベントの処理が行われる.また, 1が返された場合,基準時刻後の 2回目以 降のタイムティックでイベントの処理が行われる.

    【μ ITRON4.0 仕様との関係】

    相対時間( RELTIM 型)とシステム時刻( SYSTIM 型)の時間単位は,μ ITRON4.0 仕様では実装定義としていたが,この仕様ではミリ秒と規定した.また,相対 時間の解釈について,より厳密に規定した.

TMAX_RELTIM は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロである.

  • (3) タイムアウトとポーリング

    サービスコールの中で待ち状態が指定した時間以上継続した場合に,サービス コールの処理を取りやめて,サービスコールからリターンすることを,タイム アウト( timeout )という.タイムアウトしたサービスコールからは, E_TMOUT エラーが返る.

    タイムアウトを起こすまでの時間(タイムアウト時間)は,符号付きの整数型 である TMO 型で表し,単位はシステム時刻と同一,すなわちミリ秒とする.タイ ムアウト時間に正の値を指定した場合には,タイムアウトを起こすまでの相対 時間を表す.すなわち,タイムアウトの処理が行われるのは,サービスコール を呼び出してから指定した以上の時間が経過した後となる.

    ポーリング( polling )を行うサービスコールとは,サービスコールの中で待ち 状態に遷移すべ き状況になった場合に,サービスコールの処理を取りやめてリ ターンするサービスコールのことをいう.ここで,サービスコールの処理を取 りやめてリターンすることを,ポーリングに失敗したという.ポーリングに失 敗したサービスコールからは, E_TMOUT エラーが返る.

    ポーリングを行うサービスコールでは,待ち状態に遷移することはないのが原 則である.そのため,ポーリングを行うサービスコールは,ディ スパッチ保留 状態であっても呼び出せる場合がある.ただし,サービスコールの中で待ち状 態に遷移する状況が複数ある場合,ある状況でポーリング動作をしても,他の 状況では待ち状態に遷移する場合がある.このような場合の振舞いは,該当す るサービスコール毎に規定する.

    タイムアウト付きのサービスコールは,別に規定がない限りは,タイムアウト 時間に TMO_POL (= 0)を指定し た場合にはポーリングを行い, TMO_FEVR (= -1) を指定した場合にはタイムアウトを起こさないものとする.

    【補足説明】

    エラーコードに関する原則により,サービスコールがタイムアウトした場合や ポーリングに失敗した場合には,サービスコールによる副作用がないのが原則 である.ただし,そのような実装ができない場合にはこの原則の例外とし,ど のよう な副作用があるかをサービスコール毎に規定する.

    タイムアウト付きのサービスコールを,タイムアウト時間を TMO_POL として呼び 出した場合には,ディスパッチ保留状態で呼び出すと E_CTX エラーとなることを 除いては,ポーリングを行うサービスコールと同じ振舞いをする.また,タイ ムアウト時間を TMO_FEVR として呼び出した場合には,タイムアウトなしのサー ビスコールと全く同じ振舞いをする.

    【μ ITRON4.0 仕様との関係】

    タイムアウト時間( TMO 型)の時間単位は,μ ITRON4.0 仕様では実装定義として いたが,この仕様ではミリ秒と規定した.

    【仕様決定の理由】

    ディスパッチ保留状態において,ポーリングを行うサービスコールを呼び出せ る場合があるのに対して,タイムアウト付きのサービスコールをタイムアウト 時間を TMO_POL として呼び出すとエラーになるのは,ディスパッチ保留状態では, 別に規定がない限り,自タスクを広義の待ち状態に遷移させる可能性のあるサー ビスコール(タイムアウト付きのサービスコールはこれに該当)を呼び出すこ とはできないと規定されているためである.

  • (4) ノンブロッキング

    サービスコールの中で待ち状態に遷移すべき状況になった時,サービスコール の処理を継続したままサービスコールからリターンする場合,そのサービスコー ルをノンブロッキング( non -blocking )という.処理を継続したままリターン する場合,サービスコールからは E_WBLK エラーが返る. E_WBLK は警告を表すエ ラーコードであり,サービスコールによる副作用がないという原則は適用され な い.

    サービスコールから E_WBLK エラーが返った場合には,サービスコールの処理は 継続しているため,サービスコールに渡したパラメータまたはリターンパラメー タを入れる領域はまだ参照される可能性があり,別の目的に使用することはで きない.継続している処理が完了した場合や,何らかの理由で処理が取りやめ られた場合には,コールバックを呼び出すなどの方法で,サービスコールを呼 び出したソフトウェアに通知するものとする.

    ノンブロッキングの指定は,タイムアウト時間に TMO_NBLK (= -2)を指定する ことによって行う.ノンブロッキングの指定を行えるサービスコールは,指定 した場合の振舞いをサービスコール毎に規定する.

    【補足説明】

    ノンブロッキングは,システムサービスでサポートすることを想定した機 能で ある.カーネルは,ノンブロッキングの指定を行えるサービスコールをサポー トしていない.

2.3.3 保護機能

この節では,保護機能に関連する主な概念について説明する.この節の内容は, 保護機能対応カーネルにのみ適用される.

  • (1) アクセス保護

    保護機能対応カーネルは,処理単位 が,許可されたカーネルオブジェクトに対 して,許可された種別のアクセスを行うことのみを許し,それ以外のアクセス を防ぐアクセス保護機能を提供する.

    アクセス制御の用語では,処理単位が主体( subject ),カーネルオブジェクト が対象( object )ということになる.

  • (2) メモリオブジェクト

    保護機能対応カーネルにおいては,メモリ領域をカーネルオブジェクトとして 扱い,アクセス保護の対象とする.カーネルがアクセス保護の対象とする連続 したメモリ領域を,メモリオブジェクト( memory object )と呼ぶ.メモリオブ ジェクトは,互いに重なりあうことはない.

    メモリオブジェクトは,その先頭番地によって識別する.言い換えると,先頭 番地がオブジェクト番号とな る.

    メモリオブジェクトの先頭番地とサイズには,ターゲットハードウェアでメモ リ保護が実現できるように,ターゲット定義の制約が課せられる.

  • (3) 保護ドメイン

    保護機能を提供するために用いるカーネルオブジェクトの集合を,保護ドメイ ン( protection domain )と呼ぶ.保護ドメインは,保護ドメイン ID と呼ぶ ID 番 号によって識別する.

    カーネルオブジェクトは,たかだか 1つの保護ドメインに属する.処理単位は, いずれか 1つの保護ドメインに属さなければならないのに対して,それ以外のカー ネルオブジェクトは,いずれの保護ドメインにも属さないことができる.いず れの保護ドメインにも属さないカーネルオブジェクトを,無所属のカーネルオ ブジェクト( independent kernel object )と呼ぶ.

    処理単位がカーネルオブジェクトにアクセスできるかどうかは,処理単位が属 する保護ドメインにより決まるのが原則である.すなわち,カーネルオブジェ クトに対するアクセス権は,処理単位ではなく,保護ドメイン単位で管理され る.このことから,ある保護ドメインに属する処理単位がアクセスできること を,単に,その保護ドメインからアクセスできるという.

    ただし,タスクのユーザスタック領域は,ターゲット定義での変更がない限り は,そのタスク(とカーネルドメインに属する処理単位)のみがアクセスでき る(「 2.11.6 ユーザタスクのユーザスタック領域」の節を参照).これは, 「処理単位がカーネルオブジェクトにアクセスできるかどうかは,処理単位が 属する保護ドメインにより決まる」という原則の例外となっている.

    デフォルトで は,保護ドメインに属するカーネルオブジェクトは,同じ保護ド メイン(とカーネルドメイン)のみからアクセスできる.また,無所属のカー ネルオブジェクトは,すべての保護ドメインからアクセスできる.

  • (4) カーネルドメインとユーザドメイン

    システムには,カーネルドメイン( kernel domain )と呼ばれる保護ドメインが 1 つ存在する.カーネルドメインに属する処理単位 は,プロセッサの特権モード で実行される.また,すべてのカーネルオブジェクトに対して,すべての種別 のアクセスを行うことが許可される.この仕様で,「ある保護ドメイン(また はタスク)のみからアクセスできる」といった場合でも,カーネルドメインド メインからはアクセスすることができる.

    カーネルドメイン以外の保護ドメインを,ユーザドメイン( user domain )と呼 ぶ .ユーザドメインに属する処理単位は,プロセッサの非特権モードで実行さ れる.また,どのカーネルオブジェクトに対してどの種別のアクセスを行える かを制限することができる.

    ユーザドメインには, 1から連続する正の整数値の保護ドメイン ID が付与される. カーネルドメインの保護ドメイン ID は, TDOM_KERNEL (= -1)である.

    この仕様では,システムに登録できるユーザドメインの数は, 32 個以下に制限 する.これを超える数のユーザドメインを登録した場合には,コンフィギュレー タがエラーを報告する.

    【補足説明】

    ユーザドメインは,システムコンフィギュレーションファイル中にユーザドメ インの囲みを記述することで,カーネルに登録する(「 2.12.3 保護ドメインの 指定」の節を参照).ユーザドメインを動的に生成する機能は,現時点では用 意していない.

    保護機能対応でないカーネルは,カーネルドメインのみをサポートしていると みなすこともできる.

    【μ ITRON4.0/PX 仕様との関係】

    μ ITRON4.0/PX 仕様のシステムドメイン( system domain )は,現時点ではサポー トしない.システムドメインは,それに属する処理単位が,プロセッサの特権 モードで実行され,カーネルオブジェクトに対するアクセスを制限することが できる保護ドメインである.

  • (5) システムタスクとユーザタスク

    カーネルドメインに属するタスクをシステムタスク( system task ),ユーザド メインに属するタスクをユーザタスク( user task )と呼ぶ.

    【補足説明】

    特権モードで実行されるタスクをシステムタスク,非特権モードで実行される タスクをユーザタスクと定義する方法もあるが,ユーザタスクであっても,サー ビスコールの実行中は特権モードで実行されるため,上記の定義とした.

    μ ITRON4.0/PX 仕様のシステムドメインに属するタスクは,システムタスクと呼 ぶことになる.

  • (6) アクセス許可パターン

    あるカーネルオブジェクトに対するある種別のアクセスが,どの保護ドメイン に属する処理単位に許可されているかを表現するビットパターンを,アクセス 許可パターン( access permission pattern )と呼ぶ.アクセス許可パターンの 各ビットは, 1つのユーザドメインに対応する.カーネルドメインには,すべて の アクセスが許可されているため,カーネルドメインに対応するビットは用意 されていない.

    アクセス許可パターンは,符号無し 32 ビット整数に定義されるデータ型 ( ACPTN )で保持し,値が 1のビットに対応するユーザドメインにアクセスが許 可されていることを表す.そのため, 2つのアクセス許可パターンのビット毎論 理和( C言語の "|" )を求めることで,アクセスを許可されているユーザドメイ ンの和集合( union )を得ることができる.また, 2つのアクセス許可パターン のビット毎論理積( C言語の "&" )を求めることで,アクセスを許可されている ユーザドメインの積集合( intersection )を得ることができる.

    アクセス許可パターンの指定に用いるために,指定したユーザドメインのみに アクセスを許可することを示すアクセス許可パターンを構成するマクロ( TACP ) が 用意されている.また,カーネルドメインのみにアクセスを許可することを 示すアクセス許可パターンを表す定数( TACP_KERNEL )と,すべての保護ドメイ ンにアクセスを許可することを示すアクセス許可パターンを表す定数 ( TACP_SHARED )が用意されている.

  • (7) アクセス許可ベクタ

    カーネルオブジェクトに対するアクセスは,カーネルオブジェクトの種類毎に, 通常操作 1,通常操作 2,管理操作,参照操作の 4つの種別に分類されている.あ るカーネルオブジェクトに対する 4つの種別のアクセスに関するアクセス許可パ ターンをひとまとめにしたものを,アクセス許可ベクタ( access permission vector )と呼び,次のように定義されるデータ型( ACVCT )で保持する.

typedef struct acvct {
    ACPTN   acptn1;     /*  通常操作 1のアクセス許可パターン  */
    ACPTN   acptn2;     /*  通常操作 2のアクセス許可パターン  */
    ACPTN   acptn3;     /*  管理操作のアクセス許可パターン  */
    ACPTN   acptn4;     /*  参照操作のアクセス許可パターン  */
} ACVCT;

【補足説明】

カーネルオブジェクトの種類毎のアクセスの種別の分類については,「 5.8 カー ネルオブジェクトに対するアクセスの種別」の節を参照すること.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様では,アクセス許可ベクタを, 1つまたは 2つのアクセス許可 パターンで構成することも 許しているが,この仕様では 4つで構成するものと決 めている.

  • (8) サービスコールの呼出し方法

    保護機能対応カーネルでは,サービスコールは,ソフトウェア割込みによって 呼び出すのが基本である.サービスコール呼出しを通常の方法で記述した場合, ソフトウェア割込みによって呼び出すコードが生成される.

    一般に,ソフトウェア割込みによるサービスコール呼出しはオーバヘッドが大 きい.そのため,カーネルドメインに属する処理単位からは,関数呼出しによっ てサービスコールを呼び出すことで,オーバヘッドを削減することができる. そこで,カーネルドメインに属する処理単位から関数呼出しによってサービス コールを呼び出せるように,以下の機能が用意されている.

    カーネルドメインに属する 処理単位が実行する関数のみを含んだソースファイ ルでは,カーネルヘッダファイル( kernel.h )をインクルードする前に, TOPPERS_SVC_CALL をマクロ定義することで,サービスコール呼出しを通常の方 法で記述した場合に,関数呼出しによって呼び出すコードが生成される.

    また,カーネルドメインに属する処理単位が実行する関数と,ユーザドメイン に属する処理単位が実行する関数の両方を 含んだソースファイルでは,関数呼 出しによってサービスコールを呼び出すための名称を作るマクロ( SVC_CALL ) を用いることで,関数呼出しによって呼び出すコードが生成される.例えば, act_tsk を関数呼出しによって呼び出す場合には,次のように記述すればよい.

    ercd = SVC_CALL(act_tsk)(tskid);

【補足説明】

拡張サービスコールを,関数呼出しによって呼び出す方法は用意されていない. カーネルドメインに属する処理単位が,関数呼出しによって,拡張サービスコー ルとして登録した関数を呼び出すことはできるが,その場合には,処理単位が 呼び出した通常の関数であるとみなされ,拡張サービスコールであるとは扱わ れない.

2.3.4 マルチプロセッサ対応

この節では,マルチプロセッサ対応に関連する主な概念について説明する.こ の節の内容は,マルチプロセッサ対応カーネルにのみ適用される.

  • (1) クラス

    マルチプロセッサに対応するために用いるカーネルオブジェクトの集合を,ク ラス( class )と呼ぶ.クラスは,クラス ID と呼ぶ ID 番号によって識別する.

    カーネルオブジェクトは, いずれか 1つのクラスに属するのが原則である.カー ネルオブジェクトが属するクラスは,オブジェクトの登録時に決定し,登録後 に変更することはできない.

    【補足説明】

    処理単位を実行するプロセッサを静的に決定する機能分散型のマルチプロセッ サシステムでは,プロセッサ毎にクラスを設ける方法が典型的である.それに 対して,対称型のマルチプロセッサシステムで,処理単位のマイグレーション を許す場合には,プロセッサ毎のクラスに加えて,どのプロセッサでも実行で きるクラスを(システム中に 1つまたは初期割付けプロセッサ毎に)設ける方法 が典型的である.

    カーネルオブジェクトはいずれか 1つのクラスに属するという原則に関わらず, 以下のオブジェクトはいずれのクラスにも属さない.

  • ・オーバランハンドラ
  • ・拡張サービスコール
  • ・グローバル初期化ルーチン
  • ・グローバル終了処理ルーチン

マルチプロセッサ対応でないカーネルは,カーネルによって規定された 1つのク ラスのみをサポートしているとみなすこともできる.

  • (2) プロセッサ

    たかだか 1つの処理単位のみを同時に実行できるハードウェアの単位を,プロセッ サ( processor )と呼ぶ.プロセッサは,プロセッサ ID と呼ぶ ID 番号によって識 別する.

    複数のプロセッサを持つシステム構成をマルチプロセッサ( multiprocessor ) と呼び,同時に複数の処理単位を実行することができる.

    システムの初期化時と終了時に特別な役割を果たすプロセッサを,マスタ プロ セッサ( master processor )と呼び,システムに 1つ存在する.どのプロセッサ をマスタプロセッサとするかは,ターゲット定義である.マスタプロセッサ以 外のプロセッサを,スレーブプロセッサ( slave processor )と呼ぶ.なお,カー ネル動作状態では,マスタプロセッサとスレーブプロセッサの振舞いに違いは ない.

  • (3) 処理単位の割付けとマイグ レーション

    処理単位は,後述のマイグレーションが発生しない限りは,いずれか 1つのプロ セッサに割り付けられて実行される.処理単位を実行するプロセッサを,割付 けプロセッサと呼ぶ.また,処理単位が登録時に割り付けられるプロセッサを, 初期割付けプロセッサと呼ぶ.

    処理単位によっては,処理単位の登録後に,割付けプロセッサを変更すること が可能である.処理単位の登録後に割付けプロセッサを変更することを,処理 単位のマイグレーション( migration )と呼ぶ.

    割付けプロセッサを変更できる処理単位に対しては,処理単位を割り付けるこ とができるプロセッサ(これを,割付け可能プロセッサと呼ぶ)を制限するこ とができる.

  • (4) クラスの持つ属性とカーネルオブジェクト

    タスクの初期割付けプロセッサや割付け可能プロセッサなど,カーネルオブジェ クトをマルチプロセッサ上で実現する際に設定すべき属性は,そのカーネルオ ブジェクトが属するクラスによって定まる.

    各クラスが持ち,それに属するカーネルオブジェクトに適用される属性は,次 の通りである.

  • ・初期割付けプロセッサ
  • ・割付け可能プロセ ッサ(複数のプロセッサを指定可能,初期割付けプロセッ サを含む)
  • ・ ATT_MOD / ATA_MOD において,オブジェクトモジュール中に含まれる標準の セクションが配置されるメモリリージョン
  • ・オブジェクト生成に必要なメモリ領域(オブジェクトの管理ブロック,タ スクのスタック領域やデータキューのデータキュー管理領域など)の配置 場所
  • ・その他の管理情報(ロック単位など)

使用できるクラスの ID 番号とその属性は,ターゲット定義である.

【仕様決定の理由】

クラスを導入することで,カーネルオブジェクト毎に上記の属性を設定できる ようにしなかったのは,これらの属性をアプリケーション設計者が個別に設定 するよりも,ターゲット依存部の実装者が有益な組み合わせをあ らかじめ用意 しておく方が良いと考えたためである.

  • (5) ローカルタイマ方式とグローバルタイマ方式

    システム時刻の管理方式として,プロセッサ毎にシステム時刻を持つローカル タイマ方式と,システム全体で 1つのシステム時刻を持つグローバルタイマ方式 の 2つの方式がある.どちらの方式を用いることができるかは,ターゲット定義 である.

    ローカルタイマ方式では,プロセッサ毎のシステム時刻は,それぞれのプロセッ サが更新する.異なるプロセッサのシステム時刻を同期させる機能は,カーネ ルでは用意しない.

    グローバルタイマ方式では,システム中の 1つのプロセッサがシステム時刻を更 新する.これを,システム時刻管理プロセッサと呼ぶ.どのプロセッサをシス テム時刻管理プロセッサとするかは,ターゲット定義であ る.

    【補足説明】

    システム時刻管理プロセッサが,マスタプロセッサと一致している必要はない.

    【未決定事項】

    ローカルタイマ方式の場合に,プロセッサ毎に異なるタイムティックの周期を 設定したい場合が考えられるが,現時点の実装ではサポートしておらず, TIC_NUME と TIC_DENO の扱いも未決定であるため,今後の課題とする.

2.3.5 その他

  • (1) オブジェクトモジュール

    プログラムのオブジェクトコードとデータを含むファイルを,オブジェクトモ ジュール( object module )と呼ぶ.オブジェクトファイルとライブラリは,オ ブジェクトモジュールである.

  • (2) メモリリージョン

    オブジェクトモジュールに含まれるセクションの配置対象となる同じ性質を持っ た連続したメモリ領域をメモリリージョン( memory region )と呼ぶ.

    メモリリージョンは,文字列によって識別する.メモリリージョンを識別する 文字列を,メモリリージョン名と呼ぶ.

    【補足説明】

    この仕様では,メモリ領域( memory area )という用語は,連続したメモリの範 囲という一般的な意味で使っている.

  • (3) 標準のセクション

    コンパイラに特別な指定をしない場合に出力するセクションを,標準のセクショ ン( standard sections )と呼ぶ.また,ターゲット定義で,コンパイラが出力 しないセクションを,標準のセクションと扱う場合もある.

  • (4) 保護ドメイン毎の標準セクション

    保護機能対応カーネルにおいては,保護ドメイン毎に,標準のセクションを配 置するためのセクションが登録される.また,無所属の標準のセクションを配 置するためのセクションが登録される.これらのセクションを,保護ドメイン 毎の標準セクションと呼ぶ( stand ard sections for each protection domain ). 保護ドメイン毎の標準セクションのセクション名は,ターゲット定義で別に規 定がない限りは,標準のセクション名と保護ドメイン名(カーネルドメインの 場合は "kernel" ,無所属の場合は "shared" )を "_" でつないだものとする.例え ば,カーネルドメインの ".text" セクションのセクション名は, ".text_kernel" とする.

2.4 処理単位の種類と実行順序

2.4.1 処理単位の種類

カーネルが実行を制御する処理単位の種類は次の通りである.

  • (a) タスク
    • (a.1) タスク例外処理ルーチン
  • (b) 割込みハンドラ
    • (b.1) 割込みサービスルーチン
    • (b.2) タイムイベントハンドラ
  • (c) CPU 例外ハンドラ
  • (d) 拡張サービスコール
  • (e) 初期化ルーチン
  • (f) 終了処理ルーチン

    ここで,タイムイベントハンドラとは,時間の経過をきっかけに起動される処 理単位である周期ハンドラ,アラームハンドラ,オーバランハンドラの総称で ある.

    【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,オーバランハンドラと拡張サービスコールをサポートしてい ない.ただし,オーバランハンドラ機能拡張パッケージを用いると,オーバラ ンハンドラ機能を追加することができる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,オーバランハンドラと拡 張サービスコールをサポートしてい ない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスク例外処理ルーチン,タイムイベントハンドラ,拡張サー ビスコールをサポートしていない.

2.4.2 処理単位の実行順序

処理単位の実行順序を規定するために,ここでは,処理単位の優先順位を規定 する.また,ディスパッチが起こるタイミングを規定するために,ディスパッ チを行うカーネル内の処理であるディスパッチャの優先順位についても規定す る.

タスクの優先順位は,ディスパッチャの優先順位よりも低い.タスク間では, 高い優先度を持つ方が優先順位が高く,同じ優先度を持つタスク間では,先に 実行できる状態となった方が優先順位が高い.詳しくは,「 2.6.3 タスクのス ケジューリング規則」の節を参照すること.

タスク例外処理ルーチンの優先順位は,例外が要求されたタスクと同じである が,タスクよりも先に実行される.

割込みハンドラの優先順位は,ディスパッチャの優先順位よりも高い.割込み ハンドラ間では,高い割込み優先度を持つ方が優先順位 が高く,同じ割込み優 先度を持つ割込みハンドラ間では,先に実行開始された方が優先順位が高い. 同じ割込み優先度を持つ割込みハンドラ間での実行開始順序は,この仕様では 規定しない.詳しくは,「 2.7.2 割込み優先度」の節を参照すること.

割込みサービスルーチンとタイムイベントハンドラの優先順位は,それを呼び 出す割込みハンドラと同じである.

CP U例外ハンドラの優先順位は, CPU 例外がタスクまたはタスク例外処理ルーチ ンで発生した場合には,ディスパッチャの優先順位と同じであるが,ディスパッ チャよりも先に実行される. CPU 例外がその他の処理単位で発生した場合には, CPU 例外ハンドラの優先順位は,その処理単位の優先順位と同じであるが,その 処理単位よりも先に実行される.

拡張サービスコールの優先順位は,それを呼び出した処理単位と 同じであるが, それを呼び出した処理単位よりも先に実行される.

初期化ルーチンは,カーネルの動作開始前に,システムコンフィギュレーショ ンファイル中に初期化ルーチンを登録する静的 API を記述したのと同じ順序で実 行される.終了処理ルーチンは,カーネルの動作終了後に,終了処理ルーチン を登録する静的 API を記述したのと逆の順序で実行される.

マルチプロセッサ対応カーネルでは,初期化ルーチンには,クラスに属さない グローバル初期化ルーチンと,クラスに属するローカル初期化ルーチンがある. グローバル初期化ルーチンがマスタプロセッサで実行された後に,各プロセッ サでローカル初期化ルーチンが実行される.また,終了処理ルーチンには,ク ラスに属さないグローバル終了処理ルーチンと,クラスに属するローカル終了 処理ルーチンがある.ローカル終 了処理ルーチンが各プロセッサで実行された 後に,マスタプロセッサでグローバル終了処理ルーチンが実行される.

【仕様決定の理由】

終了処理ルーチンを,登録する静的 API を記述したのと逆順で実行するのは,終 了処理は初期化の逆の順序で行うのがよいためである(システムコンフィギュ レーションファイルを分割すると,終了処理ルーチンを登録する静的 API だけ逆 順に記述するのは難しい).

2.4.3 カーネル処理の不可分性

カーネルのサービスコール処理やディスパッチャ,割込みハンドラと CPU 例外ハ ンドラの入口処理と出口処理などのカーネル処理は不可分に実行されるのが基 本である.実際には,カーネル処理の途中でアプリケーションが実行される場 合はあるが,アプリケーションがサービスコールを用いて観測できる範囲で, カーネル処理が不可分に実行された場合と同様に振る舞うのが原則である.こ れを,カーネル処理の不可分性という.

ただし,マルチプロセッサ対応カーネルにおいては,カーネル処理が実行され ているプロセッサ以外のプロセッサから,カーネル処理の途中の状態が観測で きる場合がある.具体的には, 1つのサービスコールにより複数のオブジェクト の状態が変化する場合に,一部のオブジェクトの状態のみが変化し,残りのオ ブジェクトの状態が変化していない過渡的な状態が観測できる場合がある.

【補足説明】

マルチプロセッサ対応でないカーネルでは, 1つのサービスコールにより複数の タスクが実行できる状態になる場合,新しく実行状態となるべきタスクへのディ スパッチは,すべてのタスクの状態遷移が完了し た後に行われる.例えば,低 優先度のタスク Aが発行したサービスコールにより,中優先度のタスク Bと高優 先度のタスク Cがこの順で待ち解除される場合,タスク Bとタスク Cが待ち解除さ れた後に,タスク Cへのディスパッチが行われる.

マルチプロセッサ対応カーネルでは,上のことは, 1つのプロセッサ内では成り 立つが,他のプロセッサに割り付けられたタスクに対しては成り立たない.例 えば,プロセッサ 1で低優先度のタスク Aが実行されている時に,他のプロセッ サ 2で実行されているタスクが発行したサービスコールにより,プロセッサ 1に 割り付けられた中優先度のタスク Bと高優先度のタスク Cがこの順で待ち解除さ れる場合,タスク Cが待ち解除される前に,タスク Bへディスパッチされる場合 がある.

2.4.4 処理単位を実行するプロセッサ

マルチプロセッサ対応カーネルでは,処理単位を実行するプロセッサ(割付け プロセッサ)は,その処理単位が属するクラスの初期割付けプロセッサと割付 け可能プロセッサから,次のように決まる.

タスク,周期ハンドラ,アラームハンドラは,登録時に,属するクラスの初期 割付けプロセッサに割り付けられる.また,割付けプロセッサを変更するサー ビスコール( mact_tsk / imact_tsk , mig_tsk , msta_cyc , msta_alm / imsta_alm )によって,割付けプロセッサを,クラスの割付け可能プロセッサの いずれかに変更することができる.

割込みハンドラ, CPU 例外ハンドラ,ローカル初期化ルーチン,ローカル終了処 理ルーチンは,属するクラスの初期割付けプロセッサで実行される.クラスの 割 付け可能プロセッサの情報は用いられない.

割込みサービスルーチンは,属するクラスの割付け可能プロセッサのいずれか (オプション設定によりすべて)で実行される.クラスの初期割付けプロセッ サの情報は用いられない.

以上を整理すると,次の表の通りとなる.この表の中で,「○」はその情報が 使用されることを,「 - 」はその情報が使用されないことを示す.

  初期割付けプロセッサ 割付け可能プロセッサ
タスク(タスク例外処理ルーチンを含む)
割込みハンドラ
割込みサービスルーチン
周期ハンドラ
アラームハンドラ
CPU 例外ハンドラ
ローカル初期化ルーチン
ローカル終了処理ルーチン

オーバランハンドラ,拡張サービスコール,グローバル初期化ルーチン,グロー バル終了処理ルーチンは,いずれのクラスにも属さない.オーバランハンドラ は,オーバランを起こしたタスクの割付けプロセッサによって実行される.拡 張サービスコールは,それを呼び出した処理単位の割付けプロセッサによって 実行される.グローバル初期化ルーチンとグローバル終了処理ルーチンは,マ スタプロセッサによって実行される.

2.5 システム状態とコンテキスト

2.5.1 カーネル動作状態と非動作状態

カーネルの初期化が完了した後,カーネルの終了処理が開始されるまでの間を, カーネル動作状態と呼ぶ.それ以外の状態,すなわちカーネルの初期化完了前 (初期化ルーチンの実行中を含む)と終了処理開始後(終了処理ルーチンの実 行中を含む)を,カーネル非動作状態と呼ぶ.プロセッサは,カーネル動作状 態かカーネル非動作状態のい ずれかの状態を取る.

カーネル非動作状態では,原則として, NMI を除くすべての割込みがマスクされ る.

カーネル非動作状態では,システムインタフェースレイヤの API とカーネル非動 作状態を参照するサービスコール( sns_ker )のみを呼び出すことができる.カー ネル非動作状態で,その他のサービスコールを呼び出した場合の動作は,保証 されない.

マルチプロセッサ対応カーネルでは,プロセッサ毎に,カーネル動作状態かカー ネル非動作状態のいずれかの状態を取る.

2.5.2 タスクコンテキストと非タスクコンテキスト

処理単位が実行される環境(用いるスタック領域やプロセッサの動作モードな ど)をコンテキストと呼ぶ.

カーネル動作状態において,処理単位が実行されるコンテキストは,タスクコ ンテキストと非タスクコンテキストに分類される.

タスク(タスク例外処理ルーチンを含む)が実行されるコンテキストは,タス クコンテキストに分類される.また,タスクコンテキストから呼び出した拡張 サービスコールが実行されるコンテキストは,タスクコンテキストに分類され る.

割込みハンドラ(割込みサービスルーチンおよびタイムイベントハンドラを含 む)と CPU 例外ハンドラが実行されるコンテキストは,非タスクコンテキストに 分類される.また,非タスクコンテキストから呼び出した拡張サービスコール が実行されるコンテキストは,非タスクコンテキストに分類される.

タスクコンテキストで実行される処理単位は,別に規定がない限り,タスクの スタック領域を用いて 実行される.非タスクコンテキストで実行される処理単 位は,別に規定がない限り,非タスクコンテキスト用スタック領域を用いて実 行される.

タスクコンテキストからは,非タスクコンテキスト専用のサービスコールを呼 び出すことはできない.逆に,非タスクコンテキストからは,タスクコンテキ スト専用のサービスコールを呼び出すことはできない.いずれも,呼び出した 場合には E_CTX エラーとなる.

2.5.3 カーネルの振舞いに影響を与える状態

カーネル動作状態において,プロセッサは,カーネルの振舞いに影響を与える 状態として,次の状態を持つ.

  • ・全割込みロックフラグ(全割込みロック状態と全割込みロック解除状態)
  • ・ CPU ロックフラグ( CPU ロック状態と CPU ロック解除状態)
  • ・割込み優先度マスク(割込み優先度マスク全解除状態と全解除でない状態)
  • ・ディスパッチ禁止フラグ(ディスパッチ禁止状態とディスパッチ許可状態)

これらの状態は,それぞれ独立な状態である.すなわち,プロセッサは上記の 状態の任意の組合せを取ることができ,それぞれの状態を独立に変化させるこ とができる.

2.5.4 全割込みロック状態と全割込みロ ック解除状態

プロセッサは, NMI を除くすべての割込みをマスクするための全割込みロックフ ラグを持つ.全割込みロックフラグがセットされた状態を全割込みロック状態, クリアされた状態を全割込みロック解除状態と呼ぶ.すなわち,全割込みロッ ク状態では, NMI を除くすべての割込みがマスクされる.

全割込みロック状態では,システムインタフェースレイヤの API とカーネル非動 作状態を参照するサービスコール( sns_ker ),カーネルを終了するサービスコー ル( ext_ker )のみを呼び出すことができ,その他のサービスコールを呼び出す ことはできない.全割込みロック状態で,その他のサービスコールを呼び出し た場合の動作は,保証されない.また,全割込みロック状態では,実行中の処 理単位からリターンしてはならない.リターンした場合の動作は保証されない.

マルチプロセッサ対応カーネルでは,プロセッサ毎に,全割込みロックフラグ を持つ.すなわち,プロセッサ毎に,全割込みロック状態か全割込みロック解 除状態のいずれかの状態を取る.

2.5.5 CPU ロック状態と CPU ロック解除状態

プロセッサは,カーネル管理の割込み(「 2.7.7 カーネル管理外の割込み」の 節を参照)をすべてマスクするための CPU ロ ックフラグを持つ. CPU ロックフラ グがセットされた状態を CPU ロック状態,クリアされた状態を CPU ロック解除状 態と呼ぶ.すなわち, CPU ロック状態では,すべてのカーネル管理の割込みがマ スクされ,ディスパッチが保留される.

NMI 以外にカーネル管理外の割込みを設けない場合には,全割込みロックフラグ と CPU ロックフラグの機能は同一となるが,両フラグは独立に存在する.

CPU ロック状態で呼び出すことができるサービスコールは次の通り.

  • ・システムインタフェースレイヤの API
  • ・ loc_cpu / iloc_cpu , unl_cpu / iunl_cpu
  • ・ unl_spn / iunl_spn (マルチプロセッサ対応カーネルのみ)
  • ・ dis_int , ena_int
  • ・ sns_yyy , xsns_yyy ( CPU 例外ハンドラからのみ)
  • ・ get_utm
  • ・ ext_tsk , ext_ker
  • ・ cal_svc (保護機能対応カーネルのみ)

CPU ロック状態で,その他のサービスコールを呼び出した場合には, E_CTX エラー となる.

マルチプロセッサ対応カーネルでは,プロセッサ毎に, CPU ロックフラグを持つ. すなわち,プロセッサ毎に, CPU ロック状態か CPU ロック解除状態のいずれかの 状態を取る.

【補足説明】

マルチプロセッサ対応カーネルにおいて,あるプロセッサが CPU ロック状態にあ る間は,そのプロセッサにおいてのみ,すべてのカーネル管理の割込みがマス クされ,ディスパッチが保留される.それに対して他のプロセッサにおいては, 割込みはマスクされず,ディスパッチも起こるため, CPU ロック状態を使って他 のプロセッサで実行される処理単位との排他制御を実現することはできない.

2.5.6 割込み優先度マスク

プロセッサは,割込み優先度を基準に割込みをマスクするための割込み優先度 マスクを持つ.割込み優先度マスクが TIPM_ENAALL (= 0)の時は,いずれの割 込み要求もマスクされない.この状 態を割込み優先度マスク全解除状態と呼ぶ. 割込み優先度マスクが TIPM_ENAALL (= 0)以外の時は,割込み優先度マスクと 同じかそれより低い割込み優先度を持つ割込みはマスクされ,ディスパッチは 保留される.この状態を割込み優先度マスクが全解除でない状態と呼ぶ.

割込み優先度マスクが全解除でない状態では,別に規定がない限りは,自タス クを広義の待ち状態に遷移させる可能性のあるサービスコ ールを呼び出すこと はできない.呼び出した場合には, E_CTX エラーとなる.

マルチプロセッサ対応カーネルでは,プロセッサ毎に,割込み優先度マスクを 持つ.

2.5.7 ディスパッチ禁止状態とディスパッチ許可状態

プロセッサは,ディスパッチを保留するためのディスパッチ禁止フラグを持つ. ディスパッチ禁止フラグがセットされた状態をディスパッチ禁止状態,クリア された状態をディスパッチ許可状態と呼ぶ.すなわち,ディスパッチ禁止状態 では,ディスパッチは保留される.

ディスパッチ禁止状態では,別に規定がない限りは,自タスクを広義の待ち状 態に遷移させる可能性のあるサービスコールを呼び出すことはできない.呼び 出した場合には, E_CTX エラーとなる.

マルチプロセッサ対応カーネルでは,プロセッサ毎に,ディスパッチ禁止フラ グを持つ.すなわち,プロセッサ毎に,ディスパッチ禁止状態かディスパッチ 許可状態のいずれかの状態を取る.

【補足説明】

マルチプロセッサ対応カーネルにおいて,あるプロセッサがディスパッチ禁止 状態にある間は,そのプロセッサにおいてのみ,ディスパッチが保留される . それに対して他のプロセッサにおいては,ディスパッチが起こるため,ディス パッチ禁止状態を使って他のプロセッサで実行されるタスクとの排他制御を実 現することはできない.

2.5.8 ディスパッチ保留状態

非タスクコンテキストの実行中, CPU ロック状態,割込み優先度マスクが全解除 でない状態,ディスパッチ禁止状態では,ディスパッチが保留される.こ れら の状態を総称して,ディスパッチ保留状態と呼ぶ.

マルチプロセッサ対応カーネルでは,プロセッサ毎に,ディスパッチ保留状態 かそうでない状態のいずれかの状態を取る.

【補足説明】

全割込みロック状態はカーネルが管理しておらず,ディスパッチが保留される ことをカーネルが保証できないため,ディスパッチ保留状態に含めていない.

2.5.9 カーネル管理外の状態

全割込みロック状態,カーネル管理外の割込みハンドラ実行中(「 2.7.7 カー ネル管理外の割込み」の節を参照),カーネル管理外の CPU 例外ハンドラ実行中 (「 2.8.4 カーネル管理外の CPU 例外」の節を参照)を総称して,カーネル管理 外の状態と呼ぶ.

それぞれの節で規定する通り,カーネル管 理外の状態では,システムインタ フェースレイヤの API と sns_ker , ext_ker のみ(カーネル管理外の CPU 例外ハン ドラからは,それに加えて xsns_dpn と xsns_xpn )を呼び出すことができ,その 他のサービスコールを呼び出すことはできない.カーネル管理外の状態から, その他のサービスコールを呼び出した場合の動作は,保証されない.

カーネル管理外の状態では,少なくとも,カー ネル管理の割込みはマスクされ ている.カーネル管理外の割込み(の一部)もマスクされている場合もある. 保護機能対応カーネルでは,カーネル管理外の状態になるのは,特権モードで 実行している間に限られる.

2.5.10 処理単位の開始・終了とシステム状態

各処理単位が実行開始されるシステム状態の条件(実行開始条件),各処理単 位の実行開始時にカーネル によって行われるシステム状態の変更処理(実行開 始時処理),各処理単位からのリターン前(または終了前)にアプリケーショ ンが設定しておくべきシステム状態(リターン前または終了前),各処理単位 からのリターン時(または終了時)にカーネルによって行われるシステム状態 の変更処理(リターン時処理または終了時処理)は,次の表の通りである.

  CPU ロックフラグ 割込み優先度マスク ディスパッチ禁止フラグ
【タスク】
実行開始条件 解除 全解除 許可
実行開始時処理 そのまま そのまま そのまま
終了前 原則解除 (*1) 原則全解除 (*1) 原則許可 (*1)
終了時処理 解除する 全解除する 許可する
【タスク例外処理ルーチン】
実行開始条件 解除 全解除 任意
実行開始時処理 そのまま そのまま そのまま
リターン前 原則解除 (*1) 原則全解除 (*1) 元に戻す
リターン時処理 解除する 全解除する 元に戻す (*4)
【カーネル管理の割込みハンドラ】
【割込みサービスルーチン】
【タイムイベントハンドラ】
実行開始条件 解除 自優先度より低い 任意
実行開始時処理 そのまま 自優先度に (*2) そのまま
リターン前 原則解除 (*1) 変更不可 (*3) 変更不可 (*3)
リターン時処理 解除する 元 に戻す (*5) そのまま
【 CPU 例外ハンドラ】
実行開始条件 任意 任意 任意
実行開始時処理 そのまま (*6) そのまま そのまま
リターン前 原則元に (*1) 変更不可 (*3) 変更不可 (*3)
リターン時処理 元に戻す 元に戻す (*5) そのまま
【拡張サービスコール】
実行開始条件 任意 任意 任意
実行開始時処理 そのまま そのまま そのまま
リターン前 任意 任意 任意
リターン時処理 そのまま そのまま そのまま

この表の中で「原則 (*1) 」とは,処理単位からのリタ ーン前(または終了前) に,アプリケーションが指定された状態に設定しておくことが原則であるが, この原則に従わなくても,リターン時(または終了時)にカーネルによって状 態が設定されるため,支障がないことを意味する.

「自優先度に (*2) 」 とは,割込みハンドラと割込みサービスルーチンの場合に はそれを要求した割込みの割込み優先度,周期ハンドラとアラームハンドラの 場合 にはタイマ割込みの割込み優先度,オーバランハンドラの場合にはオーバ ランタイマ割込みの割込み優先度に変更することを意味する.

「変更不可 (*3) 」 とは,その処理単位中で,そのシステム状態を変更する API が用意されていないことを示す.

保護機能対応カーネルでは,タスク例外処理ルーチンからのリターン時にディ スパッチ禁止フラグを元に戻す処理 (*4) は,タスクにディス パッチ禁止フラグ の変更を許可している場合にのみ行われる.カーネルは,ディスパッチ禁止フ ラグの元の状態をユーザスタック上に保存する.アプリケーションがユーザス タック上に保存されたディスパッチ禁止フラグの状態を書き換えた場合,タス ク例外処理ルーチンからのリターン時には,書き換えた後のディスパッチ禁止 フラグの状態に変更される(すなわち,元に戻されるとは限らない).

また,タスクにディスパッチ禁止フラグの変更を許可していない場合で,タス ク例外処理ルーチン中で拡張サービスコールを用いてディスパッチ禁止フラグ を変更した場合,カーネルは元の状態に戻さない.このことから,タスク例外 処理ルーチンからの終了前に,ディスパッチ禁止フラグを元の状態に戻すのは, アプリケーションの責任とする.

【補足説明】

マルチプロセッサ対応カーネルにおいて,タスクがタスク例外処理ルーチンを 実行中にマイグレーションされた場合,マイグレーション先のプロセッサにお いて,割込み優先度マスクとディスパッチ禁止フラグが元に戻される.

【仕様決定の理由】

保護機能対応カーネルにおいて,タスク例外処理ルーチンからのリターン時に ディスパッチ禁止フラグを元に戻す処理 (*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 )

    タスクを実行できる条件が,プロセッサが使用できるかどうかを除いて,揃っ ている状態.実行できる状態は,さらに,実行状態と実行可能状態に分類され る.

    • (a.1) 実行状態( running )

      タスクが実行されている状態.または,そのタスクの実行中に,割込みまたは CPU 例外により非タスクコ ンテキストの実行が開始され,かつ,タスクコンテキ ストに戻った後に,そのタスクの実行を再開するという状態.

    • (a.2) 実行可能状態( ready )

      タスク自身は実行できる状態にあるが,それよりも優先順位の高いタスクが実 行状態にあるために,そのタスクが実行されない状態.

  • (b) 休止状態( dormant )

    タスクが実行すべき処理がない状態.タスクの実行を終了した後,次に起動す るまでの間は,タスクは休止状態となっている.タスクが休止状態にある時に は,タスクの実行を再開するための情報(実行再開番地やレジスタの内容など) は保存されていない.

  • (c) 広義の待ち状態( blocked )

    タスクが,処理の途中で実行を止められている状態.タスクが広義の待ち 状態 にある時には,タスクの実行を再開するための情報(実行再開番地やレジスタ の内容など)は保存されており,タスクが実行を再開する時には,広義の待ち 状態に遷移する前の状態に戻される.広義の待ち状態は,さらに,(狭義の) 待ち状態,強制待ち状態,二重待ち状態に分類される.

    • (c.1) (狭義の)待ち状態( waiting )

      タスクが何らかの条件が揃 うのを待つために,自ら実行を止めている状態.

    • (c.2) 強制待ち状態( suspended )

      他のタスクによって,強制的に実行を止められている状態.ただし,自タスク を強制待ち状態にすることも可能である.

    • (c.3) 二重待ち状態( waiting -suspended )

      待ち状態と強制待ち状態が重なった状態.すなわち,タスクが何らかの条件が 揃うのを待つために自ら実行を止めている時に,他のタスクによって強制的に 実行を止められている状態.

      単にタスクが「待ち状態である」といった場合には,二重待ち状態である場合 を含み,「待ち状態でない」といった場合には,二重待ち状態でもないことを 意味する.また,単にタスクが「強制待ち状態である」とい った場合には,二 重待ち状態である場合を含み,「強制待ち状態でない」といった場合には,二 重待ち状態でもないことを意味する.

  • (d) 未登録状態( non -existent )

    タスクをカーネルに登録していない仮想的な状態.タスクの生成前と削除後は, タスクは未登録状態にあるとみなす.

    カーネルによっては,これらのタスク状態以外 に,過渡的な状態が存在する場 合がある.過渡的な状態については,「 2.6.6 ディスパッチ保留状態で実行中 のタスクに対する強制待ち」の節を参照すること.

    【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,タスクが未登録状態になることはない.また,上記のタスク 状態以外の過渡的な状態になることもない.ただし,動的生成機能拡張パッケー ジでは,タスクが未登録状態になる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,タスクが未登録状態になることはない.上記のタスク状態以 外の過渡的な状態として,タスクが強制待ち状態[実行継続中]になることが ある.詳しくは,「 2.6.6 ディスパッチ保留状態で実行中のタスクに対する強 制待ち」の節を参照すること.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,タスクが未登録状態になることはない.また,上記のタス ク状態以外の過渡的な状態になることもない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスクが広義の待ち状態と未登録状態になることはない.ま た,上記のタスク状態以外の過渡的 な状態になることもない.

2.6.2 タスクの状態遷移

タスクの状態遷移を図 2-2に示す.

未登録状態のタスクをカーネルに登録することを,タスクを生成する( create ) という.生成されたタスクは,休止状態に遷移する.また,タスク生成時の属 性指定により,生成と同時にタスクを起動し,実行できる状態にすることもで きる.逆に,登録されたタスクを未登録状態に遷移させることを,タスクを削 除する( delete )という.

休止状態のタスクを,実行できる状態にすることを,タスクを起動する ( activate )という.起動されたタスクは,実行できる状態になる.逆に,起 動された状態のタスクを,休止状態(または未登録状態)に遷移させることを, タスクを終了する( terminate )という.

実行できる状態になったタスクは,まずは実行可能状態に遷移するが,そのタ スクの優先順位が実行状態のタスクよりも高い場合には,ディスパッチ保留状 態でない限りはただちにディスパッチが起こり,実行状態へ遷移する.この時, それまで実行状態であったタスクは実行可能状態に遷移する.この時,実行状 態に遷移したタスクは,実行可能状 態に遷移したタスクをプリエンプトしたと いう.逆に,実行可能状態に遷移したタスクは,プリエンプトされたという.

タスクを待ち解除するとは,タスクが待ち状態(二重待ち状態を除く)であれ ば実行できる状態に,二重待ち状態であれば強制待ち状態に遷移させることを いう.また,タスクを強制待ちから再開するとは,タスクが強制待ち状態(二 重待ち状態を除く)であれば実行できる状態に,二重待ち状態であれ ば待ち状 態に遷移させることをいう.

【補足説明】

タスクの実行開始とは,タスクが起動された後に最初に実行される(実行状態 に遷移する)時のことをいう.

2.6.3 タスクのスケジューリング規則

実行できるタスクは,優先順位の高いものから順に実行される.すなわち,ディ スパッチ保留状 態でない限りは,実行できるタスクの中で最も高い優先順位を 持つタスクが実行状態となり,他は実行可能状態となる.

タスクの優先順位は,タスクの優先度とタスクが実行できる状態になった順序 から,次のように定まる.優先度の異なるタスクの間では,優先度の高いタス クが高い優先順位を持つ.優先度が同一のタスクの間では,先に実行できる状 態になったタスクが高い優先順位を持つ.すなわち,同じ優先度を持つタスク は, FCFS ( First Come First Served )方式でスケジューリングされる.ただし, サービスコールの呼出しにより,同じ優先度を持つタスク間の優先順位を変更 することも可能である.

最も高い優先順位を持つタスクが変化した場合には,ディスパッチ保留状態で ない限りはただちにディスパッ チが起こり,最も高い優先順位を持つタスクが 実行状態となる.ディスパッチ保留状態においては,実行状態のタスクは切り 換わらず,最も高い優先順位を持つタスクは実行可能状態にとどまる.

マルチプロセッサ対応カーネルでは,プロセッサ毎に,上記のスケジューリン グ規則を適用して,タスクスケジューリングを行う.すなわち,プロセッサが ディスパッチ保留状態でない限りは,そのプロセッサに割り付けられた 実行で きるタスクの中で最も高い優先順位を持つタスクが実行状態となり,他は実行 可能状態となる.そのため,実行状態のタスクは,プロセッサ毎に存在する.

2.6.4 待ち行列と待ち解除の順序

タスクが待ち解除される順序の管理のために,待ち状態のタスクがつながれて いるキューを,待ち行列と呼ぶ.また,タスクが同期・通信オブジェクトの待 ち行列につなが れている場合に,そのオブジェクトを,タスクの待ちオブジェ クトと呼ぶ.

待ち行列にタスクをつなぐ順序には, FIFO 順とタスクの優先度順がある.どち らの順序でつなぐかは,待ち行列毎に規定される.多くの待ち行列において, どちらの順序でつなぐかを,オブジェクト属性により指定できる.

FIFO 順の待ち行列においては,新たに待ち状態に遷移したタスクは待ち行列の 最後につながれる.それに対してタスクの優先度順の待ち行列においては,新 たに待ち状態に遷移したタスクは,優先度の高い順に待ち行列につながれる. 同じ優先度のタスクが待ち行列につながれている場合には,新たに待ち状態に 遷移したタスクが,同じ優先度のタスクの中で最後につながれる.

待ち解除の条件がタスクによって異なる場合には,待ち行列の先頭のタスクは 待ち解除の条件を満た さないが,後方のタスクが待ち解除の条件を満たす場合 がある.このような場合の振舞いとして,次の 2つのケースがある.どちらの振 舞いをするかは,待ち行列毎に規定される.

  • (a) 待ち解除の条件を満たしたタスクの中で,待ち行列の前方につながれたも のから順に待ち解除される.すなわち,待ち行列の前方に待ち解除の条件を満 たさないタスクがあっても,後方のタスクが待ち解除の条件を満たしていれば, 先に待ち解除される.
  • (b) タスクの待ち解除は,待ち行列につながれている順序で行われる.すなわ ち,待ち行列の前方に待ち解除の条件を満たさないタスクがあると,後方のタ スクが待ち解除の条件を満たしても,待ち解除されない.

    ここで, (b) の振舞いをする待ち行列においては,待ち行列につながれたタスク の強制終了,タスク優先度の変更(待ち行列がタスク の優先度順の場合のみ), 待ち状態の強制解除が行われた場合に,タスクの待ち解除が起こることがある. 具体的には,これらの操作により新たに待ち行列の先頭になったタスクが,待 ち解除の条件を満たしていれば,ただちに待ち解除される.さらに,この待ち 解除により新たに待ち行列の先頭になったタスクに対しても,同じ処理が繰り 返される.

2.6.5 タスク例外処理マスク状態と待ち 禁止状態

保護機能対応カーネルにおいて,ユーザタスクについては特権モードで実行し ている間(特権モードを実行している間に,実行可能状態や広義の待ち状態に なっている場合を含む.また,サービスコールを呼び出して,実行可能状態や 広義の待ち状態になっている場合も含む.タスクの実行開始前は含まない), システムタスクについては拡張サービスコールを実行している間(拡張サービ スコールを実行している間に,実行可能状態や広義の待ち状態になっている場 合を含む)は,タスク例外処理ルーチンの実行は開始されない.これらの状態 を,タスク例外処理マスク状態と呼ぶ.

タスクは,タスク例外処理マスク状態である時に,基本的なタスク状態と重複 して,待ち禁止状態になることができる.

待ち禁止状態とは,タスクが待ち状態に入ることが一時的に 禁止された状態で ある.待ち禁止状態にあるタスクが,サービスコールを呼び出して待ち状態に 遷移しようとした場合,サービスコールは E_RLWAI エラーとなる.

タスクを待ち禁止状態に遷移させるサービスコールは,対象タスクがタスク例 外処理マスク状態である場合に,対象タスクを待ち禁止状態に遷移させる.そ の後,タスクがタスク例外処理マスク状態でなくなる時点(ユーザタスクにつ いては特権モードから戻る時点,システムタスクについて拡張サービスコール からリターンする時点)で,待ち禁止状態が解除される.また,タスクの待ち 禁止状態を解除するサービスコールによっても,待ち禁止状態を解除すること ができる.

【仕様決定の理由】

タスク例外処理ルーチンでは,タスクの本体のための例外処理(例えば,タス クに対して終了要求があっ た時の処理)を行うことを想定しており,タスクか ら呼び出した拡張サービスコールのための例外処理を行うことは想定していな い.そのため,拡張サービスコールを実行している間にタスク例外処理が要求 された場合に,すぐにタスク例外処理ルーチンを実行すると,拡張サービスコー ルのための例外処理が行われないことになる.

また,ユーザタスクの場合には,特権モードを実行中にタスク例外処理ルーチ ンを実行すると,システムスタックに情報を残したまま非特権モードに戻るこ とになる.この状態で,タスク例外処理ルーチンから大域脱出すると,システ ムスタック上に不要な情報が残ってしまう.

これらの理由から,タスクが拡張サービスコールを実行している間は,タスク 例外処理マスク状態とし,タスク例外処理ルーチンの実行を開始しないことと する.さらに,ユーザタスクについては,特 権モードを実行している間(拡張 サービスコールを実行している間を含む)を,タスク例外処理マスク状態とす る.

対象タスクに,タスク例外処理ルーチンをすみやかに実行させたい場合には, タスク例外処理の要求に加えて,待ち状態の強制解除を行う(必要に応じて, 強制待ち状態からの再開も行う).保護機能対応でないカーネルにおいては, この方法により,対象タスクが正常に待ち解除さ れるのを待たずに,タスク例 外処理ルーチンを実行させることができる.

それに対して,保護機能対応カーネルにおいては,対象タスクがタスク例外処 理マスク状態で実行している間は,タスク例外処理ルーチンの実行が開始され ない.そのため,対象タスクに対して待ち状態の強制解除を行っても,その後 に対象タスクが待ち状態に入ると,タスク例外処理ルーチンがすみやかに実行 されないこと になる.

待ち禁止状態は,この問題を解決するために導入したものである.タスク例外 処理の要求( ras_tex / iras_tex )に加えて,待ち禁止状態への遷移( dis_wai / idis_wai )と待ち状態の強制解除( rel_wai / irel_wai )をこの順序で行うこと で,対象タスクが正常に待ち解除されるのを待たずに,タスク例外処理ルーチ ンを実行させることができる.

タスク例外処理マスク状態を,ユーザタスクについても拡張サービスコールを 実行している間とせず,特権モードで実行している間とした理由は,拡張サー ビスコールを実行している間とした場合に次のような問題があるためである.

ユーザタスクが,ソフトウェア割込みにより自タスクを待ち状態に遷移させる サービスコールを呼び出した直後に割込みが発生し,その割込みハンドラの中 で iras_tex , idis_wai , irel_wai が呼び出されると,この時点では待ち解除も されず待ち禁止状態にもならないために,割込みハンドラからのリターン後に 待ち状態に入ってしまう.ソフトウェア割込みによりすべての割込みが禁止さ れないターゲットプロセッサでは,ソフトウェア割込みの発生とサービスコー ルの実行を不可分にできないため,このような状況を防ぐことができない.

なお,拡張サービスコールは,待ち状態に入るサービスコールから E_RLWAI が返 された場合には,実行中の処理を取りやめて, E_RLWAI を返値としてリターンす るように実装すべきである.

【μ ITRON4.0 仕様,μ ITRON4.0/PX 仕様との関係】

待ち禁止状態は,μ ITRON4.0 仕様にはない概念であり,μ ITRON4.0/PX 仕様で導 入された.ただし, μ ITRON4.0/PX 仕様では,タスクの待ち状態を強制解除する サービスコールが,タスクを待ち禁止状態へ遷移させる機能も持つこととして いる.その結果μ ITRON4.0/PX 仕様は,待ち状態を強制解除するサービスコール の仕様において,μ ITRON4.0 仕様との互換性がなくなっている.

この仕様では,待ち状態の強制解除と待ち禁止状態への遷移を別々のサービス コールで行うこととした.これにより,待ち状態を強制解除するサービスコー ルの仕様が,μ ITRON4.0 仕様と互換になっている.一方,μ ITRON4.0/PX 仕様と は互換性がない.

2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち

ディスパッチ保留状態において,実行状態のタスクを強制待ち状態へ遷移させ るサービスコールを呼び出した 場合,実行状態のタスクの切換えは,ディスパッ チ保留状態が解除されるまで保留される.

この間,それまで実行状態であったタスクは,実行状態と強制待ち状態の間の 過渡的な状態にあると考える.この状態を,強制待ち状態[実行継続中]と呼 ぶ.一方,ディスパッチ保留状態が解除された後に実行すべきタスクは,実行 可能状態にとどまる.

タスクが強制待ち状態[実 行継続中]にある時に,ディスパッチ保留状態が解 除されると,ただちにディスパッチが起こり,タスクは強制待ち状態に遷移す る.

過渡的な状態も含めたタスクの状態遷移を図 2-3に示す.

タスクが強制待ち状態[実行継続中]である時の扱いは次の通りである.

  • (a) プロセッサを占有して実行を継続する.

    強制待ち 状態[実行継続中]のタスクは,プロセッサを占有して,そのまま継 続して実行される.

  • (b) 実行状態のタスクに関する情報を参照するサービスコールでは,実行状態 であるものと扱う.

    実行状態のタスクに関する情報を参照するサービスコール( get_tid / iget_tid , get_did , sns_tex )では,強制待ち状態[実行継続中]のタスクが, それを実行するプロセッサにおいて実行状態のタスクであるものと扱う.具体 的には,強制待ち状態[実行継続中]のタスクが実行されている時に get_tid / iget_tid を発行すると,そのタスクの ID 番号を参照する.また, get_did を発行 するとそのタスクが属する保護ドメインの ID 番号を, sns_tex を発行するとその タスクのタスク例外処理禁止フラグを参照する.

  • (c) その他のサービスコールでは,強制待ち状態であるものと扱う.

    その他のサービスコールでは,強制待ち状態[実行継続中]のタスクは,強制 待ち状態であるものと扱う.

    なお, TOPPERS 新世代カーネルでは,ディスパッチ保留状態において,実行状態 のタスクを強制終了させるサービスコールはサポートしていない.

    【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,ディスパッチ保留状態において実行状態のタスクを強制待ち 状態へ遷移させるサービスコールはサポートしていないため,タスクが強制待 ち状態[実行継続中]になることはない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,ディスパッチ保留状態に おいて実行状態のタスクを強制待ち 状態へ遷移させるサービスコールを,他のプロセッサから呼び出すことができ るため,タスクが強制待ち状態[実行継続中]になる場合がある.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,ディスパッチ保留状態において実行状態のタスクを強制待 ち状態へ遷移させるサービスコールはサポートしていないため,タスクが強制 待ち状態[実行継続中]になることはない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスクが広義の待ち状態になることはないため,タスクが強 制待ち状態[実行継続中]になることもない.

2.6.7 制約タスク

制約タスク( restricted task )は,複数のタスクでスタック 領域を共有するこ とによるメモリ使用量の削減を目的に,通常のタスクに対して,広義の待ち状 態を持たないなどの機能制限を加えたものである.具体的には,制約タスクに は以下の機能制限がある.

  • (a) 広義の待ち状態に入ることができない.
  • (b) サービスコールにより優先度を変更することができない.
  • (c) 対象優先度の中の先頭の タスクが制約タスクである場合には,タスクの優 先順位の回転( rot_rdq / irot_rdq )を行うことができない.
  • (d) マルチプロセッサ対応カーネルでは,割付けプロセッサを変更することが できない.

    制約タスクに対して,機能制限により使用できなくなったサービスコールを呼 び出した場合には, E_NOSPT エラーとなる. E_NOSPT エラーが返ることに依存し ている場合を除いては,制約タスクを通常のタスクに置き換えることができる.

    【未決定事項】

    現状では,制約タスクの優先度を変更するサービスコールは設けていないが, 制約タスクが,自タスクの優先度を,起動時優先度( SSP カーネルにおいては, 実行時優先度)と同じかそれよりも高い値に変更することは許してもよい.た だし,優先度の変更後は,同じ優先度内で 最高優先順位としなければならない ため, chg_pri とは振舞いが異なることになる.自タスクの優先度を起動時優先 度と同じかそれよりも高い値に変更するサービスコールを設けるかどうかは, 今後の課題である.

    【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,制約タスクをサポートしていない.ただし,制約タスク拡張 パッケージを用いる と,制約タスクの機能を追加することができる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,制約タスクをサポートしていない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,制約タスクをサポートしていない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,制約タスクのみをサポートする.そのため,すべてのタスク と非タスクコンテキストがスタック領域を共有することができ,すべての処理 単位で同一のスタック領域を使用している.このスタック領域を,共有スタッ ク領域と呼ぶ.

【μ ITRON4.0 仕様との関係】

制約タスクは,μ ITRON4.0 仕様の自動車制御プロファイルで導入された機能で ある.この仕様における制約タスクは,μ ITRON4.0 仕様の制約タスクよりも機 能制限が少なくなっている.

2.7 割込み処理モデル

TOPPERS 新世代カーネルにおける割込み処理のモデルは, TOPPERS 標準割込み処 理モデルに準拠している.

TOPPERS 標準割込み処理モデルの概念図を図 2-4に示す.この図は,割込み処理 モデルの持つすべての機能が,ハードウェア(プロセッサおよび割込みコント ローラ)で実現されているとして描いた概念図である.実際のハードウェアで 不足している機能については,カーネル内の割込み処理のソフトウェアで実現 される.

【μ ITRON4.0 仕様との関係】

割込み処理モデルは,μ ITRON4.0 仕様から大幅に拡張している.

2.7.1 割込み処理の流れ

周辺デバイス(以下,デバイスと呼ぶ)からの割込み要求は,割込みコントロー ラ( IRC )を経由して,プロセッサに伝えられる.デバイスから割込みコントロー ラに割込み要求を伝えるための信号線を,割込み要求ラインと呼ぶ.一般には, 1 つの割込み要求ラインに,複数のデバイスからの割込み要求が接続される.

プロセッサは,デバイスからの割込み要求を受け付ける条件が満たされた場合, 割込み要求を受け付ける.受け付けた割込み要求が,カーネル管理の割込みで ある場合には,カーネル内の割込みハンドラの入口処理(割込み入口処理)を 経由して,カーネル内の割込みハンドラを実行する.

カーネル 内の割込みハンドラは,アプリケーションが割込み要求ラインに対し て登録した割込みサービスルーチン( ISR )を呼び出す.割込みサービスルーチ ンは,プロセッサの割込みアーキテクチャや割込みコントローラに依存せず, 割込みを要求したデバイスのみに依存して記述するのが原則である. 1つの割込 み要求ラインに対して複数のデバイスが接続されることから, 1つの割込み要求 ラインに対して複数の割込みサービスルーチンを登録する ことができる.

ただし,カーネルが標準的に用意している割込みハンドラで対応できない特殊 なケースも考えられる.このような場合に対応するために,アプリケーション が用意した割込みハンドラをカーネルに登録することもできる.

カーネルが用いるタイマデバイスからの割込み要求の場合,カーネル内の割込 みハンドラにより,タイムイベントの処理が行われる.具体的には,タイムア ウト処理等が行われることに加えて,アプリケーションが登録したタイムイベ ントハンドラが呼び出される.

なお,受け付けた割込み要求に対して,割込みサービスルーチンも割込みハン ドラも登録していない場合の振舞いは,ターゲット定義である.

2.7.2 割込み優先度

割込み要求は,割込み処理の優先順位を指定するための割込み優先度を持つ. プロセッサは,割込み優先度マスクの現在値よりも高い割込み優先度を持つ割 込み要求のみを受け付ける.逆に言うと,割込み優先度マスクの現在値と同じ か,それより低い割込み優先度を持つ割込みは,マスクされる.

プロセッサは,割込み要求を受け付けると,割込み優先度マスクを,受け付け た割込み要求の割込み優 先度に設定する(ただし,受け付けた割込みが NMI であ る場合には例外とする).また,割込み処理からのリターンにより,割込み優 先度マスクを,割込み要求を受け付ける前の値に戻す.

これらのことから,他の方法で割込みをマスクしていない限り,ある割込み要 求の処理中は,それと同じかそれより低い割込み優先度を持つ割込み要求は受 け付けられず,それより高い割込み優先度を持つ割込み要求は受け付けられ る ことになる.つまり,割込み優先度は,多重割込みを制御するためのものと位 置付けることができる.それに対して,同時に発生している割込み要求の中で, 割込み優先度の高い割込み要求が先に受け付けられるとは限らない.

割込み優先度は, PRI 型で表現し,値が小さいほど優先度が高いものとするが, 優先度に関する原則には従わず, -1から連続した負の値を用いる.

割込み優先度の段階数は,ターゲット定義である.プロセッサが割込み優先度 マスクを実現するための機能を持たないか,実現するために大きいオーバヘッ ドを生じる場合には,ターゲット定義で,割込み優先度の段階数を 1にする(す なわち,多重割込みを許さない)場合がある.

【仕様決定の理由】

割込み優先度に -1から連続した負の値を用いるのは,割込み優先度とタスク優 先度を比較できるようになることと,いずれの割込みもマスクしない割込み優 先度マスクの値を 0にできるためである.

2.7.3 割込み要求ラインの属性

各割込み要求ラインは,以下の属性を持つ.なお, 1つの割込み要求ラインに複 数のデバイスからの割込み要求が接続されている場合,それらの割込み要求は 同一の属性を持つ.それらの割込み要求に別々の属性を設定することはできな い.

  • (1) 割込み要求禁止フラグ

    割込み要求ライン毎に,割込みをマスクするための割込み要求禁止フラグを持 つ.割込み要求禁止フラグをセットすると,その割込み要求ラインによって伝 えられる割込み要求はマスクされる.

    プロセッサが割込み 要求禁止フラグを実現するための機能を持たないか,実現 するために大きいオーバヘッドを生じる場合には,ターゲット定義で,割込み 要求禁止フラグをサポートしない場合がある.また,プロセッサの持つ割込み 要求禁止フラグの機能がこの仕様に合致しない場合には,ターゲット定義で, 割込み要求禁止フラグをサポートしないか,振舞いが異なるものとする場合が ある.

    アプリケーションが, 割込み要求禁止フラグを動的にセット/クリアする機能 を用いると,次の理由でソフトウェアの再利用性が下がる可能性があるため, 注意が必要である.プロセッサによっては,この割込み処理モデルに合致した 割込み要求禁止フラグの機能を実現できない場合がある.また,割込み要求禁 止フラグをセットすることで,複数のデバイスからの割込みがマスクされる場 合がある.ソフトウェアの再利用性を上げるためには,あるデバイスからの割 込みのみをマスクしたい場合には,そのデバイス自身の機能を使ってマスクを 実現すべきである.

  • (2) 割込み優先度

    割込み要求ライン毎に,割込み優先度を設定することができる.割込み要求の 割込み優先度とは,その割込み要求を伝える割込み要求ラインに対して設定さ れた割込み優先度のことである.

  • (3) トリガモ ード

    割込み要求ラインに対する割込み要求が,レベルトリガであるかエッジトリガ であるかを設定することができる.エッジトリガの場合には,さらに,ポジティ ブエッジトリガかネガティブエッジトリガか両エッジトリガかを設定できる場 合もある.また,レベルトリガの場合には,ローレベルトリガかハイレベルト リガかを設定できる場合もある.

    プロセッサがトリガモ ードを設定するための機能を持たないか,設定するため に大きいオーバヘッドを生じる場合には,ターゲット定義で,トリガモードの 設定をサポートしない場合がある.

    属性が設定されていない割込み要求ラインに対しては,割込み要求禁止フラグ がセットされ,割込み要求はマスクされる.また,割込み要求禁止フラグをク リアすることもできない.

2.7.4 割込みを 受け付ける条件

NMI 以外の割込み要求は,次の 4つの条件が揃った場合に受け付けられる.

  • (a) 割込み要求ラインに対する割込み要求禁止フラグがクリアされていること
  • (b) 割込み要求ラインに設定された割込み優先度が,割込み優先度マスクの現 在値よりも高い(優先度の値としては小さい)こと
  • (c) 全割込みロックフラグがクリアされていること
  • (d) 割込み要求がカーネル管理の割込みである場合には, CPU ロックフラグがク リアされていること

    これらの条件が揃った割込み要求が複数ある場合に,どの割込み要求が最初に 受け付けられるかは,この仕様では規定しない.すなわち,割込み優先度の高 い割込み要求が先に受け付けられるとは限らない.

2.7.5 割込み番号と割込みハンドラ番号

割込み要求ラインを識別するための番号を,割込み番号と呼ぶ.割込み番号は, 符号無しの整数型である INTNO 型で表し,ターゲットハードウェアの仕様から決 まる自然な番号付けを基本として,ターゲット定義で付与される.そのため, 1 から連続した正の値であるとは限らない.

それに対して,アプリ ケーションが用意した割込みハンドラをカーネルに登録 する場合に,割込みハンドラの登録対象となる割込みを識別するための番号を, 割込みハンドラ番号と呼ぶ.割込みハンドラ番号は,符号無しの整数型である INHNO 型で表し,ターゲットハードウェアの仕様から決まる自然な番号付けを基 本として,ターゲット定義で付与される.そのため, 1から連続した正の値であ るとは限らない.

割 込みハンドラ番号は,割込み番号と 1対 1に対応するのが基本である(両者が 一致する場合が多い).

ただし,割込みを要求したデバイスが割込みベクタを生成してプロセッサに渡 すアーキテクチャなどでは,割込み番号と割込みハンドラ番号の対応を,カー ネルが管理していない場合がある.そこで,ターゲット定義で,割込み番号に 対応しない割込みハンドラ番号や,割込みハンドラ番号に対応しない割込み番 号を設ける場合もある.ただし,割込みサービスルーチンの登録対象にできる 割込み番号は,割込みハンドラ番号との 1対 1の対応関係をカーネルが管理して いるもののみである.

2.7.6 マルチプロセッサにおける割込み処理

この節では,マルチプロセッサにおける割込み処理について説明する.この節 の内容は,マルチプロセッサ対応カーネルにのみ適用される.

マルチプロセッサ対応カーネルでは, TOPPERS 標準割込み処理モデルの構成要素 の中で,図 2-4の破線に囲まれた部分はプロセッサ毎に持ち,それ以外の部分は システム全体で 1つのみ持つ.すなわち,全割込みロックフラグ, CPU ロックフ ラグ,割込み優先度マスクはプロセッサ毎に持つのに対して,割込み要求ライ ンおよびその属性(割込み要求禁止フラグ,割込み優先度,トリガモード)は システム全体で共通に持つ.

割込み番号は,割込み要求ラインを識別するための番号であることから,割込 み要求ラインが複数のプロセッサに接続されている場合でも, 1つの割込み要求 ラインには 1つの割込み番号を付与する.逆に,複数のプロセッサが同じ種類の デバイスを持っている場合でも,別のデバイスからの割込み要求ラインには異 なる割込み番号を付与する(図 2-5).図 2-5において,ローカル IRC は個々のプ ロセッサに対する割込みを制御するための回路であり,グローバル IRC はデバイ スからの割込みをプロセッサに分配するための回路である.グローバル IRC は, 必ず備わっているとは限らない.

割込み要求禁止フラグは,この仕様上はシステム全体で共通に持つこととして いるが,実際のターゲットハードウェア(特に,グローバル IRC を備えていない もの)では,プロセッサ毎に持っている場合がある.そのため,ターゲット定 義で,あるプロセッサで割込み要求禁止フラグを動的にセット/クリアしても, 他のプロセッサに対しては割込みがマスク/マスク解除されない場合があるも のとする.

複数のプロセッサに接続された割込み要求ラインに対して登録された割込みサー ビスルーチンは,それらのプロセッサのいずれによっても実行することが でき る.ただし,その内のどのプロセッサで割込みサービスルーチンを実行するか は,割込みサービスルーチンが属するクラスの割付け可能プロセッサにより決 定される(「 2.4.4 処理単位を実行するプロセッサ」の節を参照).

割込みサービスルーチンが属するクラスの割付け可能プロセッサは,登録対象 の割込み要求ラインが接続されたプロセッサの集合に含まれていなければなら ない. また,同一の割込み要求ラインに対して登録する割込みサービスルーチ ンは,同一のクラスに属していなければならない.

それに対して,割込みハンドラはプロセッサ毎に登録する.そのため,同じ割 込み要求に対応する割込みハンドラであっても,プロセッサ毎に異なる割込み ハンドラ番号を付与する(図 2-5).割込みハンドラが属するクラスの初期割付 けプロセッサは,割込みが要求されるプロセッサと一致してい なければならな い.

【補足説明】

マルチプロセッサ対応カーネルにおける割込み番号の付与方法は,複数のプロ セッサに接続された割込み要求ラインに対しては,割込み番号の上位ビットを 0 とし, 1つのプロセッサのみに接続された割込み要求ラインに対しては,割込 み番号の上位ビットに,接続されたプロセッサの ID 番号を含める方法を基本と する.また,割込みハンドラ番号の付与方法は,割込みハンドラ番号の上位ビッ トに,その割込みハンドラを実行するプロセッサの ID 番号を含める方法を基本 とする(図 2-5).

1 つのプロセッサのみに接続された割込み要求ラインに対して登録された割込み サービスルーチンは,そのプロセッサのみを割付け可能プロセッサとするクラ スに属していなければならない.

【使用上の注意】

複数のプロセッサで実行することができる割込みサービスルーチンは,それら のプロセッサのいずれかで実行されるものと設定した場合でも,複数回の割込 み要求により,異なるプロセッサで同時に実行される可能性がある.

2.7.7 カーネル管理外の割込み

高い割込み応答性を求められるアプリケーションでは,カーネル内で割 込みを マスクすることにより,割込み応答性の要求を満たせなくなる場合がある.こ のような要求に対応するために,カーネル内では,ある割込み優先度(これを, TMIN_INTPRI と書く)よりも高い割込み優先度を持つ割込みをマスクしないこと としている. TMIN_INTPRI を固定するか設定できるようにするか,設定できるよ うにする場合の設定方法は,ターゲット定義である.

TMIN_INTPRI よりも高い割込み優先度を持ち,カーネル内でマスクしない割込み を,カーネル管理外の割込みと呼ぶ.また,カーネル管理外の割込みによって 起動される割込みハンドラを,カーネル管理外の割込みハンドラと呼ぶ. NMI は, カーネル管理外の割込みとして扱う. NMI 以外にカーネル管理外の割込みを設け るか(設けられるようにするか)どうかは,ターゲット定義である.

それに対して, TMIN_INTPRI と同じかそれよりも低い割込み優先度を持つ割込み をカーネル管理の割込み,カーネル管理の割込みによって起動される割込みハ ンドラをカーネル管理の割込みハンドラと呼ぶ.

カーネル管理外の割込みハンドラは,カーネル内の割込み入口処理を経由せず に実行するのが基本である.ただし,すべての割込みで同じ番地に分岐するプ ロセッサでは,カーネル内 の割込み入口処理を全く経由せずにカーネル管理外 の割込みハンドラを実行することができず,入口処理の一部分を経由してカー ネル管理外の割込みハンドラが実行されることになる.

カーネル管理外の割込みハンドラが実行開始される時のシステム状態とコンテ キスト,割込みハンドラの終了時に行われる処理,割込みハンドラの記述方法 は,ターゲット定義である.カーネル管理外の割込みハンドラからは,システ ムインタフェースレイヤの API と sns_ker , ext_ker のみを呼び出すことができ, その他のサービスコールを呼び出すことはできない.カーネル管理外の割込み ハンドラから,その他のサービスコールを呼び出した場合の動作は,保証され ない.

2.7.8 カーネル管理外の割込みの設定方法

カーネル管理外の割込みの設定方法は,ターゲット定義で,次の 3つ の方法のい ずれかが採用される.

  • (a -1) NMI 以外にカーネル管理外の割込みを設けない
  • (a -2) カーネル構築時に特定の割込みをカーネル管理外にすると決める

    これら場合には,カーネル管理外とする割込みはカーネル構築時(ターゲット 依存部の実装時やカーネルのコンパイル時)に決まるため,カーネル管理外と する割込みをアプリケーション側で設定する必要はない.ここで,カーネル管 理外とされた割込みに対して,カーネルの API により割込みハンドラを登録でき るかと,割込み要求ラインの属性を設定できるかは,ターゲット定義である. 割込みハンドラを登録できる場合には,それを定義する API において,カーネル 管理外であることを示す割込みハンドラ属性( TA_NONKERNEL )を指定する.ま た,割込み要 求ラインの属性を設定できる場合には,設定する割込み優先度を TMIN_INTPRI よりも高い値とする.

  • (b) カーネル管理外とする割込みをアプリケーションで設定できるようにする

    この場合には,カーネル管理外とする割込みの設定は,次の方法で行う.まず, カーネル管理外とする割込みハンドラを定義する API において,カーネル管理外 であることを示す割込みハンドラ属性( TA_NONKERNEL )を指定する.また,カー ネル管理外とする割込みの割込み要求ラインに対して設定する割込み優先度を, TMIN_INTPRI よりも高い値とする.

    いずれの場合にも,カーネル管理の割込みの割込み要求ラインに対して設定す る割込み優先度は, TMIN_INTPRI より高い値であってはならない.また,カーネ ル管理外の割込みに対して,割込みサービスルーチンを登録することはでき な い.

2.8 CPU 例外処理モデル

プロセッサが検出する CPU 例外の種類や, CPU 例外検出時のプロセッサの振舞い は,プロセッサによって大きく異なる.そのため, CPU 例外ハンドラをターゲッ トハードウェアに依存せずに記述することは,少なくとも現時点では困難であ る.そこでこの仕様では, CPU 例外の処理モデルを厳密に標準化するのではなく, ターゲットハードウェアに依存せずに決められる範囲で規定する.

2.8.1 CPU 例外処理の流れ

アプリケーションは,プロセッサが検出する CPU 例外の種類毎に, CPU 例外ハン ドラを登録することができる.プロセッサが CPU 例外の発生を検出すると,カー ネル内の 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 例外を起こしたタスクが最高優先度の 場合には,この方法でリカバリ処理を行うことはできない(リカバリ処理を行 うタスクを最高優先度とし,タスクの起動または待ち解除後に優先順位を回転 させることで,リカバリ処理を行える可能性があるが, CPU 例外を起こしたタス クが制約タスクの場合には適用できないなど,推奨できる方法ではない).
  • (c) CPU 例外を起こしたタスクにタスク例外処理を要求し,タスク例外処理ルー チンでリカバリ処理を行う(例えば, CPU 例外を起こしたタスクを終了する).
  • (d) システム全体に対してリカバリ処理を行う(例えば,システムを再起動す る).

    この中で (a) と (d) の方法は,カーネルの機能を必要としないため, CPU 例外が発 生したコンテキストおよび状態に依存せずに常に行える.それに対して (b) と

  • (c) の方法は, CPU 例外ハンドラからそのためのサービスコールを呼び出せるこ とが必要であり,それが行えるかどうかは, CPU 例外が発生したコンテキストお よび状態に依存する.

    なお,発生した CPU 例外に対して, CPU 例外ハンドラを登録していない場合の 振 舞いは,ターゲット定義である.

    【使用上の注意】

CPU 例外入口処理で CPU 例外が発生し,それを処理するための CPU 例外ハンドラの 入口処理で同じ原因で CPU 例外が発生すると, CPU 例外が繰り返し発生し,アプ リケーションが登録した CPU 例外ハンドラまで処理が到達しない状況が考えられ る.このような状況が発生するかどうかはターゲットによるが, これが許容で きない場合には, CPU 例外入口処理を経由せずに,アプリケーションが用意した CPU 例外ハンドラを直接実行するようにしなければならない.

【補足説明】

マルチプロセッサ対応カーネルにおける CPU 例外ハンドラ番号の付与方法は, CPU 例外ハンドラ番号の上位ビットに,その CPU 例外が発生するプロセッサの ID 番号を含める方法を基本とする.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様では, CPU 例外からのリカバリ処理の方法については,記述され ていない.

2.8.2 CPU 例外ハンドラから呼び出せるサービスコール

CPU 例外ハンドラからは, CPU 例外発生時のディスパッチ保留状態を参照するサー ビスコール( xsns_dpn )と, CPU 例外発生時にタスク例外処理ルーチンを実行開 始できない状態であったかを参照するサービスコール( xsns_xpn )を呼び出す ことができる.

xsns_dpn は, CPU 例外がタスクコンテキストで発生し,そのタスクがディスパッ チできる状態であった場合に false を返す. xsns_dpn が false を返した場合,そ の CPU 例外ハン ドラから,非タスクコンテキストから呼び出せるすべてのサービ スコールを呼び出すことができ, (b) の方法によるリカバリ処理が可能である. ただし, CPU 例外を起こしたタスクが最高優先度の場合には,この方法でリカバ リ処理を行うことはできない.

xsns_xpn は, CPU 例外がタスクコンテキストで発生し,そのタスクがタスク例外 処理ルーチンを実行できる状態であった場合に false を返す. xs ns_xpn が false を返した場合,その CPU 例外ハンドラから,非タスクコンテキストから呼び出せ るすべてのサービスコールを呼び出すことができ, (c) の方法によるリカバリ処 理が可能である.

xsns_dpn と xsns_xpn のいずれのサービスコールも true を返した場合,その CPU 例 外ハンドラからは, xsns_dpn と xsns_xpn に加えて,システムインタフェースレ イヤの API と sns_ker , ext_ker のみを呼び出すことができ,その他のサービスコー ルを呼び出すことはできない.いずれのサービスコールも true を返したにもか かわらず,その他のサービスコールを呼び出した場合の動作は,保証されない. この場合には, (b) と (c) の方法によるリカバリ処理は行うことはできず, (a) ま たは (d) の方法によるリカバリ処理を行うしかないことになる.

【μ ITRON4.0 仕様との関係】

CPU 例外ハンドラで行える操作に関しては,μ ITRON4.0 仕様を見直し,全面的に 修正した.

2.8.3 エミュレートされた CPU 例外ハンドラ

エラーコードによってアプリケーションに通知できないエラーをカーネルが検 出した場合に,アプリケーションが登録したエラー処理を,カーネルが呼び出 す場合がある.この場合に,カーネルが検出するエラーを CPU 例外と同等に扱う ものとし,エミュレートされた CPU 例外と呼ぶ.また,エラー処理のためのプロ グラムを CPU 例外ハンドラと同等に扱うものとし,エミュレートされた CPU 例外 ハンドラと呼ぶ.

具体的には,エミュレートされた CPU 例外ハンドラに対しても CPU 例外ハンドラ 番号が付与され, CPU 例外ハンドラと同じ方法で登 録できる.また,エミュレー トされた CPU 例外ハンドラからも, CPU 例外ハンドラから呼び出せるサービスコー ルを呼び出すことができ, CPU 例外ハンドラと同様のリカバリ処理を行うことが できる.

【μ ITRON4.0 仕様との関係】

エミュレートされた CPU 例外および CPU 例外ハンドラは,μ ITRON4.0 仕様に定義 されていない概念である.

2.8.4 カーネル管理外の CPU 例外

カーネル内のクリティカルセクションの実行中(これを,カーネル実行中と呼 ぶ),全割込みロック状態, CPU ロック状態,カーネル管理外の割込みハンドラ 実行中のいずれかで発生した CPU 例外を,カーネル管理外の CPU 例外と呼ぶ.ま た,それによって起動される CPU 例外ハンドラを,カーネル管理外の CPU 例外ハ ンド ラと呼ぶ.さらに,カーネル管理外の CPU 例外ハンドラ実行中に発生した CPU 例外も,カーネル管理外の CPU 例外とする.

それに対して,カーネル管理外の CPU 例外以外の CPU 例外をカーネル管理の CPU 例 外,カーネル管理の CPU 例外によって起動される CPU 例外ハンドラをカーネル管 理の CPU 例外ハンドラと呼ぶ.

カーネル管理外の CPU 例外ハンドラからは,システムインタ フェースレイヤの API と sns_ker , ext_ker , xsns_dpn , xsns_xpn のみを呼び出すことができ,その 他のサービスコールを呼び出すことはできない.カーネル管理外の CPU 例外ハン ドラから,その他のサービスコールを呼び出した場合の動作は,保証されない.

カーネル管理外の CPU 例外ハンドラにおいては, xsns_dpn と xsns_xpn のいずれの サービスコールも true を返す.そのため,カーネル管理外の CPU 例外からは,

  • (a) または (d) の方法によるリカバリ処理しか行えない.

    【補足説明】

    カーネル管理外の CPU 例外は,カーネル管理外の割込みと異なり,特定の CPU 例 外をカーネル外とするわけではない.同じ CPU 例外であっても, CPU 例外が起こ る状況によって,カーネル管理となる場合とカーネル管理外となる場合がある.

2.9 システムの初期化と終了

2.9.1 システム初期化手順

システムのリセット後,最初に実行するプログラムを,スタートアップモジュー ルと呼ぶ.スタートアップモジュールはカーネルの管理外であり,アプリケー ションで用意するのが基本であるが,スタートアップモジュールで行うべき処 理を明確にするために,カーネルの配布パッケー ジの中に,標準のスタートアッ プモジュールが用意されている.

標準のスタートアップモジュールは,プロセッサのモードとスタックポインタ 等の初期化, NMI を除くすべての割込みのマスク(全割込みロック状態と同等の 状態にする),ターゲットシステム依存の初期化フックの呼出し,非初期化デー タセクション( bss セクション)のクリア,初期化データセクション( data セク ション )の初期化,ソフトウェア環境(ライブラリなど)依存の初期化フック の呼出しを行った後,カーネルの初期化処理へ分岐する.ここで呼び出すター ゲットシステム依存の初期化フックでは,リセット後に速やかに行うべき初期 化処理を行うことが想定されている.

マルチプロセッサ対応カーネルでは,すべてのプロセッサがスタートアップモ ジュールを実行し,カーネルの初期化処理へ分岐する.ただし,共有リソース の初期化処理(非初期化データセクションのクリア,初期化データセクション の初期化,ソフトウェア環境依存の初期化フックの呼出しなど)は,マスタプ ロセッサのみで実行する.各プロセッサがカーネルの初期化処理へ分岐するの は,共有リソースの初期化処理が完了した後でなければならないため,スレー ブプロセッサは,カーネルの初期化処理へ分岐する前に,マスタプロセッサに よる共有リソースの初期化処理の完了を待ち合わせる必要がある.

カーネルの初期化処理においては,まず,カーネル自身の初期化処理(カーネ ル内のデータ構造の初期化,カーネルが用いるデバイスの初期化など)と静的 API の処理(オブジェクトの登録など)が行われる.静的 API のパラメータに関 するエラーは,コンフィギュレータによって検出されるのが原則であるが,コ ンフィギュレー タで検出できないエラーが,この処理中に検出される場合もあ る.

静的 API の処理順序によりシステムの規定された振舞いが変化する場合には,シ ステムコンフィギュレーションファイルにおける静的 API の記述順と同じ順序で 静的 API が処理された場合と,同じ振舞いとなる.例えば,静的 API によって同 じ優先度のタスクを複数生成・起動した場合,静的 API の記述順が先のタスクが 高い優先順位を持つ.それに対して,周期ハンドラの動作開始順序は,同じタ イムティックで行うべき処理が複数ある場合の処理順序が規定されないことか ら(「 4.6.1 システム時刻管理」の節を参照),静的 API の記述順となるとは限 らない.

次に,静的 API ( ATT_INI )により登録した初期化ルーチンが,システムコンフィ ギュレーションファイルにおける静的 API の記述順と同じ順序で実行される .

マルチプロセッサ対応カーネルでは,すべてのプロセッサがカーネル自身の初 期化処理と静的 API の処理を完了した後に,マスタプロセッサがグローバル初期 化ルーチンを実行する.グローバル初期化ルーチンの実行が完了した後に,各 プロセッサは,自プロセッサに割り付けられたローカル初期化ルーチンを実行 する.すなわち,ローカル初期化ルーチンは,初期割付けプロセッサにより実 行される.

以上が終了すると,カーネル非動作状態から動作状態に遷移し(「 2.5.1 カー ネル動作状態と非動作状態」の節を参照),カーネルの動作が開始される.具 体的には,システム状態が,全割込みロック解除状態・ CPU ロック解除状態・割 込み優先度マスク全解除状態・ディスパッチ許可状態に設定され(すなわち, 割込みがマスク解除され),タスクの実行が開始される.

マルチプロセッサ対応カーネルでは,すべてのプロセッサがローカル初期化ルー チンの実行を完了した後に,カーネル非動作状態から動作状態に遷移し,カー ネルの動作が開始される.マルチプロセッサ対応カーネルにおけるシステム初 期化の流れと,各プロセッサが同期を取るタイミングを,図 2-6に示す.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様においては,初期化ルーチンの実行は静的 API の処理に含まれる ものとしていたが,この仕様では,初期化ルーチンを登録する静的 API の処理は, 初期化ルーチンを登録することのみを意味し,初期化ルーチンの実行は含まな いものとした.

2.9.2 システム終了手順

カーネルを終了させるサービスコール( ext_ker )を呼び出すと,カ ーネル動作 状態から非動作状態に遷移する(「 2.5.1 カーネル動作状態と非動作状態」の 節を参照).具体的には, NMI を除くすべての割込みがマスクされ,タスクの実 行が停止される.

マルチプロセッサ対応カーネルでは,カーネルを終了させるサービスコール ( ext_ker )は,どのプロセッサからでも呼び出すことができる. 1つのプロセッ サでカーネルを終了させるサービスコールを呼び出すと,そのプロセッサがカー ネル動作状態から非動作状態に遷移した後,他のプロセッサに対してカーネル 終了処理の開始を要求する.複数のプロセッサから,カーネルを終了させるサー ビスコール( ext_ker )を呼び出してもよい.

次に,静的 API ( ATT_TER )により登録した終了処理ルーチンが,システムコン フィギュレーション ファイルにおける静的 API の記述順と逆の順序で実行される.

マルチプロセッサ対応カーネルでは,すべてのプロセッサがカーネル非動作状 態に遷移した後に,各プロセッサが,自プロセッサに割り付けられたローカル 終了処理ルーチンを実行する.すなわち,ローカル終了処理ルーチンは,初期 割付けプロセッサにより実行される.すべてのプロセッサでローカル処理ルー チンの実行が完了した後に,マスタプロセッサ がグローバル終了処理ルーチン を実行する.

以上が終了すると,ターゲットシステム依存の終了処理が呼び出される.ター ゲットシステム依存の終了処理は,カーネルの管理外であり,アプリケーショ ンで用意するのが基本であるが,カーネルの配布パッケージの中に,ターゲッ トシステム毎に標準的なルーチンが用意されている.標準のターゲットシステ ム依存の終了処理では,ソフトウェア環境 (ライブラリなど)依存の終了処理 フックを呼び出す.

マルチプロセッサ対応カーネルでは,すべてのプロセッサで,ターゲットシス テム依存の終了処理が呼び出される.マルチプロセッサ対応カーネルにおける システム終了処理の流れと,各プロセッサが同期を取るタイミングを,図 2-7に 示す.

【使用上の注意】

マルチプロセッサ対応カーネルで,あるプロセッサからカーネルを終了させる サービスコール( ext_ker )を呼び出しても,他のプロセッサがカーネル動作状 態で割込みをマスクしたまま実行し続けると,カーネルが終了しない.

プロセッサが割込みをマスクしたまま実行し続けないようにするのは,アプリ ケーションの責任である.例えば,ある時間を超えて割込みをマスクしたまま 実行し続 けていないかを,ウォッチドッグタイマを用いて監視する方法が考え られる.割込みをマスクしたまま実行し続けていた場合には,そのプロセッサ からもカーネルを終了させるサービスコール( ext_ker )を呼び出すことで,カー ネルを終了させることができる.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様には,システム終了に関する規定はない.

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

2.10.1 ID 番号で識別するオブジェクト

ID 番号で識別するオブジェクトは,オブジェクトを生成する静的 API ( CRE_YYY ),サービスコール( acre_yyy ),またはオブジェクトを追加す る静的 API ( ATT_YYY , ATA_YYY )によってカーネルに登録する.オブジェクトを 追加する静的 API によって登録されたオブジェクトは ID 番号を持たないため, ID 番号を指定して操作することができない.

オブジェクトを生成する静的 API ( CRE_YYY )は,生成するオブジェクトに ID 番 号を割り付け, ID 番号を指定するパラメータとして記述した識別名を,割り付 けた ID 番号にマクロ定義する.同じ識別名のオブジェクトが生成済みの場合に は, E_OBJ エラーとなる.

オブジェクトを生成するサービスコール( acre_yyy )は,割付け可能な ID 番号 の数を指定する静的 API ( AID_YYY )によって確保された ID 番号の中から,使用 されていない ID 番号を 1つ選び,生成するオブジェクトに割り付ける.割り付け た ID 番号は,サービスコールの返値としてアプリケーションに通知する.使用 されていない ID 番号が残っていない場合には, E_NOID エラーとなる.

割付け可能な ID 番号の数を指定する静的 API ( AID_YYY )は,システムコンフィ ギュレーションファイル中に複数記述することができる.その場合,各静的 API で指定した数の合計の数の ID 番号が確保される.

オブジェクトを生成するサービスコール( acre_yyy )によって登録したオブジェ クトは,オブジェクトを削除するサービスコール( del_yyy )によって登録を解 除 することができる.登録解除したオブジェクトの ID 番号は,未使用の状態に 戻され,その ID 番号を用いて新しいオブジェクトを登録することができる.こ の場合に,登録解除前のオブジェクトに対して行うつもりの操作が,新たに登 録したオブジェクトに対して行われないように,注意が必要である.

オブジェクトを生成または追加する静的 API によって登録したオブジェクトは, 登録を解除することができない.登 録を解除しようとした場合には, E_OBJ エラー となる.

タスク以外の処理単位は,その処理単位が実行されている間でも,登録解除す ることができる.この場合,登録解除された処理単位に実行が強制的に終了さ せられることはなく,処理単位が自ら実行を終了するまで,処理単位の実行は 継続される.

同期・通信オブジェクトを削除した時に,そのオブジェクトを待っ ているタス クがあった場合,それらのタスクは待ち解除され,待ち状態に遷移させたサー ビスコールは E_DLT エラーとなる.複数のタスクが待ち解除される場合には,待 ち行列につながれていた順序で待ち解除される.削除した同期・通信オブジェ クトが複数の待ち行列を持つ場合には,別の待ち行列で待っていたタスクの間 の待ち解除の順序は,該当するサービスコール毎に規定する.

オブジェクトを再初期化するサービスコール( ini_yyy )は,指定したオブジェ クトを削除した後に,同じパラメータで再度生成したのと等価の振舞いをする. ただし,オブジェクトを生成または追加する静的 API によって登録したオブジェ クトも,再初期化することができる.

なお,動的生成対応カーネル以外では,オブジェクトを生成するサービスコー ル( acre_yyy ),割付け可 能な ID 番号の数を指定する静的 API ( AID_YYY ),オ ブジェクトを削除するサービスコール( del_yyy )は,サポートされない.

【μ ITRON4.0 仕様との関係】

ID 番号を指定してオブジェクトを生成するサービスコール( cre_yyy )を廃止し た.また,オブジェクトを生成または追加する静的 API によって登録したオブジェ クトは,登録解除できないこととした.

μ ITRON4.0 仕様では,割付け可能な ID 番号の数を指定する静的 API ( AID_YYY ) は規定されていない.

複数の待ち行列を持つ同期・通信オブジェクトを削除した時に,別の待ち行列 で待っていたタスクの間の待ち解除の順序は,μ ITRON4.0 仕様では実装依存と されている.

【μ ITRON4.0/PX 仕様との関係】

アクセス許可ベクタを指定してオブジェクトを生成する静的 API ( CRA_YYY )は 廃止し,オブジェクトの登録後にアクセス許可ベクタを設定する静的 API ( SAC_YYY )をサポートすることとした.これにあわせて,アクセス許可ベ クタを指定してオブジェクトを登録するサービスコール( cra_yyy , acra_yyy , ata_yyy )も廃止した.

【仕様決定の理由】

ID 番号を指定してオブジェクトを生成するサービスコール( cre_yyy )とアクセ ス許可ベクタを指定してオブジェクトを登録するサービスコール( cra_yyy , acra_yyy , ata_yyy )を廃止したのは,必要性が低いと考えたためである. 静的 API についても,サービスコールに整合するよう変更した.

2.10.2 オブジェ クト番号で識別するオブジェクト

オブジェクト番号で識別するオブジェクトは,オブジェクトを定義する静的 API ( DEF_YYY )またはサービスコール( def_yyy )によってカーネルに登録する.

オブジェクトを定義するサービスコール( def_yyy )によって登録したオブジェ クトは,同じサービスコールを,オブジェクトの定義情報を入れたパケットへ のポインタを NULL と して呼び出すことによって,登録を解除することができる. 登録解除したオブジェクト番号は,オブジェクト登録前の状態に戻され,同じ オブジェクト番号に対して新たにオブジェクトを定義することができる.登録 解除されていないオブジェクト番号に対して再度オブジェクトを登録しようと した場合には, E_OBJ エラーとなる.

オブジェクトを定義する静的 API によって登録したオブジェクトは,登録を解除 することができない.登録を解除しようとした場合には, E_OBJ エラーとなる.

なお,動的生成対応カーネル以外では,オブジェクトを定義するサービスコー ル( def_yyy )はサポートされない.

【μ ITRON4.0 仕様との関係】

この仕様では,オブジェクトの定義を変更したい場合には,一度登録解除した 後に,新たにオブジェクトを定義する必要がある.また,オブジェクトを定義 する静的 API によって登録したオブジェクトは,この仕様では,登録解除できな いこととした.

2.10.3 識別番号を持たないオブジェクト

識別する必要がないために,識別番号を持たないオブジェクトは,オブジェク トを追加する静的 API ( ATT_YYY )によってカーネルに登録する .

2.10.4 オブジェクト生成に必要なメモリ領域

カーネルオブジェクトを生成する際に,サイズが一定でないメモリ領域を必要 とする場合には,カーネルオブジェクトを生成する静的 API およびサービスコー ルに,使用するメモリ領域の先頭番地を渡すパラメータを設けている.このパ ラメータを NULL とした場合,必要なメモリ領域は,コンフィギュレータまたは カーネルにより確保される.

オブジェクト生成に必要なメモリ領域の中で,カーネルの内部で用いるものを, カーネルの用いるオブジェクト管理領域と呼ぶ.この仕様では,以下のメモリ 領域が,カーネルの用いるオブジェクト管理領域に該当する.

  • ・データキュー管理領域
  • ・優先度データキュー管理領域
  • ・優先度別のメッセージキューヘッダ領域
  • ・固定長メモリプール管理領域

【補足説明】

カーネルオブジェクトを生成する際には,管理ブロックなどを置くためのメモ リ領域も必要になるが,サイズが一定のメモリ領域はコンフィギュレータによ り確保されるため,カーネルオブジェクトを生成する静的 API およびサービスコー ルにそれらのメモリ領域の先頭番地を渡すパラメータを設けていない.

2.10.5 オブジェクトが属する保護ドメインの設定

保護機能対応カーネルにおいて,カーネルオブジェクトが属する保護ドメイン は,オブジェクトの登録時に決定し,登録後に変更することはできない.

カーネルオブジェクトを静的 API によって登録する場合には,オブジェクトを登 録する静的 API を,そのオブジェクトを属させる保護ドメインの囲みの中に記述 する.無所属のオブジェクトを登録する静的 API は,保護ドメインの囲みの外に 記述する(「 2.12.3 保護ドメインの指定」の節を参照).

カーネルオブジェクトをサービスコールによって登録する場合には,オブジェ クト属性に TA_DOM(domid) を指定することにより,オブジェクトを属させる保護 ドメインを設定する.ここで domid は,そのオブジェクトを属させる保護ドメイ ンの ID 番号であり, TDOM_KERNEL (= -1)を指定することでカーネルドメインに 属させることができる.また, domid に TDOM_SELF (= 0)を指定するか,オブジェ クト属性に TA_DOM(domid) を指定しないことで,自タスクが属する保護ドメイン に属させることができる.さらに,無所属のオブジェクトを登録する場合には, domid に TDOM_NONE (= -2)を指定する.

ただし,特定の保護ドメインのみに属することができるカーネルオブジェクト を登録するサービスコールの中には,オブジェクトを属させる保護ドメインを オブジェクト属性で設定する必要がないものもある.

割付け可能な ID 番号の数を指定する静的 API ( AID_YYY )で確保した ID 番号は, どの保護ドメインに属するオブジェクトにも(また,無所属のオブジェクトに も)割り付けられる .これらの静的 API は,保護ドメインの囲みの外に記述しな ければならない.保護ドメインの囲みの中に記述した場合には, E_RSATR エラー となる.

【補足説明】

この仕様では,カーネルオブジェクトの属する保護ドメインを参照する機能は 用意していない.

【仕様決定の理由】

カーネルオブ ジェクトをサービスコールによって登録する場合に,オブジェク トを属させる保護ドメインをオブジェクト属性で指定することにしたのは,保 護機能対応でないカーネルとの互換性のためには,サービスコールのパラメー タを増やさない方が望ましいためである.

2.10.6 オブジェクトが属するクラスの設定

マルチプロセッサ対応カーネルにおいて,カーネルオブジェクトが属するクラ スは,オブジェクトの登録時に決定し,登録後に変更することはできない.

カーネルオブジェクトを静的 API によって登録する場合には,オブジェクトを登 録する静的 API を,そのオブジェクトを属させるクラスの囲みの中に記述する. クラスに属さないオブジェクトを登録する静的 API は,クラスの囲みの外に記述 する(「 2.12.4 クラスの指定」の節を参照).

カーネルオブジェクトをサービスコールによって登録する場合には,オブジェ クト属性に TA_CLS(clsid) を指定することにより,オブジェクトを属させるクラ スを設定する.ここで clsid は,そのオブジェクトを属させるクラスの ID 番号で あり, clsid に TCLS_SELF (= 0)を指定するか,オブジェクト属性に TA_CLS(clsid) を指定しないことで,自タスクが属するクラスに属させることが できる.

割付け可能な ID 番号の数を指定する静的 API ( AID_YYY )で確保した ID 番号は, 静的 API を囲むクラスに属するオブジェクトにのみ割り付けられる.これらの静 的 API は,確保した ID 番号を割り付けるオブジェクトの属すべきクラスの囲みの 中に記述しなければならない.クラスの囲みの外に記述した場合には, E_RSATR エラーとなる.

【補足説明】

この仕様では,カーネルオブジェクトの属するクラスを参照する機能は用意し ていない.

【仕様決定の理由】

カーネルオブジェクトをサービスコールによって登録する場合に,オブジェク トを属させるクラスをオブジェクト属性で指定することにしたのは,マルチプ ロセッサ対応でないカーネルとの互換性のためには,サービス コールのパラメー タを増やさない方が望ましいためである.

2.10.7 オブジェクトの状態参照

ID 番号で識別するオブジェクトのすべてと,オブジェクト番号で識別するオブ ジェクトの一部に対して,オブジェクトの状態を参照するサービスコール ( ref_yyy , get_yyy )を用意する.

オブジェクトの状態を参照するサービスコールでは,オブジェクトの登録時に 指定し,その後に変化しない情報(例えば,タスクのタスク属性や初期優先度) を参照するための機能は用意しないことを原則とする.自タスクの拡張情報の 参照するサービスコール( get_inf )は,この原則に対する例外である.

2.11 オブジェクトのアクセス保護

この節では,カーネ ルオブジェクトのアクセス保護について述べる.この節の 内容は,保護機能対応カーネルにのみ適用される.

2.11.1 オブジェクトのアクセス保護とアクセス違反の通知

カーネルオブジェクトに対するアクセスは,そのオブジェクトに対して設定さ れたアクセス許可ベクタによって保護される.ただし,アクセス許可ベクタを 持たないオブジェクトに対するアクセスは,システム状態に対する アクセス許 可ベクタによって保護される.また,オブジェクトを登録するサービスコール と,特定のオブジェクトに関連しないシステムの状態に対するアクセスについ ては,システム状態のアクセス許可ベクタによって保護される.

アクセス許可ベクタによって許可されていないアクセス(アクセス違反)は, カーネルによって検出され,以下の方法によって通知される.

サ ービスコールにより,メモリオブジェクト以外のカーネルオブジェクトに対 して,許可されていないアクセスを行おうとした場合,サービスコールから E_OACV エラーが返る.また,メモリオブジェクトに対して,許可されていない 管理操作または参照操作を行おうとした場合も,サービスコールから E_OACV エ ラーが返る.

メモリオブジェクトに対して,通常のメモリアクセスにより,許可されていな い書込みアクセスまたは読出しアクセス(実行アクセスを含む)を行おうとし た場合, CPU 例外ハンドラが起動される.どの CPU 例外ハンドラが起動されるか は,ターゲット定義である.ターゲットによっては,エミュレートされた CPU 例 外ハンドラの場合もある.また,ターゲット定義で,アクセス違反の状況に応 じて異なる CPU 例外ハンドラが起動される場合もある.この(これらの) CPU 例 外ハンドラを,メ モリアクセス違反ハンドラと呼ぶ.

メモリオブジェクトに対して,サービスコールを通じて,許可されていない書 込みアクセスまたは読出しアクセスを行おうとした場合,サービスコールから E_MACV エラーが返るか,メモリアクセス違反ハンドラが起動される. E_MACV エ ラーが返るかメモリアクセス違反ハンドラされるかは,ターゲット定義である.

メモリアクセス違反ハンドラでは, アクセス違反を発生させたアクセスに関す る情報(アクセスした番地,アクセスの種別,アクセスした命令の番地など) を参照する方法を,ターゲット定義で用意する.

メモリオブジェクトとしてカーネルに登録されていないメモリ領域に対して, カーネルドメイン以外の保護ドメインから,書込みアクセスまたは読出しアク セス(実行アクセスを含む)を行おうとした場合には,メモリオブジェクトに 対するアクセスが許可されていない場合と同様に扱われる.

【未決定事項】

マルチプロセッサ対応カーネルにおいて,システム状態のアクセス許可ベクタ をシステム全体で 1つ持つかプロセッサ毎に持つかは,今後の課題である.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様では,アクセス保護の実装定義の制限について規定している が,この仕様では,メモリオブジェクトに対するアクセス許可ベクタのターゲッ ト定義の制限以外については規定していない.

【仕様決定の理由】

オブジェクトを登録するサービスコールを,そのオブジェクトのアクセス許可 ベクタによって保護しないのは,オブジェクトを登録する前 には,アクセス許 可ベクタが設定されていないためである.

2.11.2 メモリオブジェクトに対するアクセス許可ベクタの制限

メモリオブジェクトの書込みアクセスと読出しアクセス(実行アクセスを含む) に対して設定できるアクセス許可パターンは,ターゲット定義で制限される場 合がある.

ただし,少なくとも,次の 5つの組み合わせの設 定は,行うことができる.

  • (a) メモリオブジェクトが属する保護ドメインのみに,読出しアクセス(実行 アクセスを含む)のみを許可する.これを,専有リードオンリー( private read only )と呼ぶ.
  • (b) メモリオブジェクトが属する保護ドメインのみに,書込みアクセスと読出 しアクセス(実行アクセスを含む)を許可する.これを,専有リー ドライ ト( private read/write )と呼ぶ.
  • (c) すべての保護ドメインに,読出しアクセス(実行アクセスを含む)のみを 許可する.これを,共有リードオンリー( shared read only )と呼ぶ.
  • (d) すべての保護ドメインに,書込みアクセスと読出しアクセス(実行アクセ スを含む)を許可する.これを,共有リードライト( shared read/write ) と呼ぶ.
  • (e) メモリオブジェクトが属する保護ドメインに,書込みアクセスと読出しア クセス(実行アクセスを含む)を許可し,他の保護ドメインには,読出し アクセス(実行アクセスを含む)のみを許可する.これを,共有リード専 有ライト( shared read private write )と呼ぶ.

また,ターゲット定義で, 1つの保護ドメインに登録できるメモリオブジェクト の数が制限される場合がある.

2.11.3 デフォルトのアクセス許可ベクタ

静的 API によりカーネルオブジェクトを登録した直後は,次に規定されるデフォ ルトのアクセス許可ベクタが設定される.

保護ドメインに属するカーネルオブジェクトに対しては, 4つの種別のアクセス がいずれも,その保護ドメインのみに許可される.すなわち,カーネルドメイ ンに属するオブジェクトに対しては, 4つのアクセス許可パターンがいずれも TACP_KERNEL に,ユーザドメインに属するオブジェクトに対しては, 4つのアク セス許可パターンがいずれも TACP(domid) ( domid はオブジェクトが属する保護 ド メインの ID 番号)に設定される.

無所属のカーネルオブジェクトに対しては, 4つの種別のアクセスがいずれも, すべての保護ドメインに許可される.すなわち, 4つのアクセス許可パターンが いずれも, TACP_SHARED に設定される.

システム状態のアクセス許可ベクタは, 4つの種別のアクセスがいずれも,カー ネルドメインのみに許可される.すなわち, 4つのアクセス許可パターンがいず れも, TACP_KERNEL に設定される.

【未決定事項】

サービスコールによりカーネルオブジェクトを登録した直後のアクセス許可ベ クタについては,今後の課題である.

2.11.4 アクセス許可ベクタの設定

ア クセス許可ベクタをデフォルト以外の値に設定するために,カーネルオブジェ クトのアクセス許可ベクタを設定する静的 API ( SAC_YYY )とサービスコール ( sac_yyy )が用意されている.また,システム状態のアクセス許可ベクタを設 定する静的 API ( SAC_SYS )とサービスコール( sac_sys )が用意されている.

ただし,静的 API によって登録したオブジェクトは,サービスコール( sac_yyy ) によってアクセス許可ベクタを設定することができない.アクセス許可ベクタ を設定しようとした場合には, E_OBJ エラーとなる.

メモリオブジェクトに対しては,アクセス許可ベクタを設定する静的 API は用意 されておらず,オブジェクトの登録と同時にアクセス許可ベクタを設定する静 的 API ( ATA_YYY )が用意されている.

オブジェクトに対するアクセスが許可 されているかは,そのオブジェクトにア クセスするサービスコールを呼び出した時点でチェックされる.そのため,ア クセス許可ベクタを変更しても,変更以前に呼び出されたサービスコールの振 舞いには影響しない.例えば,待ち行列を持つ同期・通信オブジェクトのアク セス許可ベクタを変更しても,呼び出した時点ですでに待ち行列につながれて いるタスクには影響しない.また,ミューテックスのアクセス許可ベクタを変 更しても,呼び出した時点ですでにミューテックをロックしていたタスクには 影響しない.

なお,動的生成対応カーネル以外では,アクセス許可ベクタを設定するサービ スコール( sac_yyy )はサポートされない.

この仕様では,カーネルオブジェクトに設定されたアクセス許可ベクタを参照 する機能は用意していない.

【μ ITRON4.0/PX 仕様との関係】

アクセス許可ベクタを指定してオブジェクトを生成する静的 API ( CRA_YYY )は 廃止し,オブジェクトの登録後にアクセス許可ベクタを設定する静的 API ( SAC_YYY )をサポートすることとした.

静的 API によって登録したオブジェクトは,サービスコール( sac_yyy )によっ てアクセス許可ベクタを設定することができないこ ととした.

オブジェクトの状態参照するサービスコール( ref_yyy )により,オブジェクト に設定されたアクセス許可ベクタを参照する機能サポートしないこととした. これは,オブジェクトの登録時に指定し,その後に変化しない情報を参照する ための機能は用意しないという原則に合わせるための修正である.

2.11.5 カーネルの管理領域のアクセス保護

カーネルが動作するために,カーネルの内部で用いるメモリ領域を,カーネル の管理領域と呼ぶ.ユーザタスクからカーネルを保護するためには,カーネル の管理領域にアクセスできるのは,カーネルドメインのみでなければならない. そのため,カーネルの管理領域は, 4つの種別のアクセスがカーネルドメインの みに許可されたメモリオブジェクト(これを,カーネル専用のメモリオブジェ クトと呼ぶ)の中に置かれる.

カーネルの用いるオブジェクト管理領域(カーネルの管理領域に該当する. 「 2.10.4 オブジェクト生成に必要なメモリ領域」の節を参照)として,カーネ ル専用のメモリオブジェクトに含まれないメモリ領域を指定した場合, E_OBJ エ ラーとなる.また,カーネルの用いるオブジェクト管理領域の先頭番地に NULL を指定した場合,必要なメモリ領域が,カーネル専用のメモリオブジェクトの 中に確保される.

システムタスクのスタック領域,ユーザタスクのシステムスタック領域,非タ スクコンテキスト用のスタック領域は,カーネルの用いるオブジェクト管理領 域には該当しないが,カーネルドメインの実行中にのみアクセスされるため, カーネルの用いるオブジェクト管理領域と同様の扱いとなる.一方,ユーザタ スクのユーザスタック領域と固定長メモリプール領域は,ユーザドメインの実 行中にもアクセスされるため,カーネルの用いるオブジェクト管理領域とは異 なる扱いとなる.

2.11.6 ユーザタスクのユーザスタック領域

ユーザタスクが非特権モードで実行する間に用いるスタック領域を,システム スタック領域(「 4.1 タスク管理機能」の節を参照)と対比させて,ユーザス タック領域と呼ぶ.ユーザスタック領域は,そのタスクと同じ保護ドメイ ンに 属する 1つのメモリオブジェクトとしてカーネルに登録されるが,他のメモリオ ブジェクトとは異なり,次のように扱われる.

タスクのユーザスタック領域に対しては,そのタスクのみが書込みアクセスお よび読出しアクセスを行うことができる.そのため,書込みアクセスと読出し アクセス(実行アクセスを含む)に対するアクセス許可パターンは意味を持た ない.ユーザスタック領域に対して実行アクセスを行えるかどうかは,ターゲッ ト定義である.

ただし,上記の仕様を実現するために大きいオーバヘッドを生じる場合には, ターゲット定義で,タスクのユーザスタック領域を,そのタスクが属する保護 ドメインのみからアクセスできるものとする場合がある.

【μ ITRON4.0/PX 仕様との関係】

この仕様では,タスクのユーザスタック領域は,そのタスクのみがアクセスで きるものとした.

2.12 システムコンフィギュレーション手順

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

カーネルやシステムサービスが管理するオブジェクトの生成情報や初期状態な どを記述するファイルを,システムコンフィギュレーションファイ ル( system configuration file )と呼ぶ.また,システムコンフィギュレーションファイ ルを解釈して,カーネルやシステムサービスの構成・初期化情報を含むファイ ルなどを生成するツールを,コンフィギュレータ( configurator )と呼ぶ.

システムコンフィギュレーションファイルには,カーネルの静的 API ,システム サービスの静的 API ,保護ドメインの囲み,クラスの囲 み,コンフィギュレータ に対する INCLUDE ディレクティブ, C言語プリプロセッサのインクルードディレ クティブ( #include )と条件ディレクティブ( #if , #ifdef など)のみを記述す ることができる.

コンフィギュレータに対する INCLUDE ディレクティブは,システムコンフィギュ レーションファイルを複数のファイルに分割して記述するために用いるもので, その文法は次のいずれかである(両者の違いは,指定されたファイルを探すディ レクトリの違いのみ).

INCLUDE(" ファイル名 "); INCLUDE(< ファイル名 >);

コンフィギュレータは, INCLUDE ディレクティブによって指定されたファイル中 の記述を,システムコンフィギュレーションファイルの一部分として解釈する. すなわち, INCLUDE ディレクティブによって指定されたファイル中には,カーネ ルの静的 API ,システムサービスの静的 API ,コンフィギュレータに対する INCLUDE ディレクティブ, C言語プリプロセッサのインクルードディレクティブ と条件ディレクティブのみを記述することができる.

C 言語プリプロセッサのインクルードディレクティブは,静的 API のパラメータ を解釈するために必 要な C言語のヘッダファイルを指定するために用いる.また, 条件ディレクティブは,有効とする静的 API を選択するために用いることができ る.ただし,インクルードディレクティブは,コンフィギュレータが生成する ファイルでは先頭に集められる.そのため,条件ディレクティブの中にインク ルードディレクティブを記述しても,インクルードディレクティブは常に有効 となる.また, 1つの静的 API の記述の途中に,条件ディレクティ ブを記述する ことはできない.

コンフィギュレータは,システムコンフィギュレーションファイル中の静的 API を,その記述順に解釈する.そのため例えば,タスクを生成する静的 API の 前に,そのタスクにタスク例外処理ルーチンを定義する静的 API が記述されてい た場合,タスク例外処理ルーチンを定義する静的 API が E_NOEXS エラーとなる.

【μ ITRON4.0 仕様との関係】

システムコンフィギュレーションファイルにおける C言語プリプロセッサのディ レクティブの扱いを全面的に見直し,コンフィギュレータに対する INCLUDE ディ レクティブを設けた.また,共通静的 API を廃止した.μ ITRON4.0 仕様における

ディレクティブの役割は,この仕様では INCLUDE ディレクティブに置き
換わる. 逆に,μ ITRON4.0 仕様における INCLUDE 静的 API の役割は,この仕様で は #include ディレクティブに置き換わる.

2.12.2 静的 API の文法とパラメータ

静的 API は,次に述べる例外を除いては, C言語の関数呼出しと同様の文法で記 述する.すなわち,静的 API の名称に続けて,静的 API の各パラメータを "," で区 切って列挙したものを "(" と ")" で 囲んで記述し,最後に ";" を記述する.ただし, 静的 API のパラメータに構造体(または構造体へのポインタ)を記述する場合に は,構造体の各フィールドを "," で区切って列挙したものを "{" と "}" で囲んだ形 で記述する.

サービスコールに対応する静的 API の場合,静的 API のパラメータは,対応する サービスコールのパラメータと同一とすることを原則とする.

静的 API のパラメータは,次の 4種類に分類される.

  • (a) オブジェクト識別名

    オブジェクトの ID 番号を指定するパラメータ.オブジェクトの名称を表す単一 の識別名のみを記述することができる.

    コンフィギュレータは,オブジェクト生成のための静的 API ( CRE_YYY )を処理 する際に,オブジェクトに ID 番号を割り付け,構成・初期化ヘッダファイルに, 指定された識別名を割り付けた ID 番号にマクロ定義する C言語プリプロセッサの ディレクティブ( #define )を生成する.

    オブジェクト生成以外の静的 API が,オブジェクトの ID 番号をパラメータに取る 場合(カーネルの静的 API では, SAC_TSK や DEF_TEX の tskid パラメータ等がこれ に該当する)には,パラメータとして記述する識別名は,生成済みのオブジェ クトの名称を表す識別名でなければならない.そうでない場合には,コンフィ ギュレータがエラーを報告する.

    静的 API の整数定数式パラメータの記述に,オブジェクト識別名を使用すること はできない.

  • (b) 整数定数式パラメータ

    オブジェクト番号や機能コード, オブジェクト属性,サイズや数,優先度など, 整数値を指定するパラメータ.プログラムが配置される番地に依存せずに値の 決まる整数定数式を記述することができる.

    整数定数式の解釈に必要な定義や宣言等は,システムコンフィギュレーション ファイルから C言語プリプロセッサのインクルードディレクティブによってイン クルードするファイルに含まれていなければならない.

  • (c) 一般定数式パラメータ

    処理単位のエントリ番地,メモリ領域の先頭番地,拡張情報など,番地を指定 する可能性のあるパラメータ.任意の定数式を記述することができる.

    定数式の解釈に必要な定義や宣言等は,システムコンフィギュレーションファ イルから C言語プリプロセッサのインクルードディレクティブによってインクルー ドするファイルに含まれていなければならない.

  • (d) 文字列パラメータ

    オブジェクトモジュール名やセクション名など,文字列を指定するパラメータ. 任意の文字列を, C言語の文字列の記法で記述することができる.

    【μ ITRON4.0 仕様との関係】

    μ ITRON4.0 仕様においては,静的 API のパラメータを次 の 4種類に分類していた が,コンフィギュレータの仕組みを見直したことに伴い全面的に見直した.

  • (A) 自動割付け対応整数値パラメータ
  • (B) 自動割付け非対応整数値パラメータ
  • (C) プリプロセッサ定数式パラメータ
  • (D) 一般定数式パラメータ

    この仕様の (a) が,おおよそμ ITRON4.0 仕様の (A) に相当するが, (a) には整数値 を記述できない点が異なる. (b) ~ (c) と (B) ~ (D) の間には単純な対応関係がな いが,記述できる定数式の範囲には, (B) ⊂ (C) ⊂ (b) ⊂ (c) = (D) の関係がある.

    μ ITRON4.0 仕様では,静的 API のパラメータは基本的には (D) とし,コンフィギュ レータが値を知る必要があるパラメータを (B) ,構成・初期化ファイルに生成す る C言語プリプロセッサの条件ディレクティブ( #if )中に含めたい可 能性のあ るパラメータを (C) としていた.

    それに対して,この仕様におけるコンフィギュレータの処理モデル(「 2.12.5 コンフィギュレータの処理モデル」の節を参照)では,コンフィギュレータの パス 2において定数式パラメータの値を知ることができるため, (B) ~ (D) の区別 をする必要がない.そのため,静的 API のパラメータは基本的には (b) とし,パ ス 2で値を知ることのできない定数式パラメータのみを (c) としている.

2.12.3 保護ドメインの指定

保護機能対応カーネルでは,オブジェクトを登録する静的 API 等を,そのオブジェ クトが属する保護ドメインの囲みの中に記述する.無所属のオブジェクトを登 録する静的 API は,保護ドメインの囲みの外に記述する.保護ドメインに属すべ きオブジェクトを登 録する静的 API 等を,保護ドメインの囲みの外に記述した場 合には,コンフィギュレータが E_RSATR エラーを報告する.

ユーザドメインの囲みの文法は次の通り.

DOMAIN( 保護ドメイン名 ) { ユーザドメインに属するオブジェクトを登録する静的 API 等 }

保護ドメイン名には,ユーザドメインの 名称を表す単一の識別名のみを記述す ることができる.

コンフィギュレータは,ユーザドメインの囲みを処理する際に,ユーザドメイ ンに保護ドメイン ID を割り付け,構成・初期化ヘッダファイルに,指定された 保護ドメイン名を割り付けた保護ドメイン ID にマクロ定義する C言語プリプロセッ サのディレクティブ( #define )を生成する.また,ユーザドメインの囲みの中 およびそれ以 降に記述する静的 API の整数定数式パラメータの記述に保護ドメイ ン名を記述すると,割り付けた保護ドメイン ID の値に評価される.

ユーザドメインの囲みの中を空にすることで,ユーザドメインへの保護ドメイ ン ID の割付けのみを行うことができる.

カーネルドメインの囲みの文法は次の通り.

KERNEL_DOMAIN { カーネルドメインに属するオブジェクトを登録する静的 API 等 }

同じ保護ドメイン名を指定したユーザドメインの囲みや,カーネルドメインの 囲みを,複数回記述してもよい.保護機能対応でないカーネルで保護ドメイン の囲みを記述した場合や,保護ドメインの囲みの中に保護ドメインの囲みを記 述した場合には,コンフィギュレータがエラーを報告する.

【μ ITRON4.0/PX 仕様との関係】

ユーザドメインの囲みの文法を変更した.

【仕様決定の理由】

保護ドメインに属すべきオブジェクトを登録する静的 API 等を保護ドメインの囲 みの外に記述した場合のエラーコードを E_RSATR としたのは,オブジェクトを動 的に登録する API においては,オブジェクトの属する保護ド メインを,オブジェ クト属性によって指定するためである.

2.12.4 クラスの指定

マルチプロセッサ対応カーネルでは,オブジェクトを登録する静的 API 等を,そ のオブジェクトが属するクラスの囲みの中に記述する.クラスに属すべきオブ ジェクトを登録する静的 API 等を,クラスの囲みの外に記述した場合には,コン フィギュレータが E_RSATR エラーを報告する.

クラスの囲みの文法は次の通り.

CLASS( クラス ID) { クラスに属するオブジェクトを登録する静的 API 等 }

クラス ID には,静的 API の整数定数式パラメータと同等の定数式を記述すること ができる.使用できないクラス IDを指定した場合には,コンフィギュレータが E_ID エラーを報告する.

同じクラス ID を指定したクラスの囲みを複数回記述してもよい.マルチプロセッ サ対応でないカーネルでクラスの囲みを記述した場合や,クラスの囲みの中に クラスの囲みを記述した場合には,コンフィギュレータがエラーを報告する.

なお,保護機能とマルチプロセッサの両方に対応するカーネルでは,保護ドメ インの囲みとクラスの囲みはどちらが外側になっていてもよい.

【仕様決定の理由】

クラスに属すべきオブジェクトを登録する静的 API 等をクラスの囲みの外に記述 した場合のエラーコードを E_RSATR としたのは,オブジェクトを動的に登録する API においては,オブジェクトの属するクラスを,オブジェクト属性によって指 定するためである.

2.12.5 コンフィギュレータの処理モデル

コンフィギュレータは,次の 3つないしは 4つのパスにより,システムコンフィ ギュレーションファイルを解釈し,構成・初期化情報を含むファイルなどを生 成する(図 2-8).

最初のパス 1では,システムコンフィギュレーションファイルを解釈し,そこに 含まれる静的 API の整数定数式パラメータの値を Cコンパイラを用いて求めるた めに,パラメータ計算用 C言語ファイル( cfg1_out.c )を生成する.この時,シ ステムコンフィギュレーションファイルに含まれる C言語プリプロセッサのイン クルードディレクティブは,パラメータ計算用 C言語ファイルの先頭に集めて生 成する.また,条件ディレクティブは,順序も含めて,そのままの形でパラメー タ計算用 C言語ファイルに出力する.システムコンフィギュレーションファイル に文法エラーや未サポートの記述があった場合には,この段階で検出される.

次に, Cコンパイラおよび関連ツールを用いて,パラメータ計算用 C言語ファイ ルをコンパイルし,ロードモジュールを生成する.また,それを Sレコードフォー マットの形( cfg1_out.srec )に変換し,ロードモジュール中の各シンボルとア ドレスの対応表を含 むシンボルファイル( cfg1_out.syms )を生成する.静的 API のパラメータに解釈できない式が記述された場合には,この段階でエラーが 検出される.

コンフィギュレータのパス 2では,パス 1で生成されたオブジェクトファイルを S レコードフォーマットの形に変換したものとシンボルファイルから, C言語プ リプロセッサの条件ディレクティブによりどの静的 API が有効となったかと,そ れらの静的 API の整数定数式パラメータの値を取り出し,カーネルおよびシステ ムサービスの構成・初期化ファイル( kernel_cfg.c など)と構成・初期化ヘッ ダファイル( kernel_cfg.h など)を生成する.構成・初期化ヘッダファイルに は,登録できるオブジェクトの数(動的生成対応カーネル以外では,静的 API に よって登録されたオブジェクトの数に一致)やオブジェクトの ID 番号などの定 義を出力する.静的 API の整数定数式パラメータに不正がある場合には,この段 階でエラーが検出される.

パス 2で生成されたこれらのファイルを,他のソースファイルとあわせてコンパ イルし,アプリケーションのロードモジュールを生成する.また,それを Sレコー ドフォーマットの形( system.srec )に変換し,ロードモジュール中の各シンボ ルと番地の対応表を含むシンボルファ イル( system.syms )を生成する.

コンフィギュレータのパス 3では,パス 1で生成されたロードモジュールを Sレコー ドフォーマットの形に変換したものとシンボルファイル,パス 2で生成されたロー ドモジュールを Sレコードフォーマットの形に変換したものとシンボルファイル から,静的 API パラメータの値などを取り出し,妥当性のチェックを行う.静的 API の一般定数式パラメータに不正がある場 合には,この段階でエラーが検出さ れる.

保護機能対応カーネルにおいては,メモリ保護のための設定情報を生成するた めに,パス 3ではじめて得られる情報が必要となる.そこで,そのようなメモリ 保護のための設定情報は,パス 3においてメモリ構成・初期化ファイル ( kernel_mem.c )に生成する.生成したメモリ構成・初期化ファイルは,他の ソースファイルとあわせてコンパイ ルし,アプリケーションの最終的なロード モジュールを生成する.

そのため,パス 2で生成されたファイルから生成したロードモジュールは,仮の ロードモジュールという位置付けになる.ここで,仮のロードモジュールと最 終的なロードモジュールでサイズが変化してはならないため,パス 3でメモリ構 成・初期化ファイルに生成するのと同じサイズのデータ構造を,パス 2において 仮のメモリ構 成・初期化ファイル( kernel_mem2.c )に生成し,これも含めて仮 のロードモジュールを生成しておく.また,仮のロードモジュールを Sレコード フォーマットの形に変換したもの( cfg2_out.srec ),仮のロードモジュール中 の各シンボルと番地の対応表を含むシンボルファイル( cfg2_out.syms )も,混 乱を避けるためにファイル名を変更しておく(図 2-9).

パス 3でメモリ保護のための設定情報を生成した場合には,パス 4を実行する. コンフィギュレータのパス 4では,パス 1で生成されたロードモジュールを Sレコー ドフォーマットの形に変換したものとシンボルファイル,パス 3で生成されたロー ドモジュールを Sレコードフォーマットの形に変換したものとシンボルファイル から,生成したロードモジュールの妥当性のチェックを行う.この段階で検出 されるエラーは,コ ンフィギュレーション処理の不具合を示すものである.

【μ ITRON4.0 仕様との関係】

コンフィギュレータの処理モデルは全面的に変更した.

2.12.6 静的 API のパラメータに関するエラー検出

静的 API のパラメータに関するエラー検出は,同じものがサービスコールとして 呼ばれた場合と同等とすることを原則とする.言い換える と,サービスコール によっても検出できないエラーは,静的 API においても検出しない.静的 API の 機能説明中の「 E_XXXXX エラーとなる」または「 E_XXXXX エラーが返る」という 記述は,コンフィギュレータがそのエラーを検出することを意味する.

ただし,エラーの種類によっては,サービスコールと同等のエラー検出を行う ことが難しいため,そのようなものについては例外とする.例えば,メモリ 不 足をコンフィギュレータによって検出するのは容易ではない.

逆に,オブジェクト属性については,サービスコールより強力なエラーチェッ クを行える可能性がある.例えば,タスク属性に TA_STA と記述されている場合, サービスコールではエラーを検出できないが,コンフィギュレータでは検出で きる可能性がある.ただし,このようなエラー検出を完全に行おうとするとコ ンフィギュレータが複雑になるため,このようなエラーを検出することは必須 とせず,検出できた場合には警告として報告する.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様では,静的 API のパラメータに関するエラー検出について規定さ れていない.

2.12.7 オブジェクトの ID 番号の指定

コンフィギュレータのオプション機能として,アプリケーション設計者がオブ ジェクトの ID 番号を指定するための次の機能を用意する.

コンフィギュレータのオプション指定により,オブジェクト識別名と ID 番号の 対応表を含むファイルを渡すと,コンフィギュレータはそれに従ってオブジェ クトに ID 番号を割り付ける.それに従った ID 番号割付けができない場合( ID 番 号に抜けができる場合など )には,コンフィギュレータはエラーを報告する.

またコンフィギュレータは,オプション指定により,オブジェクト識別名とコ ンフィギュレータが割り付けた ID 番号の対応表を含むファイルを,コンフィギュ レータに渡すファイルと同じフォーマットで生成する.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様では,オブジェクト生成のための静的 API の ID 番号を指定するパ ラメータに整数値を記述できるため,このような機能は用意されていない.

2.13 TOPPERS ネーミングコンベンション

この節では, TOPPERS ソフトウェアの API の構成要素の名称に関するネーミング コンベンションについて述べる.このネーミングコンベンションは,モジュー ル間のインタフェースに関わる名称に適用することを想定しているが,モジュー ル内部の名称に適用してもよい.

2.13.1 モジュール識別名

異なるモジュールの API の構成要素の名称が衝突することを避けるために,各モ ジュールに対して,それを識別するためのモジュール識別名を定める.モジュー ル識別名は,英文字と数字で構成し, 2~ 8文字程度の長さとする .

カーネルのモジュール識別名は "kernel" ,システムインタフェースレイヤのモ ジュール識別名は "sil" とする.

API の構成要素の名称には,モジュール識別名を含めることを原則とするが,カー ネルの API など,頻繁に使用されて衝突のおそれが少ない場合には,モジュール 識別名を含めない名称を使用する.

以下では,モジュー ル識別名の英文字を英小文字としたものを www ,英大文字と したものを WWW と表記する.

2.13.2 データ型名

各サイズの整数型など,データの意味を定めない基本データ型の名称は,英小 文字,数字, "_" で構成する.データ型であることを明示するために,末尾が "_t" である名称とする.

複合データ型やデータの意味を定めるデータ型の名称は,英大文字,数字, "_" で構成する.データ型であることを明示するために,先頭が "T_" または末尾 が "_T" である名称とする場合もある.

データ型の種類毎に,次のネーミングコンベンションを定める.

  • (A) パケットのデータ型
T_CYYY acre _yyy に渡すパケットのデータ型
T_DYYY def_yyy に渡すパケットのデータ型
T_RYYY ref_yyy に渡すパケットのデータ型
T_WWW_CYYY www_acre_yyy に渡すパケットのデータ型
T_WWW_DYYY www_def_yyy に渡すパケットのデータ型
T_WWW_RYYY 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 と いった名称とする.

    【補足説明】

    サービスコールの名称を構成する省略名( xxx , yyy , z)の元になった英語につ いては,「 5.9 省略名の元になった英語」の 節を参照すること.

  • (B) コールバック

    コールバックの名称は,サービスコールのネーミングコンベンションに従う.

2.13.4 変数名

変数( const 修飾子のついたものを含む)の名称は,英小文字,数字, "_" で構 成する.データ型が異なる変数には,異なる名称を付けることを原則とする.

変数の名称に関して,次のガイドラインを設ける.

~ id ~ ID (オブジェクトの ID 番号, ID 型)
~ no ~番号(オブジェクト番号)
~ atr ~属性(オブジェクト属性, ATR 型)
~ stat ~状態(オブジェクト状態, STAT 型)
~ mode ~モード(サービスコールの動作モード, MODE 型)
~ pri ~優先度(優先度, PRI 型)
~ sz ~サイズ(単位はバイト数, SIZE 型または uint_t 型)
~ cnt ~の個数(単位は個数, uint_t 型)
~ ptn ~パターン
~ tim ~時刻,~時間
~ cd ~コード
i ~ ~の初期値
max ~ ~の最大値
min ~ ~の最小値
left ~ ~の残り

また,ポインタ変数(関数ポインタを除く)の名称に関して,次のガイドライ ンを設ける.

p_ ~ ポインタ
pp_ ~ ポインタを入れる 領域へのポインタ
pk_ ~ パケットへのポインタ
ppk_ ~ パケットへのポインタを入れる領域へのポインタ

変数の種類毎に,次のネーミングコンベンションを定める.

  • (A) パケットへのポインタ
pk_cyyy acre_yyy に渡すパケットへのポインタ
pk_dyyy def_yyy に渡すパケットへのポインタ
pk_ryyy ref_yyy に渡すパケットへのポインタ
pk_www_cyyy www_acre_yyy に渡すパケットへのポインタ
pk_www_dyyy www_def_yyy に渡すパケットへのポインタ
pk_www_ryyy www_ref_yyy に渡 すパケットへのポインタ

2.13.5 定数名

定数( C言語プリプロセッサのマクロ定義によるもの)の名称は,英大文字,数 字, "_" で構成する.

定数の種類毎に,次のネーミングコンベンションを定める.

  • (A) メインエラーコード

    メインエラーコードは,先頭が "E_" である名称とする.

  • (B) 機能コード
TFN_XXX_YYY xxx_yyy の機能コード
TFN_WWW_XXX_YYY www_xxx_yyy の機能コード
  • (C) その他の定数

    その他の定数は,先頭が TUU_ または TUU_W WW_ である名称とする.ここで UU は, 定数の種類またはデータ型を表す.同じパラメータまたはリターンパラメータ に用いられる定数の名称については, 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 モジュール内部の名称の衝突回避

モジュール内部の名称が,他のモジュール内部の名称と衝突することを避ける ために,次のガイドラインを設ける.

モジュール内部に閉じて使われる関数や変数などの名称で,オブジェクトファ イルのシンボル表に登録されて外部から参照できる名称は, C言語レベルで,先 頭が _www _または _WWW_ である名称とする.例えば,カーネルの内部シンボルは, C 言語レベルで,先頭が "_kernel_" または "_KERNEL_" である名称とする.

また,モジュールを用いるために必要な定義を含むヘッダファイル中に用いる 名称で,それをインクルードする他のモジュールで使用する名称と衝突する可 能性のある名称は, "TOPPERS_" で始まる名称とする.

2. 14 TOPPERS 共通定義

TOPPERS ソフトウェアに共通に用いる定義を, TOPPERS 共通定義と呼ぶ.

2.14.1 TOPPERS 共通ヘッダファイル

TOPPERS 共通定義(共通データ型,共通定数,共通マクロ)は, TOPPERS 共通ヘッ ダファイル( t_stddef.h )およびそこからインクルードされるファイルに含ま れている. TOPPERS 共通定義を用いる場合には, TOPPERS 共通ヘッダファイルを インクルードする.

TOPPERS 共通ヘッダファイルは,カーネルヘッダファイル( kernel.h )やシステ ムインタフェースレイヤヘッダファイル( sil.h )からインクルードされるため, これらのファイルをインクルードする場合には, TOPPERS 共通ヘッダファイルを 直接インクルード する必要はない.

2.14.2 TOPPERS 共通データ型

C90 に規定されているデータ型以外で, TOPPERS ソフトウェアで共通に用いるデー タ型は次の通りである.

int8_t 符号付き 8ビット整数(オプション, C99 準拠)
uint8_t 符号無し 8ビット整数(オプション, C99 準拠)
int16_t 符号付き 16 ビット整数( C99 準拠)
uint16_t 符号無し 16 ビット整数( C99 準拠)
int32_t 符号付き 32 ビット整数( C99 準拠)
uint32_t 符号無し 32 ビット整数( C99 準拠)
int64_t 符号付き 64 ビット整数(オプション, C99 準拠)
uint64_t 符号無し 64 ビッ ト整数(オプション, C99 準拠)
int128_t 符号付き 128 ビット整数(オプション, C99 準拠)
uint128_t 符号無し 128 ビット整数(オプション, C99 準拠)
int_least8_t 8 ビット以上の符号付き整数( C99 準拠)
uint_least8_t int_least8_t 型と同じサイズの符号無し整数( C99 準拠)
float32_t IEEE754 準拠の 32 ビット単精度浮動小数点数(オプション)
double64_t IEEE754 準拠の 64 ビット倍精度浮動小数点数(オプション)
bool_t 真偽値( true または false )
int_t 16 ビット以上の符号付き整数
uint_t int_t 型と 同じサイズの符号無し整数
long_t 32 ビット以上かつ int_t 型以上のサイズの符号付き整数
ulong_t long_t 型と同じサイズの符号無し整数
intptr_t ポインタを格納できるサイズの符号付き整数( C99 準拠)
uintptr_t intptr_t 型と同じサイズの符号無し整数( C99 準拠)
FN 機能コード(符号付き整数, int_t に定義)
ER 正常終了( E_OK )またはエラーコード(符号付き整数, int_tに定義)
ID オブジェクトの ID 番号(符号付き整数, int_t に定義)
ATR オブジェクト属性(符号無し整数, uint_t に定義)
STAT オブジェクトの状態(符号無し整数, uint_t に定義)
MODE サービスコールの動作モード(符号無し整数, uint_t に定義)
PRI 優先度(符号付き整数, int_t に定義)
SIZE メモリ領域のサイズ(符号無し整数,ポインタを格納できるサイズの符号無し整数型に定義)
TMO タイムアウト指定(符号付き整数,単位はミリ秒, int_t に定義)
RELTIM 相対時間(符号無し整数,単位はミリ秒, uint_t に定義)
SYSTIM システム時刻(符号無し整数,単位はミリ秒, ulong_t に定義)
SYSUTM 性能評価用システム時刻(符号無し整数,単位はマイクロ秒,ulong_t に定 義)
FP プログラムの起動番地(型の定まらない関数ポインタ)
ER_BOOL エラーコードまたは真偽値(符号付き整数, int_t に定義)
ER_ID エラーコードまたは ID 番号(符号付き整数, int_t に定義,負の ID 番号は格納できない)
ER_UINT エラーコードまたは符号無し整数(符号付き整数, int_t に定義,符号無し整数を格納する場合の有効ビット数は uint_tより 1ビット短い)
MB_T オブジェクト管理領域を確保するためのデータ型
ACPTN アクセス許可パターン (符号無し 32 ビット整数, uint32_t に定義)
ACVCT アクセス許可ベクタ

ここで,データ型が「 Aまたは B」とは, Aか Bのいずれかの値を取ることを示す. 例えば ER_BOOL は,エラーコードまたは真偽値のいずれかの値を取る.

int8_t , uint8_t , int64_t , uint64_t , int128_t , uint128_t , float32_t , double64_t が使用できるかどうかは,ターゲットシステムに依存する.これら が使用できるかどうかは,それぞれ, INT8_MAX , UINT8_MAX , INT64_MAX , UINT64_MAX , INT128_MAX , UINT128_MAX , FLOAT32_MAX , DOUBLE64_MAX がマクロ 定義されているかどうかで判別することができる. IEEE754 準拠の浮動小数点数 がサポートされていないターゲットシステムでは, float32_t と double64_t は使 用できないものとする.

【μ ITRON4.0 仕様との関係】

B , UB , H, UH , W, UW , D, UD , VP_INT に代えて, C99 準拠の int8_t , uint8_t , int16_t , uint16_t , int32_t , uint32_t , int64_t , uint64_t , intptr_t を用い ることにした.また, uintptr_t , int128_t , uint128_t を用意することにした.

VP は, void * と等価であるため,用意しないことにした.また,ターゲットシ ステムにより振舞いが一定しないことから, VB , VH , VW , VD に代わるデータ型 は用 意しないことにした.

INT , UINT に代えて, C99 の型名と相性が良い int_t , uint_t を用いることにした. また, 32 ビット以上かつ int_t 型(または uint_t 型)以上のサイズが保証される 整数型として, long_t , ulong_t を用意し, 8ビット以上のサイズで必ず存在す る整数型として, C99 準拠の int_least8_t , uint_least8_t を導入することにし た. int_least16_t , uint_least16_t , int_least32_t , uint_least32_t を導入 しなかったのは, 16 ビットおよび 32 ビットの整数型があることを仮定しており, それぞれ int16_t , uint16_t , int32_t , uint32_t で代用できるためである.

TECS との整合性を取るために, BOOL に代えて, bool_t を用いることにした.ま た, IEEE754 準 拠の単精度浮動小数点数を表す型として float32_t , IEEE754 準拠 の 64 ビットを表す型として double64_t を導入した.

性能評価用システム時刻のためのデータ型として SYSUTM を,オブジェクト管理 領域を確保するためのデータ型として MB_T を用意することにした

2.14.3 TOPPERS 共通定数

C90 に規定されている定数以外 で, TOPPERS ソフトウェアで共通に用いる定数は 次の通りである(一部, C90 に規定されているものも含む).

  • (1) 一般定数
  NULL 無効ポインタ
true 1
false 0
E_OK 0 正常終了

【μ ITRON4.0 仕様との関係】

BOOL を bool_t に代えたことから, TRUE および FALSE に代えて, true および false を用いることにした.

  • (2) 整数型に格納できる最大値と最小値
INT8_MAX int8_t に格納できる最大値(オプション, C99 準拠)
INT8_MIN int8_t に格納できる最小値(オプション, C99 準拠)
UINT8_MAX uint8_t に格納できる最大値(オプション, C99 準拠)
INT16_MAX int16_t に格納できる最大値( C99 準拠)
INT16_MIN int 16_t に格納できる最小値( C99 準拠)
UINT16_MAX uint16_t に格納できる最大値( C99 準拠)
INT32_MAX int32_t に格納できる最大値( C99 準拠)
INT32_MIN int32_t に格納できる最小値( C99 準拠)
UINT32_MAX uint32_t に格納できる最大値( C99 準拠)
INT64_MAX int64_t に格納できる最大値(オプション, C99 準拠)
INT64_MIN int64_t に格納できる最小値(オプション, C99 準拠)
UINT64_MAX uint64_t に格納できる最大値(オプション, C99 準拠)
INT128_MAX int128_t に格納できる最大値(オプション, C99 準拠)
INT128_MIN int128_t に格納できる最小値(オプション, C99 準拠)
UINT128_MAX uint128_t に格納できる最大値(オプション, C99 準拠)
INT_LEAST8_MAX int_least8_t に格納できる最大値( C99 準拠)
INT_LEAST8_MIN int_least8_t に格納できる最小値( C99 準拠)
UINT_LEAST8_MAX uint_least8_t に格納できる最大値( C99 準拠)
INT_MAX int_t に格納できる最大値( C90 準拠)
INT_MIN int_t に格納できる最小値( C90 準拠)
UIN T_MAX uint_t に格納できる最大値( C90 準拠)
LONG_MAX long_t に格納できる最大値( C90 準拠)
LONG_MIN long_t に格納できる最小値( C90 準拠)
ULONG_MAX ulong_t に格納できる最大値( C90 準拠)
FLOAT32_MIN float32_t に格納できる最小の正規化された正の浮動小数点数(オプション)
FLOAT32_MAX float32_t に格納できる表現可能な最大の有限浮動小数点数(オプション)
DOUBLE64_MIN double64_t に格納できる最小の正規化された正の浮動小数点数(オプション)
DOUBLE64_MAX double64_t に格納できる表現可能な最大の有限浮動小数点数(オプション)
  • (3) 整数型のビット数
CHAR_BIT char 型のビット数( C90 準拠)
  • (4) オブジェクト属性
TA_NULL 0U オブジェクト属性を指定しない
  • (5) タイムアウト指定
TMO_POL 0 ポーリング
TMO_FEVR -1 永久待ち
TMO_NBLK -2 ノンブロッキング
  • (6) アクセス許可パターン
TACP_KERNEL 0U カーネルドメインのみにアクセスを許可
TACP_SHARED ˜0U すべての保護ドメインにアクセスを許可

2.14.4 TOPPERS 共通エラーコード

TOPPERS ソフトウェアで共通に用いるメインエラーコードは 次の通りである.

  • (A) 内部エラークラス( EC_SYS , -5~ -8)
E_SYS -5 システムエラー
  • (B) 未サポートエラークラス( EC_NOSPT , -9~ -16 )
E_NOSPT -9 未サポート機能
E_RSFN -10 予約機能コード
E_RSATR -11 予約属性
  • (C) パラメータエラークラス( EC_PAR , -17 ~ -24 )
E_PAR -17 パラメータエラー
E_ID -18 不正 ID 番号
  • (D) 呼出しコンテキストエラークラス( EC_CTX , -25 ~ -32 )
E_CTX -25 コンテキストエラー
E_MACV -26 メモリアクセス違反
E_OACV -27 オブジェクトアクセス違反
E_ILUSE -28 サービスコール不正使用
  • (E) 資源不足エラー クラス( EC_NOMEM , -33 ~ -40 )
E_NOMEM -33 メモリ不足
E_NOID -34 ID 番号不足
E_NORES -35 資源不足
  • (F) オブジェクト状態エラークラス( EC_OBJ , -41 ~ -48 )
E_OBJ -41 オブ ジェクト状態エラー
E_NOEXS -42 オブジェクト未登録
E_QOVR -43 キューイングオーバフロー
  • (G) 待ち解除エラークラス( EC_RLWAI , -49 ~ -56 )
E_RLWAI -49 待ち禁止状態または待ち状態の強制解除
E_TMOUT -50 ポーリ ング失敗またはタイムアウト
E_DLT -51 待ちオブジェクトの削除または再初期化
E_CLS -52 待ちオブジェクトの状態変化
  • (H) 警告クラス( EC_WARN , -57 ~ -64 )
E_WBLK -57 ノンブロッキング受付け
E_BOVR -58 バッファオーバフロー

このエラークラスに属するエラーコードは,警告を表すエラーコードであり, サービスコールがエラーコードを返した場合には副作用がないという原則の例 外となる.

【μ ITRON4.0 仕様との関係】

E_NORES は,μ ITRON4.0 仕様に規定されていないエラー コードである.

2.14.5 TOPPERS 共通マクロ

  • (1) 整数定数を作るマクロ
INT8_C(val) int_least8_t 型の定数を作るマクロ( C99 準拠)
UINT8_C(val) uint_least8_t 型の定数を作るマクロ( C99 準拠)
INT16_C(val) int16_t 型の定数を作るマクロ( C99 準拠)
UINT16_C(val) uint16_t 型の定数を作るマクロ( C99 準拠)
INT32_C(val) int32_t 型の定数を作るマクロ( C99 準拠)
UINT32_C(val) uint32_t 型の定数を作るマクロ( C99 準拠)
INT64_C(val) int64_t 型の定数を作るマ クロ(オプション, C99 準拠)
UINT64_C(val) uint64_t 型の定数を作るマクロ(オプション, C99 準拠)
INT128_C(val) int128_t 型の定数を作るマクロ(オプション, C99 準拠)
UINT128_C(val) uint128_t 型の定数を作るマクロ(オプション, C99 準拠)
UINT_C(val) uint_t 型の定数を作るマクロ
ULONG_C(val) ulong_t 型の定数を作るマクロ

【仕様決定の理由】

C99 に用意されていない UINT_C と ULONG_C を導入したのは,アセンブリ言語から も参照する定数を記述するためである. C言語のみで用いる定数をこれらのマク ロを使って記述する必要はない.

  • (2) 型に関する情報を取り出すためのマクロ
offsetof(structure, field) 構造体 structure 中のフィールド field のバイト位置を返すマクロ( C90 準拠)
alignof(type) 型 type のアラインメント単位を返すマクロ
ALIGN_TYPE(addr, type) 番地 addr が型 type に対してアラインしているかどうかを返すマクロ
  • (3) assert マクロ
assert(exp) exp が成立しているかを検査するマクロ( C90 準拠)
  • (4) コンパイラの拡張機能のためのマクロ
inline インライン関数
Inline ファイルローカルなインライン関数
asm インラインアセンブラ
Asm インラインアセンブラ(最適化抑止)
throw() 例外を発生しない関数
NoReturn リターンしない関数
  • (5) エラーコード構成・分解マクロ
ERCD(mercd, sercd) メインエラーコード mercd とサブエラーコード sercd から,エラーコードを構成するためのマクロ
MERCD(ercd) エラーコード ercd からメインエラーコードを抽出するためのマクロ
SERCD(ercd) エラーコード ercd からサブエラーコードを抽出するためのマクロ
  • (6) アクセス許可パターン構成マクロ
TACP(domid) domid で指定されるユーザドメインのみにアクセスを許可するアクセス許可パターンを構成するためのマクロ

ここで, TACP のパラメータ( domid )には,ユーザドメインの ID 番号のみを指定 することができる. TDOM_SELF , TDOM_KERN EL , TDOM_NONE を指定した場合の動作 は,保証されない.

2.14.6 TOPPERS 共通構成マクロ

  • (1) 相対時間の範囲
TMAX_RELTIM 相対時間に指定できる最大値

2.15 カーネル共通定義

カーネルの複数の機能で共通に用いる定義を,カーネル共 通定義と呼ぶ.

2.15.1 カーネルヘッダファイル

カーネルを用いるために必要な定義は,カーネルヘッダファイル( kernel.h ) およびそこからインクルードされるファイルに含まれている.カーネルを用い る場合には,カーネルヘッダファイルをインクルードする.

ただし,カーネルを用いるために必要な定義の中で,コンフィギュレータによっ て生成されるものは,カーネル構成・初期化ヘッダファイル( kernel_cfg.h ) に含まれる.具体的には,登録できるオブジェクトの数( TNUM_YYY )やオブジェ クトの ID 番号などの定義が,これに該当する.これらの定義を用いる場合には, カーネル構成・初期化ヘッダファイルをインクルードする.

μ ITRON4.0 仕様で規定されており,この仕様で廃止されたデータ型および定数 を用いる場合には, ITRON 仕様互換ヘッダファイル( itron.h )をインクルード する.

【μ ITRON4.0 仕様との関係】

この仕様では,コンフィギュレータが生成するヘッダファイルに,オブジェク トの ID 番号の定義に加えて,登録できるオブジェクトの数( TNUM_YYY )の定義 が含まれることとした.これに伴い,ヘッダファイルの名称を,μ ITRON4.0 仕 様の自動割付け結果ヘッダファイル( kernel_id.h )から,カーネル構成・初期 化ヘッダファイル( kernel_cfg.h )に変更した.

2.15.2 カーネル共通定数

  • (1) オブジェクト属性
TA_TPRI 0x01U タスクの待ち行列をタスクの優先度順に

【μ ITRON4.0 仕様との関係】

値が 0のオブジェクト属性( TA_HLNG , TA_TFIFO , TA_MFIFO , TA_WSGL )は,デフォ ルトの扱いにして廃止した.これは,「 (tskatr & TA_HLNG) != 0U 」のような 間違いを防ぐためである. TA_ASM は,有効な使途がないために廃止した. TA_MPRI は,メールボックス機能でのみ使用するため,カーネル共通定義から外 した.

  • (2) 保護ドメイン ID
TDOM_SELF 0 自タスクの属する保護ドメイン
TDOM_KERNEL -1 カーネルドメイン
TDOM_NONE -2 無所属(保護ドメインに属さない)
  • (3) その他のカーネル共通定数
TCLS_SELF 0 自タスクの属するクラス
TPRC_NONE 0 割付けプロセッサの指定がない
TPRC_INI 0 初期割付けプロセッサ
TSK_SELF 0 自タスク指定
TSK_NONE 0 該当するタスクがない
TPRI_SELF 0 自タスクのベース優先度の指定
TPRI_INI 0 タスクの起動時優先度の指定
TIPM_ENAALL 0 割込み優先度マスク全解除
  • (4) カーネルで用いるメインエラーコード

    「 2.14.4 TOPPERS 共通エラーコード」の節で定義したメインエラーコードの中 で, E_CLS , E_WBLK , E_BOVR の 3つは,カーネルでは使用しない.

    【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,サービスコールから, E_RSFN , E_RSATR , E_MACV , E_OACV , E_NOMEM , E_NOID , E_NORES , E_NOE XS が返る状況は起こらない. E_RSATR は,コ ンフィギュレータによって検出される.ただし,動的生成機能拡張パッケージ では, E_RSATR , E_NOMEM , E_NOID , E_NOEXS が返る状況が起こる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,サービスコールから, E_RSFN , E_RSATR , E_MACV , E_OACV , E_NOM EM , E_NOID , E_NORES , E_NOEXS が返る状況は起こらない. E_RSATR と E_NORES は,コンフィギュレータによって検出される.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,サービスコールから, E_RSATR , E_NOID , E_NORES , E_NOEXS が返る状況は起こらない. E_RSATR は,コンフィギュレータによって検 出される.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,サービスコールから, E_RSFN , E_RSATR , E_MACV , E_OACV , E_ILUSE , E_NOMEM , E_NOID , E_NORES , E_NOEXS , E_RLWAI , E_TMOUT , E_DLT が返 る状況は起こらない. E_RSATR は,コンフィギュレータによって検出される.

2.15.3 カーネル共通マクロ

  • (1) スタック領域をアプリケーションで確保するためのデータ型とマクロ

    スタック領域をアプリケーションで確保するために,次のデータ型とマクロを 用意している.

STK_T スタック領域を確保するためのデータ型
COUNT_STK_T(sz) サイズ sz のスタック領域を確保するために必要なSTK_T 型の配列の要素数
ROUND_STK_T(sz) 要素数 COUNT_STK_T(sz) の STK_T 型の配列のサイズ( szを, STK_T 型のサイズの倍数になるように大きい方に丸めた値)

これらを用いてスタック領域を確保する方法は次の通り.

STK_T < スタック領域の変数名 >[COUNT_STK_T(< スタック領域のサイズ >)];

この方法で確保したスタック領域を,サービスコールまたは静的 API に渡す場合 には,スタック領域の先頭番地に <スタック領域の変数名 >を,スタック領域の サ イズに ROUND_STK_T(< スタック領域のサイズ >) を指定する.

ただし,保護機能対応カーネルにおいては,上の方法によりタスクのユーザス タック領域を確保することはできない.詳しくは,「 4.1 タスク管理機能」の 節の CRE_TSK の機能の項を参照すること.

  • (2) オブジェクト属性を作るマクロ

    保護機能対応カーネルでは,オブジェクトが属する保護ドメインを指定するた めのオブジェクト属性を作るマクロとして,次のマクロを用意している.

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

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

TA_CLS(clsid) clsid で指定されるクラスに属する
  • (3) サービスコールの呼出し方法を指定するマクロ

    保護機能対応カーネルでは,サービスコールの呼出し方法を指定するためのマ クロとして,次のマクロを用意している.

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

2.15.4 カーネル共通構成マクロ

  • (1) サポートする機能
TOPPERS_SUPPORT_PROTECT 保護機能対応のカーネル
TOPPERS_SUPPORT_MULTI_PRC マルチプロセ ッサ対応のカーネル
TOPPERS_SUPPORT_DYNAMIC_CRE 動的生成対応のカーネル

【未決定事項】

マクロ名は,今後変更する可能性がある.

  • (2) 優先度の範囲
TMIN_TPRI タスク優先度の最小値(= 1)
TMAX_TPRI タスク優先度の最大値

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,タスク優先度の最大値( TMAX_TPRI )は 16 に固定されている. ただし,タスク優先度拡張パッケージを用いると, TMAX_TPRI を 256 に拡張する ことができる.

【 TOPPERS/FMP カー ネルにおける規定】

FMP カーネルでは,タスク優先度の最大値( TMAX_TPRI )は 16 に固定されている.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,タスク優先度の最大値( TMAX_TPRI )は 16 に固定されている.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスク優先度の最大値( TMAX_TPRI )は 16 に固定されている.

【μ ITRON4.0 仕様との関係】

メッセージ優先度の最小値( TMIN_MPRI )と最大値( TMAX_MPRI )は,メールボッ クス機能でのみ使用するため,カーネル共通定義から外した.

  • (3) プロセッサの数

    マルチプロセッサ対応カーネルでは,プロセッサの数を知るためのマクロとし て,次の構成マクロを用意している.

TNUM_PRCID プロセッサの数
  • (4) 特殊な役割を持ったプロセッサ

    マルチプロセッサ対応カーネルでは,特殊な役割を持ったプロセッサを知るた めのマクロとして,次の構成マクロを用意している.

TOPPERS_MASTER_PRCID マスタプロセッサの ID 番号
TOPPERS_SYSTIM_PRCID システム時刻管理プロセッサの ID 番号(グローバルタイマ方式の場合のみ)
  • (5) タイマ方式

    マルチプロセッサ対応カーネルでは, システム時刻の方式を知るためのマクロ として,次の構成マクロを用意している.

TOPPERS_SYSTIM_LOCAL ローカルタイマ方式の場合にマクロ定義
TOPPERS_SYSTIM_GLOBAL グローバルタイマ方式の場合にマクロ定義
  • (6) バージョン情報
TKERNEL_MAKER カーネルのメーカコード(= 0x0118 )
TKERNEL_PRID カーネルの識別番号
TKERNEL_SPVER カーネル仕様のバージョン番号
TKERNEL_PRVER カーネルのバージョン番号

カーネルのメーカコード( TKERNEL_MAKER )は, TOPPERS プロジェク トから配布 するカーネルでは, TOPPERS プロジェクトを表す値( 0x0118 )に設定されている.

カーネルの識別番号( TKERNEL_PRID )は, TOPPERS カーネルの種類を表す.

0x0001 TOPPERS/JSP カーネル
0x0002 予約( IIMP カーネル)
0x0003 予約( IDL カーネル)
0x0004 TOPPERS/FI4 カーネル
0x0005 TOPPERS/FDMP カーネル
0x0006 TOPPERS/HRP カーネル
0x0007 TOPPERS/ASP カーネル
0x0008 TOPPERS/FMP カーネル
0x0009 TOPPERS/SSP カーネル
0x000a TOPPERS/ASP Safety カーネル

カーネル仕様のバージョン番号( TKERNEL_SPVER )は,上位 8ビット( 0xf5 )が TOPPERS 新世代カーネル仕様であることを,中位 4ビットがメジャーバージョン 番号,下位 4ビットがマイナーバージョン番号を表す.

カーネルのバージョン番号( TKERNEL_PRVER )は,上位 4ビットがメジ ャーバー ジョン番号,中位 8ビットがマイナーバージョン番号,下位 4ビットがパッチレ ベルを表す.

第3章 システムインタフェースレイヤ API 仕様

3.1 システムインタフェースレイヤの概要

システムインタフェースレイヤ(この章では, SIL と略記する)は,デバイスを 直接操作するプログラムが用いるための機能である. ITRON デバイスドライバ設 計ガイドラインの一部分として検討されたものをベースに, TOPPERS プロジェク トにおいて修正を加えて用いている.

SIL の機能は,プロセッサの特権モードで実行されているプログラムが使用する ことを想定している.非特権モードで実行されているプログラムから SIL の機能 を呼び出した場合の動作は,次の例外を除いては保証されない.

  • ・微少時間待ちの機能を呼び出すこと
  • ・エンディアンの取得のためのマクロを参照すること
  • ・メモリ空間アクセス関数により,アクセスを許可されたメモリ領域にアクセ スすること
  • ・ I/O 空間アクセス関数により,アクセスを許可された I/O 領域にアクセスする こと

3.2 SIL ヘッダファイル

SIL を用いるために必要な定義は, SIL ヘッダファイル( sil.h )およびそこから インクルードされるファイルに含まれている. SIL を用いる場合には, SIL ヘッ ダファイルをインクルードする.

3.3 全割込みロック状態の制御

デバイスを扱うプログラムの中では,すべての割込み( NMI を除く,以下同じ) をマスクしたい場合がある.カーネルで制御できる CPU ロック状態は,カーネル 管理外の割込み( NMI 以外にカーネル管理外の割込みがあるかはターゲット定義) をマスクしないため,このような場合に用いることはできない.

そこで, SIL では,すべての割込みをマスクする全割込みロック状態を制御する ための以下の機能を用意している.

  • (1) SIL_PRE_ LOC

    全割込みロック状態の制御に必要な変数を宣言するマクロ.通常は,型と変数 名を並べたもので,最後に ";" を含まない.

    このマクロは, SIL_LOC_INT , SIL_UNL_INT を用いる関数またはブロックの先頭 の変数宣言部に記述しなければならない. SIL_LOC_INT , SIL_UNL_INT を 1つの関 数内でネストして用いることは可能であるが,その場合には ,ネストレベル毎 にブロックを作り,そのブロックの先頭の変数宣言部に SIL_PRE_LOC を記述しな ければならない.そのように記述しなかった場合の動作は保証されない.

  • (2) SIL_LOC_INT()

    全割込みロックフラグをセットすることで, NMI を除くすべての割込みをマスク し,全割込みロック状態に遷移する.

  • (3) SIL_UNL_INT()

    全割込みロックフラグを,対応する SIL_LOC_INT を実行する前の状態に戻す. SIL_LOC_INT を実行せずに SIL_UNL_INT を呼び出した場合の動作は保証されない.

    なお,全割込みロック状態で呼び出せるサービスコールなどの制限事項につい ては,「 2.5.4 全割込みロック状態と全割込みロック解除状態」の節を参照す ること.

    【補足説明】

    全割込みロック状態の制御機能の使用例は次の通り.

    { SIL_PRE_LOC;

    SIL_LOC_INT(); SIL_UNL_INT(); }

3.4 SIL スピンロック

マルチプロセッサシステムにおいて,カーネルの機能を用いずに,他のプロセッ サとの間でも排他制御を実現したい場合がある.そこで SIL では,割込みのマス クとプロセッサ間ロックの取得により排他制御を行うためのスピンロックの機 能を用意している.これを,カーネルのスピンロック機能と区別するために, SIL スピンロックと呼ぶ.

プロセッサ間ロックを取得している間は,全割込みロック状態にすることです べての割込み( NMI を除く)がマスクされる.ロックが他のプロセッサに取得さ れている場合には,ロックが取得できるまでループによって待つ.ロックの取 得を待つ間は,割込みはマスクされない(ロックの取得 を試みる前にマスクし ていた割込みは,マスク解除されない).プロセッサ間ロックを取得し割込み をマスクすることを, SIL スピンロックを取得するという.また,プロセッサ間 ロックを返却し割込みをマスク解除することを, SIL スピンロックを返却すると いう.

SIL で取得・返却するプロセッサ間ロックは,システムに唯一存在する.

  • (1) SIL_PRE_LOC

    全割込みロック状態の制御に必要な変数を宣言するマクロであるが, SIL スピン ロックの取得・解放にも兼用する.

    このマクロは, SIL_LOC_SPN , SIL_UNL_SPN を用いる関数またはブロックの先頭 の変数宣言部に記述しなければならない. SIL_LOC_SPN , SIL_UNL_SPN を,同じ 関数内の SIL_L OC_INT , SIL_UNL_INT とネストして用いることは可能であるが, その場合には,ネストレベル毎にブロックを作り,そのブロックの先頭の変数 宣言部に SIL_PRE_LOC を記述しなければならない.そのように記述しなかった場 合の動作は保証されない.

  • (2) SIL_LOC_SPN()

    SIL スピンロックが取得されていない状態である場合には,プロセッサ間ロック の取得を試みる.ロックが他のプロセッサに取得されている状態である場合や, 他のプロセッサがロックの取得に成功した場合には,ロックが返却されるまで ループによって待ち,返却されたらロックの取得を試みる.ロックの取得に成 功した場合には,全割込みロックフラグをセットし,全割込みロック状態に遷 移する.

  • (3) SIL_UNL_SPN()

    プロセッサ間ロックを返却し,全割込みロックフラグを対応する SIL_LOC_SPN を 実行する前の状態に戻す.

SIL スピンロックを取得している状態で SIL_LOC_SPN を呼び出した場合の動作は 保証されない.逆に, SIL スピンロックを取得していない状態で SIL_UNL_SPN を 呼び出した場合の動作も保証されない.

なお, SIL スピンロック取得 中は全割込みロック状態となっているため, SIL ス ピンロック取得中に呼び出せるサービスコールなどについては,「 2.5.4 全割 込みロック状態と全割込みロック解除状態」の節の制限事項が適用される.

なお,マルチプロセッサシステム以外では, SIL_LOC_SPN と SIL_UNL_SPN は用意 されていない.

【使用上の注意】

全割込ロック状態や CPU ロック状態で SIL_LOC_SPN を呼び出すことはできるが, 割込みがマスクされている時間が長くなるために,そのような使い方は避ける べきである.

【補足説明】

SIL スピンロック機能の使用例は次の通り.

{ SIL_PRE_LOC;

SIL_LOC_SPN(); SIL_UNL_SPN(); }

3.5 微少時間待ち

デバイスをアクセスする際に,微少な時間待ちを入れなければならない場合が ある.そのような場合に, NOP 命令をいくつか入れるなどの方法で対応すると, ポータビリティを損なうことになる.そこで, SIL では,微少な時間待ちを行う ための以下の機能を用意している.

  • (1) void sil_dly_nse(ulong_t dlytim)

    dlytim で指定された以上の時間(単位はナノ秒),ループなどによって待つ. 指定した値によっては,指定した時間よりもかなり長く待つ場合があるので注 意すること.

3.6 エンディアンの取得

プロセッサのバイトエンディアンを取得するためのマクロとして, SIL では,以 下のマクロを定義している.

  • (1) SIL_ENDI AN_BIG , SIL_ENDIAN_LITTLE

    ビッグエンディアンプロセッサでは SIL_ENDIAN_BIG を,リトルエンディアンプ ロセッサでは SIL_ENDIAL_LITTLE を,マクロ定義している.

3.7 メモリ空間アクセス関数

メモリ空間にマッピングされたデバイスレジスタや,デバイスとの共有メモリ をアクセスするために, SIL では,以下の関数を用意している.

  • (1) uint8_t sil_reb_mem(const uint8_t *mem)

    mem で指定されるアドレスから 8ビット単位で読み出した値を返す.

  • (2) void sil_wrb_mem(uint8_t *mem, uint8_t data)

    mem で指 定されるアドレスに data で指定される値を 8ビット単位で書き込む.

  • (3) uint16_t sil_reh_mem(const uint16_t *mem)

    mem で指定されるアドレスから 16 ビット単位で読み出した値を返す.

  • (4) void sil_wrh_mem(uint16_t *mem, uint16_t data)

    mem で指定さ れるアドレスに data で指定される値を 16 ビット単位で書き込む.

  • (5) uint16_t sil_reh_lem(const uint16_t *mem)

    mem で指定されるアドレスから 16 ビット単位でリトルエンディアンで読み出した 値を返す.リトルエンディアンプロセッサでは, sil_reh_mem と一致する.ビッ グエンディアンプロセッサでは, sil_reh_mem が返す値を,エン ディアン変換し た値を返す.

  • (6) void sil_wrh_lem(uint16_t *mem, uint16_t data)

    mem で指定されるアドレスに data で指定される値を 16 ビット単位でリトルエンディ アンで書き込む.リトルエンディアンプロセッサでは, sil_wrh_mem と一致する. ビッグエンディアンプロセッサでは, data をエンディアン変換した値を, sil_wrh_mem で書き込むのと同じ結果となる.

  • (7) uint16_t sil_reh_bem(const uint16_t *mem)

    mem で指定されるアドレスから 16 ビット単位でビッグエンディアンで読み出した 値を返す.ビッグエンディアンプロセッサでは, sil_reh_mem と一致 する.リト ルエンディアンプロセッサでは, sil_reh_mem が返す値を,エンディアン変換し た値を返す.

  • (8) void sil_wrh_bem(uint16_t *mem, uint16_t data)

    mem で指定されるアドレスに data で指定される値を 16 ビット単位でビッグエンディ アンで書き込む.ビッグエンディアンプロセッサでは, sil_wrh_mem と一致する. リトルエンディアンプロセッサでは, data をエンディアン変換した値を, sil_wrh_mem で書き込むのと同じ結果となる.

  • (9) uint32_t sil_rew_mem(const uint32_t *mem)

    mem で指定されるアドレスから 32 ビット単位で読み出した値を返す.

  • (10) void sil_wrw_mem(u int32_t *mem, uint32_t data)

    mem で指定されるアドレスに data で指定される値を 32 ビット単位で書き込む.

  • (11) uint32_t sil_rew_lem(const uint32_t *mem)

    mem で指定されるアドレスから 32 ビット単位でリトルエンディアンで読み出した 値を返す.リトルエンディアンプロセッサでは, sil_rew_mem と一致する.ビッ グエンディアンプロセッサでは, sil_rew_mem が返す値を,エンディアン変換し た値を返す.

  • (12) void sil_wrw_lem(uint32_t *mem, uint32_t data)

    mem で指定されるアドレスに data で指定される値を 32 ビット単位でリトルエンディ アンで書き込む.リトルエンディアンプロセッサでは, sil_wrw_mem と一致する. ビッグエンディアンプロセッサでは, data をエンディアン変換した値を, sil_wrw_mem で書き込むのと同じ結果となる.

  • (13) uint32_t sil_rew_bem(const uint32_t *mem)

    mem で指定されるアドレスから 32 ビット単位でビッグエンディ アンで読み出した 値を返す.ビッグエンディアンプロセッサでは, sil_rew_mem と一致する.リト ルエンディアンプロセッサでは, sil_rew_mem が返す値を,エンディアン変換し た値を返す.

  • (14) void sil_wrw_bem(uint32_t *mem, uint32_t data)

    mem で指定されるアドレスに data で指定される値を 32 ビット単 位でビッグエンディ アンで書き込む.ビッグエンディアンプロセッサでは, sil_wrw_mem と一致する. リトルエンディアンプロセッサでは, data をエンディアン変換した値を, sil_wrw_mem で書き込むのと同じ結果となる.

3.8 I/O 空間アクセス関数

メモリ空間とは別に I/O 空間を持つプロセッサでは, I/O 空間にあるデバイスレ ジスタをアクセスするために,メモリ空間アクセス関数と同等の以下の関数を 用意している.

  • (1) uint8_t sil_reb_iop(const uint8_t *iop)
  • (2) void sil_wrb_iop(uint8_t *iop, uint8_t data)
  • (3) uint16_t sil_reh_iop(const uint16_t *iop)
  • (4 ) void sil_wrh_iop(uint16_t *iop, uint16_t data)
  • (5) uint16_t sil_reh_lep(const uint16_t *iop)
  • (6) void sil_wrh_lep(uint16_t *iop, uint16_t data)
  • (7) uint16_t sil_reh_bep(const uint16_t *iop)
  • (8) void sil_wrh_bep(uin t16_t *iop, uint16_t data)
  • (9) uint32_t sil_rew_iop(const uint32_t *iop)
  • (10) void sil_wrw_iop(uint32_t *iop, uint32_t data)
  • (11) uint32_t sil_rew_lep(const uint32_t *iop)
  • (12) void sil_wrw_lep(uint32_t *iop, uint32_ t data)
  • (13) uint32_t sil_rew_bep(const uint32_t *iop)
  • (14) void sil_wrw_bep(uint32_t *iop, uint32_t data)

3.9 プロセッサ ID の参照

マルチプロセッサシステムにおいては,プログラムがどのプロセッサで実行さ れているかを参照するために,以下の関数を用意している .

  • (1) void sil_get_pid(ID *p_prcid)

    この関数を呼び出したプログラムを実行しているプロセッサの ID 番号を参照し, p_prcid で指定したメモリ領域に返す.

    【使用上の注意】

    タスクは, sil_get_pid を用いて,自タスクを実行しているプロセッサを正しく 参照できるとは限らない.これは, sil_get_pid を呼び出し,自タスクを実行し ているプロセッサの ID 番号を参照した直後に割込みが発生した場合, sil_get_pid から戻ってきた時には自タスクを実行しているプロセッサが変化し ている可能性があるためである.

第4章 カーネル API 仕様

この章では,カーネルの API 仕様 について規定する.

カーネルの API の種別と API をサポートするカーネルの種類を表すために,次の 記号を用いる.

〔 T〕はタスクコンテキスト専用のサービスコールを示す.非タスクコンテキス トから呼び出すと, E_CTX エラーとなる.

〔 I〕は非タスクコンテキスト専用のサービスコールを示す.タスクコンテキス トから呼び出すと, E_CTX エラーとなる.

〔 TI 〕はタスクコンテキストからも非タスクコンテキストからも呼び出すこと のできるサービスコールを示す.

〔 S〕は静的 API を示す.

〔 P〕は保護機能対応カーネルのみでサポートされている API を示す.保護機能 対応でないカーネルでは,この API はサポートされない.

〔 p〕は保護機能対応でないカーネルのみでサポートされている API を示す.保 護機能対応カーネルでは,この API はサポートされない.

〔 M〕はマルチプロセッサ対応カーネルのみでサポートされている API を示す. マルチプロセッサ対応でないカーネルでは,この API はサポートされない.

〔 D〕は動的生成対応カーネルのみでサポートされている API を示す.動的生成 対応でないカーネルでは,この API はサポートされない.

また,エラーコードが返る条件を表すために,次の記号を用いる.

〔 s〕はサービスコールのみで返るエラーコードを示す.静的 API では,この エラーコードは返らない.

〔 S〕は静的 API のみで返るエラーコードを示す.サービスコールでは,このエ ラーコードは返らない.

〔 P〕は保護機能対応カーネルのみで返るエラーコードを示す.保護機能対応で ないカーネルでは,このエラーコードは返らない.

〔 D〕は動的生成対応カーネルのみで返るエラーコードを示す.動的生成対応で ないカーネルでは,このエラーコードは返らない.

【μ ITRON4.0 仕様との関係】

TOPPERS 共通データ型に従い,パラメータ のデータ型を次の通り変更した.これ らの変更については,個別の API 仕様では記述しない.

INT → int_t UINT → uint_t VP → void * VP_INT → intptr_t

【μ ITRON4.0/PX 仕様との関係】

ID 番号で識別するオブジェクトのアクセス許可ベクタをデフォルト以外に設定 する場合には,オブジェクトを生成した後に設定することとし,アクセス許可 ベクタを設定する静的 API ( SAC_YYY )を新設した.逆に,アクセス許可ベクタ を指定してオブジェクトを生成する機能( CRA_YYY , cra_yyy , acra_yyy )は廃 止した.これらの変更については,個別の API 仕様では記述しない.

4.1 タスク管理機能

タスクは,プログラムの並行実行の単位で,カーネルが実行を制御する処理単 位である.タスクは,タスク ID と呼ぶ ID 番号によって識別する.

タスク管理機能に関連して,各タスクが持つ情報は次の通り.

  • ・タスク属性
  • ・タスク状態
  • ・ベース優先度
  • ・現在優先度
  • ・起動要求キューイング数
  • ・割付けプロセッサ(マルチプロセッサ対応カーネルの場合)
  • ・次回起動時の割付けプロセッサ(マルチプロセッサ対応カーネルの場合)
  • ・拡張情報
  • ・メインルーチンの先頭番地
  • ・起動時優先度
  • ・実行時優先度( TOPPERS/SSP カーネルの場合)
  • ・スタック領域
  • ・システムスタック領域(保護機能対応カーネルの場合)
  • ・アクセス許可ベクタ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス(マルチプロセッサ対応カーネルの場合)

タスクのベース優先度は,タスクの現在優先度を決定するために使われる優先 度であり,タスクの起動時に起動時優先度に初期化される.

タスクの現在優先度は,タスクの実行順位を決定するために使われる優先度で ある.単にタスクの優先度と言った場合には,現在優先度のことを指す.タス クがミューテックスをロックしていない間は,タスクの現在優先度はベース優 先度に一致する.ミューテックスをロックしている間のタスクの現在優先度に ついては,「 4.4.6 ミューテックス」の節を参照すること.

タスクの起動要求キュ ーイング数は,処理されていないタスクの起動要求の数 であり,タスクの生成時に 0に初期化される.

割付けプロセッサは,マルチプロセッサ対応カーネルにおいて,タスクを実行 するプロセッサで,タスクの生成時に,タスクが属するクラスによって定まる 初期割付けプロセッサに初期化される.

次回起動時の割付けプロセッサは,マルチプロセッサ対応カーネルにおいて, タスクが次に起動される時に割り付けられるプロセッサで,タスクの生成時に 未設定の状態に初期化される.タスクの起動時に,次回起動時の割付けプロセッ サが設定されていれば,タスクの割付けプロセッサがそのプロセッサに変更さ れ,次回起動時の割付けプロセッサは未設定の状態に戻される.次回起動時の 割付けプロセッサが未設定の場合には,タスクの割付けプロセッサは変更され ない(つまり,タスクが前に実行されていたのと同じプロセッサで実行され る).

保護機能対応カーネルにおいては,スタック領域の扱いは,ユーザタスクとシ ステムタスクで異なる.ユーザタスクのスタック領域は,ユーザタスクが非特 権モードで実行する間に用いるスタック領域であり,ユーザスタック領域と呼 ぶ.その扱いについては,「 2.11.6 ユーザタスクのユーザスタック領域」の 節 を参照すること.システムタスクのスタック領域は,カーネルの用いるオブジェ クト管理領域と同様に扱われる.

システムスタック領域は,保護機能対応カーネルにおいて,ユーザタスクがサー ビスコール(拡張サービスコールを含む)を呼び出し,特権モードで実行する 間に用いるスタック領域である.システムスタック領域は,カーネルの用いる オブジェクト管理領域と同様に扱われる.

タスク属性には,次の属性を指定することができる.

TA_ACT 0x02U タスクの生成時にタスクを起動する
TA_RSTR 0x04U 生成するタスクを制約タスクとする

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

TA_FPU FPU レジスタをコンテキストに含める

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に固定されている.また,制約タスクはサポー トしていない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, TMAX_ACTCNT は 1に固定されている.また,制約タスクはサ ポートしていない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスクの起動要求のキューイングはサポートしておらず,タ スクに対して起動要求キューイング数の情報を持たない.また, TMAX_ACTCNT を 定義してい ない.

また,制約タスクのみをサポートすることから,すべてのタスクでスタック領 域を共有しており,タスク毎にスタック領域の情報を持たない.

SSP カーネルにおける追加機能として,タスクに対して,実行時優先度の情報を 持つ. SSP カーネルにおいては,タスクが起動された後,最初に実行状態になる 時に,タスクのベース優先度が,タスクの実行時優先度に設定される.実行時 優先度の機能は,起動時優先度よりも高い優先度でタスクを実行することで, 同時期に共有スタック領域を使用している状態になるタスクの組み合わせを限 定し,スタック領域を節約するための機能である.

タスクの実行時優先度は,実行時優先度を定義する静的 API ( DEF_EPR )によっ て設定する.実行時優先度を定義しない場合,タスクの実行時優先度は,起動 時優先度と同じ値に設定される .

〔実行時優先度によるスタック領域の節約〕

いずれのタスクにも実行時優先度が設定されていない場合には,すべてのタス クが同時期に共有スタック領域を使用している状態になる可能性があるため, すべてのタスクのスタック領域のサイズの和に,非タスクコンテキスト用のス タック領域のサイズを加えたものが,共有スタック領域に必要なサイズとなる.

タスク Aに対して実行時優先度が設定されており,タスク Aの起動時優先度より も高く,タスク Aの実行時優先度と同じかそれよりも低い起動時優先度を持つタ スク Bがある場合,タスク Aとタスク Bは同時期に共有スタック領域を使用してい る状態にならない.そのため,タスク Aとタスク Bの内,サイズが小さい方のス タック領域のサイズは,共有スタック領域のサイズに加える必要がなくなり, スタック領域を節約でき ることになる.

【μ 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 })

※ sstksz および sstk の記述は省略することができる.

【 C言語 API 】

ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)

【パラメータ】

ID tskid 生成するタスクの ID 番号( CRE_TSK の場合)
T_CTSK * pk_ctsk タスクの生成情報を入れたパケットへのポインタ(静的 API を除く)

*タスクの生成情報(パケットの内容)

ATR tskatr タスク属性
intptr_t exinf タスクの拡張情報
TASK task タスクのメインルーチンの先頭番地
PRI itskpri タスクの起動時優先度
SIZE stksz タスクのスタック領域のサイズ(バイト数)
S TK_T * stk タスクのスタック領域の先頭番地
SIZE sstksz タスクのシステムスタック領域のサイズ(バイト数,保護機能対応カーネルの場合,静的 APIにおいては省略可)
STK_T * sstk タスクのシステムスタ ック領域の先頭番地(保護機能対応カーネルの場合,静的 API においては省略可)

【リターンパラメータ】

ER_ID tskid 生成されたタスクの ID 番号(正の値)またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( tskatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( task , itskpri , stksz , stk , sstksz ,sstk が不正,その他の条件については機能の項を参照すること)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されてい ない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_ctsk が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるタスク ID がない)
E_NOMEM メモリ不足(スタック領域やシステムスタック領域が確保できない)
E_OBJ オブジェクト状態エラー( tskid で指定したタスクが登録済み: CRE_TSK の場合,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定したタスク生成情報に従って,タスクを生成する.具体的 な振舞いは以下の 通り.

まず, stk と stksz からタスクが用いるスタック領域が設定される. stksz に 0を 指定した時や,ターゲット定義の最小値よりも小さい値を指定した時には, E_PAR エラーとなる.また,保護機能対応カーネルで,生成するタスクがユーザ タスクの場合には, sstk と sstksz からシステムスタック領域が設定される.こ の場合, sstksz に 0を指定した時や,ターゲット定義の最小値より も小さい値を 指定した時には, E_PAR エラーとなる.

次に,生成されたタスクに対してタスク生成時に行うべき初期化処理が行われ, 生成されたタスクは休止状態になる.さらに, tskatr に TA_ACT を指定した場合 には,タスク起動時に行うべき初期化処理が行われ,生成されたタスクは実行 できる状態になる.

静的 API においては, tskid はオブジェクト識別名, tskatr , itskpri , stksz は 整数定数式パラメータ, exinf , task , stk は一般定数式パラメータである.コ ンフィギュレータは,静的 API のメモリ不足( E_NOMEM )エラーを検出すること ができない.

itskpri は, TMIN_TPRI 以上, TMAX_TPRI 以下でなければならない.

〔 stk に NULL を指定した場合〕

stk を NULL とした場合, stksz で指定したサイズのスタック領域が,コンフィギュ レータまたはカーネルにより確保される. stksz にターゲット定義の制約に合致 しないサイズを指定した時には,ターゲット定義の制約に合致するように大き い方に丸めたサイズで確保される.

保護機能対応カーネルにおいて,生成するタスクが ユーザタスクの場合,コン フィギュレータまたはカーネルにより確保されるスタック領域(ユーザスタッ ク領域)は,「 2.11.6 ユーザタスクのユーザスタック領域」の節の規定に従っ て,メモリオブジェクトとしてカーネルに登録される.

静的 API において,生成するタスクが制約タスクの場合( tskatr に TA_RSTR を指 定した場合),コンフィギュレータは,生成する制約タスクの起動時優先度毎 にスタック領域を確保し,同じ起動時優先度を持つ制約タスクにそのスタック 領域を共有させる.確保するスタック領域のサイズは,コンフィギュレータが スタック領域を確保し( stk に NULL を指定して生成され),同じ起動時優先度を 持つ制約タスクのスタック領域のサイズ( stksz )の最大値となる.マルチプロ セッサ対応カーネルでは,以上のスタック領域の確保処理を,制約タスクの初 期割付けプロセッサ毎に行う.

〔 stk に NULL 以外を指定した場合〕

stk に NULL 以外を指定した場合, stk と stksz で指定したスタック領域は,アプリ ケーションで確保しておく必要がある.スタック領域をアプリケーションで確 保する方法については,「 2.15.3 カーネル共通マクロ」の節を参照すること. その方法に従わず, stk や stksz に ターゲット定義の制約に合致しない先頭番地 やサイズを指定した時には, E_PAR エラーとなる.

保護機能対応カーネルにおいて,生成するタスクがシステムタスクの場合に, stk と stksz で指定したスタック領域がカーネル専用のメモリオブジェクトに含 まれない場合, E_OBJ エラーとなる.

保護機能対応カーネルにおいて,生成するタスクがユーザタスクの場合, stk と stksz で指定したスタック領域(ユーザスタック領域)は,「 2.11.6 ユーザタ スクのユーザスタック領域」の節の規定に従って,メモリオブジェクトとして カーネルに登録される.そのため,上の方法を用いてスタック領域を確保して も,ターゲット定義の制約に合致する先頭番地とサイズとなるとは限らず,ス タック領域をアプリケーションで確保する方法は,ターゲット定義である.ま た, stk と stksz で指 定したスタック領域が,登録済みのメモリオブジェクトと メモリ領域が重なる場合には, E_OBJ エラーとなる.

〔 sstk と sstksz の扱い〕

保護機能対応カーネルにおける sstk と sstksz の扱いは,生成するタスクがユー ザタスクの場合とシステムタスクの場合で異なる.

生成するタスクがユーザタスクの場合の扱いは次の通り.

sstk の記述を省略するか, sstk を NULL とした場合, sstksz で指定したサイズの システムスタック領域が,コンフィギュレータまたはカーネルにより確保され る. sstksz にターゲット定義の制約に合致しないサイズを指定した時には,ター ゲット定義の制約に合致するように大きい方に丸めたサイズで確保される. sstksz の記述も省略した場合には,ターゲット定義のデフォルトのサイズで確 保される.

sstk に NULL 以外を指定した場合, sstk と sstksz で指定したスタック領域は,ア プリケーションで確保しておく必要がある.スタック領域をアプリケーション で確保する方法については,「 2.15.3 カーネル共通マクロ」の節を参照するこ と.その方法に従わず, sstk や sstksz にターゲット定義の制約に合致しない先 頭番地やサイズを指定した時には, E_PAR エラーとなる.また, stk と stksz で指 定したシステムスタック領域がカーネル専用のメモリオブジェクトに含まれな い場合, E_OBJ エラーとなる.

生成するタスクがシステムタスクの場合の扱いは次の通り.

sstk に指定することができるのは, NULL のみである. sstk に NULL 以外を指定し た場合には, E_PAR エラーとなる.

sstksz に 0以外の値を指定した場合で, stk が NULL の場合には,コンフィギュレー タまたはカーネルにより確保されるスタック領域のサイズに, sstksz が加えら れる. stksz に sstksz を加えた値が,ターゲット定義の制約に合致しないサイズ になる時には,ターゲット定義の制約に合致するように大きい方に丸めたサイ ズで確保される.

sstksz に 0以外の値を指定した場合で, stk が NULL でない場合には, E_PAR エラー となる.

sstksz に 0を指定した場合,これらの処理は行わず, E_PAR エラーにもならない.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_TSK のみをサポートする.ただし,動的生成機能拡張パッ ケージ では, acre_tsk もサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_TSK のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_TSK のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, CRE_TSK のみをサポートする.

SSP カーネルでは,複数のタスクに対して,同じ起動時優先度を設定することは できない.設定した場合には,コンフィギュレータが E_PAR エラーを報告する.

SSP カーネルでは,制約タスクのみをサポートするため,タスク属性に TA_RSTR を指定しない場合でも,生成されるタスクは制約タスクとなる .

SSP カーネルでは, stk には NULL を指定しなくてはならず,その場合でも,コン フィギュレータはタスクのスタック領域を確保しない.これは, SSP カーネルで は,すべての処理単位が共有スタック領域を使用し,タスク毎にスタック領域 を持たないためである. stk に NULL 以外を指定した場合には, E_PAR エラーとな る.

共有スタック領域の設定方法については, DEF_STK の項を参照すること.

【μ ITRON4.0 仕様との関係】

task のデータ型を TASK に, stk のデータ型を STK_T * に変更した. COUNT_STK_T と ROUND_STK_T を新設し,スタック領域をアプリケーションで確保する方法を規定 した.

【μ ITRON4.0/ PX 仕様との関係】

sstk のデータ型を STK_T * に変更した.システムスタック領域をアプリケーショ ンで確保する方法を規定した.

【未決定事項】

サービスコール( acre_tsk )により, stk に NULL を指定して制約タスクを生成し た場合のスタック領域の確保方法については,今後の課題である.

【仕 様決定の理由】

保護機能対応カーネルにおいて, sstksz および sstk の記述は省略することがで きることとしたのは,保護機能対応でないカーネル用のシステムコンフィギュ レーションファイルを,保護機能対応カーネルにも変更なしに使えるようにす るためである.


AID_TSK 割付け可能なタスク ID の数の指定〔 SD 〕

【静的 API 】

AID_TSK(uint_t notsk)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

notsk で指定した数のタスク ID を,タスクを生成するサービスコールによって割 付け可能なタスク ID として確保する.

notsk は整数定数式パラメータである.


SAC_TSK タスクのアクセス許可ベクタの設定〔 SP 〕
sac_tsk タスクのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_TSK(ID tskid, { ACPTN acptn1, ACPTN acpt n2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_tsk(ID tskid, const ACVCT *p_acvct)

【パラメータ】

ID tskid 対象タスクの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス 許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_TSKの場合)
E_NOEXS 〔 D〕 オブジェ クト未登録(対象タスクが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象タスクに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エ ラー(対象タスクは静的 API で生成された: sac_tsk の場合,対象タスクに対してアクセス許可ベクタが設定済み: SAC_TSK の場合)

【機能】

tskid で指定したタスク(対象タスク)のアクセス許可ベクタ( 4つのアクセス 許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, tskid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_TSK は,対象タスクが属する保護ドメインの囲みの中に記述しなければなら ない.そうでない場合には, E_RSATR エラーとなる.

sac_tsk において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_TSK , sac_tsk をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_TSK , sac_tsk をサポートしない.

【 TOPPERS/HRP2 カーネルに おける規定】

HRP2 カーネルでは, SAC_TSK のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, SAC_TSK , sac_tsk をサポートしない.


DEF_EPR タスクの実行時優先度の定義〔 S〕

【静的 API 】

DEF_EPR(ID tskid, { PRI exepri })

【パラメータ】

ID tskid 対象タスクの ID 番号
PRI exepri タスクの実行時優先度

【エラーコード】

E_ID 不正 ID 番号( tskid が不正)
E_PAR パラメータエラー( exepri が不正)
E_ILUSE サービスコール不正使用( exepri が,自タスクの起動時優先度よりも低い場合)
E_OBJ オブジェクト状態エラー (対象タスクに対して実行優先度が設定済み)

【サポートするカーネル】

DEF_EPR は, TOPPERS/SSP カーネルのみがサポートする静的 API である.他のカー ネルは, DEF_EPR をサポートしない.

【機能】

tskid で指定したタスク(対象タスク)の実行 時優先度を, exepri で指定した優 先度に設定する.

tskid はオブジェクト識別名, exepri は整数定数式パラメータである.

exepri は, TMIN_TPRI 以上, TMAX_TPRI 以下でなければならない.また, exepri は,対象タスクの起動時優先度と同じかそれよりも高くなければならない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていない静的 API である.


del_tsk タスクの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_tsk(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する管理操作が許可されていない)
E_OBJ オブジェクト 状態エラー(対象タスクが休止状態でない,対象タスクは静的 API で生成された)

【機能】

tskid で指定したタスク(対象タスク)を削除する.具体的な振舞いは以下の通 り.

対象タスクが休止状態である場合には,対象タスクの登録が解除され,そのタ スク ID が未使用の状態に戻される.また,タスクの生成時にタスクのスタック 領域およびシステムスタック領域がカーネルによって確保された場合は,それ らのメモリ領域が解放される.

対象タスクが休止状態でない場合には, E_OBJ エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_tsk をサポ ートしない.ただし,動的生成機能拡張パッ ケージでは, del_tsk をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_tsk をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, del_tsk をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, del_tsk をサポートしない.


act_tsk タスクの起動〔 T〕
iact_tsk タスクの起動〔 I〕

【 C言語 API 】

ER ercd = act_tsk(ID tskid)

ER ercd = iact_tsk(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: act_tsk の場合,タスクコンテキストからの呼出し:iact_tsk の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 1が許可されていない: act_tsk の場合)
E_QOVR キューイングオーバフロー(起動要求キューイング数が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 tskid 対象タスクの ID 番号
ID prcid タスクの 割付け対象のプロセッサの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: mact_tsk の場合,タスクコンテキストからの呼出し: imact_tsk の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid , prcid が不正)
E_PAR パラメータエラー(対象タスクは prcid で指定したプロセッサに 割り付けられない)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 1が許可されていない: mact_tsk の場合)
E_QOVR キューイングオーバフロー(起動要求キューイング数がTM AX_ACTCNT に一致)

【機能】

prcid で指定したプロセッサを割付けプロセッサとして, tskid で指定したタス ク(対象タスク)に対して起動要求を行う.具体的な振舞いは以下の通り.

対象タスクが休止状態である場合には,対象タスクの割付けプロセッサが prcid で指定したプロセッサに変更された後,対象タスクに対してタスク起動時 に行うべき初期化処理が行われ,対象タスクは実行できる状態になる.

対象タスクが休止状態でない場合には,対象タスクの起動要求キューイング数 に 1が加えられ,次回起動時の割付けプロセッサが prcid で指定したプロセッサ に変更される.起動要求キューイング数に 1を加えると TMAX_ACTCNT を超える場 合には, E_QOVR エラーとなる.

mact_tsk において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タス クとなる.

対象タスクの属するクラスの割付け可能プロセッサが, prcid で指定したプロセッ サを含んでいない場合には, E_PAR エラーとなる.

prcid に TPRC_INI (= 0)を指定すると,対象タスクの割付けプロセッサを,そ れが属するクラスの初期割 付けプロセッサとする.

【補足説明】

TMAX_ACTCNT が 2以上の場合でも,対象タスクが次に起動される時の割付けプロ セッサは,キューイングされない.すなわち,プロセッサ Aに割り付けられた休 止状態でないタスクを対象として,プロセッサ Bを割付けプロセッサとして mact_tsk を呼び出し,さらにプロセッサ Cを割付けプロセッサとして mact_tsk を 呼び出すと,対象タスクの次回起動時の割付けプロセッサがプロセッサ Cに変更 され,対象タスクがプロセッサ Bで実行されることはない.なお, TMAX_ACTCNT が 1の場合には,プロセッサ Cを割付けプロセッサとした 2回目の mact_tsk が E_QOVR エラーとなるため,次回起動時の割付けプロセッサはプロセッサ Bのまま 変更されない.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, mact_tsk , imact_tsk をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, mact_tsk , imact_tsk をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, mact_tsk , imact_tsk をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


can_act タスク起動要求のキャンセル 〔 T〕

【 C言語 API 】

ER_UINT actcnt = can_act(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

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

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 1が許可されていない)

【機能】

tskid で指定したタスク(対象タスク)に対する処理されていない起動要求をす べてキャンセルし,キャンセルした起動要求の数を返す.具体的な振舞いは以 下の通り.

対象タスクの起動要求キューイング数が 0に設定され, 0に設定する前の起動要 求キューイング数が,サービスコールの返値として返される.また,マルチプ ロセッサ対応カーネルにおいては,対象タスクの次回起動時の割付けプロセッ サが未設定状態に戻される.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, can_act をサポートしない.


mig_tsk タスクの割付けプロセッサの変更〔 TM 〕

【 C言語 API 】

E R ercd = mig_tsk(ID tskid, ID prcid)

【パラメータ】

ID tskid 対象タスクの ID 番号
ID prcid タスクの割付けプロセッサの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエ ラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,対象タスクが自タスクでディスパッチ保留状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid , prcid が不正)
E_PAR パラメータエラー(対象タスクは prcid で指定したプロセッサに割り付けられない)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常 操作 1が許可されていない)
E_OBJ オブジェクト状態エラー(対象タスクが自タスクと異なるプロセッサに割り付けられている)

【機能】

tskid で指定したタスクの割付けプロセッサを, prcid で指定したプロセッサに 変更する.具体的な 振舞いは以下の通り.

対象タスクが,自タスクが割り付けられたプロセッサに割り付けられている場 合には,対象タスクを prcid で指定したプロセッサに割り付ける.対象タスクが 実行できる状態の場合には, prcid で指定したプロセッサに割り付けられた同じ 優先度のタスクの中で,最も優先順位が低い状態となる.

対象タスクが,自タスクが割付けられたプロセッサと異なるプロセッサ に割り 付けられている場合には, E_OBJ エラーとなる.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.

ディスパッチ保留状態で,対象タスクを自タスクとして mig_tsk を呼び出すと, E_CTX エラーとなる.

prcid に TPRC_INI (= 0)を指定すると,対象タスクの割付けプロセッサを,そ れが属するクラスの初期割付けプロセッサに変更する.

【補足説明】

この仕様では,タスクをマイグレーションさせることができるのは,そのタス クと同じプロセッサに割り付けられたタスクのみである.そのため, CPU ロック 状態やディスパッチ禁止状態を用いて,他のタスクへのディスパッチが起こら ないようにすることで,自タスクが他のプロセッサへマイグレーショ ンされる のを防ぐことができる.

対象タスクが,最初から prcid で指定したプロセッサに割り付けられている場合 には,割付けプロセッサの変更は起こらないが,優先順位が同一優先度のタス クの中で最低となる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, mig_tsk をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, mig_tsk をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, mig_tsk をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


ext_tsk 自タスクの終了〔 T〕

【 C言語 API 】

ER ercd = ext_tsk()

【パラメータ】

なし

【リターンパラメータ】

ER ercd エラーコード

【エラーコード】

E_SYS システムエラー(カーネルの誤動作)
E_CTX コンテキストエラー(非タスクコンテキストからの呼出し)

【機能】

自タスクを終了させる.具体的な振舞いは以下の通り.

自タスクに対してタスク終了時に行うべき処理が行われ,自タスクは休止状態 になる.さらに,自タスクの起動要求キューイング数が 0でない場合には,自タ スクに対してタスク起動時に行うべき処理が行われ,自タスクは実行できる状 態になる.またこの時,起動要求キューイング数から 1が減ぜられる.

ext_tsk は, CPU ロック解除状態,割込み優先度マスク全解除状態,ディスパッ チ許可状態で呼び出すのが原則であるが,そうでない状態で呼び出された場合 には, CPU ロック解除状態,割込み優先度マスク全解除状態,ディスパッチ許可 状態に遷移させた後,自タスクを終了させる.

ext_tsk が正常に処理された場合, ext_tsk からはリターンしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, ext_tsk をサポートしない.自タスクを終了させる場合には, タスクのメインルーチンからリターンする.

【μ ITRON4.0 仕様との関係】

ext_tsk を非タスクコンテキストから呼び出した場合に, E_CTX エラーが返るこ ととした. μ ITRON4.0 仕様においては, ext_tsk からはリターンしないと規定さ れている.


ter_tsk タスクの強制終了〔 T〕

【 C言語 API 】

ER ercd = ter_tsk(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

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

【機能】

tskid で指定したタスク(対象タスク)を終了さ せる.具体的な振舞いは以下の 通り.

対象タスクが休止状態でない場合には,対象タスクに対してタスク終了時に行 うべき処理が行われ,対象タスクは休止状態になる.さらに,対象タスクの起 動要求キューイング数が 0でない場合には,対象タスクに対してタスク起動時に 行うべき処理が行われ,対象タスクは実行できる状態になる.またこの時,起 動要求キューイング数から 1が減ぜられる.

対象タスクが休止状態である場合には, E_OBJ エラーとなる.また,対象タスク が自タスクの場合には, E_ILUSE エラーとなる.

マルチプロセッサ対応カーネルでは,対象タスクは,自タスクと同じプロセッ サに割り付けられているタスクに限られる.対象タスクが自タスクと異なるプ ロセッサに割り付けられている場合には, E_OBJ エラーとなる.

【 TOPPERS/FMP カーネルにおける使用上の注意】

現時点の FMP カーネルの実装では,デッドロック回避のためのリトライ処理によ り,サービスコールの処理時間に上限がないため,注意が必要である(ロック 方式にも依存する).

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, ter_tsk をサポートしない.


chg_pri タスクのベース優先度の変更〔 T〕

【 C言語 API 】

ER ercd = chg_pri(ID tskid, PRI tskpri)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_PAR パラメータエラー( tskpri が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない)
E_ILUSE サービスコール不正使用( tskpri が,対象タスクがロックしているかロックを待っている優先度上限ミューテックスの上限優先度よりも高い場 合)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態)

【機能】

tskid で指定したタスク(対象タスク)のベース優先度を, tskpri で指定した優 先度に変更する.具体的な振舞いは以下の通り.

対象タスクが休止状態でない場合には,対象タスクのベース優先度が, tskpri で指定した優先 度に変更される.それに伴って,対象タスクの現在優先度も変 更される.

対象タスクが,優先度上限ミューテックスをロックしていない場合には,次の 処理が行われる.対象タスクが実行できる状態の場合には,同じ優先度のタス クの中で最低優先順位となる.対象タスクが待ち状態で,タスクの優先度順の 待ち行列につながれている場合には,対象タスクの変更後の現在優先度に従っ て,その待ち 行列中での順序が変更される.待ち行列中に同じ現在優先度のタ スクがある場合には,対象タスクの順序はそれらの中で最後になる.

対象タスクが,優先度上限ミューテックスをロックしている場合には,対象タ スクの現在優先度が変更されることはなく,優先順位も変更されない.

対象タスクが休止状態である場合には, E_OBJ エラーとなる.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.また, tskpri に TPRI_INI (= 0)を指定すると,対象タスクのベース優先度が,起動時 優先度に変更される.

tskpri は, TPRI_INI であるか, TMIN_TPRI 以上, TMAX_TPRI 以下でなければなら ない.また,対象タスクが優先度上限ミューテックスをロックしているかロッ クを待っている場合, tskpri は,それらのミューテックスの上限優先度と同じ かそれより低くなければならない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, chg_pri をサポートしない.

【μ ITRON4.0 仕様との関係】

対象タスクが,同じ優先度のタスクの中で最低の優先順位となる(対象タスク が待ち状態で,タスクの優先度順の待ち行列につながれている場合には,同じ 優先度のタスクの中での順序が最後になる)条件を変更した.


get_pri タスク優先度の参照〔 T〕

【 C言語 API 】

ER ercd = g et_pri(ID tskid, PRI *p_tskpri)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
PRI tskpri 現在優先度

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_tskpri が指すメモリ領域への書込みアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態)

【機能】

tskid で指定したタスク(対象タスク)の現在優先度を参照する.具体的な振舞 いは以下の通り.

対象タスクが休止状態でない場合には,対象タスクの現在優先度が, p_tskpri で指定した メモリ領域に返される.対象タスクが休止状態である場合には, E_OBJ エラーとなる.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, get_pri をサポートしない.


get_inf 自タスクの拡張情報の参照〔 T〕

【 C言語 API 】

ER ercd = get_inf(intptr_t *p_exinf)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
intptr_t exinf 拡張情報

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_MACV 〔 P〕 メモリアクセス違反( p_exinf が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

自タスクの拡張情報を参照する.参照した拡張情報は, p_exinf で指定したメモ リ領域に返される.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, get_inf をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


ref_tsk タスクの状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk)

【パラメータ】

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

【リターンパラ メータ】

ER ercd 正常終了( E_OK )またはエラーコード

*タスクの現在状態(パケットの内容)

STAT tskstat タスク状態
PRI tskpri タスクの現在優先度
PRI tskbpri タスクのベース優先度
STAT tskwait タスクの待ち要因
ID wobjid タスクの待ち対象のオブジェクトの ID
TMO lefttmo タスクがタイムアウトするまでの時間
uint_t actcnt タスクの起動要求キューイング数
uint_t wupcnt タスクの起床要求キューイング数
bool_t texmsk タスクがタスク例外処理マスク状態か否か(保護機能対応カーネルの場合)
bool_t waifbd タスクが待ち禁止状態か否か(保護機能対応カーネルの場合)
uint_t svclevel タスクの拡張サービスコールのネストレベル(保護機能対応カーネルの場合)
ID prcid タスクの割付けプロセッサの ID (マルチプロセッサ対応カーネルの場合)
ID actprc タスクの次回起動時の割付けプロセッサの ID (マルチプロセッサ対応カーネルの場合)

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOE XS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rtsk が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

tskid で指定したタスク(対象タスク)の現在状態を参照する.参照した現在状 態は, pk_rtsk で指定したメモリ領域に返される.

tskstat には,対象タスクの現在のタスク状態を表す次のいずれかの値が返され る.

TTS_RUN 0x01U 実行状態
TTS_RDY 0x02U 実行可能状態
TTS_WAI 0x04U 待ち状態
TTS_SUS 0x08U 強制待ち状態
TTS_WAS 0x0cU 二重待ち状態
TTS_DMT 0x10U 休止状態

マルチプロセッサ対応カーネルでは,対象タスクが自タスクの場合にも, tskstat が TTS_SUS となる場合がある.この状況は,自タスクに対して ref_tsk を 発行するのと同じタイミングで,他のプロセッサで実行されているタスクから 同じタスクに対して sus_tsk が発行された場合に発生する可能性がある.

対象タスクが休止状態でない場合には, tskpri には対象タスクの現在優先度が, tskbpri には対象タスクのベース優先度が返される.対象タスクが休止 状態であ る場合には, tskpri と tskbpri の値は保証されない.

対象タスクが待ち状態である場合には, tskwait には,対象タスクが何を待って いる状態であるかを表す次のいずれかの値が返される.

TTW_SLP 0x0001U 起床待ち
TTW_DLY 0x0002U 時間経過待ち
TTW_SEM 0x0004U セマフォの資源獲得待ち
TTW_FLG 0x0008U イベントフラグ待ち
TTW_SDTQ 0x0010U データキューへの送信待ち
TTW_RDTQ 0x0020U データキューからの受信待ち
TTW_SPDQ 0x0100U 優先度データキューへの送信待ち
T TW_RPDQ 0x0200U 優先度データキューからの受信待ち
TTW_MBX 0x0040U メールボックスからの受信待ち
TTW_MTX 0x0080U ミューテックスのロック待ち状態
TTW_MPF 0x2000U 固定長メモリブロックの獲得待ち

対象タスクが待ち状態でない場合には, tskwait の値は保証されない .

対象タスクが起床待ち状態および時間経過待ち状態以外の待ち状態である場合 には, wobjid に,対象タスクが待っているオブジェクトの ID 番号が返される. 対象タスクが待ち状態でない場合や,起床待ち状態または時間経過待ち状態で ある場合には, 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,呼び出している場合には,実行中の拡張 サービスコールがネスト段数が返される.対象タスクが休止状態である場合に は, texmsk , waifbd , svclevel の値は保証されない.

マルチプロセッサ対応カーネルでは, prcid に,対象タスクの割付けプロセッサ の ID 番号が返される.また actprc には,対象タスクの次回起動時の割付けプロ セッサの ID 番号が返される.次回起動時の割付けプロセッサが未設定の場合に は, actprc に TPRC_NONE (= 0)が返される.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.

【補足説明】

対象タスクが時間経過待ち状態である場合に, lefttmo ( TMO 型)に返される値 を RELTIM 型に型キャストすることで,タスクが待ち解除されるまでの相対時間 を正しく得ることができる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, tskwait に TTW_MTX が返ることはない.ただし,ミューテック ス機能拡張パッケージを用いると, tskwait に TTW_MTX が返る場合がある.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, tskwait に TTW_MTX が返ることはない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, tskwait に TTW_MBX が返ることはない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネル では, ref_tsk をサポートしない.

【使用上の注意】

ref_tsk はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_tsk を呼び出し,対象タスクの現在状態を参照した直後に割 込みが発生した場合, ref_tsk から戻ってきた時には対象タスクの状態が変化し ている可能性があるためである.

【μ ITRON4.0 仕様との関係】

対象タスクが時間経過待ち状態の時に lefttmo に返される値について規定した. また,参照できるタスクの状態から,強制待ち要求ネスト数( suscnt )を除外 した.

マルチプロセッサ対応カーネルで参照できる情報として,割付けプロセッサの ID ( prcid )と次回起動時の割付けプロセッサの ID ( actprc )を追 加した.

【μ ITRON4.0/PX 仕様との関係】

保護機能対応カーネルで参照できる情報として,タスク例外処理マスク状態か 否か( texmsk ),待ち禁止状態か否か( waifbd ),拡張サービスコールのネス トレベル( svclevel )を追加した.


4.2 タスク付属同期機能

タスク付属同期機能は,タスクとタスクの間,または非タスクコンテキストの 処理とタスクの間で同期を取るために,タスク単独で持っている機能である.

タスク付属同期機能に関連して,各タスクが持つ情報は次の通り.

  • ・起床要求キューイング数

タスクの起床要求キューイング数は,処理されていないタスクの起床要求の数 であり,タスクの起動時に 0に初期化される.

タスク付属同期機能に関連するカーネル構成マクロは次の通り.

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

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, TMAX_WUPCNT は 1に固定されている.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, TMAX_WUPCNT は 1に固定されている.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, TMAX_WUPCNT は 1に固定されている.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスク付属同期機能をサポートしない.

【μ 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_NOSPT 未サポート機能(制約タスクからの呼出し)
E_PAR パラメータエラー( tmout が不正: tslp_tsk の場合)
E_TMOUT ポーリング失敗またはタイムアウト( slp_tsk を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除

【機能】

自タスクを起床待ちさせる.具体的な振舞いは以下の通り.

自タスクの起床要求キューイング数が 0でない場合には,起床要求キューイング 数から 1が減ぜられる.起床要求キューイング数が 0の場合には,自タスクは起 床待ち状態となる.

【補足説明】

自タスクの起床要求キューイング数が 0でない場合には,自タスクは実行できる 状態を維持し,自タスクの優先順位は変化しない.


wup_tsk タスクの起床〔 T〕
iwup_tsk タスクの起床〔 I〕

【 C言語 API 】

ER ercd = wup_tsk(ID tskid)

ER ercd = iwup_tsk(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: wup_tsk の場合,タスクコンテキストからの呼出し:iwup_tsk の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 1が許可されていない: wup_tsk の場合)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態 )
E_QOVR キューイングオーバフロー(起床要求キューイング数がTMAX_WUPCNT に一致)

【機能】

tskid で指定したタスク(対象タスク)を起床する.具体的な振舞いは以下の通 り.

対象タスクが起床待ち状態である場合には,対象タスクが待ち解除され る.待 ち解除されたタスクには,待ち状態となったサービスコールから E_OK が返る.

対象タスクが起床待ち状態でなく,休止状態でもない場合には,対象タスクの 起床要求キューイング数に 1が加えられる.起床要求キューイング数に 1を加え ると TMAX_WUPCNT を超える場合には, E_QOVR エラーとなる.

対象タスクが休止状態である場合には, E_OBJ エラーとなる.

wup_tsk において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.


can_wup タスク起床要求のキャンセル〔 T〕

【 C言語 API 】

ER_UINT wupcnt = can_wup(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

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

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 1が許可されていない)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態)

【機能】

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)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: rel_wai の場合,タスクコンテキストからの呼出し:irel_wai の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない: rel_wai の場合)
E_OBJ オブジェクト状態エラー(対象タスクが待ち状態でない)

【機能】

tskid で指定したタスク(対象タスク)を,強制的に待ち解除する.具体的な振 舞いは以下の通り.

対象タスクが待ち状態である場合には,対象タスクが待ち解除される.待ち解 除されたタスクには,待ち状態となったサービスコールから E_RLWAI が返る.

対象タスクが待ち状態でない場合には, E_OBJ エラーとなる.


sus_tsk 強制待ち状態への遷移〔 T〕

【 C言語 API 】

ER ercd = sus_tsk(ID tskid)

【パラメー タ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,対象タスクが自タスクでディスパッチ保留状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オ ブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態)
E_QOVR キューイングオーバフロー(対象タスクが強制待ち状態)

【機能】

tskid で指定したタスク(対象タスク)を強制待ちにする.具体的な振舞いは以 下の通り.

対象タスクが実行できる状態である場合には,対象タスクは強制待ち状態とな る.また,待ち状態(二重待ち状態を除く)である場合には,二重待ち状態と なる.

対象タスクが強制待ち状態または二重待ち状態である場合は E_QOVR エラー,休 止状態で ある場合には E_OBJ エラーとなる.

マルチプロセッサ対応カーネルでは,対象タスクが自タスクの場合にも, E_QOVR エラーとなる場合がある.この状況は,自タスクに対して sus_tsk を発行 するのと同じタイミングで,他のプロセッサで実行されているタスクから同じ タスクに対して sus_tsk が発行された場合に発生する可能性がある.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.

ディスパッチ保留状態で,対象タスクを自タスクとして sus_tsk を呼び出すと, E_CTX エラーとなる.


rsm_tsk 強制待ち状態からの再開〔 T〕

【 C言語 API 】

ER ercd = rsm_tsk(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない)
E_OBJ オブジェクト状態エラー(対象タスクが強制待ち状態でない)

【機能】

tskid で指定したタスク(対象タスク)を,強制待ちか ら再開する.具体的な振 舞いは以下の通り.

対象タスクが強制待ち状態である場合には,対象タスクは強制待ちから再開さ れる.強制待ち状態でない場合には, E_OBJ エラーとなる.


dis_wai 待ち禁止状態への遷移〔 TP 〕
idis_wai 待ち禁止状態への遷移〔 IP 〕

【 C言語 API 】

ER ercd = dis_wai(ID tskid)

ER ercd = idis_wai(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: dis_wai の場合,タスクコンテキストからの呼出し:idis_wai の場合, CPU ロック状態から の呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない: dis_wai の場合)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態,対象タスクがタスク例外処理マスク状態でない)
E_QOVR キューイングオーバフロー(対象タスクが待ち禁止状態)

【機能】

tskid で指定したタスク(対象タスク)を待ち禁止状態にする.具体的な振舞い は以下の通り.

対象タスクがタスク例外処理マスク状態であり,待ち禁止状態でない場合には, 対象タスクは待ち禁止状態になる.

対象タスクが休止状態である場合には, E_OBJ エラーとなる.また,対象タスク がタスク例外処理マスク状態でない場合には E_OBJ エラー,待ち禁止状態の場合 には E_QOVR エラーとなる.

dis_wai において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, dis_wai をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, dis_wai をサポートしない .

【補足説明】

dis_wai は,対象タスクの待ち解除は行わない.対象タスクを待ち禁止状態にす ることに加えて待ち解除したい場合には, dis_wai を呼び出した後に, rel_wai を呼び出せばよい.

【未決定事項】

マルチプロセッサ対応カーネルでは,対象タスクを,自タスクと同じプロセッ サに割り付けられているタスクに限るなどの制限を導入する可能性があるが, 現時点では未決定である.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様に定義されていないサービスコールである.


ena_wai 待ち禁止状態の解除〔 TP 〕
iena_wai 待ち禁止状態の解除〔 IP 〕

【 C言語 API 】

ER ercd = ena_wai(ID tskid)

ER ercd = iena_wai(ID tskid)

【パラメータ】

ID tskid 対象 タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: ena_wai の場合,タスクコンテキストからの呼出し:iena_wai の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象タスクが制約タスク)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない: ena_wai の場合)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態,対象タスクが待ち禁止状態でない)

【機能】

tskid で指定したタスク(対象タスク)の待ち禁止状態を解除する.具体的な振 舞いは以下の通り.

対象タスクが待ち禁止状態である場合には,待ち禁止状態は解除される.対象 タスクが休止状態である場合や,待ち禁止状態でない場合には, E_OBJ エラーと なる.

ena_wai において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, ena_wai をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, ena_wai をサポートしない.

【未決定事項】

マルチプロセッサ対応カーネルでは,対象タスクを,自タスクと同じプロセッ サに割り付けられているタスクに限るなどの制限を導入する 可能性があるが, 現時点では未決定である.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様に定義されていないサービスコールである.


dly_tsk 自タスクの遅延〔 T〕

【 C言語 API 】

ER ercd = dly_tsk(RELTIM dlytim)

【パラメータ】

RELTIM dlytim 遅延時間

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコー ド】

E_CTX コンテキストエラー(ディスパッチ保留状態からの呼出し)
E_NOSPT 未サポート機能(制約タスクからの呼出し)
E_PAR パラメータエラー( dlytim が不正)
E_RLWAI 待ち禁止状態または待ち状態の強制解除

【機能】

dlytim で指定した時間,自タスクを遅延させる.具体的な振舞いは以下の通り.

自タスクは, dlytim で指定した時間が経過するまでの間,時間経過待ち状態と なる. dly_tsk を呼び出してから dlytim で指定した相対時間後に,自タスクは待 ち解除され, dly_tsk から E_OK が返る.

dlytim は, TMAX_RE LTIM 以下でなければならない.


4.3 タスク例外処理機能

タスク例外処理ルーチンは,カーネルが実行を制御する処理単位で,タスクと 同一のコンテキスト内で実行される.タスク例外処理ルーチンは,各タスクに 1 つのみ登録できるため,タスク ID によって識別する.

タスク例外処理機能に関連して,各タスクが持つ情報は次の通り.

  • ・タスク例外処理ルーチン属性
  • ・タスク例外処理禁止フラグ
  • ・保留例外要因
  • ・タスク例外処理ルーチンの先頭番地

タスク例外処理ルーチン属性に指定できる属性はない.そのため,タスク例外 処理ルーチン属性には, TA_NULL を指定しなければならない.

タスクは,タスク例外処理ルーチンの実行を保留するためのタスク例外処理禁 止フラグを持つ.タスク例外処理禁止フラグがセットされた状態をタスク例外 処理禁止状態,クリアされた状態をタスク例外処理許可状態と呼ぶ.タスク例 外処理禁止フラグは,タスクの起動時に,セットした状態に初期化される.

タスクの保留例外要因は,タスクに対して要求された例外要因を蓄積するため のビットマップであり,タスクの起動時に 0に初期化される.

タスク例外処理ルーチンは,「タスク例外処理許可状態である」「保留例外要 因が 0でない」「タスクが実行状態である」「タスクコンテキストが実行されて いる」「割込み優先度マスク全解除状態である」「 CPU ロック状態でない」の 6 つの条件が揃った場 合に実行が開始される.保護機能対応カーネルにおいては, さらに,「タスク例外処理マスク状態でない」という条件が追加される.タス ク例外処理マスク状態については,「 2.6.5 タスク例外処理マスク状態と待ち 禁止状態」の節を参照すること.

タスク例外処理ルーチンの実行が開始される時,タスク例外処理禁止フラグは セットされ,保留例外要因は 0にクリアされる.また,タスク例外処理ルーチン からのリターン時には,タスク例外処理禁止フラグはクリアされる.

保護機能対応カーネルでは,ユーザタスクのタスク例外処理ルーチンの実行開 始時に,リターン先の番地やシステム状態等が,ユーザスタック上に保存され る.ここで,ユーザスタック領域に十分な空きがない場合や,ユーザスタック ポインタがユーザスタック領域以外を指している場合,カーネルは,エミュレー トされた CPU 例 外を発生させる.これを,タスク例外実行開始時スタック不正例 外と呼ぶ.

逆に,タスク例外処理ルーチンからのリターン時には,リターン先の番地やシ ステム状態等が,ユーザスタック上から取り出される.ここで,ユーザスタッ ク領域に積まれている情報が足りない場合や,ユーザスタックポインタがユー ザスタック領域以外を指している場合,カーネルは,エミュレートされた CPU 例 外を発 生させる.これを,タスク例外リターン時スタック不正例外と呼ぶ.

タスク例外実行開始時スタック不正例外またはタスク例外リターン時スタック 不正例外を起こしたタスクの実行を継続した場合の動作は保証されないため, アプリケーションは,これらの CPU 例外を処理する CPU 例外ハンドラで, 「 2.8.1 CPU 例外処理の流れ」の節の (b) または (d) の方法でリカバリ処理を行う 必要がある.

保護機能対応カーネルにおいて,タスク例外処理ルーチンは,タスクと同じ保 護ドメインに属する.

タスク例外処理機能に用いるデータ型は次の通り.

TEXPTN タスク例外要因のビットパターン(符号無し整数, uint_t に定義)

C 言語によるタスク例外処理ルーチンの記述形式は次の通り.

void task_exception_routine(TEXPTN texptn, intptr_t exinf)  
{  
     タスク例外処理ルーチン本体  
}

texptn にはタスク例外処理ルーチン起動時の保留例外要因が, exinf にはタスク の拡張情報が,それぞれ渡される.

タスク例外処理機能に関連するカーネル構成マクロは次の通り.

TBIT_TEXPTN タスク例外要因のビット数( TEXPTN の有効ビット数)

【補足説明】

保護機能対応でないカーネルでは,タスク例外処理ルーチンの実行開始条件の 内,「 CPU ロック状態でない」は省いても 同じ結果になる.これは, CPU ロック 状態で他の条件が揃うことはないためである.一方,保護機能対応カーネルで は, CPU ロック状態で拡張サービスコールからリターンした場合(より厳密には, タスク例外処理マスク状態が解除された場合)に, CPU ロック状態で他の条件が 揃うことになる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,タスク例外要因のビット数( TBIT_TEXPTN )は 16 以上である.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,タスク例外要因のビット数( TBIT_TEXPTN )は 16 以上である.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,タスク例外要因のビット数 ( TBIT_TEXPTN )は 16 以上である.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,タスク例外処理機能をサポートしない.

【μ ITRON4.0 仕様との関係】

割込み優先度マスク全解除状態でない場合には,タスク例外処理ルーチンの実 行が開始されないという仕様に変更した.

【μ ITRON4.0/PX 仕様との関係】

ユーザタスクのタスク例外処理ルーチンの実行開始時とリターン時にユーザス タックが不正となる問題に関して,μ ITRON4.0/PX 仕様では考慮されていない.

【仕様変更の経緯】

この仕様の Release 1.2 以前では,タスク例外処理ルーチンの実行開始条件に 「割込み優先度マスク全解除状態である」の条件がなかったが, Release1.3 以 降で追加した.これは,マルチプロセッサ対応カーネルにおいて,他プロセッ サで実行中のタスクに対してタスク例外処理を要求した場合に,割込み優先度 マスクが全解除でないと,タスク例外処理ルーチンをただちに実行開始するこ とができないためである.なお, ASP カーネル Release 1.6 以前と, FMP カーネ ル Release 1.1.1 以前のバージョンは,古い仕様に従って実装されている.


DEF_TEX タスク例外処理ルーチンの定義〔 S〕
def_tex タスク例外処理ルーチンの定義〔 TD 〕

【静的 API 】

DEF_TEX(ID t skid, { ATR texatr, TEXRTN texrtn })

【 C言語 API 】

ER ercd = def_tex(ID tskid, const T_DTEX *pk_dtex)

【パラメータ】

ID tskid 対象タスクの ID 番号
T_DTEX * pk_dtex タスク例外処理ル ーチンの定義情報を入れたパケットへのポインタ(静的 API を除く)

*タスク例外処理ルーチンの定義情報(パケットの内容)

ATR texatr タスク例外処理ルーチン属性
TEXRTN texrtn タスク例外処理ルーチンの先頭番地

【リターンパラ メータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_RSATR 予約属性( texatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象タスクに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_dtex が指すメモリ領域への読出しアクセスが許可されていない)
E_PAR パラメータエラー( texrtn が不正)
E_OBJ オブジェクト状態エラー(タスク例外処理ルーチンを定義済みのタスクに対する定義,タスク例外処理ルーチ ンを未定義のタスクに対する解除,対象タスクは静的 API で生成された: def_tex の場合)

【機能】

tskid で指定したタスク(対象タスク)に対して,各パラメータで指定したタス ク例外処理ルーチン定義情報に従って,タスク例外処理ルーチンを定義する.

ただし, def_tex において pk_dtex を NULL にした場合には,対象タスクに対する タスク例外処理ルーチンの定義を解除する.また,対象タスクのタスク例外処 理禁止フラグをセットし,保留例外要因を 0に初期化する.

静的 API においては, tskid はオブジェクト識別名, texatr は整数定数式パラメー タ, texrtn は一般定数式パラメータである.

静的 API によって生成したタスクに対しては,タスク例外処理ルーチンの登録は DEF_TEX によって行わねばならず, def_tex によってタスク例外処理ルーチンを 登録/登録解除することはできない. def_tex において,対象タスクが静的 API で生成したタスクである場合には, E_OBJ エラーとなる.

タスク例外処理ルーチンを定義する場合( DEF_TEX の場合および def_tex におい て pk_dtex を NULL 以外にした場合)で,対象タスクに対してすでにタスク例外処 理ルーチンが定義されている場合には, E_OBJ エラーとなる.

保護機能対応カーネルにおいて, DEF_TEX は,対象タスクが属する保護ドメイン の囲みの中に記述しなければならない.そうでない場合には, E_RSATR エラーと なる.また, def_tex でタスク例外処理ルーチンを定義する場合には,タスク例 外処理ルーチンの属する保護ドメインを設定する必要はなく,タスク例外処理 ルーチン属性に TA_DOM(domid) を指定した場合には E_RSATR エラーとなる.ただ し, TA_DOM(TDOM_SELF) を指定した場合には,指定が無視され, E_RSATR エラー は検出されない.

タスク例外処理ルーチンの定義を解除する場合( def_tex において pk_dtex を NULL にし た場合)で,対象タスクに対してタスク例外処理ルーチンが定義され ていない場合には, E_OBJ エラーとなる.

def_tex において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, DEF_TEX のみをサポートする.ただし,動的生成機能拡張パッ ケージでは, def_tex もサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, DEF_TEX のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, 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)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: ras_tex の場合,タスクコンテキストからの呼出し:iras_tex の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未 登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない: ras_tex の場合)
E_PAR パラメータエラー( rasptn が不正)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態,対象タスクに対してタスク例外処理ルーチンが定義されていない)

【機能】

tskid で指定したタスク(対象タスク)に対して, rasptn で指定したタスク例外 要因のタスク例外処理を要求する.対象タスクの保留例外要因が,それまでの 値と rasptn で指定した値のビット毎論理和( C言語の "|" )に更新される.

対象タスクが休止状態である場合と,対象タスクに対してタスク例外処理ルー チンが定義されていない場合には, E_OBJ エラーとなる.

ras_tex において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

rasptn が 0の場合には, E_PAR エラーとなる.


dis_tex タスク例外処理の禁止〔 T〕

【 C言語 API 】

ER ercd = dis_tex()

【パラメータ】

なし

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_OBJ オブジェクト状態エラー(自タスクに対してタスク例外処理ルーチンが定義されていない)

【機能】

自タスクのタスク例外処理禁止フラグをセットする.すなわち,自タスクをタ スク例外処理禁止状態に遷移させる.


ena_tex タスク 例外処理の許可〔 T〕

【 C言語 API 】

ER ercd = ena_tex()

【パラメータ】

なし

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_OBJ オブジェクト状態エラー(自タスクに対してタスク例外処理ルーチンが定義されていない)

【機能】

自タ スクのタスク例外処理禁止フラグをクリアする.すなわち,自タスクをタ スク例外処理許可状態に遷移させる.

【補足説明】

タスク例外処理ルーチン中で ena_tex を呼び出すことにより,タスク例外処理ルー チンの多重起動を行うことができる.ただし,多重起動の最大段数を制限する のは,アプリケーションの責任である.


sns_tex タスク例外処理禁止状態の参照〔 TI 〕

【 C言語 API 】

bool_t state = sns_tex()

【パラメータ】

なし

【リターンパラメータ】

b ool_t state タスク例外処理禁止状態

【機能】

実行状態のタスクのタスク例外処理禁止フラグを参照する.具体的な振舞いは 以下の通り.

実行状態のタスクが,タスク例外処理禁止状態の場合に true ,タスク例外処理 許可状態の場合に false が返る. sns_tex を非タスクコンテキストから呼び出し た場合で,実行状態のタスクがない場合には, true が返る.

マルチプロセッサ対応カーネルにおいては,サービスコールを呼び出した処理 単位を実行しているプロセッサにおいて実行状態のタスクのタスク例外処理禁 止フラグを参照する.

【補足説明】

sns_tex をタスクコンテキストから呼び出した場合,実行状態のタスクは自タス クに一致する.


ref_tex タスク例外処理の状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_tex(ID tskid, T_RTEX *pk_rtex)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*タスク例外処理の現在状態(パケットの内容)

STAT texstat タスク例外処理の状態
TEXPTN pndptn タスクの保留例外要因

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック 状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rtex が指すメモリ領域へ の書込みアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態,対象タスクに対してタスク例外処理ルーチンが定義されていない)

【機能】

tskid で指定したタスク(対象タスク)のタスク例外処理に関する現在状態を参 照する.参照した現在状態は, pk_rtex で指定したパケットに返される.

texstat には,対象タスクの現在のタスク例外処理禁止フラグを表す次のいずれ かの値が返される.

TTEX_ENA 0x01U タスク例外処理許可状態
TTEX _DIS 0x02U タスク例外処理禁止状態

pndptn には,対象タスクの現在の保留例外要因が返される.

tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスクとなる.


4.4 同期・通信機能

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,同期・通信機能をサポートしない..

【μ ITRON4.0 仕様との関係】

この仕様では,ランデブ機能はサポートしていない.今後の検討により,ラン デブ機能をサポートすることに変更する可能性もある.

4.4.1 セマフォ

セマフォは,資源の数を表す 0以上の整数値を取るカウンタ(資源数)を介して, 排他制御やイベント通知を行うための同期・通信オブジェクトである.セマフォ の資源数から 1を減ずることを資源の獲得,資源数に 1を加えることを資源の返 却と呼ぶ.セマフォは,セマフォ ID と呼ぶ ID 番号によって識別する.

各セマフォが持つ情報は次の通 り.

  • ・セマフォ属性
  • ・資源数(の現在値)
  • ・待ち行列(セマフォの資源獲得待ち状態のタスクのキュー)
  • ・初期資源数
  • ・最大資源数
  • ・アクセス許可ベクタ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス(マルチプロセッサ対応カーネルの場合)

待ち行列は,セマフォの資源が獲得できるまで待っている状態(セマフォの資 源獲得待ち状態)のタスクが,資源を獲得できる順序でつながれているキュー である.

セマフォの初期資源数は,セマフォを生成または再初期化した際の,資源数の 初期値である.また,セマフォの最大資源数は,資源数が取りうる最大値であ る.資源数が最大資源数に一致している時に資源を返却しようとすると, E_QOVR エラーとなる.

セマフォ属性には,次の属性を指定することができる.

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

TA_TPRI を指定しない場合,待ち行列は FIFO 順になる.

セマフォ機能に関連するカーネル構成マクロは次の通り.

TMAX_MAXSEM セマフォの最大資源数の最大値(= UINT_MAX )
TNUM_SEMID 登録できるセマフォの数(動的生成対応でないカーネルでは,静的 API によって登録されたセマフォの数に一致)

【μ ITRON4.0 仕様との関係】

TNUM_SEMID は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロである.


CRE_SEM セマフォの生成〔 S〕
acre_sem セマフォの生成〔 TD 〕

【静的 API 】

CRE_SEM(I D semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })

【 C言語 API 】

ER_ID semid = acre_sem(const T_CSEM *pk_csem)

【パラメータ】

ID semid 生成するセマフォの ID 番号( CRE_SEM の場合)
T_C SEM * pk_csem セマフォの生成情報を入れたパケットへのポインタ(静的 API を除く)

*セマフォの生成情報(パケットの内容)

ATR sematr セマフォ属性
uint_t isemcnt セマフォの初期資源数
uint_t maxsem セマフォの最大資源数

【リターンパラメータ】

ER_ID semid 生成されたセマフォの ID 番号(正の値)またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( sematr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( isemcnt , maxsem が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_csem が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるセマフォ ID がない)
E_OBJ オブジェクト状態エラー( semid で指定したセマフォ が登録済み: CRE_SEM の場合)

【機能】

各パラメータで指定したセマフォ生成情報に従って,セマフォを生成する.生 成されたセマフォの資源数は初期資源数に,待ち行列は空の状態に初期化され る.

静的 API においては, semid はオブジェクト識別名, isemcnt と maxsem は整数 定数 式パラメータである.

isemcnt は, 0以上で, maxsem 以下でなければならない.また, maxsem は, 1以上 で, TMAX_MAXSEM 以下でなければならない.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_SEM のみをサポートする.ただし,動的生成機能拡張パッ ケージでは, acre _sem もサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_SEM のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_SEM のみをサポートする.


AID_SEM 割付け可能なセマフォ ID の数の指定〔 SD 〕

【静的 API 】

AID_SEM(uint_t nosem)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

nosem で指定した数のセマフォ ID を,セマフォを生成するサービスコールによっ て割付け可能なセマフォ ID として確保する.

nosem は整数定数式パラメー タである.


SAC_SEM セマフォのアクセス許可ベクタの設定〔 SP 〕
sac_sem セマフォのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_SEM(ID semid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_sem(ID semid, const ACVCT *p_acvct)

【パラメータ】

ID semid 対象セマフォの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1の アクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )ま たはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( semid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_SEMの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象セマフォが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象セマフォに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象セマフォは静的 API で生成された: sac_sem の場合,対象セマフォに対してアクセス許可ベクタが設定済み: SAC_SEM の場合)

【機能】

semid で指定したセマフォ(対象セマフォ)のアクセス許可ベクタ( 4つのアク セス許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, semid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_SEM は,対象セマフォが属する保護ドメインの囲みの中に記述しなければな らない.そうでな い場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_SEM , sac_sem をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_SEM , sac_sem をサポートしない.

【 TOPPERS/HRP 2カーネルにおける規定】

HRP2 カーネルでは, SAC_SEM のみをサポートする.


del_sem セマフォの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_sem(ID semid)

【パラメータ】

ID semid 対象セマフォの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

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

【機能】

semid で指定したセマフォ(対象セマフォ)を削除する.具体的な振舞いは以下 の通り.

対象セマフォの登録が解除され,そのセマフォ ID が未使用の状態に戻される. また,対象セマフ ォの待ち行列につながれたタスクは,待ち行列の先頭のタス クから順に待ち解除される.待ち解除されたタスクには,待ち状態となったサー ビスコールから E_DLT エラーが返る.

【使用上の注意】

del_sem により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_sem をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_sem をサポートする.

【 TOPPERS/FMP カーネルに おける規定】

FMP カーネルでは, del_sem をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, del_sem をサポートしない.


sig_sem セマフ ォの資源の返却〔 T〕
isig_sem セマフォの資源の返却〔 I〕

【 C言語 API 】

ER ercd = sig_sem(ID semid)

ER ercd = isig_sem(ID semid)

【パラメータ】

ID semid 対象セマフォの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: sig_sem の場合,タスクコンテキストからの呼出し:isig_sem の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( semid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象セマフォが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象セマフォに対する通常操作 1が許可されていない: sig_sem の場合)
E_QOVR キューイングオーバフロー(資源数が最大資源数に一致)

【機能】

semid で指定したセマフォ(対象セマフォ)に資源を返却する.具体的な振舞い は以下の通り.

対象セマフォの待ち行列にタスクが存在する場合には,待ち行列の先頭のタス クが待ち解除される.この時,待ち解除されたタスクが資源を獲得したことに なるため ,対象セマフォの資源数は変化しない.待ち解除されたタスクには, 待ち状態となったサービスコールから E_OK が返る.

待ち行列にタスクが存在しない場合には,対象セマフォの資源数に 1が加えられ る.資源数に 1を加えるとそのセマフォの最大資源数を越える場合には, E_QOVR エラーとなる.


wai_sem セマフォの資源の獲得〔 T〕
pol_sem セマフォの資源の獲得(ポーリング)〔 T〕
twai_sem セマフォの資源の獲得(タイムアウト付き)〔 T〕

【 C言語 API 】

ER erc d = wai_sem(ID semid)

ER ercd = pol_sem(ID semid)

ER ercd = twai_sem(ID semid, TMO tmout)

【パラメータ】

ID semid 対象セマフォの ID 番号
TMO tmout タイムアウト時間( twai_sem の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: pol_sem を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: pol_sem を除く)
E_ID 不正 ID 番号( semid が不正)
E_PAR パラメータエラー( tmout が不正: twai_sem の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象セマフォが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象セマフォに対する通常操作 2が許可されていない)
E_TMOUT ポーリング失敗またはタイムアウト( wai_sem を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( pol_sem を除く)
E_DLT 待ちオブジェクトの削除または再初期化( pol_sem を除く)

【機能】

semid で指定したセマフォ(対象セマフォ)から資源を獲得する.具体的な振舞 いは以下の通り.

対象セマフォの資 源数が 1以上の場合には,資源数から 1が減ぜられる.資源数 が 0の場合には,自タスクはセマフォの資源獲得待ち状態となり,対象セマフォ の待ち行列につながれる.


ini_sem セマフォの再初期化〔 T〕

【 C言語 API 】

ER ercd = ini_sem(ID semid)

【パラメータ】

ID semid 対象セマフォの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( semid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象セマフォが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象セマフォに対する管理操作が許可されていない)

【機能】

semid で指定したセマフォ(対象セマフォ)を再初期化する.具体的な振舞いは 以下の通り.

対象セマフォの資源数は,初期資源数に初期化される.また,対象セマフォの 待ち行列につながれたタスクは,待ち行列の先頭のタスクから順に待ち解除さ れる.待ち解除されたタスクには,待ち状態となったサービスコールから E_DLT エラーが返る.

【使用上の注意】

ini_sem により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止 時間が長くなるため,注意が必要である.

セマフォを再初期化した場合に,アプリケーションとの整合性を保つのは,ア プリケーションの責任である.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


ref_sem セマフォの状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_sem(ID semid, T_RSEM *pk_rsem)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*セマフォの現在状態(パケットの内容)

ID wtskid セマフォの待ち行列の先頭のタスクの ID 番号
uint_t semcnt セマフォの資源数

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( semid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象セマフォが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象セマフォに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rsem が指すメモリ領域への書込みアクセスが許可されて いない)

【機能】

semid で指定したセマフォ(対象セマフォ)の現在状態を参照する.参照した現 在状態は, pk_rsem で指定したパケットに返される.

対象セマフォの待ち行列にタスクが存在しない場合, wtskid には TSK_NONE (= 0 )が返る.

【使用上の注意】

ref_sem はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_sem を呼び出し,対象セマフォの現在状態を参照した直後に 割込みが発生した場合, ref_sem から戻ってきた時には対象セマフォの状態が変 化している可能性があるためである.


4.4.2 イベントフラグ

イベントフラグは,イベントの発生の有無を表すビットの集合(ビットパター ン)を介して,イベント通知を行うための同期・通信オブジェクトである.イ ベントが発生している状態を 1,発生していない状態を 0とし,ビットパターン により複数のイベントの発生の有無を表す.イベントフラグは,イベントフラ グ ID と呼ぶ ID 番号によ って識別する.

1 つまたは複数のビットをセットする 1にする(セットする)ことを,イベント フラグをセットするといい, 0にする(クリアする)ことを,イベントフラグを クリアするという.イベントフラグによりイベントを通知する側のタスクは, イベントフラグをセットまたはクリアすることで,イベントの発生を通知する.

イベントフラグによりイベントの通知を受ける側のタスクは,待 ちビットパター ンと待ちモードにより,どのビットがセットされるのを待つかを指定する.待 ちモードに TWF_ORW (= 0x01U )を指定した場合,待ちビットパターンに含まれ るいずれかのビットがセットされるのを待つ.待ちモードに TWF_ANDW (= 0x02U )を指定した場合,待ちビットパターンに含まれるすべてのビットがセッ トされるのを待つ.この条件を,イベントフラグの待ち解除の条件と呼ぶ.

各イベントフラグが持つ情報は次の通り.

  • ・イベントフラグ属性
  • ・ビットパターン(の現在値)
  • ・待ち行列(イベントフラグ待ち状態のタスクのキュー)
  • ・初期ビットパターン
  • ・アクセス許可ベクタ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス(マルチ プロセッサ対応カーネルの場合)

待ち行列は,イベントフラグが指定した待ち解除の条件を満たすまで待ってい る状態(イベントフラグ待ち状態)のタスクがつながれているキューである. 待ち行列につながれたタスクの待ち解除は,待ち解除の条件を満たした中で, 待ち行列の前方につながれたものから順に行われる(「 2.6.4 待ち行列と待ち 解除の順序」の節の (a) に該当).

イベントフラグの初期ビットパターンは,イベントフラグを生成または再初期 化した際の,ビットパターンの初期値である.

イベントフラグ属性には,次の属性を指定することができる.

TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
TA_WMUL 0x02U 複数のタスクが待つのを許す
TA_CLR 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 以上である.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,イベントフラグのビット数( TBIT_FLGPTN )は 16 以上である.

【μ ITRON4.0 仕様との関係】

TNUM_FLGID は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロである.


CRE_FLG イベントフラグの生成〔 S〕
acre_flg イベントフラグの生成〔 TD 〕

【静的 API 】

CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })

【 C言語 API 】

ER_ID flgid = acre_flg(const T_CFLG *pk_cflg)

【パラメータ】

ID flgid 生成するイベントフラグの ID 番号( CRE_FLG の場合)
T_CFLG * pk_cflg イベントフラグの生成情報を入れたパケットへのポインタ(静的 API を除く)

*イベントフラグの生成情報(パケットの内容)

ATR flgatr イベントフラグ属性
FLGPTN iflgptn イベントフラグの初期ビットパターン

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( flgatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cflg が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるイベントフラグ ID がない)
E_OBJ オブジェクト状態エラー( flgid で指定したイベントフラグが登録済み: CRE_FLG の場合)

【機能】

各パラメータで指定したイベントフラグ生成情報に従って,イベントフラグを 生成する.生成された イベントフラグのビットパターンは初期ビットパターン に,待ち行列は空の状態に初期化される.

静的 API においては, flgid はオブジェクト識別名, iflgptn は整数定数式パラメー タである.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_FLG のみをサポートする.ただし,動的生成機能拡張パッ ケージでは, acre_flg もサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_FLG のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_FLG のみをサポートする.


AID_FLG 割付け可能なイベントフラグ ID の数の指定〔 SD 〕

【静的 API 】

AID_FLG(uint_t noflg)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

noflg で指定した数のイベントフラグ ID を,イベントフラグを生成するサービス コールによって割付け可能なイベントフラグ ID として確保する.

noflg は整数定数式パラメータである.


SAC_FLG イベントフラグのアクセス許可ベクタの設定〔 SP 〕
sac_flg イベントフラグのアクセス許可ベクタの設定〔 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 flgid 対象イベントフラグの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可 パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコ ード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( flgid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_FLGの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象イベントフラグに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象イベントフラグは静的 APIで生成された: sac_flg の場合,対象イベントフラグに対してアクセス許可ベクタが設定済み: SAC_FLG の場合)

【機能】

flgid で指定したイベントフラグ(対象イベントフラグ)のアクセス許可ベクタ ( 4つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, flgid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_FLG は,対象イベントフラグが属する保護ドメインの囲みの中に記述しなけ ればならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_FLG , sac_flg をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_FLG , sac_flg をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_FLG のみをサポートする.


del_flg イベントフラグの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_flg(ID flgid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( flgid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象イベントフラグに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象イベントフラグは静的 APIで生成された)

【機能】

flgid で指定したイベントフラグ(対象イベントフラグ)を削除する.具体的な 振舞いは以下の通り.

対象イベントフラグの登録が解除され,そのイベントフラグ ID が未使用の状態 に戻される.また,対象イベントフラグの待ち行列につながれたタスクは,待 ち行列の先頭のタスクから順に待ち解除される.待ち解除されたタスクには, 待ち状態となったサービスコールから E_DLT エラーが返る.

【使用上の注意】

del_flg により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_f lg をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_flg をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_flg をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, 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 flgid 対象イベントフラグの ID 番号
FLGPTN setptn セットするビットパターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: set_flg の場合,タスクコンテキストからの呼出し:iset_flg の場合, CPU ロック状態から の呼出し)
E_ID 不正 ID 番号( flgid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象イベントフラグに対する通常操作 1が許可されていない: set_flg の場合)

【機能】

flgid で指定したイベントフラグ(対象イベントフラグ)の setptn で指定したビッ トをセットする.具体的な振舞いは以下の通り.

対象イベントフラグのビットパターンは,それまでの値と setptn で指定した値 のビット毎論理和( C言語の "|" )に更新される.対象イベントフラグの待ち行 列にタスクが存在する場合には,待ち解除の条件を満たしたタスクが,待ち行 列の前方につな がれたものから順に待ち解除される.待ち解除されたタスクに は,待ち状態となったサービスコールから E_OK が返る.

ただし,対象イベントフラグが TA_CLR 属性である場合には,待ち解除の条件を 満たしたタスクを 1つ待ち解除した時点で,対象イベントフラグのビットパター ンが 0にクリアされるため,他のタスクが待ち解除されることはない.

【使用上の注意】

対象イベントフラグが, TA_WMUL 属性であり, TA_CLR 属性でない場合, set_flg または iset_flg により複数のタスクが待ち解除される場合がある.この場合, サービスコールの処理時間およびカーネル内での割込み禁止時間が,待ち解除 されるタスクの数に比例して長くなる.特に,多くのタスクが待ち解除される 場合,カーネル内での割込み禁止時間が長くなるため,注意が必要である.


clr_flg イベントフラグのクリア〔 T〕

【 C言語 API 】

ER ercd = clr_flg(ID flgid, FLGPTN clrptn)

【パラメータ】

ID flgid 対象イベントフラグの ID 番号
FLGPTN clrptn クリアするビットパターン(クリアしないビットを 1,クリアするビットを 0とする)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( flgid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反( 対象イベントフラグに対する通常操作 1が許可されていない: clr_flg の場合)

【機能】

flgid で指定したイベントフラグ(対象イベントフラグ)の clrptn で指定したビッ トをクリアする.対象イベントフラグのビットパターンは,それまでの値と 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)

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 flgid 対象イベントフラグの ID 番号
FLGPTN waiptn 待ちビットパターン
MODE wfmode 待ちモード
FLGPTN * p_flgptn 待 ち解除時のビットパターンを入れるメモリ領域へのポインタ
TMO tmout タイムアウト時間( twai_flg の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
FLGPTN flgptn 待ち解除時のビットパターン

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: pol_flg を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: pol_flg を除く)
E_ID 不正 ID 番号( flgid が不正)
E_PAR パラメータエラー( waiptn , wfmode が不正, tmout が不正:twai_flg の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象イベントフラグに対する通常操作 2が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_flgptn が指すメモリ領域への書込みアクセスが許可されていない)
E_ILUSE サービスコール不正使用( TA_WMUL 属性でないイベントフラグで待ちタスクあり)
E_TMOUT ポーリング失敗またはタイムアウト( wai_flg を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( pol_flg を除く)
E_DLT 待ちオブジェクト の削除または再初期化( pol_flg を除く)

【機能】

flgid で指定したイベントフラグ(対象イベントフラグ)が, waiptn と wfmode で 指定した待ち解除の条件を満たすのを待つ.具体的な振舞いは以下の通り.

対象イベントフラグが, waiptn と wfmode で指定した待ち解除の条件を満たして いる場合には,対象イベントフラグのビットパター ンの現在値が flgptn に返さ れる.対象イベントフラグが TA_CLR 属性である場合には,対象イベントフラグ のビットパターンが 0にクリアされる.

待ち解除の条件を満たしていない場合には,自タスクはイベントフラグ待ち状 態となり,対象イベントフラグの待ち行列につながれる.


ini_flg イベントフラグの再初期化〔 T〕

【 C言語 API 】

ER ercd = ini_flg(ID flgid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( flgid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象イベントフラグに対する管理操作が許可されていない)

【機能】

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 flgid 対象イベントフラグの ID 番号
T_RFLG * pk_rflg イベントフラグの現在状態を入れるパケットへのポインタ

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*イベントフラグの現在状態(パケットの内容)

ID wtskid イベントフラグの待ち行列の先頭のタスクの ID番号
uint_t flgptn イベントフラグのビットパターン

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( flgid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象イベントフラグが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象イベントフラグに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rflg が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

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 仕様との関係】

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 dtqid 生成するデータキューの ID 番号( CRE_DTQ の場合)
T_CDTQ * pk_cdtq データキューの生成情報を入れたパケットへのポインタ(静的 API を除く)

*データキューの生成情報(パケットの内容)

A TR dtqatr データキュー属性
uint_t dtqcnt データキュー管理領域に格納できるデータ数
void * dtqmb データキュー管理領域の先頭番地

【リターンパラメータ】

ER_ID dtqid 生成されたデータキューの ID 番号(正の値)またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( dtqatr が不正または使用できない,属する保護ドメイン かクラスが不正)
E_NOSPT 未サポート機能( dtqmb がサポートされていない値)
E_PAR パラメータエラー( dtqmb が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cdt qが指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるデータキュー ID がない)
E_NOMEM メモリ不足(データキュー管理領域が確保できない)
E_OBJ オブジェクト状態エラー( dtqid で指定したデータキューが登録済み: CRE_DTQ の場合,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定したデータキュー生成情報に従って,データキューを生成 する. dtqcnt と dtqmb からデータキュー管理領域が設定され,格納されているデー タがない状態に初 期化される.また,送信待ち行列と受信待ち行列は,空の状 態に初期化される.

静的 API においては, dtqid はオブジェクト識別名, dtqcnt は整数定数式パラメー タ, dtqmb は一般定数式パラメータである.コンフィギュレータは,静的 API の メモリ不足( E_NOMEM )エラーを検出することができない.

dtqmb を NULL とした場合, dtqcnt で指定した数のデー タを格納できるデータキュー 管理領域を,コンフィギュレータまたはカーネルが確保する.

〔 dtqmb に NULL 以外を指定した場合〕

dtqmb に NULL 以外を指定した場合, dtqmb を先頭番地とするデータキュー管理領 域は,アプリケーションで確保しておく必要がある.データキュー管理領域を アプリケーションで確保するために,次のマクロを用意している.

TSZ_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータキュー管理領域のサイズ(バイト数)
TCNT_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータキュー管理領域を確保するために必要な MB_T 型の配列の要素数

これらを用いてデータキュー管理領域を確保する方法は次の通り.

MB_T < データキュー管理領域の変数名 >[TCNT_DTQMB(dtqcnt)];

この時, dtqmb には <データキュー管理領域の変数名 >を指定する.

この方法に従わず, dtqmb にターゲット定義の制約に合致しない先頭番地を指定 した時には, E_PAR エラーとなる.また,保護機能対応カーネルにおいて, dtqmb で指定したデータキュー管理領域がカーネル専用のメモリオブジェクトに 含まれない場合, E_OBJ エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_ DTQ のみをサポートする.また, dtqmb には NULL のみを指 定することができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.た だし,動的生成機能拡張パッケージでは, acre_dtq もサポートする. acre_dtq に対しては, dtqmb に NULL 以外を指定できないという制限はない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネル では, CRE_DTQ のみをサポートする.また, dtqmb には NULL のみを指 定することができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_DTQ のみをサポートする.また, dtqmb には NULL のみを 指定することができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0/PX 仕様にあわせて,データキュー生成情報の最後のパラメータを, dtq (データキュー領域の先頭番地)から, dtqmb (データキュー管理領域の先 頭番地)に改名した.また, TSZ_DTQ を TSZ_DTQMB に改名した.

TCNT_DTQMB を新設し,データキュー管理領域をアプリケーションで確 保する方 法を規定した.


AID_DTQ 割付け可能なデータキュー ID の数の指定〔 SD 〕

【静的 API 】

AID_DTQ(uint_t nodtq)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

nodtq で指定した数のデータキュー ID を,データキューを生成するサービスコー ルによって割付け可能なデータキュー ID として確保する.

nodtq は整数定数式パラメータである.


SAC_DTQ データキューのアクセス許可ベクタの設定〔 SP 〕
sac_dtq データキューのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_dtq(ID dtqid, const ACVCT *p_acvct)

【パラメータ】

ID dtqid 対象データキューの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( dtqid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_DTQの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象データキューに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象データキューは静的 API で生成された: sac_dtq の場合,対象データキューに対してアクセス許可ベクタが設定済み: SAC_DTQ の場合)

【機能】

dtqid で指定したデータキュー(対象データキュー)のアクセス許可ベクタ( 4 つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, dtqid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_DTQ は,対象データキューが属する保護ドメインの囲みの中に記述しなけれ ばならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_DTQ , sac_dtq をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_DTQ , sac_dtq をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_DTQ のみをサポートする.


del_dtq データキューの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_dtq(ID dtqid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( dtqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象データキューに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象データキューは静的 API で生成された)

【機能】

dtqid で指定したデータキュー(対象データキュー)を削除する.具体的な振舞 いは以下の通り.

対象データキューの登録が解除され,そのデータキュー ID が未使用の状態に戻 される.また,対象データキューの送信待ち行列と受信待ち行列につながれた タスクは,それぞれの待ち行列の先頭のタスクから順に待ち解除される.待ち 解除されたタスクには,待ち状態となったサービスコールから E_DLT エラーが返 る.

データキューの生成時に,データキュー管理領域がカーネルによって確保さ れ た場合は,そのメモリ領域が解放される.

【補足説明】

送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため, 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな い.

【使用上の注意】

del_dtq により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_d tq をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_dtq をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_dtq をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, 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, T MO tmout)

【パラメータ】

ID dtqid 対象データキューの ID 番号
intptr_t data 送信データ
TMO tmout タイムアウト時間( tsnd_dtq の場合)

【リターンパラメータ】

ER er cd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: ipsnd_dtq を除く,タスクコンテキストからの呼出し:ipsnd_dtq の場合, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: snd_dtq と tsnd_dtq の場合)
E_NOSPT 未サポート機能(制約タスクからの呼出し: snd_dtq とtsnd_dtq の場合)
E_ID 不正 ID 番号( dtqid が不正)
E_PAR パラメータエラー( tmo ut が不正: tsnd_dtq の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象データキューに対する通常操作 1が許可されていない: ipsnd_dtq を除く)
E_TMOUT ポーリング失敗またはタイムアウト( snd_dtq を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( snd_dtq とtsnd_dtq の場合)
E_DLT 待ちオブジェクトの削除または再初期化( snd_dtq とtsnd_dtq の場合)

【機能】

dtqid で指定したデータキュー(対象デ ータキュー)に, data で指定したデータ を送信する.具体的な振舞いは以下の通り.

対象データキューの受信待ち行列にタスクが存在する場合には,受信待ち行列 の先頭のタスクが, data で指定したデータを受信し,待ち解除される.待ち解 除されたタスクには,待ち状態となったサービスコールから E_OK が返る.

対象データキューの受信待ち行列にタスクが存在せず,データキュー管 理領域 にデータを格納するスペースがある場合には, data で指定したデータが, FIFO 順でデータキュー管理領域に格納される.

対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域 にデータを格納するスペースがない場合には,自タスクはデータキューへの送 信待ち状態となり,対象データキューの送信待ち行列につながれる.


fsnd_dtq データキューへの強制送信〔 T〕
ifsnd_dtq データキューへの強制送信〔 I〕

【 C言語 API 】

ER ercd = fsnd_dtq(ID dtqid, intptr_t data)

ER ercd = ifsnd_dtq(ID dtqid, intptr_t data)

【パラメータ】

ID dtqid 対象データキューの ID 番号
intptr_t data 送信データ

【リターンパラメータ】

ER ercd 正常終了( E_OK )また はエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: fsnd_dtq の場合,タスクコンテキストからの呼出し:ifsnd_dtq の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( dtqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象データキューに対する通常操作 1が許可されていない: fsnd_dtq の場合)
E_ILUSE サービスコール不正使用(対象データキューのデータキュー管理領域のサイズが 0)

【機能】

dtqid で指定したデータキュー(対象データキュー)に, data で指定したデータ を強制送信する.具体的な振舞いは以下の通り.

対象データキューの受信待ち行列にタスクが存在する場合には,受信待ち行列 の先頭のタスクが, data で指定したデータを受信し,待ち解除される.待ち解 除されたタスクには,待ち状態となったサービスコールから E_OK が返る.

対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域 にデータを格納するスペースがある場合には, data で指定したデータが, FIFO 順でデータキュー管理領域に格納される.

対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域 にデータを格 納するスペースがない場合には,データキュー管理領域の先頭に 格納されたデータを削除し,空いたスペースを用いて, data で指定したデータ が, FIFO 順でデータキュー管理領域に格納される.

対象データキューのデータキュー管理領域のサイズが 0の場合には, E_ILUSE エ ラーとなる.


rcv_dtq データキューからの受信〔 T〕
prcv_dtq データキューからの受信(ポーリング)〔 T〕
trcv_dtq データキューからの受信(タイムアウト付き)〔 T〕

【 C言語 API 】

ER ercd = rcv_dtq(ID dtqid, intptr_t *p_data)

ER ercd = prcv_dtq(ID dtqid, intptr_t *p_data)

ER ercd = trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)

【パラメータ】

ID dtqid 対象データキューの ID 番号
intptr_t * p_data 受信データを入れるメモリ領域へのポインタ
TMO tmout タイムアウト時間( trcv_dtq の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
intptr_t data 受信データ

【エラーコード】

E_CTX コ ンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: prcv_dtq を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: prcv_dtq を除く)
E_ID 不正 ID 番号( dtqid が不正)
E_PAR パラメータエラー( tmout が不正: trcv_dtq の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象データキューに対する通常操作 2が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_data が指すメモリ領域への書込みアクセスが許可されていない)
E_TMOUT ポーリング失敗またはタイムアウト( rcv_dtq を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( prcv_dtq を除く)
E_DLT 待ちオブジェクトの削除または再初期化( prcv_dtq を除く)

【機能】

dtqid で指定したデータキュー(対象データキュー)からデータを受信する.受 信したデータは, p_data で指定したメモリ領域に返される.具体的な振舞いは 以下の通り.

対象データキューのデータキュー管理領域にデータが格納されている場合には, データキュー管理領域の先頭に格納されたデータが取り出され, p_data で指定 したメモリ領域に返される.また,送信待ち行列にタスクが存在する場合には, 送信待ち行列の先頭のタスクの送信データが, FIFO 順でデータキュー管理領域 に格納され,そのタスクは待ち解除される.待ち解除されたタスクには,待ち 状態となったサービスコールから E_OK が返る.

対象データキューのデー タキュー管理領域にデータが格納されておらず,送信 待ち行列にタスクが存在する場合には,送信待ち行列の先頭のタスクの送信デー タが, p_data で指定したメモリ領域に返される.送信待ち行列の先頭のタスク は,待ち解除される.待ち解除されたタスクには,待ち状態となったサービス コールから E_OK が返る.

対象データキューのデータキュー管理領域にデータが格納されておらず,送信 待ち行列にタスクが存在しない場合には,自タスクはデータキューからの受信 待ち状態となり,対象データキューの受信待ち行列につながれる.


ini_dtq データキューの再初期化〔 T〕

【 C言語 API 】

ER ercd = ini_d tq(ID dtqid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( dtqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象データキューに対する管理操作が許可されていない)

【機能】

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 dtqid 対象データキューの ID 番号
T_RDTQ * pk_rdtq データキューの現在状態を入れるパケットへのポインタ

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*データキューの現在状態(パケットの内容)

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

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( dtqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象データキューが未登録)
E_OACV 〔 P〕 オブジェクト アクセス違反(対象データキューに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( 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とすることができる.

保護機能対応カーネルにおいて,優先度データキュー管理領域は,カーネルの 用いるオブジェクト管理領域として扱われる.

送信待ち行列は,優先度データキューに対してデータが送信できるまで待って いる状態(優先度データキューへの送信待ち状態)のタスクが,データを送信 できる順序でつながれているキューである.また,受信待ち行列は,優先度デー タキューからデータが受信できるまで待っている状態(優先度データキューか らの受信待ち状態)のタスクが,データを受信できる順序でつながれている キューである.

優先度データキュー属性には,次の属性を指定することができる.

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

TA_TPRI を指定しない場合,送信待ち行列は FIFO 順になる.受信待ち行列は, FIFO 順に固定されている.

優先度データキュー機能に関連するカーネル構成マクロは次の通り.

TMIN_DPRI データ優先度の最小値(= 1)
TMAX_DPRI データ優先度の最大値
TNUM_PDQID 登録できる優先度データキューの数(動的生成対応でないカーネルでは,静的 API によって登録された優先度データキューの数に一致)

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,データ優先度の最大値( TMAX_D PRI )は 16 に固定されている. ただし,タスク優先度拡張パッケージでは, TMAX_DPRI を 256 に拡張する.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,データ優先度の最大値( TMAX_DPRI )は 16 に固定されている.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,データ優先度の最大値( TMAX_DPRI )は 16 に固定されている.

【使用上の注意】

データの優先度が使われるのは,データが優先度データキュー管理領域に格納 される場合のみであり,データを送信するタスクが送信待ち行列につながれて いる間には使われない.そのため,送信待ち行列につながれているタスクが, 優先度データキュー管理領 域に格納されているデータよりも高い優先度のデー タを送信しようとしている場合でも,最初に送信されるのは,優先度データ キュー管理領域に格納されているデータである.また, TA_TPRI 属性の優先度デー タキューにおいても,送信待ち行列はタスクの優先度順となり,タスクが送信 しようとしているデータの優先度順となるわけではない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に規定されていない機能である.


CRE_PDQ 優先度データキューの生成〔 S〕
acre_pdq 優先度データキューの生成〔 TD 〕

【静的 API 】

CRE_PDQ(ID pdqid, { A TR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })

【 C言語 API 】

ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)

【パラメータ】

ID pdqid 生成する優先度データキューの ID 番号( CRE_PDQの場合)
T_CPDQ * pk_cpdq 優先度データキューの生成情報を入れたパケットへのポインタ(静的 API を除く)

*優先度データキューの生成情報(パケットの内容)

ATR pdqatr 優先度データキュー属性
uint_t pdqcnt 優先度データキュー管理領域に格納できるデータ数
PRI maxdpri 優先度データキューに送信できるデータ優先度の最大値
void * pdqmb 優先度データキュー管理領域の 先頭番地

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( pdqatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_NOSPT 未サポート機能( pdqmb がサポートされていない値)
E_PAR パラメータエラー( pdqmb , maxdpri が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cpdq が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられる優先度データキュー ID がない)
E_NOMEM メモリ不足(優先度データキュー管理領域が確保できない)
E_OBJ オブジェクト状態エラー( pdqid で指定した優先度データキューが登録済み: CRE_PDQ の場合,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定した優先度データキュー生成情報に従って,優先度データ キューを生成する. pdqcnt と pdqmb から優先度データキュー管理領域が設定され, 格納されているデータがない状態に初期化される.また,送信待ち行列と受信 待ち行列は,空の状態に初期化される.

静的 API においては, pdqid はオブジェクト識別名, pdqcnt と maxdpri は整数定数 式パラメータ, pdqmb は一般定数式パラメータである.コンフィギュレータは, 静的 API のメモリ不足( E_NOMEM )エラーを検出することができない.

pdqmb を NULL とした場合, pdqcnt で指定した数のデータを格納できる優先度デー タキュー管理領域を,コンフィギュレータまたはカーネルが確保する.

maxdpri は, TMIN_DPRI 以上, TMAX_DPRI 以 下でなければならない.

〔 pdqmb に NULL 以外を指定した場合〕

pdqmb に NULL 以外を指定した場合, pdqmb を先頭番地とする優先度データキュー 管理領域は,アプリケーションで確保しておく必要がある.優先度データキュー 管理領域をアプリケーションで確保するために,次のマクロを用意している.

TSZ_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度データキュー管理領域のサイズ(バイト数)
TCNT_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度データキュー管理領域を確保するために必要な MB_T 型の配列の要素数

これらを用いて優先度データキュー管理領域を確保する方法は次の通り.

MB_T < 優先度データキュー管理領域の変数名 >[TCNT_PDQMB(pdqcnt)];

この時, pdqmb には <優先度データキュー管理領域の変数名 >を指定する.

この方法に従わず, pdqmb にターゲット定義の制約に合致しな い先頭番地を指定 した時には, E_PAR エラーとなる.また,保護機能対応カーネルにおいて, pdqmb で指定した優先度データキュー管理領域がカーネル専用のメモリオブジェ クトに含まれない場合, E_OBJ エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_PDQ のみをサポートする.また, pdqmb には NULL のみを指 定することができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.た だし,動的生成機能拡張パッケージでは, acre_pdq もサポートする. acre_pdq に対しては, pdqmb に NULL 以外を指定できないという制限はない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_PDQ のみをサポートする.また, pdqmb には NULL のみを 渡 すことができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_PDQ のみをサポートする.また, pdqmb には NULL のみを 渡すことができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.


AID_PDQ 割付け可能な優先度データキュー ID の数の指定〔 SD 〕

【静的 API 】

AID_PDQ(uint_t nopdq)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

nopdq で指定した数の優先度データキュー ID を,優先度データキューを生成する サービスコールによって割付け可能な優先度データキュー ID として確保する.

nopdq は整数定数式パラメータである.


SAC_PDQ 優先度データキューのアクセス許可ベクタの設定〔 SP 〕
sac_pdq 優先度データキューのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SA C_PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_pdq(ID pdqid, const ACVCT *p_acvct)

【パラメータ】

ID pdqid 対象優先度データキューの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス 許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラ ーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( pdqid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_PDQの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象優先度データキューが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象優先度データキューに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象優先度データキューは静的API で生成された: sac_pdq の場合,対象優先度データキューに対してアクセス許可ベクタが設定済み: SAC_PDQ の場合)

【機能】

pdqid で指定した優先度データキュー(対象優先度データキュー)のアクセス許 可ベクタ( 4 つのアクセス許可パターンの組)を,各パラメータで指定した値 に設定する.

静的 API においては, pdqid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_PDQ は,対象優先度データキューが属する保護ドメインの囲みの 中に記述し なければならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_PDQ , sac_pdq をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_PDQ , sac_pdq をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_PDQ のみをサポートする.


del_pdq 優先度データキューの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_pdq(ID pdqid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( pdqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象優先度データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象優先度データキ ューに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象優先度データキューは静的API で生成された)

【機能】

pdqid で指定した優先度データキュー(対象優先度データキュー)を削除する. 具体的な振舞いは以下 の通り.

対象優先度データキューの登録が解除され,その優先度データキュー ID が未使 用の状態に戻される.また,対象優先度データキューの送信待ち行列と受信待 ち行列につながれたタスクは,それぞれの待ち行列の先頭のタスクから順に待 ち解除される.待ち解除されたタスクには,待ち状態となったサービスコール から E_DLT エラーが返る.

優先度データキューの生成時に,優先度データキュー管理領域がカーネルによっ て確保された場合は,そのメモリ領域が解放される.

【補足説明】

送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため, 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな い.

【使用上の注意】

del_pdq により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_pdq をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_pdq をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_pdq をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, del_pdq をサポートしない.


snd_pdq 優先度データキューへの送信〔 T〕
psnd_pdq 優先度データキューへの送信(ポーリング)〔 T〕
ipsnd_pdq 優先度データキューへの送信(ポーリング)〔 I〕
tsnd_pdq 優先度データキューへの送信(タイムアウト付き)〔 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 pdqid 対象優先度データキューの ID 番号
intptr_t data 送信データ
PR I datapri 送信データの優先度
TMO tmout タイムアウト時間( tsnd_pdq の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タス クコンテキストからの呼出し: ipsnd_pdq を除く,タスクコンテキストからの呼出し:ipsnd_pdq の場合, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: snd_pdq と tsnd_pdq の場合)
E_NOSPT 未サポート機能(制約タスクからの呼出し: snd_ pdq とtsnd_pdq の場合)
E_ID 不正 ID 番号( pdqid が不正)
E_PAR パラメータエラー( datapri が不正, tmout が不正:tsnd_pdq のみ)
E_NOEXS 〔 D〕 オブジェクト未登録(対象優先度データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象優先度データキューに対する通常操作 1が許可されていない: ipsnd_pdq を除く)
E_TMOUT ポーリング失敗またはタイムアウト( snd_pdq を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( snd_pdq とtsnd_pdq の場合)
E_DLT 待ちオブジェクトの削除または再初期化( snd_pdq とtsnd_pdq の場合)

【機能】

pdqid で指定した優先度データキュー(対象優先度データキュー)に, data で指 定したデータを, datapri で指定した優先度で送信する.具体的な振舞いは 以下 の通り.

対象優先度データキューの受信待ち行列にタスクが存在する場合には,受信待 ち行列の先頭のタスクが, data で指定したデータを受信し,待ち解除される. 待ち解除されたタスクには,待ち状態となったサービスコールから E_OK が返る.

対象優先度データキューの受信待ち行列にタスクが存在せず,優先度データ キュー管理領域にデータを格納するスペ ースがある場合には, data で指定した データが, datapri で指定したデータの優先度順で優先度データキュー管理領域 に格納される.

対象優先度データキューの受信待ち行列にタスクが存在せず,優先度データ キュー管理領域にデータを格納するスペースがない場合には,自タスクは優先 度データキューへの送信待ち状態となり,対象優先度データキューの送信待ち 行列につながれる.

datapri は, TMIN_DPRI 以上で,対象データキューに送信できるデータ優先度の 最大値以下でなければならない.


rcv_pdq 優先度データキューからの受信〔 T〕
prcv_pdq 優先度データキューからの受信(ポーリング)〔 T〕
trcv_pdq 優先度データキューからの受信(タイムアウト付き)〔 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 erc d = trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)

【パラメータ】

ID pdqid 対象優先度データキューの ID 番号
intptr_t * p_data 受信データを入れるメモリ領域へのポインタ
PRI * p_datapri 受信データの優 先度を入れるメモリ領域へのポインタ
TMO tmout タイムアウト時間( trcv_pdq の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
intptr_t data 受信データ
PRI datapri 受信データの優先度

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: prcv_pdq を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: prcv_pdq を除く)
E_ID 不正 ID 番号( pdqid が不正)
E_PAR パラメータエラー( tmout が不正: trcv_pdq の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象優先度データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象優先度データキューに対する通常操作 2が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_data または p_datapri が指すメモリ領域への書込みアクセスが許可されていない)
E_TMOUT ポーリング失敗 またはタイムアウト( rcv_pdq を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( prcv_pdq を除く)
E_DLT 待ちオブジェクトの削除または再初期化( prcv_pdq を除く)

【機能】

pdqid で指定した優先度データキュー(対象優先度データキュー)からデータを 受信する.受信したデータは p_data で指定したメモリ領域に,その優先度は p_datapri で指定したメモリ領域に返される.具体的な振舞いは以下の通り.

対象優先度データキューの優先度データキュー管理領域にデータが格納されて いる場合には,優先度データキュー管理領域の先頭に格納されたデータが取り 出され, p_data で指定したメモリ領域に返される.また,その優先度が p_datapri で指定したメモリ領域に返され る.さらに,送信待ち行列にタスクが 存在する場合には,送信待ち行列の先頭のタスクの送信データが,データの優 先度順で優先度データキュー管理領域に格納され,そのタスクは待ち解除され る.待ち解除されたタスクには,待ち状態となったサービスコールから E_OK が 返る.

対象優先度データキューの優先度データキュー管理領域にデータが格納されて おらず,送信待ち行列にタスクが存在する場合には,送信待ち行列の先頭のタ スクの送信データが, p_data で指定したメモリ領域に返される.また,その優 先度が p_datapri で指定したメモリ領域に返される.送信待ち行列の先頭のタス クは,待ち解除される.待ち解除されたタスクには,待ち状態となったサービ スコールから E_OK が返る.

対象優先度データキューの優先度データ キュー管理領域にデータが格納されて おらず,送信待ち行列にタスクが存在しない場合には,自タスクは優先度デー タキューからの受信待ち状態となり,対象優先度データキューの受信待ち行列 につながれる.


ini_pdq 優先度データキューの再初期化〔 T〕

【 C言語 API 】

ER ercd = ini_pdq(ID pdqid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( pdqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象優先度データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象優先度データキューに対する管理操作が許可されていない)

【機能】

pdqid で指定した優先度データキュー(対象優先度データキュー)を再初期化す る.具体的な振舞いは以下の通り.

対象優先度データキューの優先度データキュ ー管理領域は,格納されているデー タがない状態に初期化される.また,対象優先度データキューの送信待ち行列 と受信待ち行列につながれたタスクは,それぞれの待ち行列の先頭のタスクか ら順に待ち解除される.待ち解除されたタスクには,待ち状態となったサービ スコールから E_DLT エラーが返る.

【補足説明】

送信待ち行列と受信待ち行列の両方にタスクがつな がれていることはないため, 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな い.

【使用上の注意】

ini_pdq により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

優先度データキューを再初期化した場合に,アプリケーションとの整合性を保 つのは,アプリケーションの責任である.


ref_pdq 優先度データキューの状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)

【パラメータ】

ID pdqid 対象優先度データキューの ID 番号
T_RPDQ * pk_rpdq 優先度データキューの現在状態を入れるパケットへのポインタ

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*優先度データキューの現在状態(パケットの内容)

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

【エラーコード】

E_ CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( pdqid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象優先度データキューが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象優先度データキューに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( 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 順また はメッセージの優先度順につないでおくためのキュー である.

待ち行列は,メールボックスからメッセージが受信できるまで待っている状態 (メールボックスからの受信待ち状態)のタスクが,メッセージを受信できる 順序でつながれているキューである.

メールボックス属性には,次の属性を指定することができる.

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

TA_TPRI を指定しない場合,待ち行列は FIFO 順になる. TA_MPRI を指定しない場 合,メッセージキューは FIFO 順になる.

優先度別のメッセージキューヘッダ領域は, TA_MPRI 属性のメールボックスに対 して,メッセージキューを優先度別に設ける場合に使用する領域である.

カーネルは,メールボックスに送信されたメッセージをメッセージキューにつ なぐために,メッセージの先頭のメモリ領域を使用する.そのためアプリケー ションは,メールボックスに送信するメッセージの先頭に,カーネルが利用す るためのメッセージヘッダを置かなければならない.メッセージヘッダのデー タ型として,メールボックス属性に TA_MPRI が指定されているか否かにより,以 下のいずれかを用いる.

T_MSG TA_MPRI 属性でないメールボックス用のメッセージヘッダ
T_MSG_PRI TA_MPRI 属性のメールボックス用のメッセージヘッダ

メッセージヘッダの領域は,メッセージがメッセージキューにつながれている 間(すなわち,メールボックスに送信してから受信するまでの間),カーネル によって使用される.そのため,メッセージキューにつながれているメッセー ジのメッセージヘッダの領域をアプリケーションが書き換えた場合や,メッセー ジキューにつながれているメッセージを再度メールボックスに送信した場合の 動作は保証されない.

TA_MPRI 属性のメールボックスにメッセージを送信する場合,アプリケーション は,メッセージの優先度を, T_MSG_PRI 型のメッセ ージヘッダ中の msgpri フィー ルドに設定する.

保護機能対応カーネルでは,メールボックス機能はサポートしない.

メールボックス機能に関連するカーネル構成マクロは次の通り.

TMIN_MPRI メッセージ優先度の最小値(= 1)
TMAX_MPRI メッセージ優先度の最大値
TNUM_MBXID 登録できるメールボックスの数(動的生成対応でないカーネルでは,静的 API によって登録されたメールボックスの数に一致)

【補足説明】

TOPPERS 新世代カーネルの現時点の実装では,優先度別のメッセージキューヘッ ダ領域は用いていない.

【使用上の注意】

メールボックス機能は,μ ITRON4.0 仕様との互換性のために残した機能であり, 保護機能対応カーネルではサポートしないため,使用することは推奨しない. メールボックス機能は,ほとんどの場合に,データキュー機能または優先度デー タキュー機能を用いて,メッセージを置いたメモリ領域へのポインタを送受信 する方法で置き換えることができる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,メールボックス機能をサポートする.メッセージ優先度の最 大値( TMAX_MPRI )は 16 に固定されている.ただし,タスク優先度拡張パッケー ジでは, TMAX_MPRI を 256 に拡張する.

【 TOPPERS/FMP カーネルにおける 規定】

FMP カーネルでは,メールボックス機能をサポートする.メッセージ優先度の最 大値( TMAX_MPRI )は 16 に固定されている.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,メールボックス機能をサポートしない.

【μ ITRON4.0 仕様との関係】

TNUM_MBXID は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロである.


CRE_MBX メールボックスの生成〔 Sp 〕
acre_mbx メールボックスの生成〔 TpD 〕

【静的 API 】

CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })

【 C言語 API 】

ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx)

【パラメータ】

ID mbxid 生成するメールボックスの ID 番号( CRE_MBX の場合)
T_CMBX * pk_cmbx メールボックスの生成情報を入れたパケットへのポインタ(静的 API を除く)

*メールボックスの生成情報(パケットの内容)

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

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( mbxatr が不正または使用できない,属するクラスが不正)
E_NOSPT 未サポート機能( mprihd がサポートされていない値)
E_PAR パラメータエラー( mprihd が不正)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるメールボックス ID が ない)
E_NOMEM メモリ不足(優先度別のメッセージキューヘッダ領域が確保できない)
E_OBJ オブジェクト状態エラー( mbxid で指定したメールボックスが登録済み: CRE_MBX の場合)

【機能】

各パラメータで指定したメールボックス生成情報に従って,メールボックスを 生成する.メッセージキューはつながれているメッセージがない状態に初期化 され, mprihd と maxmpri から優先度別のメッセージキューヘッダ領域が設定され る.また,待ち行列は空の状態に初期化される.

静的 API においては, mbxid はオブジェクト識別名, maxmpri は整数定数式パラメー タ, mprihd は一般定数式パラメータである.コンフィギュレータは,静的 API の メモリ不足( E_NOMEM )エラーを検出することができない.

mprihd を NULL とした場合, maxmpri の指定に合致したサイズの優先度別のメッセー ジキューヘッダ領域を,コンフィギュレータまたはカーネルが確保する.

maxmpri は, TMIN_MPRI 以上, TMAX_MPRI 以下でなければならない.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_MBX のみをサポートする.また,優先度別のメッセージ キューヘッダ領域は使用しておらず, mprihd には NULL のみを指定することがで きる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.ただし,動的生成 機能拡張パッケージでは, acre_mbx もサポートする. acre_mbx に対しても, mprihd には NULL のみを指定することができる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_MBX のみをサポートする.また,優先度別のメッセージ キューヘッダ領域は使用しておらず, mprihd には NULL のみを渡すことができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.


AID_MBX 割付け可能なメールボックス ID の数の指定〔 SpD 〕

【静的 API 】

AID_MBX(uint_t nombx)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

nombx で指定した数のメールボックス ID を,メールボックスを生成するサービス コールによって割付け可能なメールボ ックス ID として確保する.

nombx は整数定数式パラメータである.


del_mbx メールボックスの削除〔 TDp 〕

【 C言語 API 】

ER ercd = del_mbx(ID mbxid)

【パラメータ】

ID mbxid 対象メールボックスの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの 呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mbxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象メールボックスが未登録)
E_OBJ オブジェクト状態エラー(対象メールボックスは静的 APIで生成された)

【機能】

mbxid で指定したメールボックス(対象メールボックス)を削除する.具体的な 振舞いは以下の通り.

対象メールボックスの登録が解除され,そのメールボックス ID が未使用の状態 に戻される.また,対象メールボックスの待ち行列につながれたタスクは,待 ち行列の先頭のタスクから順に待ち解除される.待ち解除されたタスクには, 待ち状態となったサービスコールから E_DLT エラーが返る.

メールボックスの生成時に,優先度別のメッセージキューヘッダ領域がカーネ ルによって確保された場合は,そのメモリ領域が解放される.

【使用上の注意】

del_mbx により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_mbx をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_mbx を サポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_mbx をサポートしない.


snd_mbx メールボックスへの送信〔 Tp 〕

【 C言語 API 】

ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg)

【パラメータ】

ID mbxid 対象メールボックスの ID 番号
T_MSG *pk_msg 送信メッセージの先頭番地

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mbxid が不正)
E_P AR パラメータエラー(メッセージヘッダ中の msgpri が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象メールボックスが未登録)

【機能】

mbxid で指定したメールボックス(対象メールボックス)に, pk_msg で指定した メッセージを送信する.具体的な振舞いは以下の通り.

対象メールボックスの待ち行列 にタスクが存在する場合には,待ち行列の先頭 のタスクが, pk_msg で指定したメッセージを受信し,待ち解除される.待ち解 除されたタスクには,待ち状態となったサービスコールから E_OK が返る.

対象メールボックスの待ち行列にタスクが存在しない場合には, pk_msg で指定 したメッセージが,メールボックス属性の TA_MPRI 指定の有無によって指定され る順序で,メッセージキューにつなぐ.

対象メールボックスが TA_MPRI 属性である場合には, pk_msg で指定したメッセー ジの先頭のメッセージヘッダ中の msgpri フィールドの値が, TMIN_MPRI 以上で, 対象メールボックスに送信できるメッセージ優先度の最大値以下でなければな らない.


rcv_mbx メールボックスからの受信〔 Tp 〕
prcv_mbx メールボックスからの受信(ポーリング)〔 Tp 〕
trcv_mbx メールボックスからの受信(タイムアウト付き)〔 Tp 〕

【 C言語 API 】

ER ercd = rcv_mbx(ID mbxid, T_MSG **ppk_msg)

ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg)

ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)

【パラメータ】

ID mbxid 対象メールボックスの ID 番号
T_MSG ** ppk_msg 受信メッセ ージの先頭番地を入れるメモリ領域へのポインタ
TMO tmout タイムアウト時間( trcv_mbx の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
T_MSG * ppk_msg 受信メッセ ージの先頭番地

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: prcv_mbx を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: prcv _mbx を除く)
E_ID 不正 ID 番号( mbxid が不正)
E_PAR パラメータエラー( tmout が不正: trcv_mbx の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象メールボックスが未登録)
E_TMOUT ポーリング失敗またはタイムアウト( rcv_mbx を 除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( prcv_mbx を除く)
E_DLT 待ちオブジェクトの削除または再初期化( prcv_mbx を除く)

【機能】

mbxid で指定したメールボックス(対象メールボックス)からメッセージを受信 する.受信したメッセージの先頭番地は, ppk_msg で指定したメモリ領域に返さ れる.具体的な振舞いは以下の通り.

対象メールボックスのメッセージキューにメッセージがつながれている場合に は,メッセージキューの先頭につながれたメッセージが取り出され, ppk_msg で 指定したメモリ領域に返される.

対象メールボックスのメッセージキューにメッセージがつながれていない場合 には,自タスクはメールボックスからの受信待ち状態となり,対象メールボッ クスの待ち行列につながれる.


ini_mbx メールボックスの再初期化〔 Tp 〕

【 C言語 API 】

ER ercd = ini_mbx(ID mbxid)

【パラメータ】

ID mbxid 対象メールボックスの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mbxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象メールボックスが未登録)

【機能】

mbxid で指定したメールボックス(対象メールボックス)を再初期化する.具体 的な振舞いは以下の通り.

対象メールボックスのメールボックス管理領域は,メッセージキューはつなが れているメッセージがない状態に初期化される.また,対象メールボックスの 待ち行列につながれたタスクは,待ち行列の先頭のタスクから順に待ち解除さ れる.待ち解除されたタスクには,待ち状態となったサ ービスコールから E_DLT エラーが返る.

【使用上の注意】

ini_mbx により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

メールボックスを再初期化した場合に,アプリケーションとの整合性を保つのは, アプリケーションの責任である.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


ref_mbx メールボックスの状態参照〔 Tp 〕

【 C言語 API 】

ER ercd = ref_mbx(ID mbxid, T_RMBX *pk_rmbx)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*メールボックスの現在状態(パケットの内容)

ID wtskid メールボックスの待ち行列の先頭のタスクの ID番号
T_MSG * pk_msg メッセージキューの先頭につながれたメッセージの先頭番地

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mbxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象メールボックスが未登録)

【機能】

mbxid で指定したメールボックス(対象メールボックス)の現在状態を参照する. 参照した現在状態は, pk_rmbx で指定したパケットに返される.

対象メールボックスの待ち行列にタスクが存在しない場合, wtskid には TSK_NONE (= 0)が返る.また,メッセージキューにメッセージがつながれてい ない場合, pk_msg には NULL が返る.

【使用上の注意】

ref_mbx はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_mbx を 呼び出し,対象メールボックスの現在状態を参照した 直後に割込みが発生した場合, ref_mbx から戻ってきた時には対象メールボック スの状態が変化している可能性があるためである.


4.4.6 ミューテックス

ミューテックスは,タ スク間の排他制御を行うための同期・通信オブジェクト である.タスクは,排他制御区間に入る時にミューテックスをロックし,排他 制御区間を出る時にロック解除する.ミューテックスは,ミューテックス ID と 呼ぶ ID 番号によって識別する.

ミューテックスは,排他制御に伴う優先度逆転の時間を最小限に抑えるための 優先度上限プロトコル( priority ceiling protocol )をサポートする .ミュー テックス属性により優先度上限ミューテックスであると指定することで,その ミューテックスの操作時に,優先度上限プロトコルに従った現在優先度の制御 が行われる.

各ミューテックスが持つ情報は次の通り.

  • ・ミューテックス属性
  • ・ロック状態(ロックされている状態とロック解除されている状態)
  • ・ミューテックスをロックしているタスク
  • ・待ち行列(ミューテックスのロック待ち状態のタスクのキュー)
  • ・上限優先度(優先度上限ミューテックスの場合)
  • ・アクセス許可ベクタ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス(マルチプロセッサ対応カーネルの場合)

待ち行列は,ミューテックスをロ ックできるまで待っている状態(ミューテッ クスのロック待ち状態)のタスクが,ミューテックスをロックできる順序でつ ながれているキューである.

上限優先度は,優先度上限ミューテックスに対してのみ有効で,ミューテック スの生成時に,そのミューテックスをロックする可能性のあるタスクのベース 優先度の中で最も高い優先度(または,それより高い優先度)に設定する.

ミューテックス属性には,次の属性を指定することができる.

TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
TA_CEILING 0x03U 優先度上限ミューテックスとする.待ち行列をタスクの優先度順にする

TA_TPRI , TA_CEILING のいずれも指定しない場合,待ち行列は FI FO 順になる.

ミューテックス機能に関連して,各タスクが持つ情報は次の通り.

  • ・ロックしているミューテックスのリスト

ロックしているミューテックスのリストは,タスクの起動時に空に初期化され る.

タスクの現在優先度は,そのタスクのベース優先度と,そのタスクがロックし ている優先度上限ミューテックスの優先度上限の中で,最も高い優先度に設定 される.

ミューテックス機能によりタスクの現在優先度が変化する場合には,次の処理 が行われる.現在優先度を変化させるサービスコールの前後とも,当該タスク が実行できる状態である場合には,同じ優先度のタスクの中で最高優先順位と なる.そのサービスコールにより,当該タスクが実行できる状態に遷移する場 合には,同じ優先度のタスクの中で最低優先順位となる.そのサービスコール の後で,当該タスクが待ち状態で,タスクの優先度順の待ち行列につながれて いる場合には,当該タスクの変更後の現在優先度に従って,その待ち行列中で の順序が変更される.待ち行列中に同じ現在優先度のタスクがある場合には, 当該タスクの順序はそれらの中で最後になる.

ミューテックス機能に関連して,タスクの 終了時に行うべき処理として,タス クがロックしているミューテックスのロック解除がある.タスクの終了時にロッ クしているミューテックスが残っている場合,それらのミューテックスは,ロッ クしたのと逆の順序でロック解除される.

ミューテックス機能に関連するカーネル構成マクロは次の通り.

TNUM_MTXID 登録できるミューテックスの数(動的生成対応でな いカーネルでは,静的 API によって登録されたミューテックスの数に一致)

【使用上の注意】

優先度上限プロトコルには, (a) 優先度の低いタスクの排他制御区間に最大 1回 しかブロックされない, (b) タスクの実行が開始された以降は優先度の低いタ スクにブロックされないという利点があるが,これは,タスク間の同期に優先 度上限ミューテックスのみを用い,他の方法でタスクのスケジューリングに関 与しない場合に得られる利点である.

これらの利点を得るためには,タスクの優先順位の回転やディスパッチの禁止 を行ってはならないことに加えて,優先度上限ミューテックスをロックしたタ スクを待ち状態にしてはならない.特に,優先度上 限ミューテックスに対して, タスクがロック待ち状態になる状況に注意が必要である(優先度上限プロトコ ルでは,タスクがミューテックスのロック待ち状態になることはない).

例えば,着目するタスク Aと,タスク Aよりベース優先度の低いタスク Bとタスク C ,タスク Aよりも高い上限優先度を持った優先度上限ミューテックスがある場 合を考える.タスク Aがミューテックスをロックし,タスク Bとタスク Cがミュ ー テックスを待っている状況で,タスク Aがミューテックスをロック解除すると, タスク Bがミューテックスをロックして優先度が上がり,タスク Bに切り換わる. さらにタスク Bがミューテックスをロック解除すると,タスク Cがミューテック スをロックして優先度が上がり,タスク Cに切り換わる.タスク Aが実行される のは,タスク Cがミューテックスをロック解除した後である.この例では,タス ク Aが実行開始後 に,タスク Bとタスク Cの排他制御区間にブロックされることに なる.

優先度上限ミューテックスに対してタスクがロック待ち状態になる状況を回避 するためには,優先度上限ミューテックスをロックする場合に,待ち状態にな らない ploc_mtx を用いるのが安全である.

【補足説明】

この仕様で優先度上限プロトコルと呼んでいる方式は,オリジナルの priority ceiling protocol とは異なるものである.この仕様の方式は, OSEK/VDX OS 仕様 でも priority ceiling protocol と呼ばれているが,学術論文や他の OS では, immediate ceiling priority protocol , priority protection protocol , p riority ceiling emulation , highest locker protocol などと呼ばれている.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,ミューテックス機能をサポートしない.ただし,ミューテッ クス機能拡張パッケージを用いると,ミューテックス機能を追加することがで きる.

【 TOPPERS/FM Pカーネルにおける規定】

FMP カーネルでは,ミューテックス機能をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,ミューテックス機能をサポートする.

【未決定事項】

マルチプロセッサにおいては,タスク間の同期に優先度上限ミューテックスの み を用い,他の方法でタスクのスケジューリングに関与しない場合でも,優先 度上限ミューテックスに対してタスクがロック待ち状態になる.マルチプロセッ サ対応カーネルにおける優先度上限ミューテックスの扱いについては,今後の 課題である.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様の厳密な優先度制御規則を採用し,簡略化した優先度制御規則 はサポートしていない.また,μ ITRON4.0 仕様でサポートしている優先度継承 プロトコル( priority inheritance protocol )は,現時点ではサポートしてい ない.

ミューテックス機能によりタスクの現在優先度が変化する場合の振舞いは, μ ITRON4.0 仕様では実装依存となっているが,この仕様では規定している.

TNUM_ MTXID は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロであ る.


CRE_MTX ミューテックスの生成〔 S〕
acre_mtx ミューテックスの生成〔 TD 〕

【静的 API 】

CRE_MTX (ID mtxid, { ATR mtxatr, PRI ceilpri })

【 C言語 API 】

ER_ID mtxid = acre_mtx(const T_CMTX *pk_cmtx)

【パラメータ】

ID mtxid 生成するミューテックスの ID 番号( CRE_MTX の場合)
T_CMTX * pk_cmtx ミューテックスの生成情報を入れたパケットへのポインタ(静的 API を除く)

*ミューテックスの生成情報(パケットの内容)

ATR mtxatr ミューテックス属性
PRI ceilpri ミューテックスの上限優先度

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキ ストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( mtxatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( ceilpri が不正)
E_OACV 〔 sP 〕 オブジェ クトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cmtx が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるミューテックス ID がない)
E_OBJ オ ブジェクト状態エラー( mtxid で指定したミューテックスが登録済み: CRE_MTX の場合)

【機能】

各パラメータで指定したミューテックス生成情報に従って,ミューテックスを 生成する.生成されたミューテックスのロック状態はロックされていない状態 に,待ち行列は空の状態に初期化される.

静的 API においては, mtxid はオブジェクト識別名, ceilpri は整数定数式パラメー タである.優先度上限ミューテックス以外の場合には, ceilpri の指定を省略す ることができる.

優先度上限ミューテックスを生成する場合, ceilpri は, TMIN_TPRI 以上, TMAX_TPRI 以下でなければならない.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルのミューテックス機能拡張パッケージでは, CRE_MTX のみをサポー トする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_MTX のみをサポートする.


AID_MTX 割付け可能なミューテックス ID の数の指定〔 SD 〕

【静的 API 】

AID_MTX(uint_t nomtx)

【パラメータ】

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

【エラーコード】

E_RSATR 予 約属性(属する保護ドメインまたはクラスが不正)

【機能】

nomtx で指定した数のミューテックス ID を,ミューテックスを生成するサービス コールによって割付け可能なミューテックス ID として確保する.

nomtx は整数定数式パラメータである.


SAC_MTX ミューテックスのアクセス許可ベクタの設定〔 SP 〕
sac_mtx ミューテックスのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_MTX(ID mtxid, { ACPTN acptn1, ACP TN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_mtx(ID mtxid, const ACVCT *p_acvct)

【パラメータ】

ID mtxid 対象ミュ ーテックスの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_MTXの場合)
E_ID 不正 ID 番号( mtxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象ミューテックスが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象ミューテックスに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象ミューテックスは静的 APIで生成された: sac_mtx の場合,対象ミューテックスに対してアクセス許可ベクタが設定済み: SAC_MTX の場合)

【機能】

mtxid で指定したミューテックス(対象ミューテックス)のアク セス許可ベクタ ( 4つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, mtxid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_MTX は,対象ミューテックスが属する保護ドメインの囲みの中に記述しなけ ればならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルのミューテックス機能拡張パッケージでは, SAC_MTX , sac_mtx をサ ポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_MTX のみをサポートする.


del_mtx ミューテックスの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_mtx(ID mtxid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E _ID 不正 ID 番号( mtxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象ミューテックスが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象ミューテックスに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象ミューテックスは静的 APIで生成された)

【機能】

mtxid で指定したミューテックス(対象ミューテックス)を削除する.具体的な 振舞いは以下の通り.

対象ミューテックスの登録が解除され,そのミューテックス ID が未使用の状態 に戻される.対象ミューテックスをロックしているタスクがある場合には,そ のタスクがロックしているミューテックスのリストから対象ミューテックスが 削除され,必要な場合にはそのタスクの現在優先度が変更される.また,対象 ミューテックスの待ち行列につながれたタスクは,待ち行列の先頭のタスクか ら順に待ち解除される.待ち解除されたタスクには,待ち状態となったサービ スコールから E_DLT エラーが返る.

【使用上の注意】

対象ミューテックスをロックしているタスクには,ミューテックスが削除され たことが通知されず,そのミューテックスをロック解除する時点でエラーとな る.これが不都合な場合には,ミューテックスをロックした状態で,ミューテッ クスを削除すればよい.

del_mtx により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除される タスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルのミューテックス機能拡張パッケージでは, del_mtx をサポートし ない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, del_mtx をサポートしない.


loc_mtx ミューテックスのロック〔 T〕
ploc_mtx ミューテックスのロック(ポーリング)〔 T〕
tloc_mtx ミューテックスのロック(タイムアウト付き)〔 T〕

【 C言語 API 】

ER ercd = loc_mtx(ID mtxid)

ER ercd = ploc_mtx(ID mtxid)

ER ercd = tloc_mtx(ID mtxid, TMO tmout)

【パラメータ】

ID mtxid 対象ミューテックスの ID 番号
TMO tmout タイムアウト時間( twai_mtx の場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテ キストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: pol_mtx を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: pol_mtx を除く)
E_ID 不正 ID番号( mtxid が不正)
E_PAR パラメータエラー( tmout が不正: twai_mtx の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象ミューテックスが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象ミューテックスに対する通常操作 1が許可されていない)
E_ILUSE サービスコール不正使用(対象ミューテックスを自タスクがロックしている,対象優先度上限ミューテックスの上限優先度より自タスクのベース優先度が高い)
E_TMOUT ポーリング失敗またはタイムアウト( wai_mtx を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( pol_mtx を除く)
E_DLT 待ちオブジェクトの削除または再初期化( pol_mtx を除く)

【機能】

mtxid で指定したミューテックス(対象ミューテックス)をロックする.具体的 な振舞いは以下の通り.

対象ミュー テックスがロックされていない場合には,自タスクによってロック されている状態になる.自タスクがロックしているミューテックスのリストに 対象ミューテックスが追加され,必要な場合には自タスクの現在優先度が変更 される.

対象ミューテックスが自タスク以外のタスクによってロックされている場合に は,自タスクはミューテックスのロック待ち状態となり,対象ミューテックス の待ち行列 につながれる.

対象ミューテックスが自タスクによってロックされている場合には, E_ILUSE エ ラーとなる.また,対象ミューテックスが優先度上限ミューテックスで,その 上限優先度より自タスクのベース優先度が高い場合にも, E_ILUSE エラーとなる.


unl_mtx ミューテックスのロック解除〔 T〕

【 C言語 API 】

ER ercd = unl_mtx(ID mtxid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mtxid が不正)
E_N OEXS 〔 D〕 オブジェクト未登録(対象ミューテックスが未登録)
E_ILUSE サービスコール不正使用(対象ミューテックスを自タスクがロックしていない)

【機能】

mtxid で指定したミューテックス(対象ミューテックス)をロック解除する.具 体的な振舞いは以下の通り.

まず,自タスクがロックしているミューテックスのリストから対象ミューテッ クスが削除され,必要な場合には自タスクの現在優先度が変更される.

対象ミューテックスの待ち行列にタスクが存在する場合には,待ち行列の先頭 のタスクが待ち解除される.対象ミューテックスは,待ち解除されたタスクに よってロックされている状態になる.待ち解除されたタスクがロックしている ミューテックスのリ ストに対象ミューテックスが追加され,必要な場合にはそ のタスクの現在優先度が変更される.待ち解除されたタスクには,待ち状態と なったサービスコールから E_OK が返る.

待ち行列にタスクが存在しない場合には,対象ミューテックスはロックされて いない状態になる.

対象ミューテックスが自タスクによってロックされていない場合には, E_ILUSE エラーとなる.


ini_mtx ミューテックスの再初期化〔 T〕

【 C言語 API 】

ER ercd = ini_mtx(ID mtxid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロッ ク状態からの呼出し)
E_ID 不正 ID 番号( mtxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象ミューテックスが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象ミューテックスに対する管理操作が許可されていない)

【機能】

mtxid で指定したミューテックス(対象ミューテックス)を再初期化する.具体 的な振舞いは以下の通り.

対象ミューテックスのロック状態は,ロックされていない状態に初期化される. 対象ミューテックスをロックしているタスクがある場合には,そのタスクがロッ クしているミューテックスのリストから対象ミューテックスが削除され,必要 な場合にはそのタスクの現在優先度が変更される.また,対象ミューテックス の待ち行列につながれたタスクは,待ち行列の先頭のタスクから順に待ち解除 される.待ち解除されたタスクには,待ち状態となったサービスコールから E_DLT エラーが返る.

【使用上の注意】

対象ミューテックスをロックしているタスクには,ミューテックスが再初期化 されたことが通知されず,そのミューテックスをロック解除する時点でエラー となる.これが不都合な場合には,ミューテックスをロックした状態で,ミュー テックスを再初期化すればよい.

ini_mtx により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネ ル内での割込 み禁止時間が長くなるため,注意が必要である.

ミューテックスを再初期化した場合に,アプリケーションとの整合性を保つの は,アプリケーションの責任である.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


ref_mtx ミューテックスの状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_mtx(ID mtxid, T_RMTX *pk_rmtx)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*ミューテックスの現在状態(パケットの内容)

ID htskid ミューテックスをロックしているタスクの ID 番号
ID wtskid ミューテックスの待ち行列の先頭のタスクの ID番号

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mtxid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象ミューテックスが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象ミューテックスに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモ リアクセス違反( pk_rmtx が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

mtxid で指定したミューテックス(対象ミューテックス)の現在状態を参照する. 参照した現在状態は, pk_rmtx で指定したパケットに返される.

対象ミューテックスがロックされていない場合, htskid には TSK_NONE (= 0)が 返る.

対象ミューテックスの待ち行列にタスクが存在しない場合, wtskid には TSK_NONE (= 0)が返る.

【使用上の注意】

ref_mtx はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない. これは, ref_mtx を呼び出し,対象ミューテックスの現在状態を参照した 直後に割込みが発生した場合, ref_mtx から戻ってきた時には対象ミューテック スの状態が変化している可能性があるためである.


4.4.8 スピンロック

スピンロックは,マルチプロセッサ対応カーネルにおいて,割込みのマスクと プロセッサ間ロックの取得により,排他制御を行うための同期・通信オブジェ クトである.スピンロックは,スピンロック ID と呼ぶ ID 番号によって識別する.

プロセッサ間ロックを取得している間は, CPU ロック状態にすることですべての カーネル管理の割込みがマスクされ,ディスパッチが保留される.ロックが他 のプロセッサに取得されている場合には,ロックが取得できるまでループによっ て待つ.ロックの取得を待つ間は, CPU ロック解除状態であり,割込みはマスク されない.プロセッサ間ロックを取得し, CPU ロック状態に遷移することを,ス ピンロックを取得するという.また,プロセッサ間ロックを返却し, CPU ロック 状態を解除することを,スピンロックを返却するという.

タスクが取得したスピンロックを返却せずに終了した場合や,タスク例外処理 ルーチン,割込みハンドラ,割込みサービスルーチン,タイムイベントハンド ラが取得したスピンロックを返却せずにリターンした場合には,カーネルによっ てスピンロックが返却される.また,スピンロックを取得していない状態で発 生した CPU 例外によって呼 び出された CPU 例外ハンドラが,取得したスピンロッ クを返却せずにリターンした場合には,カーネルによってスピンロックが返却 される.一方,拡張サービスコールからのリターンでは,スピンロックは返却 されない.

各スピンロックが持つ情報は次の通り.

  • ・スピンロック属性
  • ・ロック状態(取得されている状態と取得されていない状態)
  • ・アクセス許可ベクタ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス

スピンロック属性に指定できる属性はない.そのためスピンロック属性には, TA_NULL を指定しなければならない.

スピンロック機能に関連するカーネル構成マクロは次の通り.

TNUM_SPNID 登録できるスピンロックの数(動的生成対応でないカーネルでは,静的 API によって登録されたスピンロックの数に一致)

【補足説明】

CPU ロック状態では,スピンロックを取得するサービスコールを呼び出すことが できないため,スピンロックを取得しているプロセッサが,さらにスピンロッ クを取得することはできない.そのため, 1つの処理単位が,複数のスピンロッ クを取得した状態になることはできない.

スピンロックを取得した状態で CPU 例外が発生した場合,起動される CPU 例外ハ ンドラはカーネル管理外の CPU 例外ハンドラであり( xsns_dpn , xsns_xpn とも true を返す) , CPU 例外ハンドラ中で iunl_spn を呼び出してスピンロックを返却 しようとした場合の動作は保証されない.保証されないにも関わらず iunl_spn を呼び出した場合には, CPU 例外ハンドラからのリターン時に元の状態に戻らな い.これは, CPU ロック状態の扱いと一貫していないため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルで は,スピンロック機能をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,スピンロック機能をサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,スピンロック機能をサポートしない.

【μ ITRON4.0 仕様との関係】

スピンロック機能は,μ ITRON4.0 仕様に定義されていない機能である.


CRE_SPN スピンロックの生成〔 SM 〕
acre_spn スピンロックの生成〔 TMD 〕

【静的 API 】

C RE_SPN(ID spnid, { ATR spnatr })

【 C言語 API 】

ER_ID spnid = acre_spn(const T_CSPN *pk_cspn)

【パラメータ】

ID spnid 生成するスピンロックの ID 番号( CRE_SPN の場合)
T_CSPN * pk_cspn スピンロックの生成情報を入れたパケットへのポインタ(静的 API を除く)

*スピンロックの生成情報(パケットの内容)

ATR spnatr スピンロック属性

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( spnatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cspn が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるスピンロック ID がない)
E_NORES 資源不足(スピンロックを実現するためのハードウェア資源がない: CRE_SPN の場合)
E_OBJ オブジェクト状態エラー( spnid で指定したスピンロックが登録済み: CR E_SPN の場合)

【機能】

各パラメータで指定したスピンロック生成情報に従って,スピンロックを生成 する.生成されたスピンロックのロック状態は,取得されていない状態に初期 化される.

静的 API においては, spnid はオブジェクト識別名である.

スピンロックをハードウェアによって実現している場合には,ターゲット定義 で,生成できるスピンロックの数に上限がある.この上限を超えてスピンロッ クを生成しようとした場合には, E_NORES エラーとなる.

【補足説明】

スピンロックを動的に生成する場合に,生成できるスピンロックの数の上限は AID_SPN によってチェックされるため, acre_spn で E_NORES エラーが返ることは ない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_SPN のみをサポートする.


AID_SPN 割付け可能なスピンロック ID の数の指定〔 SMD 〕

【静的 API 】

AID_SPN(uint_t nospn)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【 機能】

nospn で指定した数のスピンロック ID を,スピンロックを生成するサービスコー ルによって割付け可能なスピンロック ID として確保する.

nospn は整数定数式パラメータである.


SAC_SPN スピンロックのア クセス許可ベクタの設定〔 SPM 〕
sac_spn スピンロックのアクセス許可ベクタの設定〔 TPMD 〕

【静的 API 】

SAC_SPN(ID spnid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_spn(ID spnid, const ACVCT *p_acvct)

【パラメータ】

ID spnid 対象スピンロックの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パター ン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( spnid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_SPNの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象スピンロックが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違 反(対象スピンロックに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象スピンロックは静的 API で生成され た: sac_spn の場合,対象スピンロックに対してアクセス許可ベクタが設定済み: SAC_SPN の場合)

【機能】

spnid で指定したスピンロック(対象スピンロック)のアクセス許可ベクタ( 4 つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, spnid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_SPN は,対象スピンロックが属する保護ドメインの囲みの中に記述しなけれ ばならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_SPN , sac_spn をサポートしない.


del_spn スピンロックの削除〔 TMD 〕

【 C言語 API 】

ER ercd = del_spn(ID spnid)

【パラメータ】

ID spnid 対 象スピンロックの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( spnid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象スピンロックが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象スピンロックに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象スピンロックは静的 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 対象スピンロックの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: loc_spn の場合,タスクコンテキストからの呼出し:iloc_spn の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( spnid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象スピンロックが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象スピンロックに対する通常操作 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 対象スピンロックの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: try_spn の場合,タスクコンテキストからの呼出し:itry_spn の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( spnid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象スピンロックが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違 反(対象スピンロックに対する通常操作 1が許可されていない: try_spn の場合)
E_OBJ オブジェクト状態エラー(対象スピンロックが取得されている状態)

【機能】

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 対象スピンロックの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: unl_spn の場合,タスクコンテキストからの呼出し:iunl_spn の場合)
E_ID 不正 ID 番号( spnid が不正)
E_NOE XS 〔 D〕 オブジェクト未登録(対象スピンロックが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象スピンロックに対する通常操作 1が許可されていない: unl_spn の場合)
E_ILUSE サービスコール不正使用(対象スピンロックをロックしていない)

【機能】

spnid で指定したスピンロック(対象スピンロック)を返却する.具体的な振舞 いは以下の通り.

対象スピンロックが, unl_spn / iunl_spn を呼び出したプロセッサによって取得 されている状態である場合には,ロックを返却し,スピンロックを取得されて いない状態とする.また, CPU ロックフラグをクリアし, CPU ロック解除状態へ 遷移する.

対象スピンロックが,取得されていない状態である場合や,他のプロセッサに よって取得されている状態である場合には, E_ILUSE エラーとなる.


ref_spn スピンロックの状態参照〔 TM 〕

【 C言語 API 】

ER ercd = ref_spn(ID spnid, T_RSPN *pk_rspn)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*スピンロックの現在状態(パケットの内容)

STAT spnstat ロック状態

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキス トからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( spnid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象スピンロックが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象スピンロックに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rspn が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

spnid で指定したスピンロック(対象スピンロック)の現在状態を参照する.参 照した現在状態は, pk_rspn で指定したパケットに返される.

spn stat には,対象スピンロックの現在のロック状態を表す次のいずれかの値が 返される.

TSPN_UNL 0x01U 取得されていない状態
TSPN_LOC 0x02U 取得されている状態

【使用上の注意】

ref_spn はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_spn を呼び出し,対象スピンロックの現在状態を参照した直 後に割込みが発生した場合, ref_spn から戻ってきた時には対象スピンロックの 状態が変化している可能性があるためである.


4.5 メモリプール管理機能

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,メモリプール管理機能をサポートしない.

【μ ITRON4.0 仕様との関係】

この仕様では,可変長メモリプール機能はサポートしないこととした.

【仕様決定の理由】

可変長メモリプール機能をサポートしないこととしたのは,メモリ割付けの処 理時間とフラグメンテーションの発生を考えると,最適なメモリ管理アルゴリ ズムはアプリケーション依存となるため,カーネル内で実現するより,ライブ ラリとして実現する方が適切と考えたためである.

4.5.1 固定長メモリプール

固定長メモリプールは,生成時に決めたサイズのメモリブ ロック(固定長メモ リブロック)を動的に獲得・返却するための同期・通信オブジェクトである. 固定長メモリプールは,固定長メモリプール 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 b lksz, MPF_T *mpf, void *mpfmb })

【 C言語 API 】

ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf)

【パラメータ】

ID mpfid 生成する固定長メモリプールの ID 番号( CRE_MPFの場合)
T_CMPF * pk_cmpf 固定長メモリプールの生成情報を入れたパケットへのポインタ(静的 API を除く)

*固定長メモリプールの生成情報(パケットの内容)

ATR mpfatr 固 定長メモリプール属性
uint_t blkcnt 獲得できる固定長メモリブロックの数
uint_t blksz 固定長メモリブロックのサイズ(バイト数)
MPF_T * mpf 固定長メモリプール領域の先頭番地
void * mpfmb 固定長メモリプール管理領域の先頭番地

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( mpfatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_NOSPT 未サポート機能( mpfmb がサポートされていない値)
E_PAR パラメータエラー( blkcnt , bl ksz , mpf , mpfmb が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cmpf が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り 付けられる固定長メモリプール ID がない)
E_NOMEM メモリ不足(固定長メモリプール領域や固定長メモリプール管理領域が確保できない)
E_OBJ オブジェクト状態エラー( mpfid で指定した固定長メモリプールが登録済み: CRE_M PF の場合,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定した固定長メモリプール生成情報に従って,固定長メモリ プールを生成する. mpf , blkcnt , blksz から固定長メモリプール領域が, mpfmb と blkcnt から固定長メモリプール管理領域がそれぞれ設定され,メモリプー ル領域全体が未割当ての状態に初期化される.また,待ち行列は空の状態に初 期化される.

静的 API においては, mpfid はオブジェクト識別名, blkcnt と blksz は整数定数式 パラメータ, mpf と mpfmb は一般定数式パラメータである.コンフィギュレータ は,静的 API のメモリ不足( E_NOMEM )エラーを検出することができない.

mpf を NULL とした場合, blkcnt と blksz から決まるサイズの固定長メモリプール 領域が,コンフィギュレータまたはカーネルにより確保される.

保護機能対応カーネルでは,コンフィギュレータまたはカーネルにより確保さ れる固定長メモリプール領域は,固定長メモリプールと同じ保護ドメインに属 し,固定長メモリプールと同じアクセス許可ベクタを持ったメモリオブジェク ト中 に確保される.

mpfmb を NULL とした場合, blkcnt から決まるサイズの固定長メモリプール管理領 域が,コンフィギュレータまたはカーネルにより確保される.

blkcnt と blksz は, 0より大きい値でなければならない.

〔 mpf に NULL 以外を指定した場合〕

mpf に NULL 以外を指定した場合, mpf を先頭番地とする 固定長メモリプール領域 は,アプリケーションで確保しておく必要がある.固定長メモリプール領域を アプリケーションで確保するために,次のデータ型とマクロを用意している.

MPF_T 固定長メモリプール領域を確保するためのデータ型
COUNT_MPF_T(blksz) 固定長メモリブロックのサイズが blksz の固定長メモリプール領域を確保するために,固定長メモリブロック 1つあたりに必要な MPF_T 型の配列の要素数
ROUND_MPF_T(blksz) 要素数 COUNT_MPF_T(blksz) の MPF_T 型の配列のサイズ( blksz を, MPF_T 型のサイズの倍数になるように大きい方に丸めた値)

これらを用いて固定長メモリプール領域を確保する方法は次の通り.

MPF_T < 固定長メモリプール領域の変数名 >[(blkcnt) * COUNT_MPF_T(blksz)];

この時, mpf には <固定長メモリプール領域の変数名 >を指定する.

これ以外の方 法で固定長メモリプール領域を確保する場合には,先頭番地がター ゲット定義の制約に合致しており,上記の配列と同じサイズのメモリ領域を確 保しなければならない. mpf にターゲット定義の制約に合致しない先頭番地を指 定した時には, E_PAR エラーとなる.

保護機能対応カーネルでは,アプリケーションで確保する固定長メモリプール 領域は,カーネルに登録されたメモリオブジェクトに含まれていなければな ら ない.指定した固定長メモリプール領域が,カーネルに登録されたメモリオブ ジェクトに含まれていない場合, E_OBJ エラーとなる.

〔 mpfmb に NULL 以外を指定した場合〕

mpfmb に NULL 以外を指定した場合, mpfmb を先頭番地とする固定長メモリプール 管理領域は,アプリケーションで確保しておく必要がある.固定長メモリプー ル管理領域をア プリケーションで確保するために,次のマクロを用意している.

TSZ_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域のサイズ(バイト数)
TCNT_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリ ブロックを管理することができる固定長メモリプール管理領域を確保するために必要な MB_T 型の配列の要素数

これらを用いて固定長メモリプール管理領域を確保する方法は次の通り.

MB_T < 固定長メモリプール管理領域の変数名 >[TCNT_MPFMB(blkcnt)];

この時, mpfmb には <固定長メモリプール管理領域の変数名 >を指定する.

この方法に従わず, mpfmb にターゲット定義の制約に合致しない先頭番地を指定 した時には, E_PAR エラーとなる.また,保護機能対応カーネルにおいて, mpfmb で指定した固定長メモリプール管理領域がカーネル専用のメモリオブジェ クトに含まれない場合, E_OBJ エラーとなる.

【補足説明】

保護機能対応カーネルにおいて,固定長メモリプール領域をアプリケーション で確保する場合には,固定長メモリプール領域が属する保護ドメインとアクセ ス権の設定は変更されない.これらを適切に設定することは,アプリケーショ ンの責任である.

【 TOPPERS/ASP カーネルにおける規定】

AS Pカーネルでは, CRE_MPF のみをサポートする.また, mpfmb には NULL のみを指 定することができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.た だし,動的生成機能拡張パッケージでは, acre_mpf もサポートする. acre_mpf に対しては, mpfmb に NULL 以外を指定できないという制限はない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_MPF のみをサポートする.また, mpfmb には NULL のみを渡 すことができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_MPF のみをサポートする.また, mpfmb には NULL のみを 渡すことができる. NULL 以外を指定した場合には, E_NOSPT エラーとなる.

【μ ITRON4.0 仕様との関係】

mpf のデータ型を MPF_T * に変更した. COUNT_MPF_T と ROUND_MPF_T を新設し,固 定長メモリプール領域をアプリケーションで確保する方法を規定した.また, μ ITRON4.0/PX 仕様にあわせて,固定長メモリプール生成情報に, mpf mb を追加 した.

【μ ITRON4.0/PX 仕様との関係】

TCNT_MPFMB を新設し,固定長メモリプール管理領域をアプリケーションで確保 する方法を規定した.


AID_MPF 割付け可能な固 定長メモリプール ID の数の指定〔 SD 〕

【静的 API 】

AID_MPF(uint_t nompf)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

nompf で指定した数の固定長メモリプール ID を,固定長メモリプールを生成する サービスコールによって割付け可能な固定長メモリプール ID として確保する.

nompf は整数定数式パラメータである.


SAC_MPF 固定長メモリプールのアクセス許可ベクタの設定〔 SP 〕
sac_mpf 固定長メモリプールのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_MPF(ID mpfid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_mpf(ID mpfid, const ACVCT *p_acvct)

【パラメータ】

ID mpfid 対象固定長メモリプールの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mpfid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_MPFの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象固定長メモリプールが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象固定長メモリプールに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象固定長メモリプールは静的 API で生成された: sac_mpf の場合,対象固定長メモリプールに対してアクセス許可ベクタが設定済み: SAC_MPFの場合)

【機能】

mpfi dで指定した固定長メモリプール(対象固定長メモリプール)のアクセス許 可ベクタ( 4つのアクセス許可パターンの組)を,各パラメータで指定した値に 設定する.対象固定長メモリプールの固定長メモリプール領域がコンフィギュ レータまたはカーネルにより確保されたものである場合には,固定長メモリプー ル領域のアクセス許可ベクタも,各パラメータで指定した値に設定する.

静的 API においては, mpfid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_MPF は,対象固定長メモリプールが属する保護ドメインの囲みの中に記述し なければならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_MPF , sac_mpf をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_MPF , sac_mpf をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_MPF のみをサポートする.


del_mpf 固定長メモリプールの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_mpf(ID mpfid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mpfid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象固定長メモリプールが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象固定長メモリプールに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象固定長メモリプールは静的 API で生成された)

【機能】

mpfid で指定した固定長メモリプール(対象固定長メモリプール)を削除する. 具体的な振舞いは以下の通り.

対象固定長メモリプールの登録が解除され,その固定長メモリプール ID が未使 用の状態に戻される.また,対象固定長メモリプールの待ち行列につながれた タスクは,待ち行列の先頭のタスクから順に待ち解除される.待ち解除 された タスクには,待ち状態となったサービスコールから E_DLT エラーが返る.

【使用上の注意】

del_mpf により複数のタスクが待ち解除される場合,サービスコールの処理時間 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込 み禁止時間が長くなるため, 注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_mpf をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_mpf をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_mpf をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, 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 tmo ut)

【パラメータ】

ID mpfid 対象固定長メモリプールの ID 番号
void ** p_blk 獲得した固定長メモリブロックの先頭番地を入れるメモリ領域へのポインタ
TMO tmout タイムアウト時間( twai_mpf の 場合)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
void * blk 獲得した固定長メモリブロックの先頭番地

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し,ディスパッチ保留状態からの呼出し: pget_mpf を除く)
E_NOSPT 未サポート機能(制約タスクからの呼出し: pget_mpf を除く)
E_ID 不正 ID 番号( mpfid が不正)
E_PAR パラメータエラー( tmout が不正: tget_mpf の場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象固定長メモリプールが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象固定長メモリプールに対する通常操作 2が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_blk が 指すメモリ領域への読出しアクセスが許可されていない)
E_TMOUT ポーリング失敗またはタイムアウト( get_mpf を除く)
E_RLWAI 待ち禁止状態または待ち状態の強制解除( pget_mpf を除く)
E_DLT 待ちオブジェクトの削除または再初 期化( pget_mpf を除く)

【機能】

mpfid で指定した固定長メモリプール(対象固定長メモリプール)から固定長メ モリブロックを獲得し,その先頭番地を blk に返す.具体的な振舞いは以下の通 り.

対象固定長メモリプールの固定長メモリプール領域の中に,固定長メモリブロッ クを割り付けることのできる未割当てのメモリ領域がある場合には,固定長メ モリブロックが 1つ割り付けられ,その先頭番地が blk に返される.

未割当てのメモリ領域がない場合には,自タスクは固定長メモリプールの獲得 待ち状態となり,対象固定長メモリプールの待ち行列につながれる.


rel_mpf 固定長メモリブロックの返却〔 T〕

【 C言語 API 】

ER ercd = rel_mpf(ID mpfid, void *blk)

【パラメータ】

ID mpfid 対象固定長メモリプールの ID 番号
void * blk 返却する固定長メモリブロックの先頭番地

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコン テキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mpfid が不正)
E_PAR パラメータエラー( blk が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象固定長メモリプールが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象固定長メモリ プールに対する通常操作 1が許可されていない)

【機能】

mpfid で指定した固定長メモリプール(対象固定長メモリプール)に, blk で指 定した固定長メモリブロックを返却する.具体的な振舞いは以下の通り.

対象固定長メモリプールの待ち行列にタスクが存在する場合には,待ち行列の 先頭のタスクが, blk で指定した固定長メモリブロックを獲得し,待ち解除され る.待ち解除されたタスクには,待ち状態となったサービスコールから E_OK が 返る.

待ち行列にタスクが存在しない場合には, blk で指定した固定長メモリブロック は,対象固定長メモリプールのメモリプール領域に返却される.

blk が,対象固定長メモリプールから獲得した固定長メ モリブロックの先頭番地 でない場合には, E_PAR エラーとなる.


ini_mpf 固定長メモリプールの再初期化〔 T〕

【 C言語 API 】

ER ercd = ini_mpf(ID mpfid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mpfid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象固定長メモリプールが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象固定長メモリプールに対する管理操作が許可されていない)

【機能】

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 mpfid 対象固定長メモリプールの ID 番号
T_RMPF * pk_rmpf 固定長メモリプールの現在状態を入れるパケットへのポインタ

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*固定長メモリプールの現在状態(パケットの内容)

ID wtskid 固定長メモリプールの待ち行列の先頭のタスクの ID 番号
uint_t fblkcnt 固定長メモリプール領域の空きメモリ領域に割り付けることができる固定長メモリブロックの数

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( mpfid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象固定長メモリプールが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象固定長メモリプールに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( 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 型で表され,単位はマイクロ秒である.ただし,実際の精度 はターゲットに依存する.

マルチプロセッサ対応カーネルにおける性能評価用システム時刻の扱いは,ター ゲット定義とする.

システム時刻管理機能に関連するカーネル構成マクロは次の通り.

TIC_NUME タイムティックの周期(単位はミリ秒)の分子
TIC_DENO タイムティックの周期(単位はミリ秒)の分母
TOPPERS_SUPPORT_GET_UTM get_utm がサポートされている

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,時間管理機能をサポートしな い.

【使用上の注意】

タイムティックを通知するためのタイマ割込みが長時間マスクされた場合(タ イマ割込みより優先して実行される割込み処理が長時間続けて実行された場合 を含む)や,シミュレーション環境においてシミュレータのプロセスが長時間 スケジュールされなかった場合には,システム時刻が正しく更新されない可能 性があるため,注意が必要である.

【μ 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 正常終了( E_OK )またはエラーコード
SYSTIM systim システム時刻の現在値

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_systim が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

システム時刻の現在値を参照する.参照したシステム時刻は, p_systim で指定 したメモリ領域に返される.

マルチプロセッサ対応カーネルでローカルタイ マ方式を用いている場合には, 自タスクが割り付けられているプロセッサのシステム時刻の現在値を参照する.

【補足説明】

マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合に,他 のプロセッサのシステム時刻の現在値を参照する機能は用意していない.


get_utm 性能評価用システム時刻の参照〔 TI 〕

【 C言語 API 】

ER ercd = get_utm(SYSUTM *p_sysutm)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
SYSUTM sysutm 性能評価用システム時刻の現在値

【エラーコード】

E_NOSPT 未サポート機能( get_utm がサポートされていない)
E_MACV 〔 P〕 メモリアクセス違反( 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 を用いると,カーネル管理外の割 込みの応答性が低下する.

システム時刻が正しく更新されない状況では, get_ut mは誤った性能評価用シス テム時刻を返す可能性がある.システム時刻の更新が確実に行われることを保 証できない場合には, get_utm が誤った性能評価用システム時刻を返す可能性を 考慮に入れて使用しなければならない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


4.6.2 周期ハンドラ

周期ハンドラは,指定した周期で起動されるタイムイベントハンドラである. 周期ハンドラは,周期ハンドラ ID と呼ぶ ID 番号によって識別する.

各周期ハンドラが持つ情報は次の通り.

  • ・周期ハンドラ属性
  • ・周期ハンドラの動作状態
  • ・次に周期ハンドラを起動する時刻
  • ・拡張情報
  • ・周期ハンドラの先頭番地
  • ・起動周期
  • ・起動位相
  • ・アクセス許可ベクタ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス(マルチプロ セッサ対応カーネルの場合)

周期ハンドラの起動時刻は,後述する基準時刻から,以下の式で求められる相 対時間後である.

起動位相+起動周期× (n - 1) n = 1,2, …

周期ハンドラの動作状態は,動作している状態と動作していない状態のいずれ かをとる.周期ハンドラを動作している状態にすることを動作開始,動作して いない状態にすることを動作停止という.

周期ハンドラが動作している状態の場合には,周期ハンドラを起動する時刻に なると,周期ハンドラの起動処理が行われる.具体的には,拡張情報をパラメー タとして,周期ハンドラが呼び出される.

保護機能対応カーネルにおいて,周期ハンドラが属することのできる保護ドメ インは,カーネルドメインに限られる.

周期ハンドラ属性には,次の属性を指定することができる.

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

TA_STA を指定しない場合,周期ハンドラの生成直後には,周期ハンドラは動作 していない状態となる.

TA_PHS を指定しない場合には,周期ハンドラを動作開始した時刻が,周期ハン ドラを起動する時刻の基準時刻となる. TA_PHS を指定した場合には,周期ハン ドラを生成した時刻(静的 API で生成した場合にはカーネルの起動時刻)が,基 準時刻となる.

次に周期ハンドラを起動する時刻は,周期ハンドラが動作している状態でのみ 有効で,必要に応じて,カーネルの起動時 ,周期ハンドラの動作開始時,周期 ハンドラの起動処理時に設定される.

マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には, 周期ハンドラは,システム時刻管理プロセッサのみが割付け可能プロセッサで あるクラスにのみ属することができる.すなわち,周期ハンドラは,システム 時刻管理プロセッサによって実行される.

C 言語による周期ハンドラの記述形式は次の通り.

void cyclic_handler(intptr_t exinf)  
{  
     周期ハンドラ本体  
}

exinf には,周期ハンドラの拡張情報が渡される.

周期ハンドラ機能に関連するカーネル構成マクロは次の通り.

TNUM_CYCID 登録できる周期ハンドラの数(動的生成対応でないカーネルでは,静的 API によって登録された周期ハンドラの数に一致)

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, TA_PHS 属性の周期ハンドラをサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, TA_PHS 属性の周期ハンドラをサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, TA_PHS 属性の周期ハンドラをサポートしない.

【μ ITRON4.0 仕様との関係】

TNUM_CYCID は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロである.


CRE_CYC 周期ハンドラの生成〔 S〕
acre_cyc 周期ハンドラの生成〔 TD 〕

【静的 API 】

CRE_C YC(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 cycid 生成する周期ハンドラの ID 番号( CRE_CYC の場合)
T_CCYC * pk_ccyc 周期ハンドラの生成情報を入れたパケットへのポインタ(静的 API を除く)

*周期ハンドラの生成情報(パケットの内容)

ATR cyca tr 周期ハンドラ属性
intptr_t exinf 周期ハンドラの拡張情報
CYCHDR cychdr 周期ハンドラの先頭番地
RELTIM cyctim 周期ハンドラの起動周期
RELTIM cycphs 周期ハンドラの起動位相

【リターンパラメータ】

ER_ID cycid 生成された周期ハンドラの ID 番号(正の値)またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ RSATR 予約属性( cycatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( cychdr , cyctim , cycphs が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_ccyc が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられる周期ハンドラ ID がない)
E_OBJ オブジェクト状態エラー( cycid で指定した周期ハンドラが登録済み: CRE_CYC の場合 )

【機能】

各パラメータで指定した周期ハンドラ生成情報に従って,周期ハンドラを生成 する.具体的な振舞いは以下の通り.

cycatr に TA_STA を指定した場合,対象周期ハンドラは動作している状態となる. 次に周期ハンドラを起動する時刻は,サービスコールを呼び出した時刻(静的 API の場合はカーネルの起動時刻)から, cyc phs で指定した相対時間後に設定さ れる.

cycatr に TA_STA を指定しない場合,対象周期ハンドラは動作していない状態に 初期化される.

静的 API においては, cycid はオブジェクト識別名, cycatr , cyctim , cycphs は 整数定数式パラメータ, exinf と cychdr は一般定数式パラメータである.

保護機能対応カーネルにおいて, CRE_CYC は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.また, acre_cyc で,生成する周期ハンドラが属する保護ドメインとしてカーネルドメ イン以外を指定した場合には, E_RSATR エラーとなる.

cyctim は, 0より大きく, TMAX_RELTIM 以下の値でなければならない.また, cycphs は, TMAX_RELTIM 以下でなければならない. cycphs に cyctim より大きい値 を指定してもよい.

マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で, 生成する周期ハンドラの属するクラスの割付け可能プロセッサが,システム時 刻管理プロセッサのみでない場合には, E_RSATR エラーとなる.

【補足説明】

静的 API において, cycatr に TA_STA を, cycphs に 0を指定した場合,周期ハンド ラが最初に呼び出されるのは,カーネル起動後最初のタイムティックになる. cycphs に 1を指定した場合も同じ振舞いとなるため,静的 API で cycatr に TA_STA が指定されている場合には, cycphs に 0を指定することは推奨されず,コンフィ ギュレータが警告メッセージを出力する.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_CYC のみをサポートする.ただし, TA_PHS 属性の周期ハ ンドラはサポートしない.動的生成機能拡張パッケージでは, acre_cyc もサポー トする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_CYC のみをサポートする.ただし, TA_PHS 属性の周期ハ ンドラはサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_CYC のみをサポートする.ただし, TA_PHS 属性の周期ハ ンドラはサポートしない.

【μ ITRON4.0 仕様との関係】

cychdr のデータ型を CYCHDR に変更した.また, cycphs に cyctim より大きい値を 指定した場合の振舞いと,静的 API で cycphs に 0を指定した場合の振舞いを規定 した.


AID_CYC 割付け可能な周期ハンドラ ID の数の指定〔 SD 〕

【静的 API 】

AID_CYC(uint_t nocyc)

【パラメータ】

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

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

nocyc で指定した数の周期ハンドラ ID を,周期ハンドラを生成するサービスコー ルによって割付け可能な周期ハンドラ ID として確保する.

nocyc は整数定数式パラメータである.


SAC_CYC 周期ハンドラのアクセス許可ベクタの設定〔 SP 〕
sac_cyc 周期ハンドラのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_cyc(ID cycid, const ACVCT *p_acvct)

【パラメータ】

ID cycid 対象周期ハンドラの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn 4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( cycid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_CYCの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象周期ハンドラが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象周期ハンドラに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象周期ハンドラは静的 API で生成された: sac_cyc の場合,対象周期ハンドラに対 してアクセス許可ベクタが設定済み: SAC_CYC の場合)

【機能】

cycid で指定した周期ハンドラ(対象周期ハンドラ)のアクセス許可ベクタ( 4 つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する.

静的 API においては, cycid はオブジェクト識別名, acptn1 ~ acptn4 は整数 定数 式パラメータである.

SAC_CYC は,対象周期ハンドラが属する保護ドメイン(この仕様ではカーネルド メインに限られる)の囲みの中に記述しなければならない.そうでない場合に は, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_CYC , sac_cyc をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_CYC , sac_cyc をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_CYC のみをサポートする.


del_cyc 周期ハンドラの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_cyc(ID cycid)

【パラメータ】

ID cycid 対象周期ハンドラの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不 正 ID 番号( cycid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象周期ハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象周期ハンドラに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象周期ハンドラは静的 API で生成された)

【機能】

cycid で指定した周期ハンドラ(対象周期ハンドラ)を削除する.具体的な振舞 いは以下の通り.

対象周期ハンドラの登録が解除され,その周期ハンドラ ID が未使用の状態に戻 される.対象周期ハンドラが動作している状態であった場合には,動作してい ない状態にされた後に,登録が解除される.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_cyc をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_cyc をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_cyc をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, del_cyc をサポートしない.


sta_cyc 周期ハンドラの動作開始〔 T〕

【 C言語 API 】

ER ercd = sta_cyc(ID cycid)

【パラメータ】

ID cycid 対象周期ハンドラの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( cycid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象周期ハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象周期ハンドラに対する通常操作 1が許可されていない)

【機能】

cycid で指定した周期ハンドラ(対象周期ハンドラ)を動作開始する.具体的な 振舞いは以下の通り.

対象周期ハンドラが動作していない状態であれば,対象周期ハンドラは動作し ている状態となる.次に周期ハンドラを起動する時刻は, sta_cyc を呼び出して 以降の最初の起動時刻に設定される.

対象周期ハンドラが動作している状態であれば,次に周期ハンドラを起動する 時刻の再設定のみが行われる.

【補足説明】

TA_PHS 属性でない周期ハンドラの場合,次に周期ハンドラを起動する時刻は, sta_cyc を呼び出してから,対象周期ハンドラの起動位相で指定した相対時間後 に設定される.

対象周期ハンドラが TA_PHS 属性で,動作している状態であれば,次に周期ハン ドラを起動する時刻は変化しない.

【μ ITRON4.0 仕様との関係】

TA_PHS 属性でない周期ハンドラにおいて, sta_cyc を呼び出した後,最初に周期 ハンドラが起動される時刻を変更した.μ ITRON4.0 仕様では, sta_cy cを呼び出 してから周期ハンドラの起動周期で指定した相対時間後となっているが,この 仕様では,起動位相で指定した相対時間後とした.


msta_cyc 割付けプロセッサ指定での周期ハンドラの動作開始〔 TM 〕

【 C言語 API 】

ER ercd = msta_cyc(ID cycid, ID prcid)

【パラメータ】

ID cycid 対象周期ハンドラの ID 番号
ID prcid 周期ハンドラの割付け対象のプロセッサの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(グローバルタイマ方式を用いている場合)
E_ID 不正 ID 番号( cycid , prcid が不正)
E_PAR パラメータエラー(対象周期ハンドラは prcid で指定したプロセッサに割り付けられない)
E_NOEXS 〔 D〕 オブジェクト未登録(対象周期ハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象周期ハ ンドラに対する通常操作 1が許可されていない)

【機能】

prcid で指定したプロセッサを割付けプロセッサとして, cycid で指定した周期 ハンドラ(対象周期ハンドラ)を動作開始する.具体的な振舞いは以下の通り.

対象周期ハンドラが動作していない状態であれば,対象周期ハンドラの割付け プロセッサが prcid で指定したプロセッサに変更された後,対象周期ハンドラは 動作している状態となる.次に周期ハンドラを起動する時刻は, msta_cyc を呼 び出して以降の最初の起動時刻に設定される.

対象周期ハンドラが動作している状態であれば,対象周期ハンドラの割付けプ ロセッサが prcid で指定したプロセッサに変更された後,次に周期ハンドラを起 動する時刻の再設定が行われる.

対象周期ハンドラが実行中である場合には,割付けプロセッサを変更しても, 実行中の周期ハンドラを実行するプロセッサは変更されない.対象周期ハンド ラが変更後の割付けプロセッサで実行されるのは,次に起動される時からであ る.

対象周期ハンドラの属するクラスの割付け可能プロセッサが, prcid で指定した プロセッサを含んでいない場合には, E_PAR エラーとなる.

prcid に TPRC_INI (= 0)を指定すると,対象周期ハンドラの割付けプロセッサ を,それが属するクラスの初期割付けプロセッサとする.

グローバルタイマ方式を用いている場合, msta_cyc は E_NOSPT を返す.

【補足説明】

TA_PH S属性でない周期ハンドラの場合,次に周期ハンドラを起動する時刻は, msta_cyc を呼び出してから,対象周期ハンドラの起動位相で指定した相対時間 後に設定される.

【使用上の注意】

msta_cyc で実行中の周期ハンドラの割付けプロセッサを変更した場合,同じ周 期ハンドラが異なるプロセッサで同時に実行される可能性がある.特に,対象 周期ハンドラ の起動位相が 0の場合に,注意が必要である.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


stp_cyc 周期ハンドラの動作停止〔 T〕

【 C言 語 API 】

ER ercd = stp_cyc(ID cycid)

【パラメータ】

ID cycid 対象周期ハンドラの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( cycid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象周期ハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象周期ハンドラに対する通常操作 2が許可されていない)

【機能】

cycid で指定した周期ハンドラ(対象周期ハンドラ)を動作停止する.具体的な 振舞いは以下の通り.

対象周期ハンドラが動作している状態であれば,動作していない状態になる. 対象周期ハンドラが動作していない状態であれば,何も行われずに正常終了す る.


ref_cyc 周期ハンドラの状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_cyc(ID cycid, T_RCYC *pk_rcyc)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*周期ハンドラの現在状態(パケットの内容)

STAT cycstat 周期ハンドラの動作状態
RELTIM lefttim 次に周期ハンドラを起動する時刻までの相対時間
ID prcid 周期ハンドラの割付けプロセッサの ID (マルチプロセッサ対応カーネルの 場合)

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( cycid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象周期ハンドラが未登録)
E_OAC V〔 P〕 オブジェクトアクセス違反(対象周期ハンドラに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rcyc が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

cycid で指定した周期ハンドラ(対象周期ハンドラ )の現在状態を参照する.参 照した現在状態は, pk_rcyc で指定したパケットに返される.

cycstat には,対象周期ハンドラの現在の動作状態を表す次のいずれかの値が返 される.

TCYC_STP 0x01U 周期ハンドラが動作していない状態
TCYC_STA 0x02U 周期ハンドラが動作している状態

対象周期ハンドラが動作している状態である場合には, lefttim に,次に周期ハ ンドラ起動する時刻までの相対時間が返される.対象周期ハンドラが動作して いない状態である場合には, lefttim の値は保証されない.

マルチプロセッサ対応カーネルでは, prcid に,対象周期ハンドラの割付けプロ セッサの ID 番号が返される.

【使 用上の注意】

ref_cyc はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_cyc を呼び出し,対象周期ハンドラの現在状態を参照した直 後に割込みが発生した場合, ref_cyc から戻ってきた時には対象周期ハンドラの 状態が変化している可能性があるためである.

【μ ITRON4.0 仕様との関係】

TCYC_STP と TCYC_STA を値を変更した.


4.6.3 アラームハンドラ

アラームハンドラは,指定した相対時間後に起動されるタイムイベントハンド ラである.アラームハンドラは,アラームハンドラ ID と呼ぶ ID 番号によって識 別する.

各アラームハンドラが持つ情報は次の通り.

  • ・アラームハンドラ属性
  • ・アラームハンドラの動作状態
  • ・アラームハンドラを起動する時刻
  • ・拡張情報
  • ・アラームハンドラの先頭番地
  • ・アクセス許可ベク タ(保護機能対応カーネルの場合)
  • ・属する保護ドメイン(保護機能対応カーネルの場合)
  • ・属するクラス(マルチプロセッサ対応カーネルの場合)

アラームハンドラの動作状態は,動作している状態と動作していない状態のい ずれかをとる.アラームハンドラを動作している状態にすることを動作開始, 動作していない状態にすることを動作停止という.

アラームハン ドラを起動する時刻は,アラームハンドラを動作開始する時に設 定される.

アラームハンドラが動作している状態の場合には,アラームハンドラを起動す る時刻になると,アラームハンドラの起動処理が行われる.具体的には,まず, アラームハンドラが動作していない状態にされる.その後に,拡張情報をパラ メータとして,アラームハンドラが呼び出される.

保護機能対 応カーネルにおいて,アラームハンドラが属することのできる保護 ドメインは,カーネルドメインに限られる.

マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には, アラームハンドラは,割付け可能プロセッサがシステム時刻管理プロセッサの みであるクラスにのみ属することができる.すなわち,アラームハンドラは, システム時刻管理プロセッサによって実行される.

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 生成するアラームハンドラの ID 番号( CRE_ALMの場合)
T_CALM * pk_calm アラームハンドラの生成情報を入れたパケットへのポインタ(静的 API を除く)

*アラームハンドラの生成情報(パケットの内容)

ATR almatr アラームハンドラ属性
intptr_t exinf アラームハンドラの拡張情報
ALMHDR almhdr アラームハンドラの先頭番地

【リターンパラメータ】

ER_ID almid 生成されたアラームハンドラの ID 番号(正の値)またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( almatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメ ータエラー( almhdr が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_calm が指すメモリ領域への読出しアクセスが許可されていない)
E_NOID 〔 sD 〕 ID 番号不足(割り付けられるアラームハンドラ ID がない)
E_OBJ オブジェクト状態エラー( almid で指定したアラームハンドラが登録済み: CRE_ALM の場合)

【機能】

各パラメータで指定したアラームハンドラ生成情報に従って,アラームハンド ラを生成する.対象アラームハンドラは,動作していない状態に初期化される.

静的 API においては, almid はオブジェクト識別名, almatr は整数定数式パラメー タ, exinf と almhdr は一般定数式パラメータである.

保護機能対応カーネルにおいて, CRE_ALM は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.また, acre_alm で,生成するアラームハンドラが属する保護ドメインとしてカーネル ドメイン以外を指定した場合には, E_RSATR エラーとなる.

マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で, 生成するアラームハンドラの属するクラスの割付け可能プロセッサが,システ ム時刻管理プロセッサのみでない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CRE_ALM のみをサポートする.ただし,動的生成機能拡張パッ ケージでは, acre_alm もサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CRE_ALM のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CRE_ALM のみをサポートする.

【μ ITRON4.0 仕様との関係】

almhdr のデータ型を ALMHDR に変更した.


AID_ALM 割付け可能なアラームハンドラ ID の数の指定〔 SD 〕

【静的 API 】

AID_ALM(uint_t noalm)

【パラメータ】

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

【エラーコード】

E_RSATR 予約 属性(属する保護ドメインまたはクラスが不正)

【機能】

noalm で指定した数のアラームハンドラ ID を,アラームハンドラを生成するサー ビスコールによって割付け可能なアラームハンドラ ID として確保する.

noalm は整数定数式パラメータである.


SAC_ALM アラームハンドラのアクセス許可ベクタの設定〔 SP 〕
sac_alm アラームハンドラのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_ALM(ID almid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_alm(ID almid, const ACVCT *p_acvct)

【パラメータ】

ID almid 対象アラームハンドラの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( almid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_ALMの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象アラームハンドラが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象アラームハンドラに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象アラームハンドラは静的API で生成された: sac_alm の場合,対象アラームハンドラに対してアクセス許可ベクタが設定済み: SAC_ALM の場合)

【機能】

almid で指定したアラームハンドラ(対象アラームハンドラ)のアクセス許可ベ クタ( 4つのアクセス許可パターンの組)を,各パラメータで指定した値に設定 する.

静的 API においては, almid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_ALM は,対象アラームハンドラが属する保護ドメイン(この仕様ではカーネ ルドメインに限られる)の囲みの中に記述しなければならない.そうでない場 合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_ALM , sac_alm をサポートしない.

【 TOPPERS/FMP カーネルにおけ る規定】

FMP カーネルでは, SAC_ALM , sac_alm をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_ALM のみをサポートする.


del_alm アラームハンドラの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_alm(ID almid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( almid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象アラームハンド ラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象アラームハンドラに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象アラームハンドラは静的API で生成された)

【機能】

almi dで指定したアラームハンドラ(対象アラームハンドラ)を削除する.具体 的な振舞いは以下の通り.

対象アラームハンドラの登録が解除され,そのアラームハンドラ ID が未使用の 状態に戻される.対象アラームハンドラが動作している状態であった場合には, 登録解除の前に,アラームハンドラが動作していない状態となる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_alm をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_alm をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_alm をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HR P2 カーネルでは, 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 almid 対象アラームハンドラの ID 番号
RELTIM almtim アラームハンドラの起動時刻(相対時間)

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: sta_alm の場合,タスクコンテキストからの呼出し:ista_alm の場合, CPU ロック状態から の呼出し)
E_ID 不正 ID 番号( almid が不正)
E_PAR パラメータエラー( almtim が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象アラームハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象アラームハンドラに対する通常操作 1が許可されていな い: sta_alm の場合)

【機能】

almid で指定したアラームハンドラ(対象アラームハンドラ)を動作開始する. 具体的な振舞いは以下の通り.

対象アラームハンドラが動作していない状態であれば,対象アラームハンドラ は動作している状態となる.アラームハンドラを起動する時刻は, sta_alm を呼 び出してから, almtim で 指定した相対時間後に設定される.

対象アラームハンドラが動作している状態であれば,アラームハンドラを起動 する時刻の再設定のみが行われる.

almtim は, TMAX_RELTIM 以下でなければならない.


msta_alm 割付けプロセッサ指定でのアラームハンドラの動作開始〔 TM 〕
imsta_alm 割付けプロセッサ指定でのアラームハンドラの動作開始〔 IM 〕

【 C言語 API 】

ER ercd = msta_alm(ID almid, RELTIM almtim, ID prcid)

ER ercd = imsta_alm(ID almid, RELTIM almtim, ID prcid)

【パラメータ】

ID almid 対象アラームハンドラの ID 番号
RELTIM almtim アラームハンドラの起動時刻(相対時間)
ID prcid アラームハンドラの割付け対象のプロセッサのID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: msta_alm の場合,タスクコンテキストからの呼出し: imsta_alm の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(グローバルタイマ方式を用いている場合)
E_ID 不正 ID 番号( almid , prcid が不正)
E_PAR パラメータエラー( almtim が不正,対象アラームハンドラは prcid で指定したプロセッサに割り付けられない)
E_NOEXS 〔 D〕 オブジェクト未登録(対象アラームハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象アラームハンドラに対する通常操作 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を指定する場合に,注意が必要である.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサ ービスコールである.


stp_alm アラームハンドラの動作停止〔 T〕
istp_alm アラームハンドラの動作停止〔 I〕

【 C言語 API 】

ER ercd = stp_alm(ID almid)

ER ercd = istp_alm(ID almid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: stp_alm の場合,タスクコンテキストからの呼出し:istp_alm の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( almid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象アラームハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象アラームハンドラに対する通常操作 2が許可されていない: stp_alm の場合)

【機能】

almid で指定したアラームハンドラ(対象アラームハンドラ)を動作停止する. 具体的な振舞いは以下の通り.

対象アラームハンドラが 動作している状態であれば,動作していない状態とな る.対象アラームハンドラが動作していない状態であれば,何も行われずに正 常終了する.


ref_alm アラームハンドラの状態参照〔 T〕

【 C言語 API 】

ER e rcd = ref_alm(ID almid, T_RALM *pk_ralm)

【パラメータ】

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

【リターンパ ラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*アラームハンドラの現在状態(パケットの内容)

STAT almstat アラームハンドラの動作状態
RELTIM lefttim アラームハンドラを起動する時刻までの相対時間
ID prcid アラームハンドラの割付けプロセッサの ID (マルチプロセッサ対応カーネルの場合)

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( almid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象アラームハンドラが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象アラームハンドラに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_ralm が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

almid で指定したアラームハンドラ(対象アラームハンドラ)の現在状態を参照 する.参照した現在状態は, pk_ralm で指定したパケットに返される.

almstat には,対象アラームハンドラの現在の動作状態を表す次のいずれかの値 が返される.

TALM_STP 0x01U アラームハンドラが動作していない状態
TALM_STA 0x02U アラームハンドラが動作している状態

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

マルチプロセッサ対応カーネルでは, prcid に,対象アラームハンドラの割付け プロセッサの ID 番号が返される.

【使用上の注意】

ref_alm はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_alm を呼び出し,対象アラームハンドラの現在状態を参照し た直後に割込みが発生した場合, ref_alm から戻ってきた時には対象アラームハ ンドラの状態が変化している可能性があるためである.

【μ ITRON4.0 仕様との関係】

TALM_STP と TALM_STA を値を変更した.


4.6.4 オーバランハンドラ

オーバランハンドラは,タスクが使用したプロセッサ時間が,指定した時間を 超えた場合に起動されるタイムイベントハンドラである.オーバランハンドラ は,システムで 1つのみ登録することができる.

オーバランハンドラ機能に関連して,各タスクが持つ情報は次の通り.

  • ・オーバランハンドラ の動作状態
  • ・残りプロセッサ時間

オーバランハンドラの動作状態は,タスク毎に,動作している状態と動作して いない状態のいずれかをとる.残りプロセッサ時間は,オーバランハンドラが 動作している状態の時に,タスクが使用できる残りのプロセッサ時間を表す.

オーバランハンドラの動作状態は,タスクの起動時に,動作していない状態に 初期化される.

残りプロセッサ時間は,オーバランハンドラが動作している状態でタスクが実 行している間,タスクが使用したプロセッサ時間の分だけ減少する.残りプロ セッサ時間が 0になると(これをオーバランと呼ぶ),オーバランハンドラが起 動される.

タスクが使用したプロセッサ時間には,そのタスク自身とタスク例外処理ルー チン,それらから呼び出したサービルコール(拡張 サービスコールを含む)の 実行時間を含む.一方,タスクの実行中に起動されたカーネル管理の割込みハ ンドラ(割込みサービスルーチン,周期ハンドラ,アラームハンドラ,オーバ ランハンドラの実行時間を含む)とカーネル管理の CPU 例外ハンドラの実行時間 は含まないが,割込みハンドラおよび CPU 例外ハンドラの呼出し/復帰にかかる 時間と,それらの入口処理と出口処理の一部の実行時間は含んでしまう.また, タスクの実行中に起動されたカーネル管理外の割込みハンドラとカーネル管理 外の CPU 例外ハンドラの実行時間も含む.

プロセッサ時間は,符号無しの整数型である OVRTIM 型で表し,単位はマイクロ 秒とする.ただし,プロセッサ時間には, OVRTIM 型に格納できる任意の値を指 定できるとは限らず,指定できる値にターゲット定義の上限がある場合がある. プロセッサ時間に指定できる最大値は,構成マ クロ TMAX_OVRTIM に定義されてい る.また,タスクが使用したプロセッサ時間の計測精度はターゲットに依存す る.

保護機能対応カーネルにおいて,オーバランハンドラは,カーネルドメインに 属する.

ターゲット定義で,オーバランハンドラ機能がサポートされていない場合があ る.オーバランハンドラ機能がサポートされている場合には, TOPPERS_SUPPORT_OVRHDR がマクロ定義される.サポートされていない場合にオー バランハンドラ機能のサービスコールを呼び出すと, E_NOSPT エラーが返るか, リンク時にエラーとなる.

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

OVRTIM プロセッサ時間(符号無し整数,単位はマイクロ秒, ulong_tに定義)

オーバランハンドラ属性に指定できる属性はない.そのためオーバランハンド ラ属性には, TA_NULL を指定しなければならない.

C 言語によるオーバランハンドラの記述形式は次の通り.

void overrun_handler(ID tskid, intptr_t exinf)  
{  
     オーバランハンドラ本体  
}

tskid にはオーバランを起こしたタスクの ID 番号が, exinf にはそのタスクの拡 張情報が,それぞれ渡される.

オーバランハンドラ機能に関連するカーネル構成マクロは次の通り.

TMAX_OVRTIM プロセッサ時間に指定できる最大値
TOPPERS_SUPPORT_OVRHDR オーバランハンドラ機能がサポートされている

【使用上の注意】

マルチプロセッサ対応カーネルでは,オーバランハンドラが異なるプロセッサ で同時に実行される可能性があるので,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,オーバランハンドラをサポートしない.ただし,オーバラン ハンドラ機能拡張パッケージを用いると,オーバランハンドラ機能を追加する ことができる.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,オーバランハンドラをサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,オーバランハンドラをサポートする.

【μ ITRON4.0 仕様との関係】

OVRTIM の時間単位は,μ ITRON4.0 仕様では実装定義としていたが,この仕様で はマイクロ秒と規定した.

TMAX_OVRTIM は,μ ITR ON4.0 仕様に規定されていないカーネル構成マクロである.


DEF_OVR オーバランハンドラの定義〔 S〕
def_ovr オーバランハンドラの定義〔 TD 〕

【静的 API 】

DEF_OVR({ ATR ovratr, OVRHDR ovrhdr })

【 C言語 API 】

ER ercd = def_ovr(const T_DOVR *pk_dovr)

【パラメータ】

T_DOVR * pk_dovr オーバランハンドラの定義情報を入れたパケットへのポインタ(静的 API を除く)

*オーバランハンドラの定義情報(パケットの内容)

ATR ovratr オーバランハンドラ属性
OVRHDR ovrhdr オーバランハンドラの先頭番地

【リターンパラメータ】

ER ercd 正常終了( E_O K)またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( ovratr が不正または使用できない,属する保護ドメインかクラスが不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_dovr が指すメモリ領域への読出しアクセスが許可されていない)
E_PAR パラメータエラー( ovrhdr が不正)
E_OBJ オブジェクト状態エラー(条件については機能の項を参照すること)

【機能】

各パラメータで指定したオーバランハンドラ定義情報に従って,オーバランハ ンドラを定義する.ただし, def_ovr において pk_dovr を NULL にした場合には, オーバランハンドラの定義を解除する.

静的 API においては, ovratr は整数定数式パラメータ, ovrhdr は一般定数式パラ メータである.

オーバランハンドラを定義する場合( DEF_OVR の場合および def_ovr において pk_dovr を NULL 以外にした場合)で,すでにオーバランハンドラが定義されてい る場合には, E_OBJ エラーとなる.

保護機能対応カー ネルにおいて, DEF_OVR は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.また, def_ovr でオーバランハンドラを定義する場合には,オーバランハンドラの属す る保護ドメインを設定する必要はなく,オーバランハンドラ属性に TA_DOM(domid) を指定した場合には E_RSATR エラーとなる.ただし, TA_DOM(TDOM_SELF) を指定した場 合には,指定が無視され, E_RSATR エラーは検 出されない.

マルチプロセッサ対応カーネルでは, DEF_OVR は,クラスの囲みの外に記述しな ければならない.そうでない場合には, E_RSATR エラーとなる.また, def_ovr でオーバランハンドラを定義する場合には,オーバランハンドラの属するクラ スを設定する必要はなく,オーバランハンドラ属性に TA_CLS(clsid) を指定した 場合には E_RSATR エラーとなる.ただし, TA_CLS(TCLS_SELF) を指定した場合に は,指定が無視され, E_RSATR エラーは検出されない.

オーバランハンドラの定義を解除する場合( def_ovr において pk_dovr を NULL に した場合)で,オーバランハンドラが定義されていない場合には, E_OBJ エラー となる.

オーバランハンドラの定義を解除すると,オーバランハンドラの動作状態は, すべてのタスクに対して動作していない状態となる.

【使用上の注意】

def_ovr によりオーバランハンドラの定義を解除する場合,サービスコールの処 理時間およびカーネル内での割込み禁止時間が,タスクの総数に比例して長く なる.特に,タスクの総数が多い場合,カーネル内での割込み 禁止時間が長く なるため,注意が必要である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルのオーバランハンドラ機能拡張パッケージでは, DEF_OVR のみをサ ポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, DEF_OVR のみをサポートする.

【μ ITRON4.0 仕様との関係】

ovrhdr のデータ型を OVRHDR に変更した.

def_ovr によって定義済みのオーバランハンドラを再定義しようとした場合に, E_OBJ エラーとすることにした.オーバランハンドラの定義を変更するには,一 度定義を解除してから,再度定義する必要がある.


sta_ovr オーバランハンドラの動作開始〔 T〕
ista_ovr オーバランハンドラの動作開始〔 I〕

【 C言語 API 】

ER ercd = sta_ovr(ID tskid, OVRTIM ovrtim)

ER ercd = ista_ovr(ID tskid, OVRTIM ovrtim)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終 了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: sta_ovr の場合,タスクコンテキストからの呼出し:ista_ovr の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番 号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない: sta_ovr の場合)
E_PAR パラメータエラー( ovrtim が不正)
E_OBJ オブジェクト状 態エラー(オーバランハンドラが定義されていない)

【機能】

tskid で指定したタスク(対象タスク)に対して,オーバランハンドラの動作を 開始する.具体的な振舞いは以下の通り.

対象タスクに対するオーバランハンドラの動作状態は,動作している状態とな り,残りプロセッサ時間は, ovrtim に指定した時間に設定される.対象タスク に対してオーバランハンドラが動作している状態であれば,残りプロセッサ時 間の設定のみが行われる.

sta_ovr において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

ovrtim は, 0より大きく, TMAX_OVRTIM 以下の値でなければならない.

【μ ITRON4.0 仕様との関係】

ista_ovr は,μ ITRON4.0 仕様に定義されていないサービスコールである.


stp_ovr オーバランハンドラの動作停止〔 T〕
istp_ovr オーバランハンドラの動作停止〔 I〕

【 C言語 API 】

ER ercd = stp_ovr(ID tskid)

ER ercd = istp_ovr(ID tskid)

【パラメータ】

ID tskid 対象タスクの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: stp_ovr の場合,タスクコンテキストからの呼出し:istp_ovr の場合, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する通常操作 2が許可されていない: stp_ov rの場合)
E_OBJ オブジェクト状態エラー(オーバランハンドラが定義されていない)

【機能】

tskid で指定したタスク(対象タスク)に対して,オーバランハンドラの動作を 停止する.具体的な振舞いは以下の通り.

対象タスクに対するオーバランハンドラの動 作状態は,動作していない状態と なる.対象タスクに対してオーバランハンドラが動作していない状態であれば, 何も行われずに正常終了する.

stp_ovr において tskid に TSK_SELF (= 0)を指定すると,自タスクが対象タスク となる.

【μ ITRON4.0 仕様との関係】

istp_ovr は,μ ITRON4.0 仕様に定義さ れていないサービスコールである.


ref_ovr オーバランハンドラの状態参照〔 T〕

【 C言語 API 】

ER ercd = ref_ovr(ID tskid, T_ROVR *pk_rovr)

【パラメータ】

ID tskid 対象タスクの ID 番号
T_ROVR * pk_rovr オーバランハンドラの現在状態を入れるパケットへのポインタ

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

*タスクの現在状態(パケットの内容)

STAT ovrstat オーバランハンドラの動作状態
OVRTIM leftotm 残りプロセッサ時間

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック 状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象タスクが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象タスクに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( pk_rovr が指すメモリ領域へ の書込みアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(オーバランハンドラが定義されていない)

【機能】

tskid で指定したタスク(対象タスク)に対するオーバランハンドラの現在状態 を参照する.参照した現在状態は, pk_rovr で指定したメモリ領域に返される.

ovrstat には,対象タスクに対するオーバランハンドラの動作状態を表す次のい ずれかの値が返される.

TOVR_STP 0x01U オーバランハンドラが動作していない状態
TOVR_STA 0x02U オーバランハンドラが動作している 状態

対象タスクに対してオーバランハンドラが動作している状態の場合には, leftotm に,オーバランハンドラが起動されるまでの残りプロセッサ時間が返さ れる.オーバランハンドラが起動される直前には, leftotm に 0が返される可能 性がある.オーバランハンドラが動作していない状態の場合には, leftotm の値 は保証されない.

tskid に TS K_SELF (= 0)を指定すると,自タスクが対象タスクとなる.

【使用上の注意】

ref_ovr はデバッグ時向けの機能であり,その他の目的に使用することは推奨し ない.これは, ref_ovr を呼び出し,対象オーバランハンドラの現在状態を参照 した直後に割込みが発生した場合, ref_ovr から戻ってきた時には対象オーバ ラ ンハンドラの状態が変化している可能性があるためである.

【未決定事項】

マルチプロセッサ対応カーネルにおいて,対象タスクが,自タスクが割付けら れたプロセッサと異なるプロセッサに割り付けられている場合に, leftotm を参 照できるとするかどうかは,今後の課題である.

【μ ITRON4.0 仕様との関係】

TOVR_STP と TOVR_STA を値を変更した.


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_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_SYSの場合)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(カーネルドメイン以外からの呼出し)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモ リ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(システム状態のアクセス許可ベクタが設定済み: SAC_SYS の場合)

【機能】

システム状態のアクセス許可ベクタ( 4つのアクセス許可パターンの組)を,各 パ ラメータで指定した値に設定する.

静的 API においては, acptn1 ~ acptn4 は整数定数式パラメータである.

SAC_SYS は,カーネルドメインの囲みの中に記述しなければならない.そうでな い場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_SYS , sac_sys をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_SYS , sac_sys をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_SYS のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, 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_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: rot_rdq の場合,タスクコンテキストからの呼出し:irot_rdq の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象優先度の最も優先順位が高いタスクが制約タスク)
E_PAR パラメータエラー( tskpri が不正)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 1が許可されていない)

【機能】

tskpri で指定した優先度(対象優先度)を持つ実行できる状態のタスクの中で, 最も優先順位が高いタスクを,同じ優先度のタスクの中で最も優先順位が低い 状態にする.対象優先度を持つ実行できる状態のタスクが無いか 1つのみの場合 には,何も行われずに正常終了する.

rot_rdq において, tskpri に TPRI_SELF (= 0)を指定すると,自 タスクのベース 優先度が対象優先度となる.

対象優先度を持つ実行できる状態のタスクの中で,最も優先順位が高いタスク が制約タスクの場合には, E_NOSPT エラーとなる.

tskpri は, TPRI_SELF であるか( rot_rdq の場合のみ), TMIN_TPRI 以上, TMAX_TPRI 以下でなければならない.

【 TOPPER S/SSP カーネルにおける規定】

SSP カーネルでは, rot_rdq , irot_rdq をサポートしない.


mrot_rdq プロセッサ指定でのタスクの優先順位の回転〔 TM 〕
imrot_rdq プロセッサ指定でのタスクの優先順位の回転〔 IM 〕

【 C言語 API 】

ER ercd = mrot_rdq(PRI tskpri, ID prcid)

ER ercd = imrot_rdq(PRI tskpri, ID prcid)

【パラメータ】

PRI tskpri 回転対象の優先度(対象優先度)
ID prcid 優先順位の回転対象とするプロセッサの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: mrot_rdq の場合,タスクコンテ キストからの呼出し: imrot_rdq の場合, CPU ロック状態からの呼出し)
E_NOSPT 未サポート機能(対象優先度の最も優先順位が高いタスクが制約タスク)
E_ID 不正 ID 番号( prcid が不正)
E_PAR パラメータエラー( tskpr iが不正)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 1が許可されていない)

【機能】

prcid で指定したプロセッサに割り付けられており, tskpri で指定した優先度 (対象優先度)を持つ実行できる状態のタスクの中で,最も優先順位が高いタ スクを,同じ優先度のタスクの中で最も優先順位が低い状態にする.対象優先 度を持つ実行できる状態のタスクが無いか 1つのみの場合には,何も行われずに 正常終了する.

mrot_rdq において, tskpri に TPRI_SELF (= 0)を指定すると,自タスクのベー ス優先度が対象優先度となる.

prcid で指定したプロセッサに割り付けられており,対象優先 度を持つ実行でき る状態のタスクの中で,最も優先順位が高いタスクが制約タスクの場合には, E_NOSPT エラーとなる.

tskpri は, TPRI_SELF であるか( mrot_rdq の場合のみ), TMIN_TPRI 以上, TMAX_TPRI 以下でなければならない.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネル では, mrot_rdq , imrot_rdq をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, mrot_rdq , imrot_rdq をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, mrot_rdq , imrot_rdq をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


get_tid 実行状態のタスク ID の参照〔 T〕
iget_tid 実行状態のタスク ID の参照〔 I〕

【 C言語 API 】

ER ercd = get_tid(ID *p_tskid)

ER ercd = iget_tid(ID *p_tskid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
ID tskid タスク ID

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: get_tid の場合,タスクコンテキストからの呼出し:ige t_tid の場合, CPU ロック状態からの呼出し)
E_MACV 〔 P〕 メモリアクセス違反( p_tskid が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

実行状態のタスク( get_tid の場合には自タスク)の ID 番号を参照する.参照し たタスク ID は, p_tskid で指定したメモリ領域に返され る.

iget_tid において,実行状態のタスクがない場合には, TSK_NONE (= 0)が返さ れる.

マルチプロセッサ対応カーネルにおいては,サービスコールを呼び出した処理 単位を実行しているプロセッサにおいて実行状態のタスクの ID 番号を参照する.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, get_tid をサポートしない.


get_did 実行状態のタスクが属する保護ドメイン ID の参照〔 TP 〕

【 C言語 API 】

ER ercd = get_did(ID *p_domid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
ID domid 保護ドメイン ID

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_MACV メモリアクセス違反( p_domid が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

実行状態のタスク(自タスク)が属する保護ドメインの ID 番号を参照する.参 照した保護ドメイン ID は, p_domid で指定したメモリ領域に返される.

マルチプロセッサ対応カーネルにおいては,サービスコールを呼び出した処理 単位を実行しているプロセッサにおいて実行状態のタスクが属する保護ドメイ ンの ID 番号を参照する.

【 TOPPERS/ASP カーネ ルにおける規定】

ASP カーネルでは, get_did をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, get_did をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, get_did をサポートしない.


get_pid 割付けプロセッサの ID 番号の参照〔 TM 〕
iget_pid 割付けプロセッサの ID 番号の参照〔 IM 〕

【 C言語 API 】

ER ercd = get_pid(ID *p_prcid)

ER ercd = ige t_pid(ID *p_prcid)

【パラメータ】

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

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード
ID prcid プロセッサ ID

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: get_pid の場合,タスクコンテキストからの呼出し:iget_pid の場合, CPU ロック状態からの呼出し)
E_MACV 〔 P〕 メモリアクセス違反( p_prcid が指すメモリ領 域への書込みアクセスが許可されていない)

【機能】

サービスコールを呼び出した処理単位の割付けプロセッサの ID 番号を参照する. 参照したプロセッサ ID は, p_prcid で指定したメモリ領域に返される.

【使用上の注意】

タスクは, get_pid を用いて,自タスク の割付けプロセッサを正しく参照できる とは限らない.これは, get_pid を呼び出し,自タスクの割付けプロセッサの ID 番号を参照した直後に割込みが発生した場合, get_pid から戻ってきた時には 割付けプロセッサが変化している可能性があるためである.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, get_pid , iget_pid をサポートしな い.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, get_pid , iget_pid をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, get_pid , iget_pid をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


loc_cpu CPU ロック状態への遷移〔 T〕
iloc_cpu CPU ロック状態への遷移〔 I〕

【 C言語 API 】

ER ercd = loc_cpu()

ER ercd = iloc_cpu()

【パラメータ】

なし

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキスト エラー(非タスクコンテキストからの呼出し: loc_cpu の場合,タスクコンテキストからの呼出し:iloc_cpu の場合)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 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_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し: unl_cpu の場合,タスクコンテキストからの呼出し:iunl_cpu の場合)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 2が許可されていない: unl_cpu の場合)

【機能】

CPU ロックフラグをクリアし, CPU ロック解除状態へ遷移する. CPU ロック解除状 態で呼び出した場合には,何も行われずに正常終了する.

マルチプロセッサ対応カーネルにおいて, unl_cpu / iunl_cpu を呼び出したプロ セッサによって取得されている状態となっているスピンロックがある場合には, unl_cpu / iunl_cpu によって CPU ロック解除状態に遷移しない(何も行われずに 正常終了する).

【補足説明】

マルチプロセッサ対応カーネルでは, CPU ロック解除状態へ遷移した結果,ディ スパッチ保留状態が解除され,ディスパッチが起こる可能性がある.また,保 護機能対応カーネルとマルチプロセッサ対応カーネルでは,タスク例外処理ルー チンの実行が開始される可能性がある.


dis_dsp ディスパッチの禁止〔 T〕

【 C言語 API 】

ER ercd = dis_dsp()

【パラメータ】

なし

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 1が許可されていない)

【機能】

ディスパッチ禁止フラグをセットし,ディスパッチ禁止状態へ遷移する.ディ スパッチ禁止状態で呼び出した場合には,何も行われずに正常終了する.


ena_dsp ディスパッチの許可〔 T〕

【 C言語 API 】

ER ercd = ena_dsp()

【パラメータ】

なし

【リターンパラメー タ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 1が許可されていない)

【機能】

ディスパッチ禁止フラグをクリアし,ディスパッチ許可状態へ遷移する.ディ スパッチ許可状態で呼び出した場合には,何も行われずに正常終了する.

【補足説明】

ディスパッチ許可状態へ遷移した結果,ディスパッチ保留状態が解除され,ディ スパッチが起こる可能性がある.


sns_ctx コンテキストの参照〔 TI 〕

【 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()

【パラメータ】

なし

【リターンパラメータ】

bool_t state ディスパッチ保留状態

【機能】

ディスパッチ保留状態であるか否かを参照する.具体的な振舞いは以下の通り.

sns_dpn をディスパッチ保留状態で呼び出した場合には true ,ディスパッチ保留 状態でない状態で呼び出した場合には false が返る.


sns_ker カーネル非動作状態の参照〔 TI 〕

【 C言語 API 】

bool_t state = sns_ker()

【パラメータ】

なし

【リターンパラメータ】

bool_t state カーネル非動作状態

【機能】

カーネルが動作中であるか否かを参照する.具体的な振舞いは以下の通り.

sns_ker をカーネルの初期化完了前(初期化ルーチン実行中を含む)または終了 処理開始後(終了処理ルーチン実行中を含む)に呼び出した場合には true ,カー ネルの動作中に呼び出した場合には false が返る.

【使用方法】

sns_ker は,カーネルが動作している時とそうでない時で,処理内容を変えたい 場合に使用する. sns_ker が true を返した場合,他のサービスコールを呼び出す ことはできない. sns_ker が true を返す時に他のサービスコールを呼び出した場 合の動作は保証されない.

【使用上の注意】

どちらの条件で true が返るか間違いやすいので注意すること.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


ext_ker カーネルの終了〔 TI 〕

【 C言語 API 】

ER ercd = ext_ker()

【パラメータ】

なし

【リターンパラメータ】

ER ercd エラーコード

【エラーコード】

E_SYS システムエラー(カーネルの誤動作)
E_OACV 〔 P〕 オブジェクトアクセス違反(カーネルドメイン以外からの呼出し)

【機能】

カーネルを終了する.具体的な振舞いについては,「 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 をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ref_sys をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, ref_sys をサポートしない.


4.8 メモリオブジェクト管理機能

メモリオブジェクト管理機能は,保護機能対応カーネルでのみサポートされる 機能である.保護機能対応でないカーネルでは,メモリオブジェクト管理機能 をサポートしない.

〔メモリリージョン〕

メモリリージョンは,オブジェクトモジュールに含まれるセクションの配置対 象となる同じ性質を持った連続したメモリ領域である.メモリリージョンは, メモリリージョン名によって識別する.

各メモリリージョンが持つ情報は次の通り.

  • ・先頭番地
  • ・サイズ
  • ・メモリリージョン属性

メモリリージョンの先頭番地とサイズには,ターゲット定義の制約が課せられ る場合がある.

メモリリージョン属性には,次の属性を指定することができる.

TA_NOWRITE 0x01U 書込みアクセス禁止
TA_STDROM 0x02U 標準 ROM リージョン
TA_STDRAM 0x04U 標準 RAM リー ジョン

標準 ROM リージョン( TA_STDROM 属性が指定されたメモリリージョン)は, ATT_MOD / ATA_MOD において,書込みアクセスを行わない標準のセクションを配 置するメモリリージョンである.また,標準 RAM リージョン( TA_STDRAM 属性が 指定されたメモリリージョン)は, ATT_MOD / ATA_MOD において,書込みアクセ スを行う標準のセクションを配置するメモリリージ ョンである.

標準 ROM リージョンは,書込みアクセス禁止と扱われる.すなわち, TA_STDROM 属性を指定すれば, TA_NOWRITE 属性も指定したことになる( TA_NOWRITE 属性を 指定しても指定しなくても,同じ振舞いとなる).

ターゲットによっては,ターゲット定義のメモリリージョン属性を指定できる 場合がある.

〔メモリオブジェクト〕

メモリオブジェクトは,保護機能対応カーネルにおいてアクセス保護の対象と する連続したメモリ領域である.メモリオブジェクトは,その先頭番地によっ て識別する.

各メモリオブジェクトが持つ情報は次の通り.

  • ・先頭番地
  • ・サイズ
  • ・メモリオブジェクト属性
  • ・アクセス許可ベクタ
  • ・属する保護ドメイン
  • ・属するクラス(マルチプロセッサ対応カーネルの場合)

メモリオブジェクトの先頭番地とサイズには,ターゲット定義の制約が課せら れる.

メモリオブジェクト属性には,次の属性を指定することができる.

TA_NOWRITE 0x01U 書込みアクセス禁止
TA_NOREAD 0x02U 読出しアクセス禁止
TA_EXEC 0x04U 実行アクセス許可
TA_MEMINI 0x08U メモリの初期化を行う
TA_MEMPRSV 0x10U メモリの初期化を行わない
TA_SDATA 0x20U ショートデータ領域に配置
TA_UNCACHE 0x4 0U キャッシュ禁止
TA_IODEV 0x80U 周辺デバイスの領域

メモリオブジェクトに対して書込みアクセスできるのは,メモリオブジェクト 属性に書込みアクセス禁止( TA_NOWRITE 属性)が指定されておらず,アクセス 許可ベクタにより書込みアクセスが許可されている場合である.また,読出し アクセスできるのは,メモリオブジェクト属性に読出しアクセス禁止( TA_NOREAD 属性)が指定されておらず,アクセス許可ベクタにより読出し・実行アクセス が許可されている場合である.実行アクセスできるのは,メモリオブジェクト 属性に実行アクセス許可( TA_EXEC 属性)が指定されており,アクセス許可ベク タにより読出し・実行アクセスが許可されている場合である.

ただ し,ターゲットハードウェアの制約によってこれらの属性を実現できない 場合には,次のように扱われる.書込みアクセス禁止が実現できない場合には, TA_NOWRITE を指定しても無視される.また,読出しアクセス禁止が実現できな い場合には, TA_NOREAD を指定しても無視される.実行アクセス禁止が実現でき ない場合には, TA_EXEC を指定しなくても実行アクセス許可となり, TA_EXEC は 無視される.どのよう な場合にどの属性の指定が無視されるかは,ターゲット 定義である.

TA_MEMINI 属性は,システム初期化時に初期化するメモリオブジェクトであるこ とを, TA_MEMPRSV 属性は,システム初期化時に初期化を行わないメモリオブジェ クトであることを示す.いずれの属性も指定しない場合,そのメモリオブジェ クトは,システム初期化時にクリア(言い換えると, 0に初期化)される. TA_MEMINI と TA_MEMPRSV の両方を指定した場合には, E_RSATR エラーとなる.

TA_NOWRITE が指定されている場合には, TA_MEMINI と TA_MEMPRSV は無視される (指定しても指定しなくても,同じ振舞いとなる).

TA_MEMINI 属性を設定したメモリオブジェクトを初期化に用いる初期化データは, 標準 ROM リージョンに配置され,メモリ オブジェクトとしては登録されない.

TA_SDATA 属性は,メモリオブジェクトをショートデータ領域に配置することを 示す.具体的な扱いはターゲット定義であるが,ショートデータ領域がサポー トされていないターゲットでは,この属性は無視される.また,ターゲットに よっては, TA_NOWRITE を指定した場合に, TA_SDATA が無視される場合がある.

TA_UNCACHE 属性は,メモリオブジェクトをキャッシュ禁止に設定することを, TA_IODEV 属性は,メモリオブジェクトを周辺デバイスの領域として扱うことを 示す.これらの属性を指定しても意味がないターゲット(例えば,キャッシュ を持たないターゲットプロセッサでの TA_UNCACHE )では,これらの属性は無視 される.逆に,キャッシュ禁止にできないメモリオブジェクトに対して TA_UN CACHE を指定した場合や,周辺デバイスの領域として扱うことができない メモリオブジェクトに対して TA_IODEV を指定した場合には, E_RSATR エラーとな る.

ターゲットによっては,ターゲット定義のメモリオブジェクト属性を指定でき る場合がある.ターゲット定義のメモリオブジェクト属性として,次の属性を 予約している.

TA_WTHR OUGH ライトスルーキャッシュを用いる

〔カーネル構成マクロ〕

メモリオブジェクト管理機能に関連するカーネル構成マクロは次の通り.

TOPPERS_SUPPORT_ATT_MOD ATT_MOD / ATA_MOD がサポートされている
TOPPERS_SUPPORT_ATT_PMA ATT_PMA / ATA_PMA / at t_pma がサポートされている

ただし, att_pma は,動的生成対応カーネルのみでサポートされる API であるた め,サポートされているかを判定するには, TOPPERS_SUPPORT_DYNAMIC_CRE と TOPPERS_SUPPORT_ATT_PMA の両方が定義されていることをチェックする必要があ る.

【補足説明】

メモリオブジェクトが属するクラスは, ATT_MOD / ATA_MOD において,標準のセ クションが配置されるメモリリージョンを決定するためのみに使用される.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,メモリオブジェクト管理機能をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,メモリオブジェクト管理機能をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,メモリオブジェクト管理機能をサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,メ モリオブジェクト管理機能をサポートしない.

【μ ITRON4.0/PX 仕様との関係】

値が 0のメモリオブジェクト属性( TA_RW , TA_CACHE )は,デフォルトの扱いに して廃止した. TA_RO は TA_NOWRITE に改名し, TA_NOREAD , TA_EXEC , TA_MEMINI , TA_MEMPRSV , TA_IODEV を追加した.また, TA_UNCACHE の値を変更し,ターゲッ ト定義のメモリオブジェクト属性として TA_WTHROUGH を予約した.

メモリリージョンは,μ ITRON4.0/PX 仕様にはない概念である.

【仕様決定の理由】

TA_IODEV 属性を導入したのは,ターゲットプロセッサによっては,周辺デバイ スの領域として扱うためには,キャッシュ禁止に加えて,メモリのアクセス順 序を変更しな いことを指定しなければならないためである.メモリのアクセス 順序を変更しないことを指定するメモリオブジェクト属性を,ターゲット定義 で用意してもよいが,それを使うとアプリケーションのポータビリティが下が るため, TA_IODEV 属性を用意することにした.


ATT_REG メモリリージョンの登録〔 SP 〕

【静的 API 】

ATT_REG(" メモリリージョン名 ", { ATR regatr, void *base, SIZE size })

【パラメータ】

" メモリリージョン名 " 登録するメモリリージョンを指定する文字列
void * base 登録するメモリリージョンの先頭番地
SIZE size 登録するメモリリージョンのサイズ(バイト数)

【エラーコード】

E_RSATR 予約属性( regatr が不正または使用できない,保護ドメインの囲みの中に記述)
E_PAR パラメータエラー(メモリリージョン名, base , size が不正)
E_OBJ オブジェクト状態エラー(登録済みのメモリリージョンの再登録,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定したメモリリージョン登録情報に従って,指定したメモリ リージョンを登録する.具体的な振舞いは以下の通り.

base と size で指定したメモリ領域が,メモリリージョンとして登録される.登 録されるメモリリージョンには, regatr で指定したメモリリージョン属性が設 定される.

メモリリージョン名は文字列パラメ ータ, regatr , base , size は整数定数式パ ラメータである.

ATT_MOD / ATA_MOD がサポートされているターゲットでは,標準 ROM リージョンと 標準 RAM リージョンを,それぞれ 1つ登録しなければならない.標準 ROM リージョ ンと標準 RAM リージョンを登録していない場合や,複数登録した場合には, E_OBJ エラーとなる.

マルチプ ロセッサ対応カーネルでは, ATT_REG をクラスの囲みの中に記述すると そのクラス専用のメモリリージョンとなり, ATT_REG をクラスの囲みの外に記述 すると共通のメモリリージョンとなる. ATT_MOD / ATA_MOD がサポートされてい るターゲットでは,共通の標準 ROM リージョンと共通の標準 RAM リージョンを, それぞれ 1つ登録しなければならない.また,あるクラスの囲みの中で ATT_MOD / ATA_MOD を使用する場合には,そのクラス専用の標準 ROM リージョン/標準 RAM リー ジョンを 1つ登録するか,共通の標準 ROM リージョン/標準 RAM リージョンを 1つ 登録しなければならない.これらを登録しない場合や,複数登録した場合には, E_OBJ エラーとなる.

mematr に, TA_STDROM と TA_STDRAM を同時に指定することはできない.指定した 場合には, E_RSATR エラーとなる.

ATT_REG は,保護ドメインの囲みの外に記述しなければならない.そうでない場 合には, E_RSATR エラーとなる.

base や size に,ターゲット定義の制約に合致しない先頭番地やサイズを指定し た時には, E_PAR エラーとなる.また, size が 0の場合には, E_PAR エラーとなる. 登録しようとしたメモリリージョンが,登録済みのメモリリージョンとメモリ 領域が重なる場合には, E_OBJ エラーとなる.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様に定義されていない静的 API である.


ATT_SEC セクションの登録〔 SP 〕
ATA_ SEC セクションの登録(アクセス許可ベクタ付き)〔 SP 〕

【静的 API 】

ATT_SEC(" セクション名 ", { ATR mematr, " メモリリージョン名 " })

ATA_SEC(" セクション名 ", { ATR mematr, " メモリリージョン名 " }, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, A CPTN acptn4 })

【パラメータ】

" セクション名 " 登録するセクションを指定する文字列
  " メモリリージョン名 "する文字列 セクションを配置するメモリリージョンを指定

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【エラーコード】

E_RSATR 予約属性( mematr が不正または使用できない,属するクラスが不正)
E_PAR パラメータエラー(セクション名,メモリリージョン名が不正)
E_OBJ オブジェクト状態エラー(登録済み のセクションの再登録)

【機能】

各パラメータで指定した情報に従って,指定したセクションをカーネルに登録 する.具体的な振舞いは以下の通り.

各オブジェクトモジュールに含まれるセクション名で指定したセクションが, メモリリージョン名で指定したメモリリージョンに配置され,メモリオブジェ クトとして登録される.登録されるメモリオブジェクトには, mematr で指定し たメモリオブジェクト属性が設定される. ATA_SEC の場合には,登録されるメモ リオブジェクトのアクセス許可ベクタ( 4つのアクセス許可パターンの組)が, acptn1 ~ acptn4 で指定した値に設定される.

指定したメモリリージョンが TA_NOWRITE 属性である場合には,メモリオブジェ クト属性に TA_NOWRITE 属性を指定したことになる( TA_NOWRITE 属性を指定して も指定しなくても,同じ振舞いとなる).

mematr に, TA_MEMINI と TA_MEMPRSV を同時に指定することはできない.指定した 場合には, E_RSATR エラーとなる.

登録されるメモリオブジェクトと同じ保護ドメインに属し,メモリオブジェク ト属性 とアクセス許可ベクタがすべて一致するメモリオブジェクトがある場合 には, 1つのメモリオブジェクトにまとめて登録される場合がある.

セクション名とメモリリージョン名は文字列パラメータ, mematr , acptn1 ~ acptn4 は整数定数式パラメータである.

ターゲット定義で, ATA_SEC により登録できるセクションが属する保護ドメイン や登録できる数に制限がある場合が ある.

ATT_MOD / ATA_MOD がサポートされているターゲットでは,セクション名として, 標準のセクションを指定することはできない.指定した場合には, E_PAR エラー となる.

保護ドメイン毎の標準セクションは,コンフィギュレータによってカーネルに 登録されるため, ATT_SEC / ATA_SEC で登録することはできない.セクション名 として 指定した場合には, E_PAR エラーとなる.

マルチプロセッサ対応カーネルにおいて,指定したメモリリージョンがあるク ラス専用のメモリリージョンの場合で, ATT_SEC / ATA_SEC をクラスの囲みの外 に記述するか,他のクラスの囲みの中に記述した場合には, E_RSATR エラーとな る.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様に定義されていない静的 API である.


LNK_SEC セクションの配置〔 SP 〕

【静的 API 】

LNK_SEC(" セクション名 ", { " メモリリージョン名 " })

【パラメータ】

" セクション名 " 配置するセクションを指定する文字列
" メモリリージョン名 " セクションを配置するメモリリージョンを指定する文字列

【エラーコード】

E_RSATR 予約属性(属するクラスが不正)
E_PAR パラメータエラー(セクション名,メモリリージョン名が不正)
E_OBJ オブジェクト状態エラー(登録済みのセクションの再登録)

【機能】

各オブジェクトモジュールに含まれるセクション名で指定したセクションを, メモリリージョン 名で指定したメモリリージョンに配置する.

セクション名として,標準のセクションや保護ドメイン毎の標準セクションを 指定することはできない.指定した場合には, E_PAR エラーとなる.

マルチプロセッサ対応カーネルにおいて,指定したメモリリージョンがあるク ラス専用のメモリリージョンの場合で, LNK_SEC をクラスの囲みの外に記述する か,他のクラスの囲みの中に記述した場合には, E_RSATR エラーとなる.

【使用上の注意】

LNK_SEC により配置されたセクションは,メモリオブジェクトとしてカーネルに 登録されず,メモリ保護が実現できる先頭番地とサイズになるとは限らない.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0 /PX 仕様に定義されていない静的 API である.


ATT_MOD オブジェクトモジュールの登録〔 SP 〕
ATA_MOD オブジェクトモジュールの登録(アクセス許可ベクタ付き)〔 SP 〕

【静的 API 】

ATT_MOD(" オブジェ クトモジュール名 ")

ATA_MOD(" オブジェクトモジュール名 ", { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【パラメータ】

" オブジェクトモジュール名 " 登録するオブジェクトモジュールを指定する文字列

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【エラーコード】

E_RSATR 予約属性( mematr が不正または使用できない)
E_NOSPT 未サポート機能( ATT_MOD / ATA_MOD がサポートされていない)
E_OBJ オブジェクト状態エラー(登録済みのオブジェクトモジュールの再登録)

【機能】

各パラメータで指定した情報に従って,指定したオブジェクトモジュールをカー ネルに登録する.具体的な振舞いは以下の通り.

オブジェクトモジュール名で指定したオブジェクトモジュールに含まれる標準 のセクションの内,書込みアクセスを行わないセクションは標準 ROM リージョン に,書込みアクセスを行うセクションは標準 RAM リージョンに配置され,メモリ オブジェクトとして登録される.登録されるメモリオブジェクトには,ターゲッ ト定義でセクション毎に定まるメモリオブジェクト属性が設定される. ATA_MOD の場合には,登録されるメモリオブジェクトのアクセス許可ベクタ( 4つのアク セス許可パターンの組)が, acptn1 ~ acptn4 で指定した値に設定される.

マルチプロセッサ対応カーネルでは, ATT_MOD / ATA_MOD を,クラスの囲みの外 に記述することも,クラスの囲みの中に記述することもできる. ATT_MOD / ATA_MOD をクラスの囲みの外に記述した場合,標準のセクションが配置されるメ モリリージョンは,共通の標準 ROM リージョン/標準 RAM リージョンとなる.ク ラスの囲みの中に 記述した場合,そのクラス専用の標準 ROM リージョン/標準 RAM リージョンが登録されていればそのリージョン,登録されていなければ共通 の標準 ROM リージョン/標準 RAM リージョンとなる.

登録されるメモリオブジェクトと同じ保護ドメインに属し,メモリオブジェク ト属性とアクセス許可ベクタがすべて一致するメモリオブジェクトがある場合 には, 1つのメモリオブジェクトにまとめて登録される場合がある.

オブジェクトモジュール名は文字列パラメータ, acptn1 ~ acptn4 は整数定数式 パラメータである.

ターゲット定義で, ATA_MOD により登録できるオブジェクトモジュールが属する 保護ドメインや登録できる数に制限がある場合がある.

ターゲット定義で, ATT_ MOD / ATA_MOD がサポートされていない場合がある. ATT_MOD / ATA_MOD がサポートされている場合には, TOPPERS_SUPPORT_ATT_MOD が マクロ定義される.サポートされていない場合に ATT_MOD / ATA_MOD を使用する と,コンフィギュレータが E_NOSPT エラーを報告する.

【補足説明】

各セクションが配置されるメモリリージョンと それに設定されるメモリオブジェ クト属性は,例えば,プログラムコードを含むセクションであれば,フラッシュ メモリのメモリリージョンに配置し,書込みアクセス禁止のメモリオブジェク ト属性が設定されるというように,ターゲットシステム毎に定められる.

ATT_MOD / ATA_MOD では,標準のセクション以外は配置・登録されない.標準の セクション以外のセクションを配置・登録するためには, ATT _SEC/ATA_SEC を用 いる必要がある.

【μ ITRON4.0/PX 仕様との関係】

オブジェクトモジュールに含まれるセクションの配置場所が,標準 ROM リージョ ンと標準 RAM リージョンであることを明確化した.


ATT_MEM メモリオブジェクトの登録〔 SP 〕
ATA_MEM メモリオブジェクトの登録(アクセス許可ベクタ付き)〔 SP 〕
att_mem メモリオブジェクトの登録〔 TPD 〕

【静的 API 】

ATT_MEM({ ATR mematr, void *base, SIZE size })

ATA_MEM({ ATR mematr, void *base, SIZE size }, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = att_mem(const T_AMEM *pk_amem)

【パラメータ】

T_AMEM * pk_a mem メモリオブジェクトの登録情報を入れたパケットへのポインタ(静的 API を除く)

*メモリオブジェクトの登録情報(パケットの内容)

ATR mematr メモリオブジェクト属性
void * base 登録するメモリ領域の先頭番地
SIZE size 登録するメモリ領域のサイズ(バイト数)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( mematr が不正または使用できない,属する保護ドメインが不正)
E_NOSPT 未サポート機能(条件はターゲット定義)
E_PAR パラメータエラー( base , size が不正)
E_OACV 〔 sP 〕 オブジェク トアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_amem が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(登録済みのメモリオブジェクトと メモリ領域が重なる)

【機能】

各パラメータで指定したメモリオブジェクト登録情報に従って,メモリオブジェ クトを登録する.具体的な振舞いは以下の通り.

base と size で指定したメモリ領域が,メモリオブジェクトとして登録される. 登録されるメモリオブジェクトには, mematr で指定したメモリオブジェクト属 性が設定される. ATA_MEM の場合には,登録されるメモリオブジェクトのアクセ ス許可ベクタ( 4つのアクセス許可パターンの組)が, acptn1 ~ acptn4 で指定し た値に設定される.

mematr には, TA_MEMPRSV を指定しなければならず, TA_MEMINI を指定することは できない. TA_MEMPRSV を指定しない場合や, TA_MEMINI を指定した場合には, E_RSATR エラーとなる.

静的 API においては, mematr , size , acptn1 ~ acptn4 は整数定数式パラメータ, base は一般定数式パラメータである.

ターゲット定義で, ATT_MEM / ATA_MEM により登録できるメモリオブジェクトが 属する保護ドメインや登録できる数に制限がある場合がある.

base や size に,ターゲット定義の制約に合致しない先頭番地や サイズを指定し た時には, E_PAR エラーとなる.また, size が 0の場合には, E_PAR エラーとなる. 登録しようとしたメモリオブジェクトが,登録済みのメモリオブジェクトとメ モリ領域が重なる場合には, E_OBJ エラーとなる.

【使用上の注意】

ATT_MEM / ATA_MEM は,ユーザタスクからメモリ空間にマッピングされた I/O 領域 にアクセス できるようにするために使用することを想定した静的 API である.メ モリ領域に対しては, ATT_SEC / ATA_SEC か ATT_MOD / ATA_MOD を使用することを 推奨する.

ATT_MEM / ATA_MEM で登録したメモリオブジェクトのメモリ領域が, ATT_REG で登 録したメモリリージョンと重なっても,直ちにエラーとはならない.ただし, メモリリージョン内に配置されたメモリオブジェク トと, ATT_MEM / ATA_MEM で 登録したメモリオブジェクトのメモリ領域が重なった場合には, E_OBJ エラーと なる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ATT_MEM と ATA_MEM のみをサポートする.

【μ ITRON4.0/PX 仕様との関係】

アクセス許可ベクタを指定してメモリオブジェクトを登録するサービスコール ( ata_mem )は廃止した.

base や size がターゲット定義の制約に合致しない場合,μ ITRON4.0/PX 仕様では ターゲット定義の制約に合致するようにメモり領域を広げることとしていたが, この仕様では E_PAR エラーとなることとした.


ATT_PMA 物理メモリ領域の登録〔 SP 〕
ATA_PMA 物理メモリ領域の登録(アクセス許可ベクタ付き)〔 SP 〕
att_pma 物理メモリ領域の登録〔 TPD 〕

【静的 API 】

ATT_PMA({ ATR mematr, void *base, SIZE size , void *paddr })

ATA_PMA({ ATR mematr, void *base, SIZE size, void *paddr }, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = att_pma(const T_APMA *pk _apma)

【パラメータ】

T_APMA * pk_apma 物理メモリ領域の登録情報を入れたパケットへのポインタ(静的 API を除く)

*物理メモリ領域の登録情報(パケットの内容)

ATR mematr メモリオブジェクト属性
void * base 登録するメモリ領域の先頭番地
SIZE size 登録するメモリ領域のサイズ(バイト数)
void * paddr 登録するメモリ領域の物理アドレスの先頭番地

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK ) またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( mematr が不正または使用できない,属する保護ドメインが不正)
E _NOSPT 未サポート機能(条件はターゲット定義)
E_PAR パラメータエラー( base , size , paddr が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_apma が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(登録済みのメモリオブジェクトとメモリ領域が重なる)

【機能】

各パラメータで指定した物理メモリ領域の登録情報に従って,メモリオブジェ クトを登録する.具体的な振舞いは以下の通り.

物理アドレス空間において先頭番地が paddr ,サイズが size のメモリ領域が,論 理アドレス空間において base で指定した番地からアクセスできるように,メモ リオブジェクトとして登録される.登録されるメモリオブジェクトには, mematr で指定したメモリオブジェクト属性が設定される. ATA_PMA の場合には, 登録されるメモリオブジェクトのアクセス許可ベクタ( 4つのアクセス許可パター ンの組)が, acptn1 ~ acptn4 で指定した値に設定される.

mematr には, TA_MEMPRSV を指定しなければならず, TA_MEMINI を指定することは できない. TA_MEMPRSV を指定しない場合や, TA_MEMINI を指定した場合には, E_RSATR エラーとなる.

静的 API においては, mematr , size , paddr , acptn1 ~ acptn4 は整数定数式パラ メータ, base は一般定数式パラメータである.

ターゲット定義で, ATT_PMA / ATA_PMA により登録できるメモリオブジェクトが 属する保護ドメインや登録できる数に制限がある場合がある.

base , size , paddr に,ターゲット定義の制約に合致しない先頭番地やサイズを 指定した時には, E_PAR エラーとなる.また, size が 0の場合には, E_PAR エラー となる.登録しようとしたメモリオブジェクトが,登録済みのメモリオブジェ クトと論理アドレス空間においてメモリ領域が重なる場合には, E_OBJ エラーと なる.

ATT_PMA / ATA_PMA / att_pma は, MMU ( Memory Management Unit )を持つターゲッ トシステムにおいて,ターゲット定義でサポートされる機能である. ATT_PMA / ATA_PMA / att_pma がサポートされている場合には, TOPPERS_SUPPORT_ATT_PMA が マクロ定義される. ATT_PMA / ATA_PMA がサポートされていない場合にこれらの 静的 API を使用すると,コンフィギュレータが E_NOSPT エラーを報告する.また, att_pma がサポートされていない場合に att_pma を呼び出すと, E_NOSPT エラーが 返るか,リンク時にエラーとなる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,ターゲット定義で, ATT_PMA と ATA_PMA のみをサポートする.

【μ ITRON4.0/PX 仕様との関係】

μ ITRON4.0/PX 仕様に定義されていない静的 API およびサービスコールである.


sac_mem メモリオブジェクトのアクセス許可ベクタの設定〔 TPD 〕

【 C言語 API 】

ER ercd = sac_mem(const void *base, const ACVCT *p_acvct)

【パラメータ】

void * base メモリオブジェクトの先頭番地
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアクセス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_PAR パラメータエラー( base が不正)
E_NOEXS 〔 D〕 オブジェクト未登録( base で指定した番地を含むメモリオブジェクトが登録されていない)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象メモリオブジェクトに対する管理操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象メモリオブジェ クトは静的API で登録された)

【機能】

base で指定したメモリオブジェクト(対象メモリオブジェクト)のアクセス許 可ベクタ( 4つのアクセス許可パターンの組)を,各パラメータで指定した値に 設定する.

静的 API によって登録したメモリオブジェクトは,アクセス許可ベクタを設定す ることができない.アクセス許可ベクタを設定しようとした場合には, E_OBJ エ ラーとなる.

base に,メモリオブジェクトの先頭番地以外を指定した場合には, E_PAR エラー となる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, sac_mem をサポートしない.

【μ ITRON4.0/PX 仕様との関係】

静的 API によって登録したメモリオブジェクトは,アクセス許可ベクタを設定す ることができないこととした.

μ ITRON4.0/PX 仕様では, base はメモリオブジェクトに含まれる番地を指定する ものとしていたが,この仕様では,メモリオブジェクトの先頭番地でなければ ならないものとした.


det_mem メモリオブジェクトの登録解除〔 TPD 〕

【 C言語 API 】

ER ercd = det_mem(const void *base)

【パラメータ】

void * base メモリオブジェクトの先頭番地

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_PAR パラメータエラー( base が不正)
E_NOEXS 〔 D〕 オブジェクト未登録( base で指定される番地を含むメモリオブジェクトが登録されていない)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象メモリオブジェクトに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象メモリオブジェクトは静的API で登録された)

【機能】

base で指定したメモリオブジェクト(対象メモリオブジェクト)を登録解除す る.

静的 API によって登録したメモリオブジェクトは,登録を解除することができな い.登録を解除しようとした場合には, E_OBJ エラーとなる.

base に,メモリオブジェクトの先頭番地以外を指定した場合には, E_PAR エラー となる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, det_mem をサポートしない.

【μ ITRON4.0/PX 仕様との関係】

静的 API によって登録したメモリオブジェクトは,登録を解除することができな いこととした.

μ ITRON4.0/PX 仕様では, base はメモリオブジェクトに含まれる番地を指定する ものとしていたが,この仕様では,メモリオブジェクトの先頭番地でなければ ならないものとした.


prb_mem メモリ領域に対するアクセス権のチェック〔 TP 〕

【 C言語 API 】

ER ercd = prb_mem(const void *base, SIZE size, ID tskid, MODE pmmode)

【パラメータ】

void * base メモリ領域の先頭番地
SIZE size メモリ領域のサイズ(バイト数)
ID tskid アクセス元のタスクの ID 番号
MODE pmmode アクセスモード

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( tskid が不正)
E_P AR パラメータエラー( base , size , pmmode が不正)
E_NOEXS 〔 D〕 オブジェクト未登録( base で指定される番地を含むメモリオブジェクトが登録されていない)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象メモリ領域を含むメモリオブジェクトに対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反(対象メモリ領域へのアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象メモリ領域がメモリオブジェクトの境界を越えている)

【機能】

tskid で指定したタスクから, base と size で指定したメモリ領域(対象メモリ領 域)に対して, pmmode で指定した種別のアクセスが許可されているかをチェッ クする.アクセスが許可されている場合に E_OK ,そうでない場合に E_MACV が返 る. tskid で指定したタスクがカーネルドメインに属する場合, E_MACV が返るこ とはない.

pmmode には, TPM_W RITE (= 0x01U ), TPM_READ (= 0x02U ), TPM_EXEC (= 0x04U )のいずれか,またはそれらの内のいくつかのビット毎論理和( C言語の "|" )を指定することができる. TPM_WRITE , TPM_READ , TPM_EXEC を指定した場 合には,それぞれ,読出しアクセス,書込みアクセス,実行アクセスが許可さ れているかをチェックする.また,いくつかのビット毎論理和を指定した場合 には,そ れらに対応した種別のアクセスがすべて許可されているかをチェック する.

tskid に TSK_SELF (= 0)を指定すると,自タスクから対象メモリ領域に対して アクセスが許可されているかをチェックする.

size が 0の場合には, E_PAR エラーとなる.

【μ ITRON4.0/PX 仕様との関係】

アクセスす る主体の指定方法を,保護ドメインによる指定( domid )から,タス クによる指定( tskid )に変更した.また, pmmode に指定できるアクセス種別に TPM_EXEC を追加し, TPM_WRITE と TPM_READ の値を入れ換えた.


ref_mem メモリオブジェクトの状態参照〔 TP 〕

【 C言語 API 】

ER ercd = ref_mem(const void *base, T_RMEM *pk_rmem)

☆未完成

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ref_mem をサポートしな い.


4.9 割込み管理機能

割込み処理のプログラムは,割込みサービスルーチン( ISR )として実現するこ とを推奨する.割込みサービスルーチンをカーネルに登録する場合には,まず, 割込みサービスルーチンの登録対象となる割込み要 求ラインの属性を設定して おく必要がある.割込みサービスルーチンは,カーネル内の割込みハンドラを 経由して呼び出される.

ただし,カーネルが用意する割込みハンドラで対応できないケースに対応する ために,アプリケーションで割込みハンドラを用意することも可能である.こ の場合にも,割込みハンドラをカーネルに登録する前に,割込みハンドラの登 録対象となる割込みハンドラ番号に 対応する割込み要求ラインの属性を設定し ておく必要がある.

割込み要求ラインの属性を設定する際に指定する割込み要求ライン属性には, 次の属性を指定することができる.

TA_ENAINT 0x01U 割込み要求禁止フラグをクリア
TA_EDGE 0x02U エッジトリガ

ターゲットによっては,ターゲット定義の割込み要求ライン属性を指定できる 場合がある.ターゲット定義の割込み要求ライン属性として,次の属性を予約 している.

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

割込みサービスルーチンは,カーネルが実行を制御する処理単位である.割込 み サービスルーチンは,割込みサービスルーチン 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(vo id)  
{  
     割込みハンドラ本体  
}

割込み管理機能に関連するカーネル構成マクロは次の通り.

TMIN_INTPRI 割込み優先度の最小値(最高値)
TMAX_INTPRI 割込み優先度の最大値(最低値,= -1)
TMIN_ISRPRI 割込みサービスルーチン優先度の最小値(= 1)
TMAX_ISRPRI 割込みサービスルーチン優先度の最大値
TOPPERS_SUPPORT_DIS_INT dis_int がサポートされている
TOPPERS_SUPPORT_ENA_INT ena_int がサポートされている

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,割込みサービスルーチン優先度の最大値(= TMAX_ISRPRI ) は 16 に固定されている.ただし,タスク優先度拡張パッケージでは, TMAX_ISRPRI を 256 に拡張する.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,割込みサービスルーチン優先度の最大値( = TMAX_ISRPRI ) は 16 に固定されている.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,割込みサービスルーチン優先度の最大値(= TMAX_ISRPRI ) は 16 に固定されている.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,割込みサービスルーチン優先度の最大値(= TMAX_ISRPRI ) は 16 に固定されている.

【μ ITRON4.0 仕様との関係】

割込み要求ラインの属性,割込み優先度,割込みサービスルーチン優先度は, μ ITRON4.0 仕様にない概念であり, TMIN_INTPRI , TMAX_INTPRI , TMIN_ISRPRI , TMAX_IS RPRI は,μ ITRON4.0 仕様に定義のないカーネル構成マクロである.また, TA_NONKERNEL は,μ ITRON4.0 仕様に定義のない割込みハンドラ属性である.


CFG_INT 割込み要求ラインの属性の設定〔 S〕
cfg_int 割込み要求ラインの属性の設定〔 TD 〕

【静的 API 】

CFG_INT(INTNO intno, { ATR intatr, PRI intpri })

【 C言語 API 】

ER ercd = cfg_int(INTNO intno, const T_CINT *pk_cint)

【パラメ ータ】

INTNO intno 割込み番号
T_CINT * pk_cint 割込み要求ラインの属性の設定情報を入れたパケットへのポインタ(静的 API を除く)

*割込み要求ラインの属性の設定情報(パケットの内容)

ATR intatr 割込み要求ライン属性
PRI intpri 割込み優先度

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タス クコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( intatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されて いない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cint が指すメモリ領域への読出しアクセスが許可されていない)
E_PAR パラメータエラー( intno , intpri が不正)
E_OBJ オブジェクト状態エラー(対象割込み要求ラインに対してすでに属 性が設定されている: CFG_INT の場合,カーネル管理の割込みか否かと intpri の値が整合していない)

【機能】

intno で指定した割込み要求ライン(対象割込み要求ライン)に対して,各パラ メータで指定した属性を設定する.

対象割込み要求ラインの割込み要求禁止フラグは, intatr に TA_ENAIN Tを指定し た場合にクリアされ,指定しない場合にセットされる.

静的 API においては, intno , intatr , intpri は整数定数式パラメータである.

cfg_int において,ターゲット定義で,複数の割込み要求ラインの割込み優先度 が連動して設定される場合がある.

CFG_INT において,対象割込み要求ラインに対してすでに属性が設定されている 場合(言い換えると,同じ割込み番号に対する CFG_INT が複数ある場合)には, E_OBJ エラーとなる.

intpri に指定できる値は,基本的には, TMIN_INTPRI 以上, TMAX_INTPRI 以下の 値である.ターゲット定義の拡張で,カーネル管理外の割込み要求ラインに対 しても属性を 設定できる場合には, TMIN_INTPRI よりも小さい値を指定すること ができる.このように拡張されている場合,カーネル管理外の割込み要求ライ ンを対象として, intpri に TMIN_INTPRI 以上の値を指定した場合には, E_OBJ エ ラーとなる.逆に,カーネル管理の割込み要求ラインを対象として, intpri が TMIN_INTPRI よりも小さい値である場合にも, E_OBJ エラーとなる.

対象割込み要求ラインに対して,設定できない割込み要求ライン属性を intatr に指定した場合には E_RSATR エラー,設定できない割込み優先度を intpri に指定 した場合には E_PAR エラーとなる.ここで,設定できない割込み要求ライン属性/ 割込み優先度には,ターゲット定義の制限によって設定できない値も含む.ま た,マルチプロセッサ対応カーネルにおいて, cfg_int を呼び出したタスクが割 り付けられて いるプロセッサから,対象割込み要求ラインの属性を設定できな い場合も,これに該当する.

保護機能対応カーネルにおいて, CFG_INT は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.また, cfg_int はカーネルオブジェクトを登録するサービスコールではないため,割込 み要求ライン属性に TA_DOM(domid) を指定した場合には E_RSATR エラーとなる. ただし, TA_DOM(TDOM_SELF) を指定した場合には,指定が無視され, E_RSATR エ ラーは検出されない.

マルチプロセッサ対応カーネルで, CFG_INT の記述が,対象割込み要求ラインに 対して登録された割込みサービスルーチン(または対象割込み番号に対応する 割込みハンドラ番号に対して登録された割込みハンドラ)と異なるクラスの囲 み中にある場合には, E_RSATR エラーとなる.

【補足説明】

ターゲット定義の制限によって設定できない割込み要求ライン属性/割込み優 先度は,主にターゲットハードウェアの制限から来るものである.例えば,対 象割込み要求ラインに対して,トリガモードや割込み優先度が固定されていて, 変更できないケースが考えられる.

cfg_int において,ターゲット定義で,複数の割込み要求ラインの割込み優先度 が連動して設定されるのは,ターゲットハードウェアの制限により,異なる割 込み要求ラインに対して,同一の割込み優先度しか設定できないケースに対応 するための仕様である.この場合, CFG_INT においては,同一の割込み優先度し か設定できない割込み要求ラインに対して異なる割込み優先度を設定した場合 には, E_PAR エラーとな る.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, CFG_INT のみをサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, CFG_INT のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, CFG_INT のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, CFG_INT のみをサポートする.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていない静的 API およびサービスコールである.


CRE_ISR 割込みサービスルーチンの生成〔 S〕
ATT_ISR 割込みサービスルーチンの追加〔 S〕
acre_isr 割込みサービスルーチンの生成〔 TD 〕

【静的 API 】

CRE_ISR(ID isrid, { ATR isratr, in tptr_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(c onst T_CISR *pk_cisr)

【パラメータ】

ID isrid 対象割込みサービスルーチンの ID 番号( CRE_ISRの場合)
T_CISR * pk_cisr 割込みサービスルーチンの生成情報を入れたパケットへのポインタ(静的 API を除く)

*割込みサービスルーチンの生成情報(パケットの内容)

ATR isratr 割込みサービスルーチン属性
intptr_t exinf 割込みサービスルーチンの拡張情報
INTNO intno 割込みサービスルーチンを登録する割込み番号
ISR isr 割込みサービスルーチンの先頭番地
PRI isrpri 割込みサービスルーチン優先度

【リターンパラメータ】

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

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( isratr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( intno , isr , isrpri が不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_cisr が指すメモリ領域への読出しアクセスが許可されていない)
E_NO ID 〔 sD 〕 ID 番号不足(割り付けられる割込みサービスルーチン IDがない)
E_OBJ オブジェクト状態エラー( isrid で指定した割込みサービスルーチンが登録済み: CRE_ISR の場合,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定した割込みサービスルーチン生成情報に従って,割込みサー ビスルーチンを生成する.

ATT_ISR によって生成された割込みサービスルーチンは, ID 番号を持たない.

intno で指定した割込み要求ラインの属性が設定されていない場合には, E_OBJ エラーとなる.また, intno で指定した割込み番号に対応する割込みハンドラ番 号に対して,割込みハンドラを定義する機能( DEF_INH , def_inh )によって割 込みハンドラが定義されている場合にも, E_OBJ エラーとなる.さらに, intno でカーネル管理外の割込みを指定した場合にも, E_OBJ エラーとなる.

静的 API においては, isrid はオブジェクト識別名, isratr , int no , isrpri は整 数定数式パラメータ, exinf と isr は一般定数式パラメータである.

保護機能対応カーネルにおいて, CRE_ISR および ATT_ISR は,カーネルドメイン の囲みの中に記述しなければならない.そうでない場合には, E_RSATR エラーと なる.また, acre_isr で,生成する割込みサービスルーチンが属する保護ドメ インとしてカーネルドメイン以外を指定した場合には, E_RSATR エラーとなる.

マルチプロセッサ対応カーネルで,生成する割込みサービスルーチンの属する クラスの割付け可能プロセッサが, intno で指定した割込み要求ラインが接続さ れたプロセッサの集合に含まれていない場合には, E_RSATR エラーとなる.また, intno で指定した割込み要求ラインに対して登録済みの割込みサービスルーチン がある場合に,生成する割込みサービスルーチンがそれ と異なるクラスに属す る場合にも, E_RSATR エラーとなる.さらに,ターゲット定義で,割込みサービ スルーチンが属することができるクラスに制限がある場合がある.生成する割 込みサービスルーチンの属するクラスが,ターゲット定義の制限に合致しない 場合にも, E_RSATR エラーとなる.

isrpri は, TMIN_ISRPRI 以上, TMAX_ISRPRI 以下でなければならない.

静的 API において, isr が不正である場合に E_PAR エラーが検出されるか否かは, ターゲット定義である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, ATT_ISR のみをサポートする.ただし,動的生成機能拡張パッ ケージでは, acre_isr もサポートする.

【 TOPPERS/ FMP カーネルにおける規定】

FMP カーネルでは, ATT_ISR のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ATT_ISR のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, ATT_ISR のみをサポートする.

【μ ITRON4.0 仕様との関係】

割込みサービスルーチンの生成情報に, isrpri (割込みサービスルーチンの割 込み優先度)を追加した. CRE_ISR は,μ ITRON4.0 仕様に定義されていない静的 API である.


AID_ISR 割付け可能な割込みサービスルーチン ID の数の指定〔 SD 〕

【静的 API 】

AID_ISR(uint_t noisr)

【パラメータ】

uint_t noisr 割付け可能な割込みサービスルーチン ID の数

【エラーコード】

E_RSATR 予約属性(属する保護ドメインまたはクラスが不正)

【機能】

noisr で指定した数の割込みサービスルーチン ID を,割込みサービスルーチンを 生成するサービスコールによって割付け可能な割込みサービスルーチン ID とし て確保する.

noisr は整数定数式パラメータである.


SAC_ISR 割込みサービスルーチンのアクセス許可ベクタの設定〔 SP 〕
sac_isr 割込みサービスルーチンのアクセス許可ベクタの設定〔 TPD 〕

【静的 API 】

SAC_ISR(ID isrid, { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })

【 C言語 API 】

ER ercd = sac_isr(ID isrid, const ACVCT *p_acvct)

【パラメータ】

ID isrid 対象割込みサービスルーチンの ID 番号
ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポインタ(静的 API を除く)

*アクセス許可ベクタ(パケットの内容)

ACPTN acptn1 通常操作 1のアク セス許可パターン
ACPTN acptn2 通常操作 2のアクセス許可パターン
ACPTN acptn3 管理操作のアクセス許可パターン
ACPTN acptn4 参照操作のアクセス許可パターン

【リターンパラメータ】

ER ercd 正常終了( E_OK )または エラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( isrid が不正)
E_RSATR 予約属性(属する保護ドメインかクラスが不正: SAC_ISRの場合)
E_NOEXS 〔 D〕 オブジェクト未登録(対象割込みサービスルーチンが未登録)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(対象割込みサービスルーチンに対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( p_acvct が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(対象割込みサービスルーチンは静的 API で生成された: sac_isr の場合,対象割込みサービスルーチンに対してアクセス許可ベクタが設定済み:SAC_ISR の場合)

【機能】

isrid で指定した割込みサービスルーチン(対象割込みサービスルーチン)のア クセス許可ベクタ( 4つのアクセス許可パターンの組)を,各パラメータで指定 した値に設定する.

静的 API においては, isrid はオブジェクト識別名, acptn1 ~ acptn4 は整数定数 式パラメータである.

SAC_ISR は,対象割込みサービスルーチンが属する保護ドメイン(この仕様では カーネルドメインに限られる)の囲みの中に記述しなければならない.そうで ない場合には, E_RSATR エラーとなる.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, SAC_ISR , sac_is rをサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, SAC_ISR , sac_isr をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, SAC_ISR , sac_isr をサポートしない.

【 TOPPERS/SSP カーネルにおける 規定】

SSP カーネルでは, SAC_ISR , sac_isr をサポートしない.

【未決定事項】

割込みサービスルーチンのアクセス許可ベクタを設けず,システム状態のアク セス許可ベクタでアクセス保護する方法も考えられる.


del_isr 割込みサービスルーチンの削除〔 TD 〕

【 C言語 API 】

ER ercd = del_isr(ID isrid)

【パラメータ】

ID isrid 対象割込みサービスルーチンの ID 番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_ID 不正 ID 番号( cycid が不正)
E_NOEXS 〔 D〕 オブジェクト未登録(対象割込みサービスルーチンが未登録)
E_OACV 〔 P〕 オブジェクトアクセス違反(対象割込みサービスルーチンに対する管理操作が許可されていない)
E_OBJ オブジェクト状態エラー(対象割込みサービスルーチンは静的 API で生成された)

【機能】

isrid で指定した割込みサービスルーチン(対象割込みサービスルーチン)を削 除する.具体的な振舞いは以下の通り.

対象割込みサービスルーチンの登録が解除され,その割込みサービスルーチン ID が未使用の状態に戻される.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, del_isr をサポートしない.ただし,動的生成機能拡張パッ ケージでは, del_isr をサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, del_isr をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, del_isr をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, 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 をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ref_isr をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, 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 inhno 割込みハンドラ番号
T_DINH * pk_dinh 割込みハンドラの定義情報を入れたパケットへのポインタ(静的 API を除く)

*割込みハンドラの定義情報(パケットの内容)

ATR inhatr 割込みハンドラ属性
INTHDR inthdr 割込みハンドラの先頭番 地

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予 約属性( inhatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_dinh が指すメモリ領域への読出しアクセスが許可されていない)
E_PAR パラメータエラー( inhno , inthdr が不正)
E_OBJ オブジェクト状態エラー(条件については機能の項を参照すること)

【機能】

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 は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.また, def_inh で割込みハンドラを定義する場合には,割込みハンドラの属する保護ド メインを設定する必要はなく,割込みハンドラ属性に TA_DOM(domid) を指定した 場合には E_RSATR エラーとなる.ただし, TA_DOM(TDOM_SELF) を指定した場合に は,指定が無視され, E_RSATR エラーは検出されない.

マルチプロセッサ対応カーネルで,登録する割込みハンドラの属するクラスの 初期割付けプロセッサが,その割込みが要求されるプロセッサでない場合には, E_RSATR エラーとなる.また,ターゲット定義で,割込みハンドラが属すること ができるクラスに制限がある場合がある.登録する割込みハンドラの属するク ラスが,ターゲット定義の制限に合致しない場合にも, E_RSATR エラーとなる.

割込みハンドラの定義を解除する場合( def_inh において pk_dinh を NULL にした 場合)で,対象割込みハンドラ番号に対して割込みハンドラが定義されていな い場合には, E_OBJ エラーとなる.また,対象割込みハンドラ番号に対して定義 された割込みハンドラが,静的 API で定義されたものである場合には,ターゲッ ト定義で E_OBJ エラーとなる場合がある.

ターゲット定義で,対象割込みハンドラを定義(または定義解除)できない場 合には, E_PAR エラーとなる.具体的には,マルチプロセッサ対応カーネルにお いて, def_inh を 呼び出したタスクが割り付けられているプロセッサから,対象 割込みハンドラを定義(または定義解除)できない場合が,これに該当する.

静的 API において, inthdr が不正である場合に E_PAR エラーが検出されるか否か は,ターゲット定義である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, DEF_INH のみをサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, DEF_INH のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, DEF_INH のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, 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_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し)
E_NOSPT 未サポートエラー( dis_int がサポートされていない)
E_PAR パラメータエラー( intno が不正,その他の条件については機能の項を参照すること)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 2が許可されてい ない)
E_OBJ オブジェクト状態エラー( intno で指定した割込み要求ラインに対して割込み要求ライン属性が設定されていない)

【機能】

intno で指定した割込み要求ライン(対象割込み要求ライン)の割込み要求禁止 フラグをセットする.

ターゲット定義で ,対象割込み要求ラインの割込み要求禁止フラグをセットで きない場合には, E_PAR エラーとなる.具体的には,対象割込み要求ラインに対 して割込み要求禁止フラグがサポートされていない場合や,マルチプロセッサ 対応カーネルにおいて, dis_int を呼び出したタスクが割り付けられているプロ セッサから,対象割込み要求ラインの割込み要求禁止フラグが操作できない場 合が,これに該当する.

ターゲット定義で,割込み要求禁止フラグの振舞いが,この仕様の規定と異な る場合がある.特にマルチプロセッサ対応カーネルでは,あるプロセッサから dis_int を呼び出して割込み要求禁止フラグをセットしても,他のプロセッサに 対しては割込みがマスクされない場合がある.

ターゲット定義で, dis_int がサポートされていない場合がある. dis_int がサ ポートされている場合には, TOPPERS_SUPPORT_DIS_INT がマクロ定義される.サ ポートされていない場合に dis_int を呼び出すと, E_NOSPT エラーが返るか,リ ンク時にエラーとなる.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様で実装定義としていた intno の意味を標準化した.

CPU ロッ ク状態でも呼び出せるものとした.


ena_int 割込みの許可〔 T〕

【 C言語 API 】

ER ercd = ena_int(INTNO intno)

【パラメータ】

INTNO intno 割込み番号

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し)
E_NOSPT 未サポートエラー( ena_int がサポートされていない)
E_PAR パラメータエラー( intno が不正,その他の条件については機能の項を参照すること)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 2が許可されていない)
E_OBJ オブジェクト状態エラー( intno で指定した割込み要求ラインに対して割込み要求ライン属性が設定されていない)

【機能】

intno で指定した割込み要求ライン(対象割込み要求ライン)の割込み要求禁止 フラグをクリアする.

ターゲット定義で,対象割 込み要求ラインの割込み要求禁止フラグをクリアで きない場合には, E_PAR エラーとなる.具体的には,対象割込み要求ラインに対 して割込み要求禁止フラグがサポートされていない場合や,マルチプロセッサ 対応カーネルにおいて, ena_int を呼び出したタスクが割り付けられているプロ セッサから,対象割込み要求ラインの割込み要求禁止フラグが操作できない場 合が,これに該当する.

ターゲット定義で,割込み要求禁止フラグの振舞いが,この仕様の規定と異な る場合がある.特にマルチプロセッサ対応カーネルでは,あるプロセッサから ena_int を呼び出して割込み要求禁止フラグをクリアしても,他のプロセッサに 対しては割込みがマスク解除されない場合がある.

ターゲット定義で, 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(INTNO intno, T_RINT *pk_rint)

☆未完成

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, ref_int をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, ref_int をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ref_int をサポート しない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, ref_int をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.


chg_ipm 割込み優先度マスクの変更〔 T〕

【 C言語 API 】

ER ercd = chg_ipm(PRI intpri)

【パラメータ】

PRI intpri 割込み優先度マスク

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_P AR パラメータエラー( intpri が不正)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する通常操作 2が許可されていない)

【機能】

割込み優先度マスクを, intpri で指定した値に変更する.

intpri は, TMIN_INTPRI 以上, TIPM_ ENAALL 以下でなければならない.ただし, ターゲット定義の拡張として, TMIN_INTPRI よりも小さい値を指定できる場合が ある.

【補足説明】

割込み優先度マスクを TIPM_ENAALL に変更した場合,ディスパッチ保留状態が解 除され,ディスパッチが起こる可能性がある.また,タスク例外処理ルーチン の実行が開始される可能性がある.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, chg_ipm をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様では,サービスコールの名称およびパラメータの名称が実装定 義となっているサービスコールである.


get_ipm 割込み優先度マスクの参照〔 T〕

【 C言語 API 】

ER ercd = get_ipm(PRI *p_intpri)

【パラメータ】

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

【リターンパラメータ】

ER ercd エラーコード
PRI intpri 割込み優先度マスク

【エラーコード】

E_CTX コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_OACV 〔 P〕 オブジェクトアクセス違反(システム状態に対する参照操作が許可されていない)
E_MACV 〔 P〕 メモリアクセス違反( p_intpri が指すメモリ領域への書込みアクセスが許可されていない)

【機能】

割込み優先度マスクの現在値を参照する.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, get_ipm をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様では,サービスコールの名称およびパラメータの名称が実装定 義となっているサービスコールである.


4.10 CPU 例外管理機能

CPU 例外ハンドラは,カーネルが実行を制御する処理単位である. CPU 例外ハン ドラは, CPU 例外ハンドラ番号と呼ぶオブジェクト番号によって識別する.

保護機能対応カーネルにおいて, CPU 例外ハンドラは,カーネルドメインに属す る.

CPU 例外ハンドラ属性に標準で指定できる属性はないが,ターゲットによっては, ターゲット定義の CPU 例外ハンドラ属性を指定できる場合がある.ターゲット定 義の CPU 例外ハンドラ属性として,次の属性を予約している.

TA_DIRECT CPU 例外ハンドラを直接呼び出す

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 excno CPU 例外ハンドラ番号
T_DEXC * pk_dexc CPU 例外ハンドラの定義情報を入れたパケットへのポインタ(静的 API を除く)

* CPU 例外ハンドラの定義情報(パケットの内容)

ATR excatr CPU 例外ハンドラ属性
EXCHDR exchdr CPU 例外ハンドラの先頭番地

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

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

【機能】

excno で指定した CPU 例外ハンドラ番号(対象 CPU 例外ハンドラ番号)に対して, 各パラメータで指定した CPU 例外ハンドラ定義情報に従って, CPU 例外ハンドラ を定義する.ただし, def_exc において pk_dexc を NULL にした場 合には,対象 CPU 例外ハンドラ番号に対する CPU 例外ハンドラの定義を解除する.

静的 API においては, excno と excatr は整数定数式パラメータ, exchdr は一般定 数式パラメータである.

CPU 例外ハンドラを定義する場合( DEF_EXC の場合および def_exc において pk_dexc を NULL 以外にした場合)で,対象 CPU 例外ハンドラ番号に対してすでに CPU 例外ハンドラが定義されている場合には, E_OBJ エラーとなる.

保護機能対応カーネルにおいて, DEF_EXC は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.また, def_exc で CPU 例外ハンドラを定義する場合には, CPU 例外ハンドラの属する保護 ドメインを設定する必要はなく, CPU 例外ハンドラ属性に TA_DOM(domi d) を指定 した場合には E_RSATR エラーとなる.ただし, TA_DOM(TDOM_SELF) を指定した場 合には,指定が無視され, E_RSATR エラーは検出されない.

マルチプロセッサ対応カーネルで,登録する CPU 例外ハンドラの属するクラスの 初期割付けプロセッサが,その CPU 例外が発生するプロセッサでない場合には, E_RSATR エラーとなる.

CPU 例外ハンドラの定義を解除する場合( def_exc において pk_dexc を NULL にした 場合)で,対象 CPU 例外ハンドラ番号に対して CPU 例外ハンドラが定義されてい ない場合には, E_OBJ エラーとなる.また,対象 CPU 例外ハンドラ番号に対して 定義された CPU 例外ハンドラが,静的 API で定義されたものである場合には,ター ゲット定義で E_OBJ エラーとなる場合がある.

静的 API において, exchdr が不正である場合に E_PAR エラーが検出されるか否か は,ターゲット定義である.

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, DEF_EXC のみをサポートする.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, DEF_EXC のみをサポートする.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, DEF_EXC のみをサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, DEF_EXC のみをサポートする.

【μ ITRON4.0 仕様との関係】

def_ex cによって,定義済みの CPU 例外ハンドラを再定義しようとした場合に, E_OBJ エラーとすることにした.


xsns_dpn CPU 例外発生時のディスパッチ保留状態の参照〔 TI 〕

【 C言語 API 】

bool_t stat = xsns_ dpn(void *p_excinf)

【パラメータ】

void * p_excinf CPU 例外の情報を記憶しているメモリ領域の先頭番地

【リターンパラメータ】

bool_t state ディスパッチ保留状態

【機能】

CPU 例外発生時のディスパッチ保留状態を参照する.具体的な振舞いは以下の通 り.

実行中の CPU 例外ハンドラの起動原因となった CPU 例外が,カーネル管理外の CPU 例外でなく,タスクコンテキストで発生し,そのタスクがディスパッチ保留 状態でなかった場合に false ,そうでない場合に true が返る.

保護機能対応のカーネルにおいて, xsns_dpn をタスクコンテキストから呼び出 した場合には, true が返る.

p_excinf には, CPU 例外ハンドラに渡される p_excinf パラメータをそのまま渡す.

【使用方法】

xsns_dpn は, CPU 例外ハンドラの中で,どのようなリカバリ処理が可能かを判別 したい場合に使用する. xsns_dpn が false を返した場合( true を返した場合では ないので注意すること),非タスクコンテキスト用のサービスコールを用いて CPU 例外を起こしたタスクよりも優先度の高いタスクを起動または待ち解除し, そのタスクでリカバリ処理を行うことができる.ただし, CPU 例外を起こしたタ スクが最高優先度の場合には,この方法でリカバリ処理を行うことはできない.

【使用上の注意】

xsns_dpn は, E_CTX エラーを返すことがないために〔 TI 〕となっているが, CPU 例外ハンドラから呼び出すためのものである. CPU 例外ハンドラ以外から呼び出 した場合や, p_excinf に正しい値を渡さなかった場合, xsns_dpn が返す値は意 味を持たない.

どちらの条件で true が返るか間違いやすいので注意すること.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, xsns_dpn をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.

【仕様決定の理由】

保護機能対応のカーネルにおいては, xsns_dpn をユーザ ドメインから呼び出す ことは禁止すべきである.ユーザドメインの実行中は,必ずタスクコンテキス トであるため, xsns_dpn をタスクコンテキストから呼び出した場合に必ず true を返す仕様とすることで, xsns_dpn をユーザドメインから呼び出すことを実質 的に禁止している.


xsns_xpn CPU 例外発生時のタスク例外処理保留状態の参照〔 TI 〕

【 C言語 API 】

bool_t stat = xsns_xpn(void *p_excinf)

【パラメータ】

void * p_excinf CPU 例外の情報を記憶しているメモリ領域の先頭番地

【リターンパラメータ】

bool_t state タスク例外処理保留状態

【機能】

CPU 例外発生時にタスク例外処理ルーチンを実行開始できない状態であったかを 参照する.具体的な振舞いは以下の通り.

実行中の CPU 例外ハンドラの起動原因となった CPU 例外が,カーネル管理外の CPU 例外でなく,タスクコンテキストで発生し,そのタスクがタスク例外処理ルー チンを実行開始できる状態であった場合に false ,そうでない場合に true が返る.

保護機能対応カーネルにおいて, CPU 例外が発生したタスクがユーザタスクの場 合には,ユーザスタック領域の残りが少なく,タスク例外処理ルーチンを実行 開始できない(タスク例外処理ルーチンを実行開始しようとすると,タスク例 外実行開始時スタック不正例外が発生する)場合にも, true を返す.

保護機能対応のカーネルにおいて, xsns_xpn をタスクコンテキストから呼び出 した場合には, true が返る.

p_excinf には, CPU 例外ハンドラに渡される p_excinf パラメータをそのまま渡す.

【使用方法】

xsns_xpn は, CPU 例外ハンドラの中で,どのようなリカバリ処理が可能かを判別 したい場合に使用する. xsns_xpn が false を返した場合( true を返した場合では ないので注意すること),非タスクコンテキスト用のサービスコールを用いて CPU 例外を起こしたタスクにタスク例外を要求し,タスク例外処理ルーチンでリ カバリ処理を行うことができる.

【使用上の注意】

xsns_xpn は, E_CTX エラーを返すことがないために〔 TI 〕となっているが, CPU 例外ハンドラから呼び出すためのものである. CPU 例外ハンドラ以外から呼び出 した場合や, p_excinf に正しい値を渡さなかった場合, xsns_xpn が返す値は意 味を持たない.

どちらの条件で true が返るか間違いや すいので注意すること.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, xsns_xpn をサポートしない.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていないサービスコールである.

【仕様決定の理由】

保護機能対応 のカーネルにおいては, xsns_xpn をユーザドメインから呼び出す ことは禁止すべきである.ユーザドメインの実行中は,必ずタスクコンテキス トであるため, xsns_xpn をタスクコンテキストから呼び出した場合に必ず true を返す仕様とすることで, xsns_xpn をユーザドメインから呼び出すことを実質 的に禁止している.


4.11 拡張サービスコール管理機能

拡張サービスコールは,非特権モードで実行される処理単位から,特権モード で実行すべきルーチンを呼び出すための機能である.特権モードで実行するルー チンを,拡張サービスコールと呼ぶ.拡張サービスコールは,特権モードで実 行される処理単位からも呼び出すことができる.

保護機能対応カーネルにおいて,拡張サービスコールは,カーネルドメインに 属する.拡張サービスコールは,それを呼び出す処理単位とは別の処理単位で あり,拡張サービスコールからカーネルオブジェクトをアクセスする場合には, 拡張サービスコールがアクセスの主体となる.そのため,拡張サービスコール からは,すべてのカーネルオブジェクトに対して,すべての種別のアクセスを 行うこと が許可される.

保護機能対応でないカーネルでは,非特権モードと特権モードの区別がないた め,拡張サービスコール管理機能をサポートしない.

C 言語による拡張サービスコールの記述形式は次の通り.

ER_UINT extended_svc(intptr_t par1, intptr_t par2, intptr_t par3,  
                              intptr_t par4, intptr_t par5, ID cdmid)  
{  
     拡張サービスコール本体  
}

cdmid には,拡張サービスコールを呼び出した処理単位が属する保護ドメインの ID 番号が渡される.すなわち,拡張サービスコールから呼び出した場合には TDOM_KERNEL (= -1)が,タスク本体(拡張サービスコールを除く)から呼び出 した場合にはそのタスク(自タスク)の属する保護ドメイン ID が渡される.

par1 ~ par5 には,拡張サービスコールに対するパラメータが渡される.

拡張サービスコール管理機能に関連するカーネル構成マクロは次の通り.

TMAX_FNCD 拡張サービスコールの機能番号の最大値(動的生成対応カーネルでは,登録できる拡張サービスコールの数に一致)

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは,拡張サービスコール管理機能をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは,拡張サービスコール管理機能をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは,拡張サービスコール管理機能をサポートする.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは,拡張サービスコール管理機能をサポートしない.

【未決定事項】

動的生成対応カーネルにおいて TMAX_FNCD を設定する方法については,現時点で は未決定である.

【μ ITRON4.0 仕様との関係】

この仕様では,拡張サービスコールに対するパラメータを, intptr_t 型のパラ メータ 5個に固定した.

拡張サービスコールに,それを呼び出した処理単位が属する保護ドメインの ID 番号を渡す機能を追加した.

TMAX_FNCD は,μ ITRON4.0 仕様に規定されていないカーネル構成マクロである.


DEF_SVC 拡張サービスコールの定義〔 SP 〕
def_svc 拡張サービスコールの定義〔 TPD 〕

【静的 API 】

DEF_SVC(FN fncd, { ATR svcatr, EXTSVC extsvc, SIZE stksz })

【 C言語 API 】

ER ercd = def_svc(FN fncd, const T_DSVC *pk_dsvc)

【パラメータ】

FN fncd 拡張サービスコールの機能コード
T_DSVC * pk_dsvc 拡張サービスコールの定義情報を入れたパケットへのポインタ(静的 API を除く)

*拡張サービスコールの定義情報(パケットの内容)

ATR sv catr 拡張サービスコール属性
EXTSVC extsvc 拡張サービスコールの先頭番地
SIZE stksz 拡張サービスコールで使用するスタックサイズ

【リターンパラメータ】

ER ercd 正常終了( E_OK )またはエラーコード

【エラーコード】

E_CTX 〔 s〕 コンテキストエラー(非タスクコンテキストからの呼出し, CPU ロック状態からの呼出し)
E_RSATR 予約属性( svcatr が不正または使用できない,属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( fncd , extsvc が 不正)
E_OACV 〔 sP 〕 オブジェクトアクセス違反(システム状態に対する管理操作が許可されていない)
E_MACV 〔 sP 〕 メモリアクセス違反( pk_dsvc が指すメモリ領域への読出しアクセスが許可されていない)
E_OBJ オブジェクト状態エラー(定義済みの機能コー ドに対する再定義,未定義の機能コードに対する定義解除)

【機能】

fncd で指定した機能コード(対象機能コード)に対して,各パラメータで指定 した拡張サービスコール定義情報に従って,拡張サービスコールを定義する. ただし, def_svc において pk_dsvc を NULL にした場合には,対象機能コードに対 す る拡張サービスコールの定義を解除する.

静的 API においては, fncd , svcatr , stksz は整数定数式パラメータ, svchdr は 一般定数式パラメータである.

拡張サービスコールを定義する場合( DEF_SVC の場合および def_svc において pk_dsvc を NULL 以外にした場合)で,対象機能コードに対してすでに拡張サービ スコールが定義されている場合には, E_OBJ エラーとなる.

DEF_SVC は,カーネルドメインの囲みの中に記述しなければならない.そうでな い場合には, E_RSATR エラーとなる.また, def_svc で拡張サービスコールを定 義する場合には,拡張サービスコールの属する保護ドメインを設定する必要は なく,拡張サービスコール属性に TA_DOM(domid) を指定した場合には E_RSATR エ ラーとなる.ただし, TA_DOM(TDOM_SELF) を指定した場合には,指定が無視され, E_RSATR エラーは検出されない.

マルチプロセッサ対応カーネルでは, DEF_SVC は,クラスの囲みの外に記述しな ければならない.そうでない場合には, E_RSATR エラーとなる.また, def_svc で拡張サービスコールを定義する場合には,拡張サービスコールの属するクラ ス を設定する必要はなく,拡張サービスコール属性に TA_CLS(clsid) を指定した 場合には E_RSATR エラーとなる.ただし, TA_CLS(TCLS_SELF) を指定した場合に は,指定が無視され, E_RSATR エラーは検出されない.

拡張サービスコールの定義を解除する場合( def_svc において pk_dsvc を NULL に した場合)で,対象機能コードに対して拡張サービスコールが定義されていな い場合には, E_OBJ エラーとなる.

拡張サービスコールの機能コードには,正の値を用いる. fncd が 0または負の値 の場合には, E_PAR エラーとなる.また, fncd が TMAX_FNCD よりも大きい場合に も, E_PAR エラーとなる.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, DEF_SVC のみをサポート する.

【μ ITRON4.0 仕様との関係】

拡張サービスコールの定義情報に, stksz (拡張サービスコールで使用するスタッ クサイズ)を追加した.

extsvc のデータ型を, EXTSVC に変更した.


cal_svc 拡張サービスコールの呼出し〔 TIP 〕

【 C言語 API 】

ER_UINT ercd = cal_svc(FN fcnd, intptr_t par1, intptr_t par2, intptr_t par3, intptr_t par4, intptr_t par5)

【パラメータ】

FN fncd 呼び出す拡張サービスコールの機能コード
intptr_t par1 拡張サービスコールへの第 1パラメータ
intptr_t par2 拡張サービスコールへの第 2パラメータ
intptr_t par3 拡張サービスコールへの第 3パラメータ
intptr_t pa r4 拡張サービスコールへの第 4パラメータ
intptr_t par5 拡張サービスコールへの第 5パラメータ

【リターンパラメータ】

ER_UINT ercd 正常終了(正の値または 0)またはエラーコード

【エラーコード】

*その他,拡張サービスコールが返すエラーコードがそのまま返る.
E_SYS システムエラー(拡張サービスコー ルのネストレベルが上限を超える)
E_RSFN 予約機能コード( fncd が不正. fncd に対して拡張サービスコールが定義されていない)
E_NOMEM メモリ不足(スタックの残り領域が不足)

【機能】

fncd で指定した機能コードの拡張サービスコールを, par1 , par2 ,…, par5 を パラメータとして呼び出し,拡張サービスコールの返値を返す.

fncd が不正な値である場合や, fncd で指定した機能コードに対して拡張サービ スコールが定義されていない場合には, E_RSFN エラーとなる.

また,タスクコンテキストから呼び出した場合には,次のエラーが検出される. スタックの残り領域が,拡張サービスコールで使用するスタックサイズよりも 小さい場合には, E_NOMEM エラーとなる.また,拡張サービスコールのネストレ ベルが上限( 255 )を超える場合には, E_SYS エラーが返る.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様 では, cal_svc でカーネルのサービスコールを呼び出せるかどう かは実装定義としているが,この仕様では,カーネルのサービスコールを呼び 出せないこととした.

拡張サービスコールが呼び出される時に,スタックの残り領域のサイズをチェッ クする機能を追加した.

拡張サービスコールに対するパラメータを, intptr_t 型のパラメータ 5個に固定 し, ca l_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 })

【パラメータ】

*非タスクコンテキスト用スタック領域の設定情報

SIZE istksz 非タスクコンテキスト用スタック領域のサイズ(バイト数)
STK_T istk 非タスクコンテキスト用スタック領域の先頭番地

【エラーコ ード】

E_RSATR 予約属性(属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( istksz , istk が不正)
E_NOMEM メモリ不足(非タスクコンテキスト用スタック領域が確保できない)
E_OBJ オブジェクト状態エラー(非タスクコンテキス ト用スタック領域がすでに設定されている,その他の条件については機能の項を参照すること)

【機能】

各パラメータで指定した非タスクコンテキスト用スタック領域の設定情報に従っ て,非タスクコンテキスト用スタック領域を設定する.

istksz は整数 定数式パラメータ, istk は一般定数式パラメータである.コンフィ ギュレータは,静的 API のメモリ不足( E_NOMEM )エラーを検出することができ ない.

istk を NULL とした場合, istksz で指定したサイズのスタック領域を,コンフィ ギュレータが確保する. istksz にターゲット定義の制約に合致しないサイズを 指定した時には,ターゲット定義の制約に合致するようにサイズを大きい方に 丸めて確保する.

istk に NULL 以外を指定した場合, istk と istksz で指定したスタック領域は,ア プリケーションで確保しておく必要がある.スタック領域をアプリケーション で確保する方法については,「 2.15.3 カーネル共通マクロ」の節を参照するこ と.その方法に従わず, istk や ist ksz にターゲット定義の制約に合致しない先 頭番地やサイズを指定した時には, E_PAR エラーとなる.

保護機能対応カーネルでは, istk と istksz で指定した非タスクコンテキスト用 のスタック領域がカーネル専用のメモリオブジェクトに含まれない場合, E_OBJ エラーとなる.

DEF_ICS により非タスクコンテキスト用スタック領域を設定しない場合,ターゲッ ト定義のデフォルトのサイズのスタック領域を,コンフィギュレータが確保す る.

マルチプロセッサ対応カーネルでは,非タスクコンテキスト用スタック領域は プロセッサ毎に確保する必要がある. DEF_ICS により設定する非タスクコンテキ スト用スタック領域は, DEF_ICS の記述をその囲みの中に含むクラスの初期割付 けプロセッサが使用する.そのプロセッサに対してすでに非タスクコンテキ ス ト用スタック領域が設定されている場合には, E_OBJ エラーとなる.

保護機能対応カーネルにおいて, DEF_ICS は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, istk には NULL を指定しなくてはならず,その場合で も,コン フィギュレータは非タスクコンテキスト用のスタック領域を確保しない.これ は, SSP カーネルでは,すべての処理単位が共有スタック領域を使用し,非タス クコンテキストのみが用いるスタック領域を持たないためである.そのため, DEF_ICS の役割は,非タスクコンテキストが用いるスタック領域のサイズを指定 することのみとなる. itsk に NULL 以外を指定した場合には, E_PAR エラーとなる.

共有スタック領域の設定方法については, DEF_STK の項を参照すること.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていない静的 API である.


DEF_STK 共有スタッ ク領域の設定〔 S〕

【静的 API 】

DEF_STK({ SIZE stksz, STK_T *stk })

【パラメータ】

*共有スタック領域の設定情報

SIZE stksz 共有スタック領域のサイズ(バイト数)
STK_T stk 共有スタック領域の先頭番地

【エラーコード】

E_RSATR 予約属性(属する保護ドメインかクラスが不正)
E_PAR パラメータエラー( stksz , stk が不正)
E_NOMEM メモリ不足(共有スタック領域が確保できない)
E_OBJ オブジェクト状態エラー(共有スタック領域がすでに設定されている,その他の条件については機能の項を参照すること)

【サポートするカーネル】

DEF_STK は, TOPPERS/SSP カーネルのみがサポートする静的 API である.他のカー ネルは, DEF_STK をサポートしない.

【機能】

各パラメータで指定した共有スタック領域の設定情報に従って,共有スタック 領域を設定する.

stksz は整数定数式パラメータ, stk は一般定数式パラメータである.コンフィ ギュレータは,静的 API のメモリ不足( E_NOMEM )エラーを検出することができ ない.

stk を NULL とした場合, stksz で指定したサイズのスタック領域を,コンフィギュ レータが確保する. stksz にターゲット定義の制約に合致しないサイズを指定し た時には,ターゲット定義の制約に合致するようにサイズを大きい方に丸めて 確保する.

stk に NULL 以外を指定した場合, stk と stksz で指定したスタック領域は,アプリ ケーションで確保しておく必要がある.スタック領域をアプリケーションで確 保する方法については,「 2.15.3 カーネル共通 マクロ」の節を参照すること. その方法に従わず, stk や stksz にターゲット定義の制約に合致しない先頭番地 やサイズを指定した時には, E_PAR エラーとなる.

コンフィギュレータは,各タスクのスタック領域のサイズと,非タスクコンテ キスト用のスタック領域のサイズから,共有スタック領域に必要なサイズを計 算する. DEF_STK により共有スタック領域を設定しない場合,必要なサイズの共 有スタック領域を,コンフィギュレータが確保する.

stksz に指定したスタック領域のサイズが,共有スタック領域に必要なサイズよ りも小さい場合,コンフィギュレータは警告メッセージを出力する.

【μ ITRON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていない静的 API である.


ATT_INI 初期化ルーチンの追加〔 S〕

【静的 API 】

ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })

【パラメータ】

* 初期化ルーチンの追加情報

ATR iniatr 初期化ルーチン属性
intptr_t exinf 初期化ルーチンの拡張情報
INIRTN inirtn 初期化ルーチンの先頭番地

【エラーコード】

E_RSATR 予約属性( iniatr が不正または使用できない,属する保護ドメインが不正)
E_PAR パラメータエラー( inirtn が不正)

【機能】

各パラメータで指定した初期化ルーチン追加情報に従って,初期化ルーチンを 追加する.

iniatr は整数定数式パラメータ, exinf と inirtn は一般定数式パラメータである.

保護機能対応カーネルにおいて, ATT_INI は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.

inirtn が不正である場合に E_PAR エラーが検出されるか否かは,ターゲット定義 である.

【補足説明】

マルチプロセッサ対応カーネルでは,クラスに属 さないグローバル初期化ルー チンはマスタプロセッサで実行され,クラスに属するローカル初期化ルーチン はそのクラスの初期割付けプロセッサにより実行される.


ATT_TER 終了処理ルーチンの追加〔 S〕

【静的 API 】

ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })

【パラメータ】

*終了処理ルーチンの追加情報

ATR teratr 終了処理ルーチン属性
intptr_t exinf 終了処理ルーチンの拡張情報
TERRTN terrtn 終了処理ル ーチンの先頭番地

【エラーコード】

E_RSATR 予約属性( teratr が不正または使用できない,属する保護ドメインが不正)
E_PAR パラメータエラー( terrtn が不正)

【機能】

各パラメータで指定した終了処理ルーチン追加情報に従って,終了処理ルーチ ンを追加する.

teratr は整数定数式パラメータ, exinf と terrtn は一般定数式パラメータである.

保護機能対応カーネルにおいて, ATT_TER は,カーネルドメインの囲みの中に記 述しなければならない.そうでない場合には, E_RSATR エラーとなる.

terrtn が不正である場合に E_PAR エラーが検出されるか否かは,ターゲット定義 である.

【補足説明】

マルチプロセッサ対応カーネルでは,クラスに属さないグローバル終了処理ルー チンはマスタプロセッサで実行され,クラスに属するローカル終了処理ルーチ ンはそのクラスの初期割付けプロセッサにより実行される.

【μ ITR ON4.0 仕様との関係】

μ ITRON4.0 仕様に定義されていない静的 API である.


ref_cfg コンフィギュレーション情報の参照〔 T〕

【 C言語 API 】

ER ercd = ref_cfg(T_RCFG *pk_rcfg)

☆未完成

【 TOPPERS/ASP カーネルにおける規定】

ASP カーネルでは, ref_cfg をサポートしない.

【 TOPPERS/FMP カーネルにおける規定】

FMP カーネルでは, ref_cfg をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ref_cfg をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, 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 をサポートしない.

【 TOPPERS/HRP2 カーネルにおける規定】

HRP2 カーネルでは, ref_ver をサポートしない.

【 TOPPERS/SSP カーネルにおける規定】

SSP カーネルでは, ref _ver をサポートしない.


第5章 リファレンス

5.1 サービスコール一覧

  • (1) タスク管理機能
ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk) 〔 TD 〕
ER ercd = sac_tsk(ID tskid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_tsk(ID tskid) 〔 TD 〕
ER ercd = act_tsk(ID tskid) 〔 T〕
ER ercd = iact_tsk(ID tskid) 〔 I〕
ER ercd = mact_tsk(ID tskid, ID prcid) 〔 TM 〕
ER ercd = imact_tsk(ID tskid, ID prcid) 〔 IM 〕
ER_UINT actcnt = can_act(ID tskid) 〔 T〕
ER ercd = mig_tsk(ID tskid, ID prcid) 〔 TM 〕
ER ercd = ext_tsk() 〔 T〕
ER ercd = ter_tsk(ID tskid) 〔 T〕
ER ercd = chg_pri(ID tskid, PRI tskpri) 〔 T〕
ER ercd = get_pri(ID tskid, PRI *p_tskpri) 〔 T〕
ER ercd = get_inf(intptr_t *p_exinf) 〔 T〕
ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk) 〔 T〕
  • (2) タスク付属同期機能
ER ercd = slp_tsk() 〔 T〕
ER ercd = tslp_tsk(TMO tmout) 〔 T〕
ER ercd = wup_tsk(ID tskid) 〔 T〕
ER ercd = iwup_tsk(ID tskid) 〔 I〕
ER_UINT wupcnt = can_wup(ID tskid) 〔 T〕
ER ercd = rel_wai(ID tskid) 〔 T〕
ER ercd = irel_wai(ID tskid) 〔 I〕
ER ercd = sus_tsk(ID tskid) 〔 T〕
ER ercd = rsm_tsk(ID tskid) 〔 T〕
ER ercd = dis_wai(ID tskid) 〔 TP 〕
ER ercd = idis_wai(ID tskid) 〔 IP 〕
ER ercd = ena_wai(ID tskid) 〔 TP 〕
ER ercd = iena_wai(ID tskid) 〔 IP 〕
ER ercd = dly_tsk(RELTIM dlytim) 〔 T〕
  • (3) タスク例外処理機能
ER ercd = def_tex(ID tskid, const T_DTEX * pk_dtex) 〔 TD 〕
ER ercd = ras_tex(ID tskid, TEXPTN rasptn) 〔 T〕
ER ercd = iras_tex(ID tskid, TEXPTN rasptn) 〔 I〕
ER ercd = dis_tex() 〔 T〕
ER ercd = ena_tex() 〔 T〕
bool_t state = sns_tex() 〔 TI 〕
ER ercd = ref_tex(ID tskid, T_RTEX *pk_rtex) 〔 T〕
  • (4) 同期・通信機能

    セマフォ

ER_ID semid = acre_sem(const T_CSEM *pk_csem) 〔 TD 〕
ER ercd = sac_se m(ID semid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_sem(ID semid) 〔 TD 〕
ER ercd = sig_sem(ID semid) 〔 T〕
ER ercd = isig_sem(ID s emid) 〔 I〕
ER ercd = wai_sem(ID semid) 〔 T〕
ER ercd = pol_sem(ID semid) 〔 T〕
ER ercd = twai_sem(ID semid, TMO tmout) 〔 T〕
ER ercd = ini_sem(ID semid) 〔 T〕
ER ercd = ref_sem(ID semid, T_RSEM *pk_rsem) 〔 T〕

イベントフラグ

ER_ID flgid = acre_flg(const T_CFLG *pk_cflg) 〔 TD 〕
ER ercd = sac_flg(ID flgid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_flg(ID flgid) 〔 TD 〕
ER ercd = set_flg(ID flgid, FLGPTN setptn) 〔 T〕
ER ercd = iset_flg(ID flgid, FLGPTN setptn) 〔 I〕
ER ercd = clr_flg(ID flgid, FLGPTN clrptn) 〔 T〕
ER ercd = wai_flg(ID flgid, FLGPTN waiptn,MODE wfmode, FLGPTN *p_flgptn) 〔 T〕
ER ercd = pol_flg(ID flgid, FLGPTN waiptn,MODE wfmode, FLGPTN *p_flgptn) 〔 T〕
ER ercd = twai_flg(ID flgid, FLGPTN waiptn,MODE wfmode, FLGPTN *p_flgptn, TMO tmout) 〔 T〕
ER ercd = ini_flg(ID f lgid) 〔 T〕
ER ercd = ref_flg(ID flgid, T_RFLG *pk_rflg) 〔 T〕

データキュー

ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq) 〔 TD 〕
ER ercd = sac_dtq(ID dtqid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_dtq(ID dtqid) 〔 TD 〕
ER ercd = snd_dtq(ID dtqid, intptr_t data) 〔 T〕
ER ercd = psnd_dtq(ID dtqid, intptr_t data) 〔 T〕
ER ercd = ipsnd_dtq(ID dtqid, intptr_t data) 〔 I〕
ER ercd = tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) 〔 T〕
ER ercd = fsnd_dtq(ID dtqid, intptr_t data) 〔 T〕
ER ercd = ifsnd_dtq(ID dtqid, intptr_t data) 〔 I〕
ER ercd = rcv_dtq(ID dtqid, intptr_t *p_data) 〔 T〕
ER ercd = prcv_dtq(ID dtqid, intptr_t *p_data) 〔 T〕
ER ercd = trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) 〔 T〕
ER ercd = ini_dtq(ID dtqid) 〔 T〕
ER ercd = ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) 〔 T〕

優先度データキュー

ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq) 〔 TD 〕
ER ercd = sac_pdq(ID pdqid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_pdq(ID pdqid) 〔 TD 〕
ER ercd = snd_pdq(ID pdqid, intptr_t data, PRI datapri) 〔 T〕
ER ercd = psnd_pdq(ID pdqid, intptr_t data, PRI datapri) 〔 T〕
ER ercd = ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) 〔 I〕
ER ercd = tsnd_pdq(ID pdqid, intptr_t data,PRI datapri, TMO tmout) 〔 T〕
ER ercd = rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) 〔 T〕
ER ercd = prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) 〔 T〕
ER ercd = trcv_pdq(ID pdqid, intptr_t *p_data,PRI *p_datapri, TMO tmout) 〔 T〕
ER ercd = ini_pdq(ID pdqid) 〔 T〕
ER ercd = ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) 〔 T〕

メールボックス

ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx) 〔 TDp 〕
ER ercd = del_mbx(ID mbxid) 〔 TDp 〕
ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg) 〔 Tp 〕
ER ercd = rcv_mbx(ID mbxid, T_MSG **ppk_msg) 〔 Tp 〕
ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg) 〔 Tp 〕
ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) 〔 Tp 〕
ER ercd = ini_mbx(ID mbxid) 〔 Tp 〕
ER ercd = ref_mbx(ID mbxid, T_RMBX *pk_rmbx) 〔 Tp 〕

ミューテックス

ER_ID mtxid = acre_mtx(const T_CMTX *pk_cmtx) 〔 TD 〕
ER ercd = sac_mtx(ID mtxid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_mtx(ID mtxid) 〔 TD 〕
ER ercd = loc_mtx(ID mtxid) 〔 T〕
ER ercd = ploc_mtx(ID mtxid) 〔 T〕
ER ercd = tloc_mtx(ID mtxid, TMO tmout) 〔 T〕
ER ercd = unl_mtx(ID mtxid) 〔 T〕
ER ercd = ini_mtx(ID mtxid) 〔 T〕
ER ercd = ref_mtx(ID mtxid, T_RMTX *pk_rmtx) 〔 T〕

メッセージバッファ

☆未完成

スピンロック

ER_ID spnid = acre_spn(const T_CSPN *pk_cspn) 〔 TMD 〕
ER ercd = sac_spn(ID spnid, const ACVCT *p_acvct) 〔 TPMD 〕
ER ercd = del_spn(ID spnid) 〔 TMD 〕
ER ercd = loc_spn(ID spnid) 〔 TM 〕
ER ercd = iloc_spn(ID spnid) 〔 IM 〕
ER ercd = try_spn(ID spnid) 〔 TM 〕
ER ercd = itry_spn(ID spnid) 〔 IM 〕
ER ercd = unl_spn(ID spnid) 〔 TM 〕
ER ercd = iunl_spn(ID spnid) 〔 IM 〕
ER ercd = ref_spn(ID spnid, T_RSPN *pk_rspn) 〔 TM 〕
  • (5) メモリプール管理機能

    固定長メモリプール

ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf) 〔 TD 〕
ER ercd = sac_mpf(ID mpfid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_mpf(ID mpfid) 〔 TD 〕
ER ercd = get_mpf(ID mpfid, void **p_blk) 〔 T〕
ER ercd = pget_mpf(ID mpfid, void **p_blk) 〔 T〕
ER ercd = tget_mpf(ID mpfid, void **p_blk, TMO tmout) 〔 T〕
ER ercd = rel_mpf(ID mpfid, void *blk) 〔 T〕
ER ercd = ini_mpf(ID mpfid) 〔 T〕
ER ercd = ref_mpf(ID mpfid, T_RMPF *pk_rmpf) 〔 T〕
  • (6) 時 間管理機能

    システム時刻管理

ER ercd = get_tim(SYSTIM *p_systim) 〔 T〕
ER ercd = get_utm(SYSUTM *p_sysutm) 〔 TI 〕

周期ハンドラ

ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc) 〔 TD 〕
ER ercd = sac_cyc(ID cycid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_cyc(ID cycid) 〔 TD 〕
ER ercd = sta_cyc(ID cycid) 〔 T〕
ER ercd = msta_cyc(ID cycid, ID prcid) 〔 TM 〕
ER ercd = stp_cyc(ID cycid) 〔 T〕
ER ercd = ref_cyc(ID cycid, T_RCYC *pk_rcyc) 〔 T〕

アラームハンドラ

ER_ID almid = acre_alm(const T_CALM *pk_calm) 〔 TD 〕
ER ercd = sac_alm(ID almid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_alm(ID almid) 〔 TD 〕
ER ercd = sta_alm(ID almid, RELTIM almtim) 〔 T〕
ER ercd = ista_alm(ID almid, RELTIM almtim) 〔 I〕
ER ercd = msta_alm(ID almid, RELTIM almtim, ID prcid) 〔 TM 〕
ER ercd = imsta_alm(ID almid, RELTIM almtim, ID prcid) 〔 IM 〕
ER ercd = stp_alm(ID almid) 〔 T〕
ER ercd = istp_alm(ID almid) 〔 I〕
ER ercd = ref_alm(ID almid, T_RALM *pk_ralm) 〔 T〕

オーバラ ンハンドラ

ER ercd = def_ovr(const T_DOVR *pk_dovr) 〔 TD 〕
ER ercd = sta_ovr(ID tskid, OVRTIM ovrtim) 〔 T〕
ER ercd = ista_ovr(ID tskid, OVRTIM ovrtim) 〔 I〕
ER ercd = stp_ovr(ID tskid) 〔 T〕
ER ercd = istp_ovr(ID tskid) 〔 I〕
ER ercd = ref_ovr(ID tskid, T_ROVR *pk_rovr) 〔 T〕
  • (7) システム状態管理機能
ER ercd = sac_sys(const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = rot_rdq(PRI tskpri) 〔 T〕
ER ercd = irot_rdq(PRI tskpri) 〔 I〕
ER ercd = mrot_rdq(PRI tskpri, ID prcid) 〔 TM 〕
ER ercd = imrot_rdq(PRI tskpri, ID prcid) 〔 IM 〕
ER ercd = get_tid(ID *p_tskid) 〔 T〕
ER ercd = iget_tid(ID *p_tskid) 〔 I〕
ER ercd = get_did(ID *p_domid) 〔 TP 〕
ER ercd = get_pid(ID *p_prcid) 〔 TM 〕
ER ercd = iget_pid(ID *p_prcid) 〔 IM 〕
ER ercd = loc_cpu() 〔 T〕
ER ercd = iloc_cpu() 〔 I〕
ER ercd = unl_cpu() 〔 T〕
ER ercd = iunl_cpu() 〔 I〕
ER ercd = dis_dsp() 〔 T〕
ER ercd = ena_dsp() 〔 T〕
bool_t state = sns_ctx() 〔 TI 〕
bool_t state = sns_loc() 〔 TI 〕
bool_t state = sns_dsp() 〔 TI 〕
bool_t state = sns_dpn() 〔 TI 〕
bool_t state = sns_ker() 〔 TI 〕
ER ercd = ext_ker() 〔 TI 〕
ER ercd = ref_sys(T_RSYS *pk_rsys) 〔 T〕
  • (8) メモリオブジェクト管理機能
ER ercd = att_mem(const T_AMEM *pk_amem) 〔 TPD 〕
ER ercd = att_pma(const T_AMEM *pk_apma) 〔 TPD 〕
ER ercd = sac_mem(const void *base, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = det_mem(const void *base) 〔 TPD 〕
ER ercd = prb_mem(const void *base, SIZE size,ID tskid, MODE pmmode) 〔 TP 〕
ER ercd = ref_mem(const void *base, T_RMEM *pk_rmem) 〔 TP 〕
  • (9) 割込み管理機能
ER ercd = cfg_int(INTNO intno, const T_CINT *pk_cint) 〔 TD 〕
ER_ID isrid = acre_isr(const T_CISR *pk_cisr) 〔 TD 〕
ER ercd = sac_isr(ID isrid, const ACVCT *p_acvct) 〔 TPD 〕
ER ercd = del_isr(ID isrid) 〔 TD 〕
ER ercd = ref_isr(ID isrid, T_RISR *pk_risr) 〔 T〕
ER ercd = def_inh(INHNO inhno, const T_DINH *pk_dinh) 〔 TD 〕
ER ercd = dis_int(INTNO intno) 〔 T〕
ER ercd = ena_int(INTNO intno) 〔 T〕
ER ercd = ref_int(INTNO intno, T_RINT *pk_rint) 〔 T〕
ER ercd = chg_ipm(PRI intpri) 〔 T〕
ER ercd = get_ipm(PRI *p_intpri) 〔 T〕
  • (10) CPU 例外管理機能
ER ercd = def_exc(EXCNO excno, const T_DEXC *pk_dexc) 〔 TD 〕
bool_t stat = xsns_dpn(void *p_excinf) 〔 TI 〕
bool_t stat = xsns_xpn(void *p_excinf) 〔 TI 〕
  • (11) 拡張サービスコール管理機能
ER ercd = def_svc(FN fncd , const T_DSVC *pk_dsvc) 〔 TPD 〕
ER_UINT ercd = cal_svc(FN fcnd, intptr_t par1, intptr_t par2,intptr_t par3, intptr_t par4, intptr_t par5) 〔 TIP 〕
  • (12) システム構成管理機能
ER ercd = ref_cfg(T_RCFG *pk_rcfg) 〔 T〕
ER ercd = ref_ver(T_RVER *pk_rver) 〔 T〕

5.2 静的 API 一覧

  • (1) タスク管理機能

    *保護機能対応でないカーネルの場合

CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,PRI itskpri, SIZE stksz, STK_T *stk }) 〔 S〕

*保護機能対応カーネルの場合

CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,PRI itskpri, SIZE stksz, STK_T *stk,SIZE sstksz, STK_T *sstk }) 〔 SP 〕

※ sstksz および sstk の記述は省略することができる.

AID_TSK(uint_t notsk) 〔 SD 〕
SAC_TSK(ID tskid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
DEF_EPR (ID tskid, { PRI exepri }) 〔 S〕
  • (2) タスク付属同期機能

    なし

  • (3) タスク例外処理機能
DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn }) 〔 S〕
  • (4) 同期・通信機能

    セマフォ

CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem }) 〔 S〕
AID_SEM(uint_t nosem) 〔 SD 〕
SAC_SEM(ID semid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

イベントフラグ

CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn }) 〔 S〕
AID_FLG(uint_t noflg) 〔 SD 〕
SAC_FLG(ID flgid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

データキュー

CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb }) 〔 S〕
AID_DTQ(uint_t nodtq) 〔 SD 〕
SAC_DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

優先度データキュー

CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt,PRI maxdpri, void *pdqmb }) 〔 S〕
AID_PDQ(uint_t nopdq) 〔 SD 〕
SAC_PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

メールボックス

CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd }) 〔 Sp 〕
AID_MBX(uint_t nombx) 〔 SpD 〕

ミューテックス

CRE_MTX(ID mtxid, { ATR mtxatr, PRI ceilpri }) 〔 S〕
AID_MTX(uint_t nomtx) 〔 SD 〕
SAC_MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

メッセージバッファ

☆未完成

スピンロック

CRE_SPN(ID spnid, { ATR spnatr }) 〔 SM 〕
AID_SPN(uint_t nospn) 〔 SMD 〕
SAC_SPN(ID spnid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SPM 〕
  • (5) メモリプール管理機能

    固定長メモリプール

CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,MPF_T *mpf, void *mpfmb }) 〔 S〕
AID_MPF(uint_t nompf) 〔 SD 〕
SAC_MPF(ID mpfid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
  • (6) 時間管理機能

    周期ハンドラ

CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,RELTIM cyctim, RELTIM cycphs }) 〔 S〕
AID_CYC(uint_t nocyc) 〔 SD 〕
SAC_CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

アラームハンドラ

CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr }) 〔 S〕
AID_ALM(uint_t noalm) 〔 SD 〕
SAC_ALM(ID almid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕

オーバランハンドラ

DEF_OVR({ ATR ovratr, OVRHDR ovrhdr }) 〔 S〕
  • (7) システム状態管理機能
ACPTN acptn3, ACPTN acptn4 })
SAC_SYS({ ACPTN acptn1, ACPTN acptn2, 〔 SP 〕
  • (8) メモリオブジェクト管理機能
ATT_REG(" メモリリージョン名 ",{ ATR regatr, void *base, SIZE size }) 〔 SP 〕
ATT_SEC(" セクション名 ", { ATR mematr, " メモリリージョン名 " }) 〔 SP 〕
ATA_SEC(" セクション名 ", { ATR mematr, " メモリリージョン名 " },{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
LNK_SEC(" セクション名 ", { " メモリリージョン名 " }) 〔 SP 〕
ATT_MOD(" オブジェクトモジュール名 ") 〔 SP 〕
ATA_MOD(" オブジェクトモジュール名 ",{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
ATT_MEM({ ATR mematr, void *base, SIZE size }) 〔 SP 〕
ATA_MEM({ ATR mematr, void *base, SIZE size },{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
ATT_PMA( { ATR mematr, void *base, SIZE size, void *paddr }) 〔 SP 〕
ATA_PMA({ ATR mematr, void *base, SIZE size, void *paddr },{ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
  • (9) 割込み管理機能
CFG_INT(INTNO intno, { ATR intatr, PRI intpri }) 〔 S〕
CRE_ISR(ID isrid, { ATR isratr, intptr_t exinf,INTNO intno, ISR isr, PRI isrpri }) 〔 S〕
ATT_ISR({ ATR isratr, intptr_t exinf,INTNO intno, ISR isr, PRI isrpri }) 〔 S〕
AID_ISR(uint_t noisr) 〔 SD 〕
SAC _ISR(ID isrid, { ACPTN acptn1, ACPTN acptn2,ACPTN acptn3, ACPTN acptn4 }) 〔 SP 〕
DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr }) 〔 S〕
  • (10) CPU 例外管理機能
DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr }) 〔 S〕
  • (11) 拡張サービスコール管理機能
DEF_SVC(FN fncd, { ATR svcatr, EXTSVC svcrtn, SIZE stksz }) 〔 SP 〕
  • (12) システム構成管理機能
DEF_ICS({ SIZE istksz, STK_T *istk }) 〔 S〕
DEF_STK({ SIZE stksz, STK_T *stk }) 〔 S〕
ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn }) 〔 S〕
ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn }) 〔 S〕

5.3 データ型

5.3.1 TOPPERS 共通データ型

int8_t 符号付き 8ビット整数(オプション, C99 準拠)
uint8_t 符号無し 8ビット整数(オプション, C99 準拠)
int16_t 符号付き 16 ビット整数( C99 準拠)
uint16_t 符号無し 16 ビット整数( C99 準拠)
int32_t 符号付き 32 ビット整数( C99 準拠)
uint32_t 符号無し 32 ビット整数( C99 準拠)
int64_t 符号付き 64 ビッ ト整数(オプション, C99 準拠)
uint64_t 符号無し 64 ビット整数(オプション, C99 準拠)
int128_t 符号付き 128 ビット整数(オプション, C99 準拠)
uint128_t 符号無し 128 ビット整数(オプション, C99 準拠)
int_least8_t 8 ビット以上の符号付き整数( C99 準拠)
uint_least8_t int_least8_t 型と同じサイズの符号無し整数( C99 準拠)
float32_t IEEE754 準拠の 32 ビット単精度浮動小数点数(オプション)
double64_t IEEE754 準拠の 64 ビット倍精度浮動小数点数(オプション)
bool_t 真偽値( true または false )
int_t 16 ビット以上の符号付き整数
uint_t int_t 型と同じサイズの符号無し整数
long_t 32 ビット以上かつ int_t 型以上のサイズの符号付き整数
ulong_t long_t 型と同じサイズの符号無し整数
intptr_t ポインタを格納できるサイズの符号付き整数( C99 準拠)
uintptr_t intptr_t 型と同じサイズの符号無し整数( C99 準拠)
FN 機能コード(符号付き整数, int_t に定義)
ER エラーコード(符号付き整数, int_t に定義)
ID オブジェクトの ID 番号(符号付き整数, int_t に定義)
ATR オブジェクト属性(符号無し整数, uint_ tに定義)
STAT オブジェクトの状態(符号無し整数, uint_t に定義)
MODE サービスコールの動作モード(符号無し整数, uint_t に定義)
PRI 優先度(符号付き整数, int_t に定義)
SIZE メモリ領域のサイズ(符号無し整数,ポインタを格納できるサイズの符号無し整数型 に定義)
TMO タイムアウト指定(符号付き整数,単位はミリ秒, int_t に定義)
RELTIM 相対時間(符号無し整数,単位はミリ秒, uint_t に定義)
SYSTIM システム時刻(符号無し整数,単位はミリ秒, ulong_t に定義)
SYSUTM 性能評価用システム時刻(符号無し整数,単位はマイクロ秒,ulong_t に定義)
FP プログラムの起動番地(型の定まらない関数ポインタ)
ER_BOOL エラーコードまたは真偽値(符号付き整数, int_t に定義)
ER_ID エラーコードまたは ID 番号(符号付き整数, int_t に定義,負の ID 番 号は格納できない)
ER_UINT エラーコードまたは符号無し整数(符号付き整数, int_t に定義,符号無し整数を格納する場合の有効ビット数は uint_tより 1ビット短い)
MB_T オブジェクト管理領域を確保するためのデータ型
ACPTN アクセス許可パターン(符号無し 32 ビット整数, uint32_t に定義)
typedef struct acvct {      /*  アクセス許可ベクタ  */
    ACPTN   acptn1;         /*  通常操作 1のアクセス許可パターン  */
    ACPTN   acptn2;         /*  通常操作 2のアクセス許可パタ ーン  */
    ACPTN   acptn3;         /*  管理操作のアクセス許可パターン  */
    ACPTN   acptn4;         /*  参照操作のアクセス許可パターン  */
} ACVCT;

5.3.2 カーネルの使用するデータ型

TEXPTN タスク例外要因のビットパターン(符号無し整 数, uint_t に定義)
FLGPTN イベントフラグのビットパターン(符号無し整数, uint_t に定義)
OVRTIM プロセッサ時間(符号無し整数,単位はマイクロ秒, ulong_t に定義)
INTNO 割込み番号(符号無し整数, uint_t に定義)
INHNO 割込みハンドラ番号(符号無し整数, uint_t に定義)
EXCNO CPU 例外ハンドラ番号(符号無し整数, uint_t に定義)
TASK タスクのメインルーチン(関数ポインタ)
TEXRTN タスク例外処理ルーチン(関数ポインタ)
CYCHDR 周期ハンドラ(関数ポインタ)
ALMHDR アラームハンドラ(関数ポインタ)
OVRHDR オーバランハンドラ(関数ポインタ)
ISR 割込みサービスルーチン(関数ポインタ)
INTHDR 割込みハンドラ(関数ポインタ)
EXCHDR CPU 例外ハンドラ(関数ポインタ)
EXTSVC 拡張サービスコール(関数ポインタ)
INIRTN 初期化ルーチン(関数ポインタ)
TERRTN 終了処理ルーチン(関数ポインタ)
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_PR I;

5.3.3 カーネルの使用するパケット形式

  • (1) タスク管理機能

    タスクの生成情報のパケット形式

typedef struct t_ctsk {
    ATR         tskatr;     /*  タスク属性  */
    intptr_t    exinf;      /*  タスクの拡張情報  */
    TASK        task;       /*  タスクのメインルーチンの先頭番地  */
    PRI         itskpri;    /*  タスクの起動時優先度  */
    SIZE        stksz;      /*  タスクのスタック領域のサイズ  */
    STK_T *     stk;        /*  タスクのスタック領域の先頭番地  */
    /*  以下は,保護機能対応カーネルの場合  */
    SIZE        sstksz;     /*  タスクのシステムスタック領域のサイズ  */
    STK_T *     sstk;       /*  タスクのシステムスタック領域の先頭番地  */
} T_CTSK;

タスクの現在状態のパケット形式

typedef struct t_rtsk {
    STAT        tskstat;    /*  タスク状態  */
    PRI         tskpri;     /*  タスクの現在優先度  */
    PRI         tskbpri;    /*  タスクのベース優先度  */
    STAT        tskwait;    /*  待ち要因  */
    ID          wobjid;     /*  待ち対象のオブジェクトの ID */
    TMO         lefttmo;    /*  タイムアウトするまでの時間  */
    uint_t      actcnt;     /*  起動要求キューイング数  */
    uint_t      wupcnt;     /*  起床要求キューイング数  */
    /*  以下は,保護機能対応カーネルの場合  */
    bool_t      texmsk;     /*  タスク例外マスク状態か否か  */
    bool_t      waifbd;     /*  待ち禁止状態か否か  */
    uint_t      svcl evel;   /*  拡張サービスコールのネストレベル  */
    /*  以下は,マルチプロセッサ対応カーネルの場合  */
    ID          prcid;      /*  割付けプロセッサの ID */
    ID          actprc      /*  次の起動時の割付けプロセッサの ID */
} T_RTSK;
  • (2) タスク付 属同期機能

    なし

  • (3) タスク例外処理機能

    タスク例外処理ルーチンの定義情報のパケット形式

typedef struct t_dtex {
    ATR         texatr;     /*  タスク例外処理ルーチン属性  */
    TEXRTN      t exrtn;     /*  タスク例外処理ルーチンの先頭番地  */
} T_DTEX;

タスク例外処理の現在状態のパケット形式

typedef struct t_rtex {
    STAT        texstat;    /*  タスク例外処理の状態  */
    TEXPTN      pndptn;     /*  保留例外 要因  */
} T_RTEX;
  • (4) 同期・通信機能

    セマフォの生成情報のパケット形式

typedef struct t_csem {
    ATR         sematr;     /*  セマフォ属性  */
    uint_t      isemcnt;    /*  セマフォの初期資源数  */
    uint_t      maxsem;     /*  セマフォの最大資源数  */
} T_CSEM;

セマフォの現在状態のパケット形式

typedef struct t_rsem {
    ID            wtskid;     /*  セマフォの待ち行列の先頭のタスクの ID 番号  */
    uint_t      semcnt;     /*  セマフォの資源数  */
} T_RSEM;

イベントフラグの生成情報のパケット形式

typedef struct t_cflg {
    ATR         flgatr;      /*  イベントフラグ属性  */
    FLGPTN      iflgptn;    /*  イベントフラグの初期ビットパターン  */
} T_CFLG;

イベントフラグの現在状態のパケット形式

typedef struct t_rflg {
    ID          wtskid;     /*  イベントフラグの待ち行列の先頭 のタス
    クの ID 番号  */
    FLGPTN      flgptn;     /*  イベントフラグのビットパターン  */
} T_RFLG;

データキューの生成情報のパケット形式

typedef struct t_cdtq {
    ATR         dtqatr;     /*  データキュー属性  */
    uint_t      dtqcnt;     /*  データキュー管理領域に格納できるデータ数  */
    void *      dtqmb;      /*  データキュー管理領域の先頭番地  */
} T_CDTQ;

データキューの現在状態のパケット形式

typedef struct t_rdtq {
    ID          stskid;     /*  データキューの送信待ち行列の先頭のタ
    スクの ID 番号  */
    ID          rtskid;     /*  データキューの受信待ち行列の先頭のタ
    スクの ID 番号  */
    uint_t      sdtqcnt;    /*  データキュー管理領域に格納されている
    データの数  */
} T_RDTQ;

優先度データキューの生成情報のパケット形式

typedef struct  t_cpdq {
    ATR         pdqatr;     /*  優先度データキュー属性  */
    uint_t      pdqcnt;     /*  優先度データキュー管理領域に格納でき
    るデータ数  */
    PRI         maxdpri;    /*  優先度データキューに送信できるデータ
    優先度の最大値  */
    void *      pdqmb;      /*  優先度データキュー管理領域の先頭番地  */
} T_CPDQ;

優先度データキューの現在状態のパケット形式

typedef struct t_rpdq {
    ID          stskid;     /*  優先度データキューの送信待ち行列の先
    頭のタスクの ID 番号  */
    ID          rtskid;     /*  優先度データキューの受信待ち行列の先
    頭のタスクの ID 番号  */
    uint_t        spdqcnt;    /*  優先度データキュー管理領域に格納され
    ているデータの数  */
} T_RPDQ;

メールボックスの生成情報のパケット形式

typedef struct t_cmbx {
    ATR         mbxatr;     /*  メール ボックス属性  */
    PRI         maxmpri;    /*  優先度メールボックスに送信できるメッ
    セージ優先度の最大値  */
    void *      mprihd;     /*  優先度別のメッセージキューヘッダ領域
    の先頭番地  */
} T_CMBX;

メールボックスの現在状態のパケット形式

typedef struct t_rmbx {
    ID          wtskid;     /*  メールボックスの待ち行列の先頭のタスク
    の ID 番号  */
    T_MSG       *pk_msg;    /*  メッセージキューの先頭につながれたメッ
    セージの先頭番地  */
} T_RMBX;

ミューテックスの生成情報のパケット形式

typedef struct t_cmtx {
    AT R         mtxatr;     /*  ミューテックス属性  */
    PRI         ceilpri;    /*  ミューテックスの上限優先度  */
} T_CMTX;

ミューテックスの現在状態のパケット形式

typedef struct t_rmtx {
    ID          htskid;      /*  ミューテックスをロックしているタス
    クの ID 番号  */
    ID          wtskid;     /*  ミューテックスの待ち行列の先頭のタ
    スクの ID 番号  */
} T_RMTX;

メッセージバッファの生成情報のパ ケット形式

☆未完成

メッセージバッファの現在状態のパケット形式

☆未完成

スピンロックの生成情報のパケット形式

typedef struct t_cspn {
    ATR         spnatr;     /*  スピンロック属性  */
} T_CSPN;

スピンロックの現在状態のパケット形式

typedef struct t_rspn {
    STAT        spnstat     /*  スピンロックのロック状態  */
} T_RSPN;
  • (5) メモリプール管理機能

    固 定長メモリプールの生成情報のパケット形式

typedef struct t_cmpf {
    ATR         mpfatr;     /*  固定長メモリプール属性  */
    uint_t      blkcnt;     /*  獲得できる固定長メモリブロックの数  */
    uint_t      blksz;      /*  固定長メモリブロックのサイズ  */
    MPF_T *     mpf;        /*  固定長メモリプール領域の先頭番地  */
    void *      mpfmb;      /*  固定長メモリプール管理領域の先頭番地  */
} T_CMPF;

固定長メモリプールの現在状態のパケット形式

typedef struct t_rmpf {
    ID          wtskid;     /*  固定長メモリプールの待ち行列の先頭の
    タスクの ID 番号  */
    uint_t      fblkcnt;    /*  固定長メモリプール領域の空きメモリ領
    域に割り付けることができる固定長メモ
    リブロックの数  */
} 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;

オーバランハンドラの定義情報のパケット形式

typedef struct t_dovr {
    ATR         ovratr;     /*  オーバランハンドラ属性  */
    OVRHDR      ovrhdr;     /*  オーバランハンドラの先頭番地  */
} T_DOVR;

オーバランハンドラの現在状態のパケット形式

typedef struct t_rovr {
    STAT    ovrstat;        /*  オーバランハンドラの動作状態  */
    OVRTIM  leftotm;        /*  残りプロセッサ時間  */
} T_ROVR;
  • (7) システム状態管理機能

    システムの現在状態のパケット形式

    ☆未完成

  • (8) メモリオブジェクト管理機能

    メモリオブジェクトの登録情報のパケット形式

typedef struct t_amem {
    ATR         mematr      /*  メモリオブジェクト属性  */
    void *      base        /*  登録するメモリ領域の先頭番地  */
    SIZE        size        /*  登録するメモリ 領域のサイズ(バイト数) */
} T_AMEM;

物理メモリ領域の登録情報のパケット形式

typedef struct t_apma {
    ATR         mematr      /*  メモリオブジェクト属性  */
    void *      base        /*  登録するメモリ領域の先頭番地  */
    SIZE        size        /*  登録するメモリ領域のサイズ(バイト数) */
    void *      paddr       /*  登録するメモリ領域の物理アドレスの先頭
    番地  */
} T_APMA;

メモリオブジェクトの現在状態のパケット形式

☆未完成

  • (9) 割込み管理機能

    割込み要求ラインの属性の設定情報のパケット形式

typedef struct t_cint {
    ATR         intatr;     /*  割込み要求ライン属性  */
    PRI         intpri;     /*  割込み優先度  */
} T_CINT;

割込みサービスルーチンの生成情報のパケット形式

typedef struct t_cisr {
    ATR         isratr;     /*  割込みサービスルーチン属性  */
    intptr_t    exinf;      /*  割込みサービスルーチンの拡張情報  */
    INTNO       intno;      /*  割込みサービスルーチンを登録する割込
    み番号  */
    ISR         isr;        /*  割込みサービスルーチンの先頭番地  */
    PRI         isrpri;     /*  割込みサービスルーチン優先度  */
} T_CISR;

割込みサービスルーチンの現在状態のパケット形式

☆未完成

割込みハンドラの定義情報のパケット形式

typedef struct t_dinh {
    ATR         inhatr;     /*  割込みハンドラ属性  */
    INTHDR      inthdr;     /*  割込みハンドラの先頭番地  */
} T_DINH;

割込み要求ラインの現在状態のパケット形式

☆未完成

  • (10) CPU 例外管理機能

    CPU 例外ハンドラの定義情報のパケット形式

typedef struct t_dexc {
    ATR         excatr;     /* CPU 例外ハンドラ属性  */
    EXCHDR      exchdr;     /* CPU 例外ハンドラの先頭番地  */
} T_DEXC;
  • (11) 拡張サービスコール管理機能

    拡張サービスコールの定義情報のパケット形式

typedef struct t_dsvc {
    ATR         svcatr      /*  拡張サービスコール属性  */
    EXTSVC      svcrtn      /*  拡張サービスコールの先頭番地  */
    SIZE        stksz       /*  拡張サービスコールで使用するスタック
    サイズ  */
} T_DSVC;
  • (12) システム構成管理機能

    コンフィギュレーション情報のパケット形式

    ☆未完成

    バージョン情報のパケット形式

    ☆未完成

5.4 定数とマクロ

5.4.1 TOPPERS 共通定数

  • (1) 一般定数
  NULL 無効ポインタ
true 1
false 0
E_OK 0 正常終了
  • (2) 整数型に格納できる最大値と最小値
INT8_MAX int8_t に格納できる最大値(オプション, C99 準拠)
INT8_MIN int8_t に格納できる最小値(オプション, C99 準拠)
UINT8_MAX uint8_t に格納できる最大値(オプション, C99 準拠)
INT16_MAX int16_t に格納できる最大値( C99 準拠)
INT16_MIN int16_t に格納できる最小値( C99 準拠)
UINT16_MAX uint16_t に格納できる最大値( C99 準拠)
INT32_MAX int32_t に格納できる最大値( C99 準拠)
INT32_MIN int32_t に格納できる最小値( C99 準拠)
UINT32_MAX uint32_t に格納できる最大値( C99 準拠)
INT64_MAX int64_t に格納できる最大値(オプション, C99 準拠)
INT64_MIN int64_t に格納できる最小値(オプション, C99 準拠)
UINT64_MAX uint64_t に格納できる最大値(オプション, C99 準拠)
INT128_MAX int128_t に格納できる最大値(オプション, C99 準拠)
INT128_MIN int128_t に格納できる最小値(オプション, C99 準拠)
UINT128_MAX uint128_t に格納できる最大値(オプション, C99 準拠)
INT_LEAST8_MAX int_least8_t に格納できる最大値( C99 準拠)
INT_LEAST8_MIN int_least8_t に格納できる最小値( C99 準拠)
UINT_LEAST8_MAX uint_least8_t に格納できる最大値( C99 準拠)
INT_MAX int_t に格納できる最大値( C90 準拠)
INT_MIN int_t に格納できる最小値( C90 準拠)
UINT_MAX uint_t に格納できる最大値( C90 準拠)
LONG_MAX long_t に格納できる最大値( C90 準拠)
LONG_MIN long_t に格納できる最小値( C90 準拠)
ULONG_MAX ulong_t に格納できる最大値( C90 準拠)
FLOAT32_MIN float32_t に格納できる最小の正規化された正の浮動小数点数(オプション)
FLOAT32_MAX float32_t に格納できる表現可能な最大の有限浮動小数点数(オプション)
DOUBLE64_MIN double64_t に格納できる最小の正規化された正の浮動小数点数(オプション)
DOUBLE64_MAX double64_t に格納できる表現可能な最大の有限浮動小数点数(オプション)
  • (3) 整数型のビット数
CHAR_BIT char 型のビット数( C90 準拠)
  • (4) オブジェクト属性
TA_NULL 0U オブジェクト属性を指定しない
  • (5) タイムアウト指定
TMO_POL 0 ポーリング
TMO_FEVR -1 永久待ち
TMO_NBLK -2 ノンブロッキング
  • (6) アクセス許可パターン
TACP_KERNEL 0U カーネルドメインのみにアクセスを許可
TACP_SHARED ˜0U すべての保護ドメインにアクセスを許可

5.4.2 TOPPERS 共通マクロ

  • (1) 整数定数を作るマクロ
INT8_C(val) int_least8_t 型の定数を作るマクロ( C99 準拠)
UINT8_C(val) uint_least8_t 型の定数を作るマクロ( C99 準拠)
INT16_C(val) int16_t 型の定数を作るマクロ( C99 準拠)
UINT16_C(val) uint16_t 型の定数を作るマクロ( C99 準拠)
INT32_C(val) int32_t 型の定数を作るマクロ( C99 準拠)
UINT32_C(val) uint32_t 型の定数を作るマクロ( C99 準拠)
INT64_C(val) int64_t 型の定数を作るマクロ(オプション, C99 準拠)
UINT64_C(val) uint64_t 型の定数を作るマクロ(オプション, C99 準拠)
INT128_C(val) int128_t 型の定数を作るマクロ(オプション, C99 準拠)
UINT128_C(val) uint128_t 型の定数を作るマクロ(オプション, C99 準拠)
UINT_C(val) uint_t 型の定数を作 るマクロ
ULONG_C(val) ulong_t 型の定数を作るマクロ
  • (2) 型に関する情報を取り出すためのマクロ
offsetof(structure, field) 構造体 structure 中のフィールド field のバイト位置を返すマクロ( C90 準拠)
alignof(type) 型 type のアラインメント単位を返すマクロ
ALIGN_TYPE(addr, type) 番地 addr が型 type に対してアラインしているかどうかを返すマクロ
  • (3) assert マクロ
asser t(exp) exp が成立しているかを検査するマクロ( C90 準拠)
  • (4) コンパイラの拡張機能のためのマクロ
inline インライン関数
Inline ファイルローカルなインライン関数
asm インラインアセンブラ
Asm インラインアセンブラ(最適化抑止)
throw() 例外を発生しない関数
NoReturn リターンしない関数
  • (5) エラーコード生成・分解マクロ
ERCD(mercd, sercd) メインエラーコード mercd とサブエラーコード sercd から,エラーコードを生成するためのマクロ
MERCD(ercd) エラーコード ercd からメインエラーコードを抽出するためのマクロ
SERCD(ercd) エラーコード ercd からサブエラーコードを抽出するためのマクロ
  • (6) アクセス許可パターン生成マクロ
TACP(domid) domid で指定される保護ドメインに属する処理単位のみにアクセスを許可するアクセス許可パターン

5.4.3 カーネル共通定数

  • (1) オブジェクト属性
TA_TPRI 0x01U タスクの待ち行列をタスクの優先度順に
  • (2) 保護ドメイン ID
TDOM_SELF 0 自タスクの属する保護ドメイン
TDOM_KERNEL -1 カーネルドメイン
TDOM_NONE -2 無所属(保護ドメインに属さない)
  • (3) その他のカーネル共通定数
TCLS_SELF 0 自タスクの属するクラス
TPRC_NONE 0 割付けプロセッサの指定がない
TPRC_INI 0 初期割付けプロセッサ
TSK_SELF 0 自タスク指定
TSK_NONE 0 該当するタスクがない
TPRI_SELF 0 自タスクのベース優先度の指定
TPRI_INI 0 タスクの起動時優先度の指定
TIPM_ENAALL 0 割込み優先度マスク全解除

5.4.4 カーネル共通マクロ

  • (1) オブジェクト属性を作るマクロ
TA_DOM(domid) domid で指定される保護ドメインに属する
TA_CLS(clsid) clsid で指定されるクラスに属する
  • (2) サービスコールの呼出し方法を指定するマクロ
SVC_CALL(svc) svc で指定されるサービスコールを関数呼出しによって呼び出すための名称

5.4.5 カーネルの機能毎の定数

  • (1) タスク管理機能
TA_ACT 0x02U タスクの生成時にタスクを起動する
TA_RSTR 0x04U 生成するタスクを制約タスクとする
TA_FPU   FPU レジスタをコンテキストに含める
TTS_RUN 0x01U 実行状態
TTS_RDY 0x02U 実行可能状態
TTS_WAI 0x04U 待ち状態
TTS_SUS 0x08U 強制待ち状態
TTS_WAS 0x0cU 二重待ち状態
TTS_DMT 0x10U 休止状態
TTW_SLP 0x0001U 起床待ち
TTW_DLY 0x0002U 時間経過待ち
TTW_SEM 0x0004U セマフォの資源獲得待ち
TTW_FLG 0x0008U イベントフラグ待ち
TTW_SDTQ 0x0010U データキューへの送信待ち
TTW_RDTQ 0x0020U データキューからの受信待ち
TTW_SPDQ 0x0100U 優先度データキューへの送信待ち
TTW_RPDQ 0x0200U 優先度データキューからの受信待ち
TTW_MBX 0x0040U メールボックスからの受信待ち
TTW_MTX 0x0080U ミューテックスのロック待ち状態
TTW_MPF 0x2000U 固定長メモリブロックの獲得待ち

TA_FPU の値は,ターゲット定義とする.

  • (3) タスク例外処理機能
TTEX_ENA 0x01U タスク例外処理許可状態
TTEX_DIS 0x02U タスク例外処理禁止状態
  • (4) 同期・通信機能

    イベントフラグ

TA_WMUL 0x02U 複数のタスクが待つのを許す
TA_CLR 0x04U タスクの待ち解除時にイベントフラグをクリアする
TWF_ORW 0x01U イベントフラグの OR 待ちモード
TWF_ANDW 0x02U イベントフラグの AND 待ちモード

メ ールボックス

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

スピンロック

TSPN_UNL 0x01U 取得されていない状態
TSPN_LOC 0x02U 取得されている状態
  • (6) 時間管理機能

    周期ハンドラ

TA_STA 0x02U 周期ハンドラの生成時に周期ハンドラを動作開始する
TA_PHS 0x04U 周期ハンドラを生成した時刻を基準時刻とする
TCYC_STP 0x01U 周期ハンドラが動作していない状態
TCYC_STA 0x02U 周期ハンドラが動作している状態

アラームハンドラ

TALM_STP 0x01U アラームハンドラが動作していない状態
TALM_STA 0x02U アラームハンドラが動作している状態

オーバランハンドラ

TOVR_STP 0x01U オーバランハンドラが動作していない状態
TOVR_STA 0x02U オーバランハンドラが動作している状態
  • (8) メモリオブジェクト管理機能
TA_NOWRITE 0x01U 書込みアクセス禁止
TA_NOREAD 0x02U 読出しアクセス禁止
TA_EXEC 0x04U 実行アクセス許可
TA_MEMINI 0x08U メモリの初期化を行う
TA_MEMPRSV 0x10U メモリの初期化を行わない
TA_SDATA 0x20U ショートデータ領域に配置
TA_UNCACHE 0x40U キャッシュ禁止
TA_IODEV 0x80U 周辺デバイスの領域
TA_WTHROUGH   ライトスルーキャッシュを用いる
TA_STDROM 0x02U 標準 ROM リージョン
TA_STDRAM 0x04U 標準 RAM リージョン
TPM_WRITE 0x01U 書込みアクセス権のチェック
TPM_READ 0x02U 読出しアクセス権のチェック
TPM_EXEC 0x04U 実行アクセス権のチェック

TA_WTHROUGH の値は,ターゲット定義とする.

  • (9) 割込み管理機能
TA_ENAINT 0x01U 割込み要求禁止フラグをクリア
TA_EDGE 0x02U エッジトリガ
TA_POSEDGE   ポジティブエッジトリガ
TA_NEGEDGE   ネガティブエッジトリガ
TA_BOTHEDGE   両エッジトリガ
TA_LOWLEVEL   ローレベルトリガ
TA_HIGHLEVEL   ハイレベルトリガ
TA_NONKERNEL 0x02U カーネル管理外の割込み

TA_POSEDGE , TA_NEGEDGE , TA_BOTHEDGE , TA_LOWLEVEL , TA_HIGHLEVEL の値は, ターゲット定義とする.

  • (10) CPU 例外管理機能
TA_DIRECT CPU 例外ハンドラを直接呼び出す

TA_DIRECT の値は,ターゲット定義とする.

5.4.6 カーネルの機能毎のマクロ

  • (1) タスク管理機能
COUNT_STK_T(sz) サイズ sz のスタック領域を確保するために必要なSTK_T 型の配列の要素数
ROUND_STK_T(sz) 要素数 COUNT_STK_T(sz) の STK_T 型の配列のサイズ( szを, STK_T 型のサイズの倍数になるように大きい方に丸めた値)
  • (4) 同期・通信機能
TSZ_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータキュー管理領域のサイズ(バイト数)
TCNT_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータキュー管理領域を確保するために必要な MB_T 型の配列の要素数
TSZ_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度データキュー管理領域のサイズ(バイト数)
TCNT_PDQMB(pdqcnt) pdqcnt で指定した数のデー タを格納できる優先度データキュー管理領域を確保するために必要な MB_T 型の配列の要素数
  • (5) メモリプール管理機能
COUNT_MPF_T(blksz) 固定長メモリブロックのサイズが blksz の固定長メモリプール領域を確保するために,固定長メモリブロック 1つあたりに必要な MPF_T 型の配列の要素数を求めるマクロ
ROUND_MPF_T(blksz) 要素数 COUNT_MPF_T(blksz) の MPF_T 型の配列のサイズ( blksz を, MPF_T 型のサイズの倍数になるように大きい方に丸めた値)
TSZ_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域のサイズ(バイト数)
TCNT_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域を確保するために必要な MB_T 型の配列の要素数

5.5 構成マクロ

5.5.1 TOPPERS 共通構成マクロ

  • (1) 相対時間の範囲
TMAX_RELTIM 相対時間に指定できる最大値

5.5.2 カーネル共通構成マクロ

  • (1) サポートする機能
TOPPERS_SUPPORT_PROTECT 保護機能対応のカーネル
TOPPERS_SUPPORT_MULTI_PRC マルチプロセッサ対応のカーネル
TOPPERS_SUPPORT_DYNAMIC_CRE 動的生成対応のカーネル
  • (2) 優先度の範囲
TMIN_TPRI タスク優先度の最小値(= 1)
TMAX_TPRI タスク優先度の最大値
  • (3) プロセッサの数
TNUM_PRCID プロセッサの数
  • (4) 特殊な役割を持ったプロセッサ
TOPPERS_MASTER_PRCID マスタプロセッサの ID 番号
TOPPERS_SYSTIM_PRCID システム時刻管理プロセッサの ID 番号
  • (5) タイマ方式
TOPPERS_SYSTIM_LOCAL ローカルタイマ方式の場合にマクロ定義
TOPPERS_SYSTIM_GLOBAL グローバルタイマ方式の場合にマクロ定義
  • (6) バージョン情報
TKERNEL_MAKER カーネルのメーカコード(= 0x0118 )
TKERNEL_PRID カーネルの識別番号
TKERNEL_SPVER カーネル仕様のバージョン番号
TKERNEL_PRVER カーネルのバージョン番号

5.5.3 カーネルの機能毎の構成マクロ

  • (1) タスク管理機能
TMAX_ACTCNT タスクの起動要求キューイング数の最大値
TNUM_TSKID 登録できるタスクの数(動的生成対応でないカーネルでは,静的 API によって登録されたタスクの数に一致)
  • (2) タスク付属同期機能
TMAX_WUPCNT タスクの起床要求キューイング数の最大値
  • (3) タスク例外処理機能
TBIT_TEXPTN タスク例外要因のビット数( TEXPTN の有効ビット数)
  • (4) 同期・通信機能

    セマフォ

TMAX_MAXSEM セマ フォの最大資源数の最大値
TNUM_SEMID 登録できるセマフォの数(動的生成対応でないカーネルでは,静的 API によって登録されたセマフォの数に一致)

イベントフラグ

TBIT_FLGPTN イベントフラグのビット数( FLGPTN の有効ビット数)
TNUM_FLGID 登録できるイベントフラグの数(動的生成対応でないカーネルでは,静的 API によって登録されたイベントフラグの数に一致)

データキュー

TNUM_DTQID 登録できるデータキューの数(動的生成対応でないカーネルでは,静的 API によって登録されたデータキューの数に一致)

優先度データキュー

TMIN_DPRI データ優先度の最小値(= 1)
TMAX_DPRI データ優先度の最大値
TNUM_PDQID 登録できる優先度データキューの数(動的生成対応でないカーネルでは,静的 API によって登録された優先度データキューの数に一致)

メールボックス

TMIN_MPRI メッセージ優先度の最小値(= 1)
TMAX_MPRI メッセージ優先度 の最大値
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 によって登録されたアラームハンドラの数に一致)

オーバランハンドラ

TMAX_OVRTIM プロセッサ時間に指定できる最大値
TOPPERS_SUPPORT_OVRHDR オーバランハンドラ機能がサポートされている
  • (7) システム状態管理機能

    なし

  • (8) メモリオブジェクト管理機能
TOPPERS_SUPPORT_ATT_MOD ATT_MOD / ATA_MOD がサポートされている
TOPPERS_SUPPORT_ATT_PMA ATT_PMA / ATA_PMA / att_pma がサポートされている
  • (9) 割込み管理機能
TMIN_INTPRI 割込み優先度の最小値(最高値)
TMAX_INTPRI 割込み優先度の最大値(最低値,= -1)
TMIN_ISRPRI 割込みサービスルーチン優先度の最小値(= 1)
TMAX_ISRPRI 割込みサービスルーチン優先度の最大値
TOPPERS_SUPPORT_DIS_INT dis_int がサポートされている
TOPPERS_SUPPORT_ENA_INT ena_int がサポートされている
  • (10) CPU 例外管理機能

    なし

  • (11) 拡張サービスコール管理機能
TNUM_FNCD 登録できる拡張サービスコールの数(動的生成対応でないカーネルでは,静的 API によって登録された拡張サービスコールの数に一致)
  • (12) システム構成管理機能

    なし

5.6 エラーコード一覧

  • (1) メインエラーコード
E_SYS -5 システムエラー
E_NOSPT -9 未サポート機能
E_RSFN -10 予約機能コード
E_RSATR -11 予約属性
E_PAR -17 パラメータエラー
E_ID -18 不正 ID 番号
E_CTX -25 コンテキストエラー
E_MACV -26 メモリアクセス違反
E_OACV -27 オブジェクトアクセス違反
E_ILUSE -28 サービスコール不正使用
E_NOMEM -33 メモリ不足
E_NOID -34 ID番号不足
E_NORES -35 資源不足
E_OBJ -41 オブジェクト状態エラー
E_NOEXS -42 オブジェクト未登録
E_QOVR -43 キューイングオーバフロー
E_RLWAI -49 待ち禁止状態または待ち状態の強制解除
E_TMOUT -50 ポーリング失敗またはタイムアウト
E_DLT -51 待ちオブジェクトの削除または再初期化
E_CLS -52 待ちオブジェクトの状態変化
E_WBLK -57 ノンブロッキング受付け
E_BOVR -58 バッファオーバフロー

5.7 機能コード一覧


  -0 -1 -2 -3
-0x01 予約 予約 予約 予約
-0x05 act_tsk iact_tsk can_act ext_tsk
-0x09 ter_tsk chg_pri get_pri get_inf
-0x0d slp_tsk tslp_tsk wup_tsk iwup_tsk
-0x11 can_wup rel_wai irel_wai 予約
-0x15 dis_wai idis_wai ena_wai iena_wai
-0x19 sus_tsk rsm_tsk dly_tsk 予約
-0x1d ras_tex iras_tex dis_tex ena_tex
-0x21 sns_tex ref_tex 予約 予約
-0x25 sig_sem isig_sem wai_sem pol_sem
-0x29 twai_sem 予約 予約 予約
-0x2d set_flg iset_flg clr_flg wai_flg
-0x31 pol_flg twai_flg 予約 予約
-0x35 snd_dtq psnd_dtq ipsnd_dtq tsnd_dtq
-0x39 fsnd_dtq ifsnd_dtq rcv_dtq prcv_dtq
-0x3d trcv_dtq 予約 予約 予約
-0x41 snd_pdq psnd_pdq ipsnd_pdq tsnd_pdq
-0x45 rcv_pdq prcv_pdq trcv_pdq 予約
-0x49 snd_mbx rcv_mbx prcv_mbx trcv_mbx
-0x4d loc_mtx ploc_mtx tloc_mtx unl_mtx
-0x51 snd_mbf psnd_mbf tsnd_mbf rcv_mbf
-0x55 prcv_mbf trcv_mbf 予約 予約
-0x59 get_mpf pget_mpf tget_mpf rel_mpf
-0x5d get_tim get_utm 予約 ref_ovr
-0x61 sta_cyc stp_cyc 予約 予約
-0x65 sta_alm ista_alm stp_alm istp_alm
-0x69 sta_ovr ista_ovr stp_ovr istp_ovr
-0x6d sac_sys ref_sys rot_rdq irot_rdq
-0x71 get_did 予約 get_tid iget_tid
-0x75 loc_cpu iloc_cpu unl_cpu iunl_cpu
-0x79 dis_dsp ena_dsp sns_ctx sns_loc
-0x7d sns_dsp sns_dpn sns_ker ext_ker
-0x81 att_mem det_mem sac_mem prb_mem
-0x85 ref_mem 予約 att_pma 予約
-0x89 cfg_int dis_int ena_int ref_int
-0x8d chg_ipm get_ipm 予約 予約
-0x91 xsns_dpn xsns_xpn 予約 予約
-0x95 ref_cfg ref_ver 予約 予約
-0x99 予約 予約 予約 予約
-0x9d 予約 予約 予約 予約
-0xa1 予約 ini_sem ini_flg ini_dtq
-0xa5 ini_pdq ini_mbx ini_mtx ini_mbf
-0xa9 ini_mpf 予約 予約 予約
-0xad 予約 予約 予約 予約
-0xb1 ref_tsk ref_sem ref_flg ref_dtq
-0xb5 ref_pdq ref_mbx ref_mtx ref_mbf
-0xb9 ref_mpf ref_cyc ref_alm ref_isr
-0xbd ref_spn 予約 予約 予約
-0xc1 acre_tsk acre_sem acre_flg acre_dtq
-0xc5 acre_pdq acre_mbx acre_mtx acre_mbf
-0xc9 acre_mpf acre_cyc acre_alm acre_isr
-0xcd acre_spn 予約 予約 予約
-0xd1 del_tsk del_sem del_flg del_dtq
-0xd5 del_pdq del_mbx del_mtx del_mbf
-0xd9 del_mpf del_cyc del_alm del_isr
-0xdd del_spn 予約 予約 予約
-0xe1 sac_tsk sac_sem sac_flg sac_dtq
-0xe5 sac_pdq 予約 sac_mtx sac_mbf
-0xe9 sac_mpf sac_cyc sac_alm sac_isr
-0xed sac_spn 予約 予約 予約
-0xf1 def_tex def_ovr def_inh def_exc
-0xf5 def_svc 予約 予約 予約
-0xf9 予約 予約 予約 予約
-0xfd 予約 予約 予約 予約
-0x101 mact_tsk imact_tsk mig_tsk 予約
-0x105 msta_cyc 予約 msta_alm imsta_alm
-0x109 mrot_rdq imrot_rdq get_pid iget_pid
-0x10d 予約 予約 予約 予約
-0x111 loc_spn iloc_spn try_spn itry_spn
-0x115 unl_spn iunl_spn 予約 予約
-0x119 予約 予約 予約 予約
-0x11d 予約 予約 予約 予約

【μ ITRON4.0 仕様との関係】

サービスコールの機能コードを割り当てなおした.

5.8 カーネルオブジェクトに対するアクセスの種別


オブジェクトの種類 通常操作 1 通常操作 2 管理操作 参照操作
メモリオブジェクト 書込み 読出し det_mem ref_mem
    実行 sac_mem prb_mem
タスク act_tsk ter_tsk del_tsk get_pri
  mact_tsk chg_pri sac_tsk ref_tsk
  can_act rel_wai def_tex ref_tex
  mig_tsk sus_tsk   ref_ovr
  wup_tsk rsm_tsk    
  can_wup dis_wai    
    ena_wai    
    ras_tex    
    sta_ovr    
    stp_ovr    
セマフォ sig_sem wai_sem del_sem ref_sem
    pol_sem ini_sem  
    twai_sem sac_sem  
イベントフラグ set_flg wai_flg del_flg ref_flg
  clr_flg pol_flg ini_flg  
    twai_flg sac_flg  
データキュー snd_dtq rcv_dtq del_dtq ref_dtq
  psnd_dtq prcv_dtq ini_dtq  
  tsnd_dtq trcv_dtq sac_dtq  
  fsnd_dtq      
優先度データキュー snd_pdq rcv_pdq del_pdq ref_pdq
  psnd_pdq prcv_pdq ini_pdq  
  tsnd_pdq trcv_pdq sac_pdq  
ミューテックス loc_mtx - del_mtx ref_mtx
  ploc_mtx   ini_mtx  
  tloc_mtx   sac_mtx  
スピンロック loc_spn - del_spn ref_spn
  try_spn   sac_spn  
  unl_spn      
固定長メモリプール get_mpf rel_mpf del_mpf ref_mpf
  pget_mpf   ini_mpf  
  tget_mpf   sac_mpf  
周期ハンドラ sta_cyc stp_cyc del_cyc ref_cyc
  msta_cyc   sac_cyc  
アラームハンドラ sta_alm stp_alm del_alm ref_alm
  msta_alm   sac_alm  
割込みサービスルーチン - - del_isr ref_isr
      sac_isr  
システム状態 rot_rdq loc_cpu acre_yyy get_tim
  mrot_rdq unl_cpu att_mem get_ipm
  dis_dsp dis_int att_pma ref_sys
  ena_dsp ena_int cfg_int ref_int
    chg_ipm def_inh ref_cfg
      def_exc ref_ver
      def_svc  
      def_ovr  

すべての保護ドメインから呼び出すことができるサービスコール:

  • ・自タスクへの操作( ext_tsk , get_inf , slp_tsk , tslp_tsk , dly_tsk , dis_tex , ena_tex )
  • ・タスク例外状態参照( sns_tex )
  • ・性能評価用システム時刻の参照( get_utm )
  • ・システム状態参照( get_tid , get_did , get_pid , sns_ctx , sns_loc , sns_dsp , sns_dpn , sns_ker )
  • ・ CPU 例外発生時の状態参照( xsns_dpn , xsns_xpn )
  • ・拡張サービスコールの呼出し( cal_svc )

カーネルドメインのみから呼び出すことができるサービスコール:

  • ・システム状態のアクセス許可ベクタの設定( sac_sys )
  • ・カーネルの終了( ext_ker )
  • ・非タスクコンテキスト専用のサービスコール

アクセス許可ベクタによるアクセス保護を行わないサービスコール:

  • ・ミューテックスのロック解除( unl_mtx )

【補足説明】

xsns_dpn と xsns_xpn は,エラーコードを返さないために,すべての保護ドメイ ンから呼び出すことができるサービスコールとしているが,タスクコンテキス トから呼び出した場合には必ず true が返ることとしており,実質的にはカーネ ルドメインのみから呼び出すことができる.

unl_mtx は ,アクセス許可ベクタによるアクセス保護を行わないサービスコール としているが,ミューテックスをロックしたタスク以外が呼び出すと E_ILUSE エ ラーとなるため,実質的には対象ミューテックスの通常操作 1としてアクセス保 護されているとみなすことができる(ミューテックスのロック中にアクセス許 可ベクタを変更した場合の振舞いは異なる).

【μ ITRON4.0/PX 仕様との関係】

get_pri は,μ ITRON4.0/PX 仕様ではタスクに対する通常操作 1としていたのを, タスクに対する参照操作に変更した.また, get_ipm (μ ITRON4.0/PX 仕様では get_ixx )をシステム状態に対する通常操作 2から参照操作に, sac_sys をシステ ム状態に対する管理操作からカーネルドメインのみから呼び出すことができる サービスコールに変更した.システム時刻に対するア クセス許可ベクタは廃止 し, get_tim はシステム状態に対する参照操作とした.

5.9 省略名の元になった英語

5.9.1 サービスコールと静的 API の名称の中の xxx の元になった英語

xxx 元になった英語
act activate
aid automatically assigned ID
ata attach with access control vector
att attach
cal call
can cancel
cfg configure
chg change
clr clear
cre create
def define
del delete
det detach
dis disable
dly delay
ena enable
epr execution priority
ext exit
get get
ini initialize
lnk link
loc lock
mig migrate
pol poll
prb probe
ras raise
rcv receive
ref reference
rel release
rot rotate
rsm resume
sac set access control vector
set set
sig signal
slp sleep
snd send
sns sense
sta start
stp stop
sus suspend
ter terminate
try try
unl unlock
wai wait
wup wake up

5.9.2 サービスコールと静的 API の名称の中の yyy の元になった英語

yyy 元になった英語
act activation
alm alarm handler
cfg configuration
cpu CPU
ctx context
cyc cyclic handler
did domain ID
dpn disp atch pending
dsp dispatch
dtq data queue
exc exception
flg eventflag
ics interrupt context stack
inf information
inh interrupt han dler
ini initilization
int interrupt
ipm interrupt priority mask
isr interrupt service routine
ker kernel
loc lock
mbf message buf fer
mbx mailbox
mpf fixed -sized memory pool
mem memory
mod module
mtx mutex
ovr overrun handler
pdq priority data queue
pid processor ID
pma physical memory area
pri priority
rdq ready queue
reg region
sec section
sem semaphore
spn spin lock
stk stack
sys system
svc service call
ter termination
tex task exception
tid task ID
tim time
tsk task
utm time in micro second
ver version
wai wait
wup wake up
xpn exception pending

5.9.3 サービスコールの名称の中の zの元になった英語

z 元になった英語
a automatic ID assignment
f force
i interrupt
m multiprocessor
p poll
t timeout
x exception

5.10 バージョン履歴

2008 年 11 月 19 日 Release 1.0.0 最初のリリース
2009 年 5月 8日2010 年 5月 10 日 Release 1.1.0Release 1.2.0 FMP カーネルに関する記述が完成
2011 年 5月 5日 Release 1.3.0 HRP2 カーネルに関する記述が完成

以上

図2-1. 想定するソフトウェア構成

図2-2. タスクの状態遷移

図2-3. 過渡的な状態も含めたタスクの状態遷移

図2-4. TOPPERS標準割込み処理モデルの概念図

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

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

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

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

図2-9. 最終的なロードモジュールのパス3での生成


Trail4Youでの改変部分について

Toppersのライセンス要求にしたがってTrail4Youにより変更された点を明記します。

Trail4You連絡先: info@trail4you.com

Last Update 2012-09-07.