toppers新世代カーネル統合仕様書 release 1.6.0 1...
TRANSCRIPT
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
1
1
2 TOPPERS新世代カーネル統合仕様書
3
4 バージョン: Release 1.6.0
5 最終更新: 2014年1月6日
6
7 このドキュメントは,TOPPERS新世代カーネルに属する一連のリアルタイムカー
8 ネルの仕様を,統合的に記述したものである.未完成の部分も残っている(特
9 に動的生成対応カーネルに関しては,仕様検討が不十分なところが多い)が,
10 新世代カーネルの仕様検討はこの段階で完了とし,これ以降は第3世代カーネル
11 仕様として検討を続ける計画である.
12
13 この仕様書に準拠している各カーネルのバージョンは,次の通りである.
14
15 TOPPERS/ASPカーネル Release 1.9.0
16 TOPPERS/FMPカーネル Release 1.2.0
17 TOPPERS/HRP2カーネル Release 2.2.0
18 TOPPERS/SSPカーネル Release 1.2.0
19
20 なお,本文中から参照している図は,ファイルの最後にまとめて掲載してある.
21
22 ----------------------------------------------------------------------
23 TOPPERS New Generation Kernel Specification
24
25 Copyright (C) 2006 -2014 by Embedded and Real -Time Systems Laboratory
26 Graduate School of Information Science, Nagoya Univ., JAPAN
27 Copyright (C) 2006 -2014 by TOPPERS Project, Inc., JAPAN
28
29 上記著作権者は,以下の (1)~(3) の条件を満たす場合に限り,本ドキュメ
30 ント(本ドキュメントを改変したものを含む.以下同じ)を使用・複製・改
31 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
32 (1) 本ドキュメントを利用する場合には,上記の著作権表示,この利用条件
33 および下記の無保証規定が,そのままの形でドキュメント中に含まれて
34 いること.
35 (2) 本ドキュメントを改変する場合には,ドキュメントを改変した旨の記述
36 を,改変後のドキュメント中に含めること.ただし,改変後のドキュメ
37 ントが,TOPPERSプロジェクト指定の開発成果物である場合には,この限
38 りではない.
39 (3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害
40 からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
41 本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づ
42 く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
43
44 本ドキュメントは,無保証で提供されているものである.上記著作権者およ
45 びTOPPERSプロジェクトは,本ドキュメントに関して,特定の使用目的に対す
46 る適合性も含めて,いかなる保証も行わない.また,本ドキュメントの利用
47 により直接的または間接的に生じたいかなる損害に関しても,その責任を負
48 わない.
49 ----------------------------------------------------------------------
50
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
2
51 ○目次
52
53 ・目次
54 ・仕様書で用いる記述項目と記号
55 ・タグの付与方法
56
57 第1章 TOPPERS新世代カーネルの概要
58
59 1.1 TOPPERS新世代カーネル仕様の位置付け
60 1.2 TOPPERS新世代カーネル仕様の設計方針
61 1.3 TOPPERS/ASPカーネルの適用対象領域と仕様設計方針
62 1.4 TOPPERS/FMPカーネルの適用対象領域と仕様設計方針
63 1.5 TOPPERS/HRP2カーネルの適用対象領域と仕様設計方針
64 1.6 TOPPERS/SSPカーネルの適用対象領域と仕様設計方針
65 1.7 TOPPERS/ASP Safety カーネルの適用対象領域と仕様設計方針
66
67 第2章 主要な概念と共通定義
68
69 2.1 仕様の位置付け
70 2.1.1 カーネルの機能セット
71 2.1.2 ターゲット非依存の規定とターゲット定義の規定
72 2.1.3 想定するソフトウェア構成
73 2.1.4 想定するハードウェア構成
74 2.1.5 想定するプログラミング言語
75 2.2 APIの構成要素とコンベンション
76 2.2.1 APIの構成要素
77 2.2.2 パラメータとリターンパラメータ
78 2.2.3 返値とエラーコード
79 2.2.4 機能コード
80 2.2.5 ヘッダファイル
81 2.3 主な概念
82 2.3.1 オブジェクトと処理単位
83 2.3.2 サービスコールとパラメータ
84 2.3.3 保護機能
85 2.3.4 マルチプロセッサ対応
86 2.3.5 その他
87 2.4 処理単位の種類と実行
88 2.4.1 処理単位の種類
89 2.4.2 処理単位の実行順序
90 2.4.3 カーネル処理の不可分性
91 2.4.4 処理単位を実行するプロセッサ
92 2.5 システム状態とコンテキスト
93 2.5.1 カーネル動作状態と非動作状態
94 2.5.2 タスクコンテキストと非タスクコンテキスト
95 2.5.3 カーネルの振舞いに影響を与える状態
96 2.5.4 全割込みロック状態と全割込みロック解除状態
97 2.5.5 CPUロック状態とCPUロック解除状態
98 2.5.6 割込み優先度マスク
99 2.5.7 ディスパッチ禁止状態とディスパッチ許可状態
100 2.5.8 ディスパッチ保留状態
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
3
101 2.5.9 カーネル管理外の状態
102 2.5.10 処理単位の開始・終了とシステム状態
103 2.6 タスクの状態遷移とスケジューリング規則
104 2.6.1 基本的なタスク状態
105 2.6.2 タスクの状態遷移
106 2.6.3 タスクのスケジューリング規則
107 2.6.4 待ち行列と待ち解除の順序
108 2.6.5 タスク例外処理マスク状態と待ち禁止状態
109 2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち
110 2.6.7 制約タスク
111 2.7 割込み処理モデル
112 2.7.1 割込み処理の流れ
113 2.7.2 割込み優先度
114 2.7.3 割込み要求ラインの属性
115 2.7.4 割込みを受け付ける条件
116 2.7.5 割込み番号と割込みハンドラ番号
117 2.7.6 マルチプロセッサにおける割込み処理
118 2.7.7 カーネル管理外の割込み
119 2.7.8 カーネル管理外の割込みの設定方法
120 2.8 CPU例外処理モデル
121 2.8.1 CPU例外処理の流れ
122 2.8.2 CPU例外ハンドラから呼び出せるサービスコール
123 2.8.3 エミュレートされたCPU例外ハンドラ
124 2.8.4 カーネル管理外のCPU例外
125 2.9 システムの初期化と終了
126 2.9.1 システム初期化手順
127 2.9.2 システム終了手順
128 2.10 オブジェクトの登録とその解除
129 2.10.1 ID番号で識別するオブジェクト
130 2.10.2 オブジェクト番号で識別するオブジェクト
131 2.10.3 識別番号を持たないオブジェクト
132 2.10.4 オブジェクト生成に必要なメモリ領域
133 2.10.5 オブジェクトが属する保護ドメインの設定
134 2.10.6 オブジェクトが属するクラスの設定
135 2.10.7 オブジェクトの状態参照
136 2.11 オブジェクトのアクセス保護
137 2.11.1 オブジェクトのアクセス保護とアクセス違反の通知
138 2.11.2 メモリオブジェクトに対するアクセス許可ベクタの制限
139 2.11.3 デフォルトのアクセス許可ベクタ
140 2.11.4 アクセス許可ベクタの設定
141 2.11.5 カーネルの管理領域のアクセス保護
142 2.11.6 ユーザタスクのユーザスタック領域
143 2.12 システムコンフィギュレーション手順
144 2.12.1 システムコンフィギュレーションファイル
145 2.12.2 静的APIの文法とパラメータ
146 2.12.3 保護ドメインの指定
147 2.12.4 クラスの指定
148 2.12.5 コンフィギュレータの処理モデル
149 2.12.6 静的APIのパラメータに関するエラー検出
150 2.12.7 オブジェクトのID番号の指定
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
4
151 2.13 TOPPERSネーミングコンベンション
152 2.13.1 モジュール識別名
153 2.13.2 データ型名
154 2.13.3 関数名
155 2.13.4 変数名
156 2.13.5 定数名
157 2.13.6 マクロ名
158 2.13.7 静的API名
159 2.13.8 ファイル名
160 2.13.9 モジュール内部の名称の衝突回避
161 2.14 TOPPERS共通定義
162 2.14.1 TOPPERS共通ヘッダファイル
163 2.14.2 TOPPERS共通データ型
164 2.14.3 TOPPERS共通定数
165 2.14.4 TOPPERS共通エラーコード
166 2.14.5 TOPPERS共通マクロ
167 2.14.6 TOPPERS共通構成マクロ
168 2.15 カーネル共通定義
169 2.15.1 カーネルヘッダファイル
170 2.15.2 カーネル共通定数
171 2.15.3 カーネル共通マクロ
172 2.15.4 カーネル共通構成マクロ
173
174 第3章 システムインタフェースレイヤAPI仕様
175
176 3.1 システムインタフェースレイヤの概要
177 3.2 SILヘッダファイル
178 3.3 全割込みロック状態の制御
179 3.4 SILスピンロック
180 3.5 微少時間待ち
181 3.6 エンディアンの取得
182 3.7 メモリ空間アクセス関数
183 3.8 I/O空間アクセス関数
184 3.9 プロセッサIDの参照
185
186 第4章 カーネルAPI仕様
187
188 4.1 タスク管理機能
189 4.2 タスク付属同期機能
190 4.3 タスク例外処理機能
191 4.4 同期・通信機能
192 4.4.1 セマフォ
193 4.4.2 イベントフラグ
194 4.4.3 データキュー
195 4.4.4 優先度データキュー
196 4.4.5 メールボックス
197 4.4.6 ミューテックス
198 4.4.7 メッセージバッファ
199 4.4.8 スピンロック
200 4.5 メモリプール管理機能
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
5
201 4.5.1 固定長メモリプール
202 4.6 時間管理機能
203 4.6.1 システム時刻管理
204 4.6.2 周期ハンドラ
205 4.6.3 アラームハンドラ
206 4.6.4 オーバランハンドラ
207 4.7 システム状態管理機能
208 4.8 メモリオブジェクト管理機能
209 4.9 割込み管理機能
210 4.10 CPU例外管理機能
211 4.11 拡張サービスコール管理機能
212 4.12 システム構成管理機能
213
214 第5章 リファレンス
215
216 5.1 サービスコール一覧
217 5.2 静的API一覧
218 5.3 データ型
219 5.3.1 TOPPERS共通データ型
220 5.3.2 カーネルの使用するデータ型
221 5.3.3 カーネルの使用するパケット形式
222 5.4 定数とマクロ
223 5.4.1 TOPPERS共通定数
224 5.4.2 TOPPERS共通マクロ
225 5.4.3 カーネル共通定数
226 5.4.4 カーネル共通マクロ
227 5.4.5 カーネルの機能毎の定数
228 5.4.6 カーネルの機能毎のマクロ
229 5.5 構成マクロ
230 5.5.1 TOPPERS共通構成マクロ
231 5.5.2 カーネル共通構成マクロ
232 5.5.3 カーネルの機能毎の構成マクロ
233 5.6 エラーコード一覧
234 5.7 機能コード一覧
235 5.8 カーネルオブジェクトに対するアクセスの種別
236 5.9 ターゲット定義事項一覧
237 5.10 省略名の元になった英語
238 5.10.1 サービスコールと静的APIの名称の中のxxxの元になった英語
239 5.10.2 サービスコールと静的APIの名称の中のyyyの元になった英語
240 5.10.3 サービスコールの名称の中のzの元になった英語
241 5.11 バージョン履歴
242
243
244 ○仕様書で用いる記述項目と記号
245
246 この仕様書では,以下の記述項目を用いる.
247
248 【補足説明】の項では,仕様本体の記述に対する補足事項を説明する.
249
250 【~~カーネルにおける規定】の項では,TOPPERS新世代カーネルに属する特定
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
6
251 のカーネルにおける追加仕様を規定する.
252
253 【~~仕様との関係】の項では,この仕様と,μITRON4.0仕様または
254 μITRON4.0/PX仕様との違いについて説明する.
255
256 【未決定事項】の項では,この仕様書の現時点のバージョンでは,決定されず
257 に残っている事項について記述する.
258
259 【仕様決定の理由】の項では,仕様を決定するにあたって考慮した事項につい
260 て説明する.
261
262 「第4章 カーネルAPI仕様」の章の各サービスコールおよび静的APIの仕様記述
263 においては,以下の記述項目を用いる.
264
265 【静的API】の項では,システムコンフィギュレーションファイル中で静的API
266 を記述する形式を規定する.また,【C言語API】の項では,C言語からサービス
267 コールを呼び出す形式を規定する.
268
269 【パラメータ】の項では,サービスコールおよび静的APIに渡すパラメータの名
270 称とデータ型を規定し,簡単な説明を行う.また,【リターンパラメータ】の
271 項では,サービスコールが返すリターンパラメータの名称とデータ型を規定し,
272 簡単な説明を行う.【エラーコード】の項では,サービスコールおよび静的
273 APIが返す可能性のあるメインエラーコードと,その検出条件を規定する.
274
275 【機能】の項では,サービスコールおよび静的APIの機能を規定する.
276
277 TOPPERS新世代カーネルに属する特定のカーネルにおいてのみサポートするAPI
278 につしては,【サポートするカーネル】の項で,そのことを記述する.
279
280 また,「第4章 カーネルAPI仕様」の章では,カーネルのAPIの種別とAPIをサ
281 ポートするカーネルの種類を表すために,次の記号を用いる.
282
283 〔T〕はタスクコンテキスト専用のサービスコールを示す.非タスクコンテキス
284 トから呼び出すと,E_CTXエラーとなる.
285
286 〔I〕は非タスクコンテキスト専用のサービスコールを示す.タスクコンテキス
287 トから呼び出すと,E_CTXエラーとなる.
288
289 〔TI〕はタスクコンテキストからも非タスクコンテキストからも呼び出すこと
290 のできるサービスコールを示す.
291
292 〔S〕は静的APIを示す.
293
294 〔P〕は保護機能対応カーネルのみでサポートされているAPIを示す.保護機能
295 対応でないカーネルでは,このAPIはサポートされない.
296
297 〔p〕は保護機能対応でないカーネルのみでサポートされているAPIを示す.保
298 護機能対応カーネルでは,このAPIはサポートされない.
299
300 〔M〕はマルチプロセッサ対応カーネルのみでサポートされているAPIを示す.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
7
301 マルチプロセッサ対応でないカーネルでは,このAPIはサポートされない.
302
303 〔D〕は動的生成対応カーネルのみでサポートされているAPIを示す.動的生成
304 対応でないカーネルでは,このAPIはサポートされない.
305
306 また,エラーが発生する条件を表すために,次の記号を用いる.
307
308 〔s〕は,サービスコールのみで発生するエラーを示す.静的APIでは,このエ
309 ラーは発生しない.
310
311 〔S〕は静的APIのみで発生するエラーを示す.サービスコールでは,このエラー
312 は発生しない.
313
314 〔P〕は保護機能対応カーネルのみで発生するエラーを示す.保護機能対応でな
315 いカーネルでは,このエラーは発生しない.
316
317 〔D〕は動的生成対応カーネルのみで発生するエラーを示す.動的生成対応でな
318 いカーネルでは,このエラーは発生しない.
319
320
321 ○タグの付与方法
322
323 この仕様書では,トレーサビリティの確保のために,記述事項に対してタグを
324 付与する.具体的には,以下に該当する記述事項を,タグを付与する対象とす
325 る.
326
327 ・対象ソフトウェアの実装に対する要求事項や制限事項
328 ・対象ソフトウェアの仕様に対する一般要求事項
329 ・対象ソフトウェアの動作環境に対する要求事項
330 ・ターゲット定義の規定
331
332 それに対して,用語の定義や補足説明,対象ソフトウェアを使用する上での推
333 奨事項や注意事項,仕様決定の理由,他の仕様との関係に対しては,タグを付
334 与しない.
335
336 タグの形式と意味は次の通りである(xxxxは4桁の数字を表す).
337
338 NGKIxxxx TOPPERS 新世代カーネル全体を対象とした記述
339 ASPSxxxx TOPPERS/ASP カーネルを対象とした記述
340 FMPSxxxx TOPPERS/FMP カーネルを対象とした記述
341 HRPSxxxx TOPPERS/HRP2 カーネルを対象とした記述
342 SSPSxxxx TOPPERS/SSP カーネルを対象とした記述
343 ASSSxxxx TOPPERS/ASP Safety カーネルを対象とした記述
344
345 仕様書中では,ある記述事項に,タグYYYYxxxx(YYYYは4文字の英文字,xxxxは
346 4桁の数字を表す)が付与されていることを,【YYYYxxxx】で表現する.それに
347 対して,タグYYYYxxxxを参照する場合には,[YYYYxxxx]と表記する.
348
349
350 第1章 TOPPERS新世代カーネルの概要
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
8
351
352 TOPPERS新世代カーネルとは,TOPPERSプロジェクトにおいてITRON仕様をベース
353 として開発している一連のリアルタイムカーネルの総称である.この章では,
354 TOPPERS新世代カーネル仕様の位置付けと設計方針,それに属する各カーネルの
355 適用対象領域と設計方針について述べる.
356
357 1.1 TOPPERS新世代カーネル仕様の位置付け
358
359 TOPPERSプロジェクトでは,2000年に公開したTOPPERS/JSPカーネルを始めとし
360 て,μITRON4.0仕様およびその保護機能拡張(μITRON4.0/PX仕様)に準拠した
361 リアルタイムカーネルを開発してきた.
362
363 μITRON4.0仕様は1999年に,μITRON4.0/PX仕様は2002年に公表されたが,それ
364 以降現在までの間に,大きな仕様改訂は実施されていない.その間に,組込み
365 システムおよびソフトウェアのますますの大規模化・複雑化,これまで以上に
366 高い信頼性・安全性に対する要求,小さい消費エネルギー下での高い性能要求
367 など,組込みシステム開発を取り巻く状況は刻々変化している.リアルタイム
368 カーネルに対しても,マルチプロセッサへの対応,発展的な保護機能のサポー
369 ト,機能安全対応,省エネルギー制御機能のサポートなど,新しい要求が生じ
370 ている.
371
372 TOPPERSプロジェクトでは,リアルタイムカーネルに対するこのような新しい要
373 求に対応するために,μITRON4.0仕様を発展させる形で,TOPPERS新世代カーネ
374 ル仕様を策定することになった.
375
376 ただし,ITRON仕様が,各社が開発するリアルタイムカーネルを標準化すること
377 を目的に,リアルタイムカーネルの「標準仕様」を規定することを目指してい
378 るのに対して,TOPPERS新世代カーネル仕様は,TOPPERSプロジェクトにおいて
379 開発している一連のリアルタイムカーネルの「実装仕様」を記述するものであ
380 り,ITRON仕様とは異なる目的・位置付けを持つものである.
381
382 1.2 TOPPERS新世代カーネル仕様の設計方針
383
384 TOPPERS新世代カーネル仕様を設計するにあたり,次の方針を設定する.
385
386 (1) μITRON4.0仕様をベースに拡張・改良を加える
387
388 TOPPERS新世代カーネル仕様は,多くの技術者の尽力により作成され,多くの実
389 装・使用実績があるμITRON4.0仕様をベースとする.ただし,μITRON4.0仕様
390 の策定時以降の状況の変化を考慮し,μITRON4.0仕様で不十分と考えられる点
391 については積極的に拡張・改良する.μITRON4.0仕様への準拠性にはこだわら
392 ない.
393
394 (2) ソフトウェアの再利用性を重視する
395
396 μITRON4.0仕様の策定時点と比べると,組込みソフトウェアの大規模化が進展
397 している一方で,ハードウェアの性能向上も著しい.そのため,ソフトウェア
398 の再利用性を向上させるためには,少々のオーバヘッドは許容される状況にあ
399 る.
400
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
9
401 そこで,TOPPERS新世代カーネル仕様では,μITRON4.0仕様においてオーバヘッ
402 ド削減のために実装定義または実装依存としていたような項目についても,ター
403 ゲットシステムに依存する項目とするのではなく,強く規定する方針とする.
404
405 (3) 高信頼・安全なシステム構築を支援する
406
407 TOPPERS新世代カーネル仕様は,高信頼・安全な組込みシステム構築を支援する
408 ものとする.
409
410 安全性の面では,アプリケーションプログラムに問題がある場合でも,リーゾ
411 ナブルなオーバヘッドでそれを救済できるなら,救済するような仕様とする.
412 また,アプリケーションプログラムの誤動作を検出する機能や,システムの自
413 己診断のための機能についても,順次取り込んでいく.
414
415 (4) アプリケーションシステム構築に必要な機能は積極的に取り込む
416
417 上記の方針を満たした上で,多くのアプリケーションシステムに共通に必要と
418 なる機能については,積極的にカーネルに取り込む.
419
420 カーネル単体の信頼性を向上させるためには,カーネルの機能は少なくした方
421 が楽である.しかし,アプリケーションシステム構築に必要となる機能は,カー
422 ネルがサポートしていなければアプリケーションプログラムで実現しなければ
423 ならず,システム全体の信頼性を考えると,多くのアプリケーションシステム
424 に共通に必要となる機能については,カーネルに取り込んだ方が有利である.
425
426 1.3 TOPPERS/ASPカーネルの適用対象領域と仕様設計方針
427
428 TOPPERS/ASPカーネル(ASPは,Advanced Standard Profileの略.以下,ASPカー
429 ネル)は,TOPPERS新世代カーネルの出発点となるリアルタイムカーネルである.
430 保護機能を持ったカーネルやマルチプロセッサ対応のカーネルは,ASPカーネル
431 を拡張する形で開発する.
432
433 ASPカーネルは,20年以上に渡るITRON仕様の技術開発成果をベースとして,完
434 成度の高いリアルタイムカーネルを実現するものである.完成度を高めるとい
435 う観点から,カーネル本体の仕様については,枯れた技術で実装できる範囲に
436 留める.
437
438 ASPカーネルの主な適用対象は,高い信頼性・安全性・リアルタイム性を要求さ
439 れる組込みシステムとする.ソフトウェア規模の面では,プログラムサイズ
440 (バイナリコード)が数十KB~1MB程度のシステムを主な適用対象とする.それ
441 より大規模なシステムには,保護機能を持ったリアルタイムカーネルを適用す
442 べきと考えられる.
443
444 ASPカーネルの機能は,カーネル内で動的なメモリ管理が不要な範囲に留める.
445 これは,高い信頼性・安全性・リアルタイム性を要求される組込みシステムで
446 は,システム稼働中に発生するメモリ不足への対処が難しいためである.この
447 方針から,カーネルオブジェクトは静的に生成することとし,動的なオブジェ
448 クト生成機能は設けない.ただし,アプリケーションプログラムが動的なメモ
449 リ管理をするためのカーネル機能である固定長メモリプール機能はサポートす
450 る.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
10
451
452 1.4 TOPPERS/FMPカーネルの適用対象領域と仕様設計方針
453
454 TOPPERS/FMPカーネル(FMPは,Flexible Multiprocessor Profileの略.以下,
455 FMPカーネル)は,ASPカーネルを,マルチプロセッサ対応に拡張したリアルタ
456 イムカーネルである.
457
458 FMPカーネルの適用対象となるターゲットハードウェアは,ホモジニアスなマル
459 チプロセッサシステムである.各プロセッサが全く同一のものである必要はな
460 いが,すべてのプロセッサでバイナリコードを共有することから,同じバイナ
461 リコードを実行できることが必要である.
462
463 FMPカーネルでは,タスクを実行するプロセッサを静的に決定するのが基本であ
464 り,カーネルは自動的に負荷分散する機能を持たないが,タスクをマイグレー
465 ションさせるサービスコールを備えている.これを用いて,アプリケーション
466 で動的な負荷分散を実現することが可能である.
467
468 FMPカーネルの機能は,ASPカーネルと同様に,カーネル内で動的なメモリ管理
469 が不要な範囲に留める.
470
471 1.5 TOPPERS/HRP2カーネルの適用対象領域と仕様設計方針
472
473 TOPPERS/HRP2カーネル(HRPは,High Reliable system Profileの略.2はバー
474 ジョン番号を示す.以下,HRP2カーネル)は,さらに高い信頼性・安全性を要
475 求される組込みシステムや,より大規模な組込みシステム向けに適用できるよ
476 うに,ASPカーネルを拡張したリアルタイムカーネルである.
477
478 HRP2カーネルの適用対象となるターゲットハードウェアは,特権モードと非特
479 権モードを備え,メモリ保護のためにMMU(Memory Management Unit)または
480 MPU(Memory Protection Unit)を持つプロセッサを用いたシステムである.
481 HRP2カーネルの主な適用対象は,ソフトウェア規模の面では,プログラムサイ
482 ズ(バイナリコード)が数百KB以上のシステムである.
483
484 HRP2カーネルの機能は,ASPカーネルと同様に,カーネル内で動的なメモリ管理
485 が不要な範囲に留める.具体的には,ASPカーネルに対して,メモリ保護機能と
486 オブジェクトアクセス保護機能,拡張サービスコール機能,ミューテックス機
487 能,オーバランハンドラ機能を追加し,メールボックス機能を削除している.
488
489 1.6 TOPPERS/SSPカーネルの適用対象領域と仕様設計方針
490
491 TOPPERS/SSPカーネル(SSPは,Smallest Set Profileの略.以下,SSPカーネル)
492 は,小規模システムに用いるために,ASPカーネルをベースに可能な限り機能を
493 絞り込んだリアルタイムカーネルである.
494
495 SSPカーネルの機能は,μITRON4.0仕様の「仕様準拠の最低条件」の考え方を踏
496 襲し,メモリ使用量を最小化するように定めている.具体的には,SSPカーネル
497 においては,タスクは待ち状態を持たない(言い換えると,制約タスクのみを
498 サポートする)のが最大の特徴である.また,ASPカーネルに対して下位互換性
499 を持つように配慮しているが,システム全体のメモリ使用量を最小化するため
500 に有用な機能は,ASPカーネルに対して追加している.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
11
501
502 TOPPERS/SSPカーネルの主な適用対象は,プログラムサイズ(バイナリコード)
503 が数KB~数十KB程度の極めて小規模な組込みシステムである.
504
505 1.7 TOPPERS/ASP Safety カーネルの適用対象領域と仕様設計方針
506
507 TOPPERS/ASP Safetyカーネル(以下,ASP Safetyカーネル)は,小規模な安全
508 関連システムに用いるために,ASPカーネルの機能を徹底的な検証が可能な範囲
509 にサブセット化したものである.メールボックスのように安全性の観点から問
510 題のある機能や,タスク例外処理機能のように使用頻度に比べて検証にコスト
511 のかかる機能はサポートしない.
512
513 ASP Safetyカーネルの主な適用対象は,特に高い安全性を要求される組込みシ
514 ステムとする.ソフトウェア規模の面では,プログラムサイズ(バイナリコー
515 ド)が数十KB~1MB程度のシステムを主な適用対象とする.それより大規模なシ
516 ステムには,保護機能を持ったカーネルを適用すべきと考えられる.
517
518
519 第2章 主要な概念と共通定義
520
521 2.1 仕様の位置付け
522
523 この仕様は,TOPPERS新世代カーネルに属する各カーネルの仕様を,統合的に記
524 述することを目標としている.また,TOPPERS新世代カーネル上で動作する各種
525 のシステムサービスに共通に適用される事項についても規定する.
526
527 2.1.1 カーネルの機能セット
528
529 TOPPERS新世代カーネルは,ASPカーネルをベースとして,保護機能,マルチプ
530 ロセッサ,カーネルオブジェクトの動的生成,機能安全などに対応した一連の
531 カーネルで構成される.
532
533 この仕様では,TOPPERS新世代カーネルを構成する一連のカーネルの仕様を統合
534 的に記述するが,言うまでもなく,カーネルの種類によってサポートする機能
535 は異なる.サポートする機能をカーネルの種類毎に記述する方法もあるが,カー
536 ネルの種類はユーザ要求に対応して増える可能性もあり,その度に仕様書を修
537 正するのは得策ではない.
538
539 そこでこの仕様では,サポートする機能を,カーネルの種類毎ではなく,カー
540 ネルの対応する機能セット毎に記述する.具体的には,保護機能を持ったカー
541 ネルを保護機能対応カーネル,マルチプロセッサに対応したカーネルをマルチ
542 プロセッサ対応カーネル,カーネルオブジェクトの動的生成機能を持ったカー
543 ネルを動的生成対応カーネルと呼ぶことにする.
544
545 【TOPPERS/ASPカーネルにおける規定】
546
547 ASPカーネルは,保護機能対応カーネル,マルチプロセッサ対応カーネル,動的
548 生成対応カーネルのいずれでもない【ASPS0001】.ただし,動的生成機能拡張
549 パッケージを用いると,動的生成対応カーネルとなる【ASPS0002】.
550
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
12
551 【TOPPERS/FMPカーネルにおける規定】
552
553 FMPカーネルは,マルチプロセッサ対応カーネルであり,保護機能対応カーネル,
554 動的生成対応カーネルではない【FMPS0001】.
555
556 【TOPPERS/HRP2カーネルにおける規定】
557
558 HRP2カーネルは,保護機能対応カーネルであり,マルチプロセッサ対応カーネ
559 ル,動的生成対応カーネルではない【HRPS0001】.
560
561 【TOPPERS/SSPカーネルにおける規定】
562
563 SSPカーネルは,保護機能対応カーネル,マルチプロセッサ対応カーネル,動的
564 生成対応カーネルのいずれでもない【SSPS0001】.
565
566 【μITRON4.0仕様,μITRON4.0/PX仕様との関係】
567
568 μITRON4.0仕様は,カーネルオブジェクトの動的生成機能を持っているが,保
569 護機能を持っておらず,マルチプロセッサにも対応していない.μITRON4.0/PX
570 仕様は,μITRON4.0仕様に対して保護機能を追加するための仕様であり,カー
571 ネルオブジェクトの動的生成機能と保護機能を持っているが,マルチプロセッ
572 サには対応していない.
573
574 2.1.2 ターゲット非依存の規定とターゲット定義の規定
575
576 TOPPERS新世代カーネルは,アプリケーションプログラムの再利用性を向上させ
577 るために,ターゲットハードウェアや開発環境の違いをできる限り隠蔽するこ
578 とを目指している.ただし,ターゲットハードウェアや開発環境の制限によっ
579 て実現できない機能が生じたり,逆にターゲットハードウェアの特徴を活かす
580 ためには機能拡張が不可欠になる場合がある.また,同一のターゲットハード
581 ウェアであっても,アプリケーションシステムによって使用方法が異なる場合
582 があり,ターゲットシステム毎に仕様の細部に違いが生じることは避けられな
583 い.
584
585 そこで,TOPPERS新世代カーネルの仕様は,ターゲットシステムによらずに定め
586 るターゲット非依存(target-independent)の規定と,ターゲットシステム毎
587 に定めるターゲット定義(target-defined)の規定に分けて記述する.この仕
588 様書は,ターゲット非依存の規定について記述するものであり,この仕様書で
589 「ターゲット定義」とした事項は,ターゲットシステム毎に用意するドキュメ
590 ントにおいて規定する.
591
592 また,この仕様書でターゲット非依存に規定した事項であっても,ターゲット
593 ハードウェアや開発環境の制限によって実現できない場合や,実現するための
594 オーバヘッドが大きくなる場合には,この仕様書の規定を逸脱する場合がある.
595 このような場合には,ターゲットシステム毎に用意するドキュメントでその旨
596 を明記する.
597
598 2.1.3 想定するソフトウェア構成
599
600 この仕様では,アプリケーションシステムを構成するソフトウェアを,アプリ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
13
601 ケーションプログラム(以下,単にアプリケーションと呼ぶ),システムサー
602 ビス,カーネルの3階層に分けて考える(図2-1).カーネルとシステムサービ
603 スをあわせて,ソフトウェアプラットフォームと呼ぶ.
604
605 カーネルは,コンピュータの持つ最も基本的なハードウェア資源であるプロセッ
606 サ,メモリ,タイマを抽象化し,上位階層のソフトウェア(アプリケーション
607 およびシステムサービス)に論理的なプログラム実行環境を提供するソフトウェ
608 アである.
609
610 システムサービスは,各種の周辺デバイスを抽象化するソフトウェアで,ファ
611 イルシステムやネットワークプロトコルスタック,各種のデバイスドライバな
612 どが含まれる.
613
614 また,この仕様では,プロセッサと各種の周辺デバイスの接続方法を隠蔽する
615 ためのソフトウェア階層として,システムインタフェースレイヤ(SIL)を規定
616 する.
617
618 システムインタフェースレイヤ,カーネル,各種のシステムサービス(これら
619 をモジュールと呼ぶ)を,上位階層のソフトウェアから使うためのインタフェー
620 スを,API(Application Programming Interface)と呼ぶ.
621
622 この仕様書では,第3章においてシステムインタフェースレイヤのAPI仕様を,
623 第4章においてカーネルのAPI仕様を規定する.システムサービスのAPI仕様は,
624 システムサービス毎の仕様書で規定される.
625
626 【μITRON4.0仕様との関係】
627
628 μITRON4.0仕様では,カーネルとアプリケーションの中間にあるソフトウェア
629 をソフトウェア部品と呼んでいたが,TOPPERS組込みコンポーネントシステム
630 (TECS)においてはカーネルもソフトウェア部品の1つと捉えることから,この
631 仕様ではシステムサービスと呼ぶことにした.
632
633 2.1.4 想定するハードウェア構成
634
635 この仕様では,カーネルがサポートするハードウェア構成として,以下のこと
636 を想定している.これらに合致しないターゲットハードウェアでカーネルを動
637 作させることは可能であるが,合致しない部分への適応はアプリケーションの
638 責任になる.
639
640 (a) メモリ番地は,常に同一のメモリを指すこと(オーバレイのように,異な
641 るメモリを同一のメモリ番地でアクセスすることがないこと)【NGKI0001】.
642 マルチプロセッサ対応カーネルにおいては,同一のメモリに対しては,各プロ
643 セッサから同一の番地でアクセスできること【NGKI0002】.
644
645 (b) マルチプロセッサ対応カーネルにおいては,各プロセッサが同一の機械語
646 命令を実行できること【NGKI0003】.
647
648 2.1.5 想定するプログラミング言語
649
650 この仕様におけるAPI仕様は,ISO/IEC 9899:1990(以下,C90と呼ぶ)または
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
14
651 ISO/IEC 9899:1999(以下,C99と呼ぶ)に準拠したC言語を,フリースタンディ
652 ング環境で用いることを想定して規定している【NGKI0004】.
653
654 ただし,C90の規定に加えて,以下のことを仮定している.
655
656 ・16ビットおよび32ビットの整数型があること【NGKI0005】
657 ・ポインタが格納できるサイズの整数型があること【NGKI0006】
658
659 2.2 APIの構成要素とコンベンション
660
661 2.2.1 APIの構成要素
662
663 (1) サービスコール
664
665 上位階層のソフトウェアから,下位階層のソフトウェアを呼び出すインタフェー
666 スをサービスコール(service call)と呼ぶ.カーネルのサービスコールを,
667 システムコール(system call)と呼ぶ場合もある.
668
669 (2) コールバック
670
671 下位階層のソフトウェアから,上位階層のソフトウェアを呼び出すインタフェー
672 スをコールバック(callback)と呼ぶ.
673
674 (3) 静的API
675
676 オブジェクトの生成情報や初期状態などを定義するために,システムコンフィ
677 ギュレーションファイル中に記述するインタフェースを,静的API(static
678 API)と呼ぶ.
679
680 (4) 構成マクロ
681
682 下位階層のソフトウェアに関する各種の情報を取り出すために,上位階層のソ
683 フトウェアが用いるマクロを,構成マクロ(configuration macro)と呼ぶ.
684
685 2.2.2 パラメータとリターンパラメータ
686
687 サービスコールやコールバックに渡すデータをパラメータ(parameter),それ
688 らが返すデータをリターンパラメータ(return parameter)と呼ぶ.また,静
689 的APIに渡すデータもパラメータと呼ぶ.
690
691 オブジェクトを生成するサービスコールなど,パラメータの数が多い場合やター
692 ゲット定義のパラメータを追加する可能性がある場合には,複数のパラメータ
693 を1つの構造体に入れ,その領域へのポインタをパラメータとして渡す
694 【NGKI0007】.また,パラメータのサイズが大きい場合にも,パラメータを入
695 れた領域へのポインタをパラメータとして渡す場合がある【NGKI0008】.
696
697 C言語APIでは,リターンパラメータは,関数の返値とするか,リターンパラメー
698 タを入れる領域へのポインタをパラメータとして渡すことで実現する
699 【NGKI0009】.オブジェクトの状態を参照するサービスコールなど,リターン
700 パラメータの数が多い場合やターゲット定義のリターンパラメータを追加する
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
15
701 可能性がある場合には,複数のリターンパラメータを1つの構造体に入れて返す
702 こととし,その領域へのポインタをパラメータとして渡す【NGKI0010】.
703
704 複数のパラメータまたはリターンパラメータを入れるための構造体を,パケッ
705 ト(packet)と呼ぶ.
706
707 サービスコールやコールバックに,パケットを置く領域へのポインタやリター
708 ンパラメータを入れる領域へのポインタを渡す場合,別に規定がない限りは,
709 サービスコールやコールバックの処理が完了した後は,それらの領域が参照さ
710 れることはなく,別の目的に使用できる【NGKI0011】.
711
712 2.2.3 返値とエラーコード
713
714 一部の例外を除いて,サービスコールおよびコールバックの返値は,処理が正
715 常終了したかを表す符号付き整数とする.処理が正常終了した場合には,E_OK
716 (=0)または正の値が返るものとし,値の意味はサービスコールまたはコール
717 バック毎に定める【NGKI0012】.処理が正常終了しなかった場合には,その原
718 因を表す負の値が返る【NGKI0013】.処理が正常終了しなかった原因を表す値
719 を,エラーコード(error code)と呼ぶ.
720
721 エラーコードは,いずれも負の値のメインエラーコードとサブエラーコードで
722 構成される【NGKI0014】.メインエラーコードとサブエラーコードからエラー
723 コードを構成するマクロ(ERCD)と,エラーコードからメインエラーコードを
724 取り出すマクロ(MERCD),サブエラーコードを取り出すマクロ(SERCD)が用
725 意されている【NGKI0015】.
726
727 メインエラーコードの名称・意味・値は,カーネルとシステムサービスで共通
728 に定める(「2.14.4 TOPPERS共通エラーコード」の節を参照)【NGKI0016】.
729 サービスコールおよびコールバックの機能説明中の「E_XXXXXエラーとなる」ま
730 たは「E_XXXXXエラーが返る」という記述は,メインエラーコードとして
731 E_XXXXXが返ることを意味する.
732
733 サブエラーコードは,エラーの原因をより詳細に表すために用いる.カーネル
734 はサブエラーコードを使用せず,サブエラーコードとして常に-1が返る
735 【NGKI0017】.サブエラーコードの名称・意味・値は,サブエラーコードを使
736 用するシステムサービスのAPI仕様において規定する【NGKI0018】.
737
738 サービスコールが負の値のエラーコード(警告を表すものを除く)を返した場
739 合には,サービスコールによる副作用がないのが原則である【NGKI0019】.た
740 だし,そのような実装ができない場合にはこの原則の例外とし,サービスコー
741 ルの機能説明にその旨を記述する【NGKI0020】.
742
743 サービスコールが複数のエラーを検出するべき状況では,その内のいずれか1つ
744 のエラーを示すエラーコードが返る【NGKI0021】.
745
746 コールバックが複数のエラーを検出するべき状況では,その内のいずれか1つの
747 エラーを示すエラーコードを返せばよい【NGKI0022】.
748
749 なお,静的APIは返値を持たない.静的APIの処理でエラーが検出された場合の
750 扱いについては,「2.12.5 コンフィギュレータの処理モデル」の節および
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
16
751 「2.12.6 静的APIのパラメータに関するエラー検出」の節を参照すること.
752
753 2.2.4 機能コード
754
755 ソフトウェア割込みによりサービスコールを呼び出す場合などに用いるための
756 サービスコールを識別するための番号を,機能コード(function code)と呼ぶ.
757 機能コードは符号付きの整数値とし,カーネルのサービスコールには負の値を
758 割り付け,拡張サービスコールには正の値を用いる【NGKI0023】.
759
760 2.2.5 ヘッダファイル
761
762 カーネルやシステムサービスを用いるために必要な定義を含むファイル.
763
764 ヘッダファイルは,原則として,複数回インクルードしてもエラーにならない
765 ように対処されている.具体的には,ヘッダファイルの先頭で特定の識別子
766 (例えば,kernel.hなら"TOPPERS_KERNEL_H")がマクロ定義され,ヘッダファ
767 イルの内容全体をその識別子が定義されていない場合のみ有効とする条件ディ
768 レクティブが付加されている【NGKI0024】.
769
770 2.3 主な概念
771
772 2.3.1 オブジェクトと処理単位
773
774 (1) オブジェクト
775
776 カーネルまたはシステムサービスが管理対象とするソフトウェア資源を,オブ
777 ジェクト(object)と呼ぶ.特に,カーネルが管理対象とするソフトウェア資
778 源を,カーネルオブジェクト(kernel object)と呼ぶ.
779
780 オブジェクトは,種類毎に,番号によって識別する【NGKI0025】.カーネルま
781 たはシステムサービスで,オブジェクトに対して任意に識別番号を付与できる
782 場合には,1から連続する正の整数値でオブジェクトを識別するのを原則とする
783 【NGKI0026】.この場合に,オブジェクトの識別番号を,オブジェクトのID番
784 号(ID number)と呼ぶ.そうでない場合,すなわちカーネルまたはシステムサー
785 ビスの内部または外部からの条件によって識別番号が決まる場合には,オブジェ
786 クトの識別番号を,オブジェクト番号(object number)と呼ぶ.識別する必要
787 のないオブジェクトには,識別番号を付与しない場合がある【NGKI0027】.
788
789 オブジェクト属性(object attribute)は,オブジェクトの動作モードや初期
790 状態を定めるもので,オブジェクトの登録時に指定する【NGKI0028】.オブジェ
791 クト属性にTA_XXXXが指定されている場合,そのオブジェクトを,TA_XXXX属性
792 のオブジェクトと呼ぶ.複数の属性を指定する場合には,オブジェクト属性を
793 渡すパラメータに,指定する属性値のビット毎論理和(C言語の"¦")を渡す
794 【NGKI0029】.また,指定すべきオブジェクト属性がない場合には,TA_NULLを
795 指定する【NGKI0030】.
796
797 (2) 処理単位
798
799 オブジェクトの中には,プログラムが対応付けられるものがある.プログラム
800 が対応付けられるオブジェクト(または,対応付けられるプログラム)を,処
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
17
801 理単位(processing unit)と呼ぶ.処理単位に対応付けられるプログラムは,
802 アプリケーションまたはシステムサービスで用意し,カーネルが実行制御する.
803
804 処理単位の実行を要求することを起動(activate),処理単位の実行を開始す
805 ることを実行開始(start)と呼ぶ.
806
807 拡張情報(extended information)は,処理単位が呼び出される時にパラメー
808 タとして渡される情報で,処理単位の登録時に指定する【NGKI0031】.拡張情
809 報は,カーネルやシステムサービスの動作には影響しない【NGKI0032】.
810
811 (3) タスク
812
813 カーネルが実行順序を制御するプログラムの並行実行の単位をタスク(task)
814 と呼ぶ.タスクは,処理単位の1つである.
815
816 サービスコールの機能説明において,サービスコールを呼び出したタスクを,
817 自タスク(invoking task)と呼ぶ.拡張サービスコールからサービスコールを
818 呼び出した場合には,拡張サービスコールを呼び出したタスクが自タスクであ
819 る.
820
821 カーネルには,静的APIにより,少なくとも1つのタスクを登録しなければなら
822 ない.タスクが登録されていない場合には,コンフィギュレータがエラーを報
823 告する【NGKI0033】.
824
825 【補足説明】
826
827 タスクが呼び出した拡張サービスコールが実行されている間は,「サービスコー
828 ルを呼び出した処理単位」は拡張サービスコールであり,「自タスク」とは一
829 致しない.そのため,保護機能対応カーネルにおいて,「サービスコールを呼
830 び出した処理単位の属する保護ドメイン」と「自タスクの属する保護ドメイン」
831 は,異なるものを指す.
832
833 (4) ディスパッチとスケジューリング
834
835 プロセッサが実行するタスクを切り換えることを,タスクディスパッチまたは
836 単にディスパッチ(dispatching)と呼ぶ.それに対して,次に実行すべきタス
837 クを決定する処理を,タスクスケジューリングまたは単にスケジューリング
838 (scheduling)と呼ぶ.
839
840 ディスパッチが起こるべき状態(すなわち,スケジューリングによって,現在
841 実行しているタスクとは異なるタスクが,実行すべきタスクに決定されている
842 状態)となっても,何らかの理由でディスパッチを行わないことを,ディスパッ
843 チの保留(pend dispatching)という.ディスパッチを行わない理由が解除さ
844 れた時点で,ディスパッチが起こる【NGKI0034】.
845
846 (5) 割込みとCPU例外
847
848 プロセッサが実行中の処理とは独立に発生するイベントによって起動される例
849 外処理のことを,外部割込みまたは単に割込み(interrupt)と呼ぶ.それに対
850 して,プロセッサが実行中の処理に依存して起動される例外処理を,CPU例外
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
18
851 (CPU exception)と呼ぶ.
852
853 周辺デバイスからの割込み要求をプロセッサに伝える経路を遮断し,割込み要
854 求が受け付けられるのを抑止することを,割込みのマスク(mask interrupt)
855 または割込みの禁止(disable interrupt)という.マスクが解除された時点で,
856 まだ割込み要求が保持されていれば,その時点で割込み要求を受け付ける
857 【NGKI0035】.
858
859 マスクすることができない割込みを,NMI(non-maskable interrupt)と呼ぶ.
860
861 【μITRON4.0仕様との関係】
862
863 μITRON4.0仕様において,未定義のまま使われていた割込みとCPU例外という用
864 語を定義した.
865
866 (6) タイムイベントとタイムイベントハンドラ
867
868 時間の経過をきっかけに発生するイベントをタイムイベント(time event)と
869 呼ぶ.タイムイベントにより起動され,カーネルが実行制御する処理単位を,
870 タイムイベントハンドラ(time event handler)と呼ぶ.
871
872 2.3.2 サービスコールとパラメータ
873
874 (1) 優先順位と優先度
875
876 優先順位(precedence)とは,処理単位の実行順序を説明するための仕様上の
877 概念である.複数の処理単位が実行できる場合には,その中で最も優先順位の
878 高い処理単位が実行される【NGKI0036】.
879
880 優先度(priority)は,タスクなどの処理単位の優先順位や,メッセージなど
881 の配送順序を決定するために,アプリケーションが処理単位やメッセージなど
882 に与える値である.優先度は,符号付きの整数型であるPRI型で表し,1から連
883 続した正の値を用いるのを原則とする【NGKI0037】.優先度は,値が小さいほ
884 ど優先度が高い(すなわち,先に実行または配送される)ものとする
885 【NGKI0038】.
886
887 (2) システム時刻と相対時間
888
889 カーネルが管理する時刻を,システム時刻(system time)と呼ぶ.システム時
890 刻は,符号無しの整数型であるSYSTIM型で表し,単位はミリ秒とする
891 【NGKI0039】.システム時刻は,タイムティック(time tick)を通知するため
892 のタイマ割込みが発生する毎に更新される【NGKI0040】.
893
894 イベントを発生させる時刻を指定する場合には,基準時刻(base time)からの
895 相対時間(relative time)によって指定する【NGKI0041】.基準時刻は,別に
896 規定がない限りは,相対時間を指定するサービスコールを呼び出した時刻とな
897 る【NGKI0042】.
898
899 相対時間は,符号無しの整数型であるRELTIM型で表し,単位はシステム時刻と
900 同一,すなわちミリ秒とする【NGKI0043】.相対時間には,少なくとも,16ビッ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
19
901 トの符号無しの整数型(uint16_t型)に格納できる任意の値を指定することが
902 できるが,RELTIM型(uint_t型に定義される)に格納できる任意の値を指定で
903 きるとは限らない【NGKI0044】.相対時間に指定できる最大値は,構成マクロ
904 TMAX_RELTIMに定義されている【NGKI0045】.
905
906 イベントを発生させる時刻を相対時間で指定した場合,イベントの処理が行わ
907 れるのは,基準時刻から相対時間によって指定した以上の時間が経過した後と
908 なる【NGKI0046】.ただし,基準時刻を定めるサービスコールを呼び出した時
909 に,タイムティックを通知するためのタイマ割込みがマスクされている場合
910 (タイマ割込みより優先して実行される割込み処理が実行されている場合を含
911 む)は,相対時間によって指定した以上の時間が経過した後となることは保証
912 されない【NGKI0047】.
913
914 イベントが発生する時刻を参照する場合には,基準時刻からの相対時間として
915 返される【NGKI0048】.基準時刻は,相対時間を返すサービスコールを呼び出
916 した時刻となる【NGKI0049】.
917
918 イベントが発生する時刻が相対時間で返された場合,イベントの処理が行われ
919 るのは,基準時刻から相対時間として返された以上の時間が経過した後となる
920 【NGKI0050】.ただし,相対時間を返すサービスコールを呼び出した時に,タ
921 イムティックを通知するためのタイマ割込みがマスクされている場合(タイマ
922 割込みより優先して実行される割込み処理が実行されている場合を含む)は,
923 相対時間として返された以上の時間が経過した後となることは保証されない
924 【NGKI0051】.
925
926 【補足説明】
927
928 相対時間に0を指定した場合,基準時刻後の最初のタイムティックでイベントの
929 処理が行われる.また,1を指定した場合,基準時刻後の2回目以降のタイム
930 ティックでイベントの処理が行われる.これは,基準時刻後の最初のタイム
931 ティックは,基準時刻の直後に発生する可能性があるため,ここでイベントの
932 処理を行うと,基準時刻からの経過時間が1以上という仕様を満たせないためで
933 ある.
934
935 同様に,相対時間として0が返された場合,基準時刻後の最初のタイムティック
936 でイベントの処理が行われる.また,1が返された場合,基準時刻後の2回目以
937 降のタイムティックでイベントの処理が行われる.
938
939 【μITRON4.0仕様との関係】
940
941 相対時間(RELTIM型)とシステム時刻(SYSTIM型)の時間単位は,μITRON4.0
942 仕様では実装定義としていたが,この仕様ではミリ秒と規定した.また,相対
943 時間の解釈について,より厳密に規定した.
944
945 TMAX_RELTIMは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
946
947 (3) タイムアウトとポーリング
948
949 サービスコールの中で待ち状態が指定した時間以上継続した場合に,サービス
950 コールの処理を取りやめて,サービスコールからリターンすることを,タイム
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
20
951 アウト(timeout)という.タイムアウトしたサービスコールからは,E_TMOUT
952 エラーが返る【NGKI0052】.
953
954 タイムアウトを起こすまでの時間(タイムアウト時間)は,符号付きの整数型
955 であるTMO型で表し,単位はシステム時刻と同一,すなわちミリ秒とする
956 【NGKI0053】.タイムアウト時間に正の値を指定した場合には,タイムアウト
957 を起こすまでの相対時間を表す【NGKI0054】.すなわち,タイムアウトの処理
958 が行われるのは,サービスコールを呼び出してから指定した以上の時間が経過
959 した後となる.
960
961 ポーリング(polling)を行うサービスコールとは,サービスコールの中で待ち
962 状態に遷移すべき状況になった場合に,サービスコールの処理を取りやめてリ
963 ターンするサービスコールのことをいう.ここで,サービスコールの処理を取
964 りやめてリターンすることを,ポーリングに失敗したという.ポーリングに失
965 敗したサービスコールからは,E_TMOUTエラーが返る【NGKI0055】.
966
967 ポーリングを行うサービスコールでは,待ち状態に遷移することはないのが原
968 則である【NGKI0056】.そのため,ポーリングを行うサービスコールは,ディ
969 スパッチ保留状態であっても呼び出せる【NGKI0057】.ただし,サービスコー
970 ルの中で待ち状態に遷移する状況が複数ある場合,ある状況でポーリング動作
971 をしても,他の状況では待ち状態に遷移する場合がある.このような場合の振
972 舞いは,該当するサービスコール毎に規定する【NGKI0058】.
973
974 タイムアウト付きのサービスコールは,別に規定がない限りは,タイムアウト
975 時間にTMO_POL(=0)を指定した場合にはポーリングを行い,TMO_FEVR(=-1)
976 を指定した場合にはタイムアウトを起こさないものとする【NGKI0059】.
977
978 【補足説明】
979
980 [NGKI0019]の原則より,サービスコールがタイムアウトした場合やポーリン
981 グに失敗した場合には,サービスコールによる副作用がないのが原則である.
982 ただし,そのような実装ができない場合にはこの原則の例外とし,どのような
983 副作用があるかをサービスコール毎に規定する.
984
985 タイムアウト付きのサービスコールを,タイムアウト時間をTMO_POLとして呼び
986 出した場合には,ディスパッチ保留状態で呼び出すとE_CTXエラーとなることを
987 除いては,ポーリングを行うサービスコールと同じ振舞いをする.また,タイ
988 ムアウト時間をTMO_FEVRとして呼び出した場合には,タイムアウトなしのサー
989 ビスコールと全く同じ振舞いをする.
990
991 【μITRON4.0仕様との関係】
992
993 タイムアウト時間(TMO型)の時間単位は,μITRON4.0仕様では実装定義として
994 いたが,この仕様ではミリ秒と規定した.
995
996 【仕様決定の理由】
997
998 ディスパッチ保留状態において,ポーリングを行うサービスコールを呼び出せ
999 る場合があるのに対して,タイムアウト付きのサービスコールをタイムアウト
1000 時間をTMO_POLとして呼び出すとエラーになるのは,ディスパッチ保留状態では,
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
21
1001 別に規定がない限り,自タスクを広義の待ち状態に遷移させる可能性のあるサー
1002 ビスコール(タイムアウト付きのサービスコールはこれに該当)を呼び出すこ
1003 とはできないと規定されているためである.
1004
1005 (4) ノンブロッキング
1006
1007 サービスコールの中で待ち状態に遷移すべき状況になった時,サービスコール
1008 の処理を継続したままサービスコールからリターンする場合,そのサービスコー
1009 ルをノンブロッキング(non-blocking)という.処理を継続したままリターン
1010 する場合,サービスコールからはE_WBLKエラーが返る【NGKI0060】.E_WBLKは
1011 警告を表すエラーコードであり,サービスコールによる副作用がないという原
1012 則は適用されない【NGKI0061】.
1013
1014 サービスコールからE_WBLKエラーが返った場合には,サービスコールの処理は
1015 継続しているため,サービスコールに渡したパラメータまたはリターンパラメー
1016 タを入れる領域はまだ参照される可能性があり,別の目的に使用することはで
1017 きない【NGKI0062】.継続している処理が完了した場合や,何らかの理由で処
1018 理が取りやめられた場合には,コールバックを呼び出すなどの方法で,サービ
1019 スコールを呼び出したソフトウェアに通知するものとする【NGKI0063】.
1020
1021 ノンブロッキングの指定は,タイムアウト時間にTMO_NBLK(=-2)を指定する
1022 ことによって行う【NGKI0064】.ノンブロッキングの指定を行えるサービスコー
1023 ルは,指定した場合の振舞いをサービスコール毎に規定する【NGKI0065】.
1024
1025 【補足説明】
1026
1027 ノンブロッキングは,システムサービスでサポートすることを想定した機能で
1028 ある.カーネルは,ノンブロッキングの指定を行えるサービスコールをサポー
1029 トしていない.
1030
1031 2.3.3 保護機能
1032
1033 この節では,保護機能に関連する主な概念について説明する.この節の内容は,
1034 保護機能対応カーネルにのみ適用される.
1035
1036 (1) アクセス保護
1037
1038 保護機能対応カーネルは,処理単位が,許可されたカーネルオブジェクトに対
1039 して,許可された種別のアクセスを行うことのみを許し,それ以外のアクセス
1040 を防ぐアクセス保護機能を提供する【NGKI0066】.
1041
1042 アクセス制御の用語では,処理単位が主体(subject),カーネルオブジェクト
1043 が対象(object)ということになる.
1044
1045 (2) メモリオブジェクト
1046
1047 保護機能対応カーネルにおいては,メモリ領域をカーネルオブジェクトとして
1048 扱い,アクセス保護の対象とする【NGKI0067】.カーネルがアクセス保護の対
1049 象とする連続したメモリ領域を,メモリオブジェクト(memory object)と呼ぶ.
1050 メモリオブジェクトは,互いに重なりあうことはない【NGKI0068】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
22
1051
1052 メモリオブジェクトは,その先頭番地によって識別する【NGKI0069】.言い換
1053 えると,先頭番地がオブジェクト番号となる.
1054
1055 メモリオブジェクトの先頭番地とサイズには,ターゲットハードウェアでメモ
1056 リ保護が実現できるように,ターゲット定義の制約が課せられる【NGKI0070】.
1057
1058 (3) 保護ドメイン
1059
1060 保護機能を提供するために用いるカーネルオブジェクトの集合を,保護ドメイ
1061 ン(protection domain)と呼ぶ.保護ドメインは,保護ドメインIDと呼ぶID番
1062 号によって識別する【NGKI0071】.
1063
1064 カーネルオブジェクトは,たかだか1つの保護ドメインに属する.処理単位は,
1065 いずれか1つの保護ドメインに属さなければならないのに対して,それ以外のカー
1066 ネルオブジェクトは,いずれの保護ドメインにも属さないことができる
1067 【NGKI0072】.いずれの保護ドメインにも属さないカーネルオブジェクトを,
1068 無所属のカーネルオブジェクト(independent kernel object)と呼ぶ.
1069
1070 処理単位がカーネルオブジェクトにアクセスできるかどうかは,処理単位が属
1071 する保護ドメインにより決まるのが原則である【NGKI0073】.すなわち,カー
1072 ネルオブジェクトに対するアクセス権は,処理単位ではなく,保護ドメイン単
1073 位で管理される.このことから,ある保護ドメインに属する処理単位がアクセ
1074 スできることを,単に,その保護ドメインからアクセスできるという.
1075
1076 ただし,タスクのユーザスタック領域は,ターゲット定義での変更がない限り
1077 は,そのタスク(とカーネルドメインに属する処理単位)のみがアクセスでき
1078 る(「2.11.6 ユーザタスクのユーザスタック領域」の節を参照)【NGKI0074】.
1079 これは,[NGKI0073]の原則の例外となっている.
1080
1081 デフォルトでは,保護ドメインに属するカーネルオブジェクトは,同じ保護ド
1082 メイン(とカーネルドメイン)のみからアクセスできる【NGKI0075】.また,
1083 無所属のカーネルオブジェクトは,すべての保護ドメインからアクセスできる
1084 【NGKI0076】.
1085
1086 (4) カーネルドメインとユーザドメイン
1087
1088 システムには,カーネルドメイン(kernel domain)と呼ばれる保護ドメインが
1089 1つ存在する【NGKI0077】.カーネルドメインに属する処理単位は,プロセッサ
1090 の特権モードで実行される【NGKI0078】.また,すべてのカーネルオブジェク
1091 トに対して,すべての種別のアクセスを行うことが許可される【NGKI0079】.
1092 この仕様で,「ある保護ドメイン(またはタスク)のみからアクセスできる」
1093 といった場合でも,カーネルドメインドメインからはアクセスすることができ
1094 る.
1095
1096 カーネルドメイン以外の保護ドメインを,ユーザドメイン(user domain)と呼
1097 ぶ.ユーザドメインに属する処理単位は,プロセッサの非特権モードで実行さ
1098 れる【NGKI0080】.また,どのカーネルオブジェクトに対してどの種別のアク
1099 セスを行えるかを制限することができる【NGKI0081】.
1100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
23
1101 ユーザドメインには,1から連続する正の整数値の保護ドメインIDが付与される
1102 【NGKI0082】.カーネルドメインの保護ドメインIDは,TDOM_KERNEL(=-1)で
1103 ある【NGKI0083】.
1104
1105 この仕様では,システムに登録できるユーザドメインの数は,32個以下に制限
1106 する【NGKI0084】.これを超える数のユーザドメインを登録した場合には,コ
1107 ンフィギュレータがエラーを報告する【NGKI0085】.
1108
1109 【補足説明】
1110
1111 ユーザドメインは,システムコンフィギュレーションファイル中にユーザドメ
1112 インの囲みを記述することで,カーネルに登録する(「2.12.3 保護ドメインの
1113 指定」の節を参照).ユーザドメインを動的に生成する機能は,現時点では用
1114 意していない.
1115
1116 保護機能対応でないカーネルは,カーネルドメインのみをサポートしていると
1117 みなすこともできる.
1118
1119 【μITRON4.0/PX仕様との関係】
1120
1121 μITRON4.0/PX仕様のシステムドメイン(system domain)は,現時点ではサポー
1122 トしない.システムドメインは,それに属する処理単位が,プロセッサの特権
1123 モードで実行され,カーネルオブジェクトに対するアクセスを制限することが
1124 できる保護ドメインである.
1125
1126 (5) システムタスクとユーザタスク
1127
1128 カーネルドメインに属するタスクをシステムタスク(system task),ユーザド
1129 メインに属するタスクをユーザタスク(user task)と呼ぶ.
1130
1131 【補足説明】
1132
1133 特権モードで実行されるタスクをシステムタスク,非特権モードで実行される
1134 タスクをユーザタスクと定義する方法もあるが,ユーザタスクであっても,サー
1135 ビスコールの実行中は特権モードで実行されるため,上記の定義とした.
1136
1137 μITRON4.0/PX仕様のシステムドメインに属するタスクは,システムタスクと呼
1138 ぶことになる.
1139
1140 (6) アクセス許可パターン
1141
1142 あるカーネルオブジェクトに対するある種別のアクセスが,どの保護ドメイン
1143 に属する処理単位に許可されているかを表現するビットパターンを,アクセス
1144 許可パターン(access permission pattern)と呼ぶ.アクセス許可パターンの
1145 各ビットは,1つのユーザドメインに対応する【NGKI0086】.カーネルドメイン
1146 には,すべてのアクセスが許可されているため,カーネルドメインに対応する
1147 ビットは用意されていない.
1148
1149 アクセス許可パターンは,符号無し32ビット整数に定義されるデータ型
1150 (ACPTN)で保持し,値が1のビットに対応するユーザドメインにアクセスが許
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
24
1151 可されていることを表す【NGKI0087】.そのため,2つのアクセス許可パターン
1152 のビット毎論理和(C言語の"¦")を求めることで,アクセスを許可されている
1153 ユーザドメインの和集合(union)を得ることができる.また,2つのアクセス
1154 許可パターンのビット毎論理積(C言語の"&")を求めることで,アクセスを許
1155 可されているユーザドメインの積集合(intersection)を得ることができる.
1156
1157 アクセス許可パターンの指定に用いるために,指定したユーザドメインのみに
1158 アクセスを許可することを示すアクセス許可パターンを構成するマクロ(TACP)
1159 が用意されている【NGKI0088】.また,カーネルドメインのみにアクセスを許
1160 可することを示すアクセス許可パターンを表す定数(TACP_KERNEL)と,すべて
1161 の保護ドメインにアクセスを許可することを示すアクセス許可パターンを表す
1162 定数(TACP_SHARED)が用意されている【NGKI0089】.
1163
1164 (7) アクセス許可ベクタ
1165
1166 カーネルオブジェクトに対するアクセスは,カーネルオブジェクトの種類毎に,
1167 通常操作1,通常操作2,管理操作,参照操作の4つの種別に分類されている
1168 【NGKI0090】.あるカーネルオブジェクトに対する4つの種別のアクセスに関す
1169 るアクセス許可パターンをひとまとめにしたものを,アクセス許可ベクタ
1170 (access permission vector)と呼び,次のように定義されるデータ型
1171 (ACVCT)で保持する【NGKI0091】.
1172
1173 typedef struct acvct {
1174 ACPTN acptn1; /* 通常操作1のアクセス許可パターン */
1175 ACPTN acptn2; /* 通常操作2のアクセス許可パターン */
1176 ACPTN acptn3; /* 管理操作のアクセス許可パターン */
1177 ACPTN acptn4; /* 参照操作のアクセス許可パターン */
1178 } ACVCT;
1179
1180 【補足説明】
1181
1182 カーネルオブジェクトの種類毎のアクセスの種別の分類については,「5.8 カー
1183 ネルオブジェクトに対するアクセスの種別」の節を参照すること.
1184
1185 【μITRON4.0/PX仕様との関係】
1186
1187 μITRON4.0/PX仕様では,アクセス許可ベクタを,1つまたは2つのアクセス許可
1188 パターンで構成することも許しているが,この仕様では4つで構成するものと決
1189 めている.
1190
1191 (8) サービスコールの呼出し方法
1192
1193 保護機能対応カーネルでは,サービスコールは,ソフトウェア割込みによって
1194 呼び出すのが基本である.サービスコール呼出しを通常の方法で記述した場合,
1195 ソフトウェア割込みによって呼び出すコードが生成される【NGKI0092】.
1196
1197 一般に,ソフトウェア割込みによるサービスコール呼出しはオーバヘッドが大
1198 きい.そのため,カーネルドメインに属する処理単位からは,関数呼出しによっ
1199 てサービスコールを呼び出すことで,オーバヘッドを削減することができる.
1200 そこで,カーネルドメインに属する処理単位から関数呼出しによってサービス
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
25
1201 コールを呼び出せるように,以下の機能が用意されている.
1202
1203 カーネルドメインに属する処理単位が実行する関数のみを含んだソースファイ
1204 ルでは,カーネルヘッダファイル(kernel.h)をインクルードする前に,
1205 TOPPERS_SVC_CALLをマクロ定義することで,サービスコール呼出しを通常の方
1206 法で記述した場合に,関数呼出しによって呼び出すコードが生成される
1207 【NGKI0093】.
1208
1209 また,カーネルドメインに属する処理単位が実行する関数と,ユーザドメイン
1210 に属する処理単位が実行する関数の両方を含んだソースファイルでは,関数呼
1211 出しによってサービスコールを呼び出すための名称を作るマクロ(SVC_CALL)
1212 を用いることで,関数呼出しによって呼び出すコードが生成される
1213 【NGKI0094】.例えば,act_tskを関数呼出しによって呼び出す場合には,次の
1214 ように記述すればよい.
1215
1216 ercd = SVC_CALL(act_tsk)(tskid);
1217
1218 【補足説明】
1219
1220 拡張サービスコールを,関数呼出しによって呼び出す方法は用意されていない.
1221 カーネルドメインに属する処理単位が,関数呼出しによって,拡張サービスコー
1222 ルとして登録した関数を呼び出すことはできるが,その場合には,処理単位が
1223 呼び出した通常の関数であるとみなされ,拡張サービスコールであるとは扱わ
1224 れない.
1225
1226 2.3.4 マルチプロセッサ対応
1227
1228 この節では,マルチプロセッサ対応に関連する主な概念について説明する.こ
1229 の節の内容は,マルチプロセッサ対応カーネルにのみ適用される.
1230
1231 (1) クラス
1232
1233 マルチプロセッサに対応するために用いるカーネルオブジェクトの集合を,ク
1234 ラス(class)と呼ぶ.クラスは,クラスIDと呼ぶID番号によって識別する
1235 【NGKI0095】.
1236
1237 カーネルオブジェクトは,いずれか1つのクラスに属するのが原則である
1238 【NGKI0096】.カーネルオブジェクトが属するクラスは,オブジェクトの登録
1239 時に決定し,登録後に変更することはできない【NGKI0097】.
1240
1241 【補足説明】
1242
1243 処理単位を実行するプロセッサを静的に決定する機能分散型のマルチプロセッ
1244 サシステムでは,プロセッサ毎にクラスを設ける方法が典型的である.それに
1245 対して,対称型のマルチプロセッサシステムで,処理単位のマイグレーション
1246 を許す場合には,プロセッサ毎のクラスに加えて,どのプロセッサでも実行で
1247 きるクラスを(システム中に1つまたは初期割付けプロセッサ毎に)設ける方法
1248 が典型的である.
1249
1250 [NGKI0096]の原則に関わらず,以下のオブジェクトはいずれのクラスにも属
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
26
1251 さない.
1252
1253 ・オーバランハンドラ
1254 ・拡張サービスコール
1255 ・グローバル初期化ルーチン
1256 ・グローバル終了処理ルーチン
1257
1258 マルチプロセッサ対応でないカーネルは,カーネルによって規定された1つのク
1259 ラスのみをサポートしているとみなすこともできる.
1260
1261 (2) プロセッサ
1262
1263 たかだか1つの処理単位のみを同時に実行できるハードウェアの単位を,プロセッ
1264 サ(processor)と呼ぶ.プロセッサは,プロセッサIDと呼ぶID番号によって識
1265 別する【NGKI0098】.
1266
1267 複数のプロセッサを持つシステム構成をマルチプロセッサ(multiprocessor)
1268 と呼び,同時に複数の処理単位を実行することができる【NGKI0099】.
1269
1270 システムの初期化時と終了時に特別な役割を果たすプロセッサを,マスタプロ
1271 セッサ(master processor)と呼び,システムに1つ存在する【NGKI0100】.ど
1272 のプロセッサをマスタプロセッサとするかは,ターゲット定義である
1273 【NGKI0101】.マスタプロセッサ以外のプロセッサを,スレーブプロセッサ
1274 (slave processor)と呼ぶ.なお,カーネル動作状態では,マスタプロセッサ
1275 とスレーブプロセッサの振舞いに違いはない【NGKI0102】.
1276
1277 (3) 処理単位の割付けとマイグレーション
1278
1279 処理単位は,後述のマイグレーションが発生しない限りは,いずれか1つのプロ
1280 セッサに割り付けられて実行される【NGKI0103】.処理単位を実行するプロセッ
1281 サを,割付けプロセッサと呼ぶ.また,処理単位が登録時に割り付けられるプ
1282 ロセッサを,初期割付けプロセッサと呼ぶ.
1283
1284 処理単位によっては,処理単位の登録後に,割付けプロセッサを変更すること
1285 が可能である【NGKI0104】.処理単位の登録後に割付けプロセッサを変更する
1286 ことを,処理単位のマイグレーション(migration)と呼ぶ.
1287
1288 割付けプロセッサを変更できる処理単位に対しては,処理単位を割り付けるこ
1289 とができるプロセッサ(これを,割付け可能プロセッサと呼ぶ)を制限するこ
1290 とができる【NGKI0105】.
1291
1292 (4) クラスの持つ属性とカーネルオブジェクト
1293
1294 タスクの初期割付けプロセッサや割付け可能プロセッサなど,カーネルオブジェ
1295 クトをマルチプロセッサ上で実現する際に設定すべき属性は,そのカーネルオ
1296 ブジェクトが属するクラスによって定まる.
1297
1298 各クラスが持ち,それに属するカーネルオブジェクトに適用される属性は,次
1299 の通りである【NGKI0106】.
1300
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
27
1301 ・初期割付けプロセッサ
1302 ・割付け可能プロセッサ(複数のプロセッサを指定可能,初期割付けプロセッ
1303 サを含む)
1304 ・ATT_MOD/ATA_MODによって,オブジェクトモジュールに含まれる標準のセ
1305 クションが配置されるメモリリージョン(標準メモリリージョン)
1306 ・オブジェクト生成に必要なメモリ領域(オブジェクトの管理ブロック,タ
1307 スクのスタック領域やデータキューのデータキュー管理領域など)の配置
1308 場所
1309 ・その他の管理情報(ロック単位など)
1310
1311 使用できるクラスのID番号とその属性は,ターゲット定義である【NGKI0107】.
1312
1313 【仕様決定の理由】
1314
1315 クラスを導入することで,カーネルオブジェクト毎に上記の属性を設定できる
1316 ようにしなかったのは,これらの属性をアプリケーション設計者が個別に設定
1317 するよりも,ターゲット依存部の実装者が有益な組み合わせをあらかじめ用意
1318 しておく方が良いと考えたためである.
1319
1320 (5) ローカルタイマ方式とグローバルタイマ方式
1321
1322 システム時刻の管理方式として,プロセッサ毎にシステム時刻を持つローカル
1323 タイマ方式と,システム全体で1つのシステム時刻を持つグローバルタイマ方式
1324 の2つの方式がある.どちらの方式を用いることができるかは,ターゲット定義
1325 である【NGKI0108】.
1326
1327 ローカルタイマ方式では,プロセッサ毎のシステム時刻は,それぞれのプロセッ
1328 サが更新する【NGKI0109】.異なるプロセッサのシステム時刻を同期させる機
1329 能は,カーネルでは用意しない.
1330
1331 グローバルタイマ方式では,システム中の1つのプロセッサがシステム時刻を更
1332 新する【NGKI0110】.これを,システム時刻管理プロセッサと呼ぶ.どのプロ
1333 セッサをシステム時刻管理プロセッサとするかは,ターゲット定義である
1334 【NGKI0111】.
1335
1336 【補足説明】
1337
1338 システム時刻管理プロセッサが,マスタプロセッサと一致している必要はない.
1339
1340 【未決定事項】
1341
1342 ローカルタイマ方式の場合に,プロセッサ毎に異なるタイムティックの周期を
1343 設定したい場合が考えられるが,現時点の実装ではサポートしておらず,
1344 TIC_NUMEとTIC_DENOの扱いも未決定であるため,今後の課題とする.
1345
1346 2.3.5 その他
1347
1348 (1) オブジェクトモジュール
1349
1350 プログラムのオブジェクトコードとデータを含むファイルを,オブジェクトモ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
28
1351 ジュール(object module)と呼ぶ.オブジェクトファイルとライブラリは,オ
1352 ブジェクトモジュールである.
1353
1354 (2) メモリリージョン
1355
1356 オブジェクトモジュールに含まれるセクションの配置対象となる同じ性質を持っ
1357 た連続したメモリ領域をメモリリージョン(memory region)と呼ぶ.
1358
1359 メモリリージョンは,文字列によって識別する【NGKI0112】.メモリリージョ
1360 ンを識別する文字列を,メモリリージョン名と呼ぶ.
1361
1362 【補足説明】
1363
1364 この仕様では,メモリ領域(memory area)という用語は,連続したメモリの範
1365 囲という一般的な意味で使っている.
1366
1367 (3) 標準のセクション
1368
1369 コンパイラに特別な指定をしない場合に出力するセクションを,標準のセクショ
1370 ン(standard sections)と呼ぶ.コンパイラが出力しないセクションの中で,
1371 ターゲット定義のものを,標準のセクションと扱う場合もある【NGKI0113】.
1372
1373 (4) 保護ドメイン毎の標準セクション
1374
1375 保護機能対応カーネルにおいては,保護ドメイン毎に,標準のセクションを配
1376 置するためのセクションが登録される【NGKI0114】.また,無所属の標準のセ
1377 クションを配置するためのセクションが登録される【NGKI0115】.これらのセ
1378 クションを,保護ドメイン毎の標準セクションと呼ぶ(standard sections
1379 for each protection domain ).保護ドメイン毎の標準セクションのセクショ
1380 ン名は,ターゲット定義で別に規定がない限りは,標準のセクション名と保護
1381 ドメイン名(カーネルドメインの場合は"kernel",無所属の場合は"shared")
1382 を"_"でつないだものとする【NGKI0116】.例えば,カーネルドメインの
1383 ".text"セクションのセクション名は,".text_kernel" とする.
1384
1385 2.4 処理単位の種類と実行順序
1386
1387 2.4.1 処理単位の種類
1388
1389 カーネルが実行を制御する処理単位の種類は次の通りである【NGKI0117】.
1390
1391 (a) タスク
1392 (a.1) タスク例外処理ルーチン
1393 (b) 割込みハンドラ
1394 (b.1) 割込みサービスルーチン
1395 (b.2) タイムイベントハンドラ
1396 (c) CPU例外ハンドラ
1397 (d) 拡張サービスコール
1398 (e) 初期化ルーチン
1399 (f) 終了処理ルーチン
1400
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
29
1401 ここで,タイムイベントハンドラとは,時間の経過をきっかけに起動される処
1402 理単位である周期ハンドラ,アラームハンドラ,オーバランハンドラの総称で
1403 ある.
1404
1405 【TOPPERS/ASPカーネルにおける規定】
1406
1407 ASPカーネルでは,オーバランハンドラと拡張サービスコールをサポートしてい
1408 ない【ASPS0003】.ただし,オーバランハンドラ機能拡張パッケージを用いる
1409 と,オーバランハンドラ機能を追加することができる【ASPS0004】.
1410
1411 【TOPPERS/FMPカーネルにおける規定】
1412
1413 FMPカーネルでは,オーバランハンドラと拡張サービスコールをサポートしてい
1414 ない【FMPS0002】.
1415
1416 【TOPPERS/SSPカーネルにおける規定】
1417
1418 SSPカーネルでは,タスク例外処理ルーチン,タイムイベントハンドラ,拡張サー
1419 ビスコールをサポートしていない【SSPS0002】.
1420
1421 2.4.2 処理単位の実行順序
1422
1423 処理単位の実行順序を規定するために,ここでは,処理単位の優先順位を規定
1424 する.また,ディスパッチが起こるタイミングを規定するために,ディスパッ
1425 チを行うカーネル内の処理であるディスパッチャの優先順位についても規定す
1426 る.
1427
1428 タスクの優先順位は,ディスパッチャの優先順位よりも低い【NGKI0118】.タ
1429 スク間では,高い優先度を持つ方が優先順位が高く,同じ優先度を持つタスク
1430 間では,先に実行できる状態となった方が優先順位が高い【NGKI0119】.詳し
1431 くは,「2.6.3 タスクのスケジューリング規則」の節を参照すること.
1432
1433 タスク例外処理ルーチンの優先順位は,例外が要求されたタスクと同じである
1434 が,タスクよりも先に実行される【NGKI0120】.
1435
1436 割込みハンドラの優先順位は,ディスパッチャの優先順位よりも高い
1437 【NGKI0121】.割込みハンドラ間では,高い割込み優先度を持つ方が優先順位
1438 が高く,同じ割込み優先度を持つ割込みハンドラ間では,先に実行開始された
1439 方が優先順位が高い【NGKI0122】.同じ割込み優先度を持つ割込みハンドラ間
1440 での実行開始順序は,この仕様では規定しない.詳しくは,「2.7.2 割込み優
1441 先度」の節を参照すること.
1442
1443 割込みサービスルーチンとタイムイベントハンドラの優先順位は,それを呼び
1444 出す割込みハンドラと同じである【NGKI0123】.
1445
1446 CPU例外ハンドラの優先順位は,CPU例外がタスクまたはタスク例外処理ルーチ
1447 ンで発生した場合には,ディスパッチャの優先順位と同じであるが,ディスパッ
1448 チャよりも先に実行される【NGKI0124】.CPU例外がその他の処理単位で発生し
1449 た場合には,CPU例外ハンドラの優先順位は,その処理単位の優先順位と同じで
1450 あるが,その処理単位よりも先に実行される【NGKI0125】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
30
1451
1452 拡張サービスコールの優先順位は,それを呼び出した処理単位と同じであるが,
1453 それを呼び出した処理単位よりも先に実行される【NGKI0126】.
1454
1455 初期化ルーチンは,カーネルの動作開始前に,システムコンフィギュレーショ
1456 ンファイル中に初期化ルーチンを登録する静的APIを記述したのと同じ順序で実
1457 行される【NGKI0127】.終了処理ルーチンは,カーネルの動作終了後に,終了
1458 処理ルーチンを登録する静的APIを記述したのと逆の順序で実行される
1459 【NGKI0128】.
1460
1461 マルチプロセッサ対応カーネルでは,初期化ルーチンには,クラスに属さない
1462 グローバル初期化ルーチンと,クラスに属するローカル初期化ルーチンがある
1463 【NGKI0129】.グローバル初期化ルーチンがマスタプロセッサで実行された後
1464 に,各プロセッサでローカル初期化ルーチンが実行される【NGKI0130】.また,
1465 終了処理ルーチンには,クラスに属さないグローバル終了処理ルーチンと,ク
1466 ラスに属するローカル終了処理ルーチンがある【NGKI0131】.ローカル終了処
1467 理ルーチンが各プロセッサで実行された後に,マスタプロセッサでグローバル
1468 終了処理ルーチンが実行される【NGKI0132】.
1469
1470 【仕様決定の理由】
1471
1472 終了処理ルーチンを,登録する静的APIを記述したのと逆順で実行するのは,終
1473 了処理は初期化の逆の順序で行うのがよいためである(システムコンフィギュ
1474 レーションファイルを分割すると,終了処理ルーチンを登録する静的APIだけ逆
1475 順に記述するのは難しい).
1476
1477 2.4.3 カーネル処理の不可分性
1478
1479 カーネルのサービスコール処理やディスパッチャ,割込みハンドラとCPU例外ハ
1480 ンドラの入口処理と出口処理などのカーネル処理は不可分に実行されるのが基
1481 本である.実際には,カーネル処理の途中でアプリケーションが実行される場
1482 合はあるが,アプリケーションがサービスコールを用いて観測できる範囲で,
1483 カーネル処理が不可分に実行された場合と同様に振る舞うのが原則である
1484 【NGKI0133】.これを,カーネル処理の不可分性という.
1485
1486 ただし,マルチプロセッサ対応カーネルにおいては,カーネル処理が実行され
1487 ているプロセッサ以外のプロセッサから,カーネル処理の途中の状態が観測で
1488 きる場合がある.具体的には,1つのサービスコールにより複数のオブジェクト
1489 の状態が変化する場合に,一部のオブジェクトの状態のみが変化し,残りのオ
1490 ブジェクトの状態が変化していない過渡的な状態が観測できる場合がある
1491 【NGKI0134】.
1492
1493 【補足説明】
1494
1495 マルチプロセッサ対応でないカーネルでは,1つのサービスコールにより複数の
1496 タスクが実行できる状態になる場合,新しく実行状態となるべきタスクへのディ
1497 スパッチは,すべてのタスクの状態遷移が完了した後に行われる.例えば,低
1498 優先度のタスクAが発行したサービスコールにより,中優先度のタスクBと高優
1499 先度のタスクCがこの順で待ち解除される場合,タスクBとタスクCが待ち解除さ
1500 れた後に,タスクCへのディスパッチが行われる.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
31
1501
1502 マルチプロセッサ対応カーネルでは,上のことは,1つのプロセッサ内では成り
1503 立つが,他のプロセッサに割り付けられたタスクに対しては成り立たない.例
1504 えば,プロセッサ1で低優先度のタスクAが実行されている時に,他のプロセッ
1505 サ2で実行されているタスクが発行したサービスコールにより,プロセッサ1に
1506 割り付けられた中優先度のタスクBと高優先度のタスクCがこの順で待ち解除さ
1507 れる場合,タスクCが待ち解除される前に,タスクBへディスパッチされる場合
1508 がある.
1509
1510 2.4.4 処理単位を実行するプロセッサ
1511
1512 マルチプロセッサ対応カーネルでは,処理単位を実行するプロセッサ(割付け
1513 プロセッサ)は,その処理単位が属するクラスの初期割付けプロセッサと割付
1514 け可能プロセッサから,次のように決まる.
1515
1516 タスク,周期ハンドラ,アラームハンドラは,登録時に,属するクラスの初期
1517 割付けプロセッサに割り付けられる【NGKI0135】.また,割付けプロセッサを
1518 変更するサービスコール(mact_tsk/imact_tsk,mig_tsk,msta_cyc,
1519 msta_alm/imsta_alm)によって,割付けプロセッサを,クラスの割付け可能プ
1520 ロセッサのいずれかに変更することができる【NGKI0136】.
1521
1522 割込みハンドラ,CPU例外ハンドラ,ローカル初期化ルーチン,ローカル終了処
1523 理ルーチンは,属するクラスの初期割付けプロセッサで実行される
1524 【NGKI0137】.クラスの割付け可能プロセッサの情報は用いられない.
1525
1526 割込みサービスルーチンは,属するクラスの割付け可能プロセッサのいずれか
1527 (オプション設定によりすべて)で実行される【NGKI0138】.クラスの初期割
1528 付けプロセッサの情報は用いられない.
1529
1530 以上を整理すると,次の表の通りとなる.この表の中で,「○」はその情報が
1531 使用されることを,「-」はその情報が使用されないことを示す.
1532
1533 初期割付けプロセッサ 割付け可能プロセッサ
1534 ----------------------------------------------------------------------
1535 タスク(タスク例外処理 ○ ○
1536 ルーチンを含む)
1537 ----------------------------------------------------------------------
1538 割込みハンドラ ○ -
1539 割込みサービスルーチン - ○
1540 周期ハンドラ ○ ○
1541 アラームハンドラ ○ ○
1542 ----------------------------------------------------------------------
1543 CPU例外ハンドラ ○ -
1544 ----------------------------------------------------------------------
1545 ローカル初期化ルーチン ○ -
1546 ローカル終了処理ルーチン ○ -
1547 ----------------------------------------------------------------------
1548
1549 オーバランハンドラ,拡張サービスコール,グローバル初期化ルーチン,グロー
1550 バル終了処理ルーチンは,いずれのクラスにも属さない【NGKI0139】.オーバ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
32
1551 ランハンドラは,オーバランを起こしたタスクの割付けプロセッサによって実
1552 行される【NGKI0140】.拡張サービスコールは,それを呼び出した処理単位の
1553 割付けプロセッサによって実行される【NGKI0141】.グローバル初期化ルーチ
1554 ンとグローバル終了処理ルーチンは,マスタプロセッサによって実行される
1555 【NGKI0142】.
1556
1557 2.5 システム状態とコンテキスト
1558
1559 2.5.1 カーネル動作状態と非動作状態
1560
1561 カーネルの初期化が完了した後,カーネルの終了処理が開始されるまでの間を,
1562 カーネル動作状態と呼ぶ.それ以外の状態,すなわちカーネルの初期化完了前
1563 (初期化ルーチンの実行中を含む)と終了処理開始後(終了処理ルーチンの実
1564 行中を含む)を,カーネル非動作状態と呼ぶ.プロセッサは,カーネル動作状
1565 態かカーネル非動作状態のいずれかの状態を取る【NGKI0143】.
1566
1567 カーネル非動作状態では,原則として,NMIを除くすべての割込みがマスクされ
1568 る【NGKI0144】.
1569
1570 カーネル非動作状態では,システムインタフェースレイヤのAPIとカーネル非動
1571 作状態を参照するサービスコール(sns_ker)のみを呼び出すことができる
1572 【NGKI0145】.カーネル非動作状態で,その他のサービスコールを呼び出した
1573 場合の動作は,保証されない【NGKI0146】.
1574
1575 マルチプロセッサ対応カーネルでは,プロセッサ毎に,カーネル動作状態かカー
1576 ネル非動作状態のいずれかの状態を取る【NGKI0147】.
1577
1578 2.5.2 タスクコンテキストと非タスクコンテキスト
1579
1580 処理単位が実行される環境(用いるスタック領域やプロセッサの動作モードな
1581 ど)をコンテキストと呼ぶ.
1582
1583 カーネル動作状態において,処理単位が実行されるコンテキストは,タスクコ
1584 ンテキストと非タスクコンテキストに分類される【NGKI0148】.
1585
1586 タスク(タスク例外処理ルーチンを含む)が実行されるコンテキストは,タス
1587 クコンテキストに分類される【NGKI0149】.また,タスクコンテキストから呼
1588 び出した拡張サービスコールが実行されるコンテキストは,タスクコンテキス
1589 トに分類される【NGKI0150】.
1590
1591 割込みハンドラ(割込みサービスルーチンおよびタイムイベントハンドラを含
1592 む)とCPU例外ハンドラが実行されるコンテキストは,非タスクコンテキストに
1593 分類される【NGKI0151】.また,非タスクコンテキストから呼び出した拡張サー
1594 ビスコールが実行されるコンテキストは,非タスクコンテキストに分類される
1595 【NGKI0152】.
1596
1597 タスクコンテキストで実行される処理単位は,別に規定がない限り,タスクの
1598 スタック領域を用いて実行される【NGKI0153】.非タスクコンテキストで実行
1599 される処理単位は,別に規定がない限り,非タスクコンテキスト用スタック領
1600 域を用いて実行される【NGKI0154】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
33
1601
1602 タスクコンテキストからは,非タスクコンテキスト専用のサービスコールを呼
1603 び出すことはできない【NGKI0155】.逆に,非タスクコンテキストからは,タ
1604 スクコンテキスト専用のサービスコールを呼び出すことはできない
1605 【NGKI0156】.いずれも,呼び出した場合にはE_CTXエラーとなる【NGKI0157】.
1606
1607 2.5.3 カーネルの振舞いに影響を与える状態
1608
1609 カーネル動作状態において,プロセッサは,カーネルの振舞いに影響を与える
1610 状態として,次の状態を持つ【NGKI0158】.
1611
1612 ・全割込みロックフラグ(全割込みロック状態と全割込みロック解除状態)
1613 ・CPUロックフラグ(CPUロック状態とCPUロック解除状態)
1614 ・割込み優先度マスク(割込み優先度マスク全解除状態と全解除でない状態)
1615 ・ディスパッチ禁止フラグ(ディスパッチ禁止状態とディスパッチ許可状態)
1616
1617 これらの状態は,それぞれ独立な状態である.すなわち,プロセッサは上記の
1618 状態の任意の組合せを取ることができ,それぞれの状態を独立に変化させるこ
1619 とができる【NGKI0159】.
1620
1621 2.5.4 全割込みロック状態と全割込みロック解除状態
1622
1623 プロセッサは,NMIを除くすべての割込みをマスクするための全割込みロックフ
1624 ラグを持つ【NGKI0160】.全割込みロックフラグがセットされた状態を全割込
1625 みロック状態,クリアされた状態を全割込みロック解除状態と呼ぶ.すなわち,
1626 全割込みロック状態では,NMIを除くすべての割込みがマスクされる.
1627
1628 全割込みロック状態では,システムインタフェースレイヤのAPIとカーネル非動
1629 作状態を参照するサービスコール(sns_ker),カーネルを終了するサービスコー
1630 ル(ext_ker)のみを呼び出すことができる【NGKI0161】.全割込みロック状態
1631 で,その他のサービスコールを呼び出した場合の動作は,保証されない
1632 【NGKI0162】.また,全割込みロック状態で,実行中の処理単位からリターン
1633 してはならない.リターンした場合の動作は保証されない【NGKI0164】.
1634
1635 マルチプロセッサ対応カーネルでは,プロセッサ毎に,全割込みロックフラグ
1636 を持つ【NGKI0165】.すなわち,プロセッサ毎に,全割込みロック状態か全割
1637 込みロック解除状態のいずれかの状態を取る.
1638
1639 2.5.5 CPUロック状態とCPUロック解除状態
1640
1641 プロセッサは,カーネル管理の割込み(「2.7.7 カーネル管理外の割込み」の
1642 節を参照)をすべてマスクするためのCPUロックフラグを持つ【NGKI0166】.
1643 CPUロックフラグがセットされた状態をCPUロック状態,クリアされた状態を
1644 CPUロック解除状態と呼ぶ.CPUロック状態では,すべてのカーネル管理の割込
1645 みがマスクされ,ディスパッチが保留される【NGKI0167】.
1646
1647 CPUロック状態で呼び出すことができるサービスコールは次の通り【NGKI0168】.
1648
1649 ・システムインタフェースレイヤのAPI
1650 ・loc_cpu/iloc_cpu,unl_cpu/iunl_cpu
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
34
1651 ・unl_spn/iunl_spn(マルチプロセッサ対応カーネルのみ)
1652 ・dis_int,ena_int
1653 ・sns_yyy,xsns_yyy(CPU例外ハンドラからのみ)
1654 ・get_utm
1655 ・ext_tsk,ext_ker
1656 ・prb_mem(保護機能対応カーネルのみ)
1657 ・cal_svc(保護機能対応カーネルのみ)
1658
1659 CPUロック状態で,その他のサービスコールを呼び出した場合には,E_CTXエラー
1660 となる【NGKI0169】.
1661
1662 マルチプロセッサ対応カーネルでは,プロセッサ毎に,CPUロックフラグを持つ
1663 【NGKI0170】.すなわち,プロセッサ毎に,CPUロック状態かCPUロック解除状
1664 態のいずれかの状態を取る.
1665
1666 【補足説明】
1667
1668 NMI以外にカーネル管理外の割込みを設けない場合には,全割込みロックフラグ
1669 とCPUロックフラグの機能は同一となるが,両フラグは独立に存在する.
1670
1671 マルチプロセッサ対応カーネルにおいて,あるプロセッサがCPUロック状態にあ
1672 る間は,そのプロセッサにおいてのみ,すべてのカーネル管理の割込みがマス
1673 クされ,ディスパッチが保留される.それに対して他のプロセッサにおいては,
1674 割込みはマスクされず,ディスパッチも起こるため,CPUロック状態を使って他
1675 のプロセッサで実行される処理単位との排他制御を実現することはできない.
1676
1677 2.5.6 割込み優先度マスク
1678
1679 プロセッサは,割込み優先度を基準に割込みをマスクするための割込み優先度
1680 マスクを持つ【NGKI0171】.割込み優先度マスクがTIPM_ENAALL(=0)の時は,
1681 いずれの割込み要求もマスクされない【NGKI0172】.この状態を割込み優先度
1682 マスク全解除状態と呼ぶ.割込み優先度マスクがTIPM_ENAALL(=0)以外の時
1683 は,割込み優先度マスクと同じかそれより低い割込み優先度を持つ割込みはマ
1684 スクされ,ディスパッチは保留される【NGKI0173】.この状態を割込み優先度
1685 マスクが全解除でない状態と呼ぶ.
1686
1687 割込み優先度マスクが全解除でない状態では,別に規定がない限りは,自タス
1688 クを広義の待ち状態に遷移させる可能性のあるサービスコールを呼び出すこと
1689 はできない【NGKI0174】.呼び出した場合には,E_CTXエラーとなる
1690 【NGKI0175】.
1691
1692 マルチプロセッサ対応カーネルでは,プロセッサ毎に,割込み優先度マスクを
1693 持つ【NGKI0176】.
1694
1695 2.5.7 ディスパッチ禁止状態とディスパッチ許可状態
1696
1697 プロセッサは,ディスパッチを保留するためのディスパッチ禁止フラグを持つ
1698 【NGKI0177】.ディスパッチ禁止フラグがセットされた状態をディスパッチ禁
1699 止状態,クリアされた状態をディスパッチ許可状態と呼ぶ.すなわち,ディス
1700 パッチ禁止状態では,ディスパッチは保留される.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
35
1701
1702 ディスパッチ禁止状態では,別に規定がない限りは,自タスクを広義の待ち状
1703 態に遷移させる可能性のあるサービスコールを呼び出すことはできない
1704 【NGKI0178】.呼び出した場合には,E_CTXエラーとなる【NGKI0179】.
1705
1706 マルチプロセッサ対応カーネルでは,プロセッサ毎に,ディスパッチ禁止フラ
1707 グを持つ【NGKI0180】.すなわち,プロセッサ毎に,ディスパッチ禁止状態か
1708 ディスパッチ許可状態のいずれかの状態を取る.
1709
1710 【補足説明】
1711
1712 マルチプロセッサ対応カーネルにおいて,あるプロセッサがディスパッチ禁止
1713 状態にある間は,そのプロセッサにおいてのみ,ディスパッチが保留される.
1714 それに対して他のプロセッサにおいては,ディスパッチが起こるため,ディス
1715 パッチ禁止状態を使って他のプロセッサで実行されるタスクとの排他制御を実
1716 現することはできない.
1717
1718 2.5.8 ディスパッチ保留状態
1719
1720 非タスクコンテキストの実行中,CPUロック状態,割込み優先度マスクが全解除
1721 でない状態,ディスパッチ禁止状態では,ディスパッチが保留される
1722 【NGKI0181】.これらの状態を総称して,ディスパッチ保留状態と呼ぶ.
1723
1724 マルチプロセッサ対応カーネルでは,プロセッサ毎に,ディスパッチ保留状態
1725 かそうでない状態のいずれかの状態を取る【NGKI0182】.
1726
1727 【補足説明】
1728
1729 全割込みロック状態はカーネルが管理しておらず,ディスパッチが保留される
1730 ことをカーネルが保証できないため,ディスパッチ保留状態に含めていない.
1731
1732 2.5.9 カーネル管理外の状態
1733
1734 全割込みロック状態,カーネル管理外の割込みハンドラ実行中(「2.7.7 カー
1735 ネル管理外の割込み」の節を参照),カーネル管理外のCPU例外ハンドラ実行中
1736 (「2.8.4 カーネル管理外のCPU例外」の節を参照)を総称して,カーネル管理
1737 外の状態と呼ぶ.
1738
1739 それぞれの節で規定する通り,カーネル管理外の状態では,システムインタ
1740 フェースレイヤのAPIとsns_ker,ext_kerのみ(カーネル管理外のCPU例外ハン
1741 ドラからは,それに加えてxsns_dpnとxsns_xpn)を呼び出すことができ,その
1742 他のサービスコールを呼び出すことはできない.カーネル管理外の状態から,
1743 その他のサービスコールを呼び出した場合の動作は,保証されない.
1744
1745 カーネル管理外の状態では,少なくとも,カーネル管理の割込みはマスクされ
1746 ている.カーネル管理外の割込み(の一部)もマスクされている場合もある.
1747 保護機能対応カーネルでは,カーネル管理外の状態になるのは,特権モードで
1748 実行している間に限られる.
1749
1750 2.5.10 処理単位の開始・終了とシステム状態
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
36
1751
1752 各処理単位が実行開始されるシステム状態の条件(実行開始条件),各処理単
1753 位の実行開始時にカーネルによって行われるシステム状態の変更処理(実行開
1754 始時処理),各処理単位からのリターン前(または終了前)にアプリケーショ
1755 ンが設定しておくべきシステム状態(リターン前または終了前),各処理単位
1756 からのリターン時(または終了時)にカーネルによって行われるシステム状態
1757 の変更処理(リターン時処理または終了時処理)は,次の表の通りである.
1758
1759 CPU ロック 割込み優先度 ディスパッチ
1760 フラグ マスク 禁止フラグ
1761 ----------------------------------------------------------------
1762 【タスク】【NGKI0183】
1763 実行開始条件 解除 全解除 許可
1764 実行開始時処理 そのまま そのまま そのまま
1765 終了前 原則解除(*1) 原則全解除(*1) 原則許可(*1)
1766 終了時処理 解除する 全解除する 許可する
1767 ----------------------------------------------------------------
1768 【タスク例外処理ルーチン】【NGKI0184】
1769 実行開始条件 解除 全解除 任意
1770 実行開始時処理 そのまま そのまま そのまま
1771 リターン前 原則解除(*1) 原則全解除(*1) 元に戻す
1772 リターン時処理 解除する 全解除する 元に戻す(*4)
1773 ----------------------------------------------------------------
1774 【カーネル管理の割込みハンドラ】【NGKI0185】
1775 【割込みサービスルーチン】【NGKI0186】
1776 【タイムイベントハンドラ】【NGKI0187】
1777 実行開始条件 解除 自優先度より低い 任意
1778 実行開始時処理 そのまま 自優先度に(*2) そのまま
1779 リターン前 原則解除(*1) 変更不可(*3) 変更不可(*3)
1780 リターン時処理 解除する 元に戻す(*5) そのまま
1781 ----------------------------------------------------------------
1782 【CPU例外ハンドラ】【NGKI0188】
1783 実行開始条件 任意 任意 任意
1784 実行開始時処理 そのまま(*6) そのまま そのまま
1785 リターン前 原則元に(*1) 変更不可(*3) 変更不可(*3)
1786 リターン時処理 元に戻す 元に戻す(*5) そのまま
1787 ----------------------------------------------------------------
1788 【拡張サービスコール】【NGKI0189】
1789 実行開始条件 任意 任意 任意
1790 実行開始時処理 そのまま そのまま そのまま
1791 リターン前 任意 任意 任意
1792 リターン時処理 そのまま そのまま そのまま
1793 ----------------------------------------------------------------
1794
1795 この表の中で「原則(*1)」とは,処理単位からのリターン前(または終了前)
1796 に,アプリケーションが指定された状態に設定しておくことが原則であるが,
1797 この原則に従わなくても,リターン時(または終了時)にカーネルによって状
1798 態が設定されるため,支障がないことを意味する.
1799
1800 「自優先度に(*2)」 とは,割込みハンドラと割込みサービスルーチンの場合に
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
37
1801 はそれを要求した割込みの割込み優先度,周期ハンドラとアラームハンドラの
1802 場合にはタイマ割込みの割込み優先度,オーバランハンドラの場合にはオーバ
1803 ランタイマ割込みの割込み優先度に変更することを意味する.
1804
1805 「変更不可(*3)」 とは,その処理単位中で,そのシステム状態を変更するAPI
1806 が用意されていないことを示す.
1807
1808 保護機能対応カーネルでは,タスク例外処理ルーチンからのリターン時にディ
1809 スパッチ禁止フラグを元に戻す処理(*4)は,タスクにディスパッチ禁止フラグ
1810 の変更を許可している場合にのみ行われる【NGKI0529】.カーネルは,ディス
1811 パッチ禁止フラグの元の状態をユーザスタック上に保存する【NGKI0530】.ア
1812 プリケーションがユーザスタック上に保存されたディスパッチ禁止フラグの状
1813 態を書き換えた場合,タスク例外処理ルーチンからのリターン時には,書き換
1814 えた後のディスパッチ禁止フラグの状態に変更される(すなわち,元に戻され
1815 るとは限らない)【NGKI0190】.
1816
1817 また,保護機能対応カーネルでは,タスクにディスパッチ禁止フラグの変更を
1818 許可していない場合で,タスク例外処理ルーチン中で拡張サービスコールを用
1819 いてディスパッチ禁止フラグを変更した場合,カーネルは元の状態に戻さない
1820 【NGKI0191】.このことから,タスク例外処理ルーチンからの終了前に,ディ
1821 スパッチ禁止フラグを元の状態に戻すのは,アプリケーションの責任とする
1822 【NGKI0192】.
1823
1824 【補足説明】
1825
1826 マルチプロセッサ対応カーネルにおいて,タスクがタスク例外処理ルーチンを
1827 実行中にマイグレーションされた場合,マイグレーション先のプロセッサにお
1828 いて,割込み優先度マスクとディスパッチ禁止フラグが元に戻される.
1829
1830 【仕様決定の理由】
1831
1832 保護機能対応カーネルにおいて,タスク例外処理ルーチンからのリターン時に
1833 ディスパッチ禁止フラグを元に戻す処理(*4)が,タスクにディスパッチ禁止フ
1834 ラグの変更を許可している場合にのみ行われるのは,タスクがユーザスタック
1835 上の状態を書き換えることで,許可していない状態変更を起こせてしまうこと
1836 を防止するためである.
1837
1838 割込みハンドラやCPU例外ハンドラで,その処理単位中で割込み優先度マスクを
1839 変更するAPIが用意されていないにもかかわらず,処理単位からのリターン時に
1840 元の状態に戻す(*5)のは,プロセッサによっては,割込み優先度マスクがステー
1841 タスレジスタ等に含まれており,APIを用いずに変更できてしまう場合があるた
1842 めである.
1843
1844 CPU例外ハンドラの実行開始時には,CPUロックフラグは変更されない(*6)こと
1845 から,CPUロック状態でCPU例外が発生した場合,CPU例外ハンドラの実行開始直
1846 後はCPUロック状態となっている.CPUロック状態でCPU例外が発生した場合,起
1847 動されるCPU例外ハンドラはカーネル管理外のCPU例外ハンドラであり(xsns_dpn,
1848 xsns_xpnともtrueを返す),CPU例外ハンドラ中でiunl_cpuを呼び出してCPUロッ
1849 ク状態を解除しようとした場合の動作は保証されない.ただし,保証されない
1850 にも関わらずiunl_cpuを呼び出した場合も考えられるため,リターン時には元
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
38
1851 に戻すこととしている.
1852
1853 2.6 タスクの状態遷移とスケジューリング規則
1854
1855 2.6.1 基本的なタスク状態
1856
1857 カーネルに登録したタスクは,実行できる状態,休止状態,広義の待ち状態の
1858 いずれかの状態を取る【NGKI0193】.また,実行できる状態と広義の待ち状態
1859 を総称して,起動された状態と呼ぶ.さらに,タスクをカーネルに登録してい
1860 ない仮想的な状態を,未登録状態と呼ぶ.
1861
1862 (a) 実行できる状態(runnable)
1863
1864 タスクを実行できる条件が,プロセッサが使用できるかどうかを除いて,揃っ
1865 ている状態.実行できる状態は,さらに,実行状態と実行可能状態に分類され
1866 る.
1867
1868 (a.1) 実行状態(running)
1869
1870 タスクが実行されている状態.または,そのタスクの実行中に,割込みまたは
1871 CPU例外により非タスクコンテキストの実行が開始され,かつ,タスクコンテキ
1872 ストに戻った後に,そのタスクの実行を再開するという状態.
1873
1874 (a.2) 実行可能状態(ready)
1875
1876 タスク自身は実行できる状態にあるが,それよりも優先順位の高いタスクが実
1877 行状態にあるために,そのタスクが実行されない状態.
1878
1879 (b) 休止状態(dormant)
1880
1881 タスクが実行すべき処理がない状態.タスクの実行を終了した後,次に起動す
1882 るまでの間は,タスクは休止状態となっている.タスクが休止状態にある時に
1883 は,タスクの実行を再開するための情報(実行再開番地やレジスタの内容など)
1884 は保存されていない【NGKI0194】.
1885
1886 (c) 広義の待ち状態(blocked)
1887
1888 タスクが,処理の途中で実行を止められている状態.タスクが広義の待ち状態
1889 にある時には,タスクの実行を再開するための情報(実行再開番地やレジスタ
1890 の内容など)は保存されており,タスクが実行を再開する時には,広義の待ち
1891 状態に遷移する前の状態に戻される【NGKI0195】.広義の待ち状態は,さらに,
1892 (狭義の)待ち状態,強制待ち状態,二重待ち状態に分類される.
1893
1894 (c.1) (狭義の)待ち状態(waiting)
1895
1896 タスクが何らかの条件が揃うのを待つために,自ら実行を止めている状態.
1897
1898 (c.2) 強制待ち状態(suspended)
1899
1900 他のタスクによって,強制的に実行を止められている状態.ただし,自タスク
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
39
1901 を強制待ち状態にすることも可能である.
1902
1903 (c.3) 二重待ち状態(waiting-suspended)
1904
1905 待ち状態と強制待ち状態が重なった状態.すなわち,タスクが何らかの条件が
1906 揃うのを待つために自ら実行を止めている時に,他のタスクによって強制的に
1907 実行を止められている状態.
1908
1909 単にタスクが「待ち状態である」といった場合には,二重待ち状態である場合
1910 を含み,「待ち状態でない」といった場合には,二重待ち状態でもないことを
1911 意味する.また,単にタスクが「強制待ち状態である」といった場合には,二
1912 重待ち状態である場合を含み,「強制待ち状態でない」といった場合には,二
1913 重待ち状態でもないことを意味する.
1914
1915 (d) 未登録状態(non-existent)
1916
1917 タスクをカーネルに登録していない仮想的な状態.タスクの生成前と削除後は,
1918 タスクは未登録状態にあるとみなす.
1919
1920 カーネルによっては,これらのタスク状態以外に,過渡的な状態が存在する場
1921 合がある【NGKI0196】.過渡的な状態については,「2.6.6 ディスパッチ保留
1922 状態で実行中のタスクに対する強制待ち」の節を参照すること.
1923
1924 【TOPPERS/ASPカーネルにおける規定】
1925
1926 ASPカーネルでは,タスクが未登録状態になることはない【ASPS0005】.また,
1927 上記のタスク状態以外の過渡的な状態になることもない【ASPS0006】.ただし,
1928 動的生成機能拡張パッケージでは,タスクが未登録状態になる【ASPS0007】.
1929
1930 【TOPPERS/FMPカーネルにおける規定】
1931
1932 FMPカーネルでは,タスクが未登録状態になることはない【FMPS0003】.上記の
1933 タスク状態以外の過渡的な状態として,タスクが強制待ち状態[実行継続中]
1934 になることがある【FMPS0004】.詳しくは,「2.6.6 ディスパッチ保留状態で
1935 実行中のタスクに対する強制待ち」の節を参照すること.
1936
1937 【TOPPERS/HRP2カーネルにおける規定】
1938
1939 HRP2カーネルでは,タスクが未登録状態になることはない【HRPS0002】.また,
1940 上記のタスク状態以外の過渡的な状態になることもない【HRPS0003】.
1941
1942 【TOPPERS/SSPカーネルにおける規定】
1943
1944 SSPカーネルでは,タスクが広義の待ち状態と未登録状態になることはない
1945 【SSPS0003】.また,上記のタスク状態以外の過渡的な状態になることもない
1946 【SSPS0004】.
1947
1948 2.6.2 タスクの状態遷移
1949
1950 タスクの状態遷移を図2-2に示す【NGKI0197】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
40
1951
1952 未登録状態のタスクをカーネルに登録することを,タスクを生成する(create)
1953 という.生成されたタスクは,休止状態に遷移する【NGKI0198】.また,タス
1954 ク生成時の属性指定により,生成と同時にタスクを起動し,実行できる状態に
1955 することもできる【NGKI0199】.逆に,登録されたタスクを未登録状態に遷移
1956 させることを,タスクを削除する(delete)という.
1957
1958 休止状態のタスクを,実行できる状態にすることを,タスクを起動する
1959 (activate)という.起動されたタスクは,実行できる状態になる
1960 【NGKI0200】.逆に,起動された状態のタスクを,休止状態(または未登録状
1961 態)に遷移させることを,タスクを終了する(terminate)という.
1962
1963 実行できる状態になったタスクは,まずは実行可能状態に遷移するが,そのタ
1964 スクの優先順位が実行状態のタスクよりも高い場合には,ディスパッチ保留状
1965 態でない限りはただちにディスパッチが起こり,実行状態へ遷移する
1966 【NGKI0201】.この時,それまで実行状態であったタスクは実行可能状態に遷
1967 移する【NGKI0202】.この時,実行状態に遷移したタスクは,実行可能状態に
1968 遷移したタスクをプリエンプトしたという.逆に,実行可能状態に遷移したタ
1969 スクは,プリエンプトされたという.
1970
1971 タスクを待ち解除するとは,タスクが待ち状態(二重待ち状態を除く)であれ
1972 ば実行できる状態に,二重待ち状態であれば強制待ち状態に遷移させることを
1973 いう.また,タスクを強制待ちから再開するとは,タスクが強制待ち状態(二
1974 重待ち状態を除く)であれば実行できる状態に,二重待ち状態であれば待ち状
1975 態に遷移させることをいう.
1976
1977 【補足説明】
1978
1979 タスクの実行開始とは,タスクが起動された後に最初に実行される(実行状態
1980 に遷移する)時のことをいう.
1981
1982 2.6.3 タスクのスケジューリング規則
1983
1984 実行できるタスクは,優先順位の高いものから順に実行される【NGKI0203】.
1985 すなわち,ディスパッチ保留状態でない限りは,実行できるタスクの中で最も
1986 高い優先順位を持つタスクが実行状態となり,他は実行可能状態となる.
1987
1988 タスクの優先順位は,タスクの優先度とタスクが実行できる状態になった順序
1989 から,次のように定まる.優先度の異なるタスクの間では,優先度の高いタス
1990 クが高い優先順位を持つ【NGKI0204】.優先度が同一のタスクの間では,先に
1991 実行できる状態になったタスクが高い優先順位を持つ【NGKI0205】.すなわち,
1992 同じ優先度を持つタスクは,FCFS(First Come First Served)方式でスケジュー
1993 リングされる.ただし,サービスコールの呼出しにより,同じ優先度を持つタ
1994 スク間の優先順位を変更することも可能である【NGKI0206】.
1995
1996 最も高い優先順位を持つタスクが変化した場合には,ディスパッチ保留状態で
1997 ない限りはただちにディスパッチが起こり,最も高い優先順位を持つタスクが
1998 実行状態となる【NGKI0207】.ディスパッチ保留状態においては,実行状態の
1999 タスクは切り換わらず,最も高い優先順位を持つタスクは実行可能状態にとど
2000 まる【NGKI0208】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
41
2001
2002 マルチプロセッサ対応カーネルでは,プロセッサ毎に,上記のスケジューリン
2003 グ規則を適用して,タスクスケジューリングを行う【NGKI0209】.すなわち,
2004 プロセッサがディスパッチ保留状態でない限りは,そのプロセッサに割り付け
2005 られた実行できるタスクの中で最も高い優先順位を持つタスクが実行状態とな
2006 り,他は実行可能状態となる.そのため,実行状態のタスクは,プロセッサ毎
2007 に存在する.
2008
2009 2.6.4 待ち行列と待ち解除の順序
2010
2011 タスクが待ち解除される順序の管理のために,待ち状態のタスクがつながれて
2012 いるキューを,待ち行列と呼ぶ.また,タスクが同期・通信オブジェクトの待
2013 ち行列につながれている場合に,そのオブジェクトを,タスクの待ちオブジェ
2014 クトと呼ぶ.
2015
2016 待ち行列にタスクをつなぐ順序には,FIFO順とタスクの優先度順がある.どち
2017 らの順序でつなぐかは,待ち行列毎に規定される【NGKI0210】.多くの待ち行
2018 列において,どちらの順序でつなぐかを,オブジェクト属性により指定できる
2019 【NGKI0211】.
2020
2021 FIFO順の待ち行列においては,新たに待ち状態に遷移したタスクは待ち行列の
2022 最後につながれる【NGKI0212】.それに対してタスクの優先度順の待ち行列に
2023 おいては,新たに待ち状態に遷移したタスクは,優先度の高い順に待ち行列に
2024 つながれる【NGKI0213】.同じ優先度のタスクが待ち行列につながれている場
2025 合には,新たに待ち状態に遷移したタスクが,同じ優先度のタスクの中で最後
2026 につながれる【NGKI0214】.
2027
2028 待ち解除の条件がタスクによって異なる場合には,待ち行列の先頭のタスクは
2029 待ち解除の条件を満たさないが,後方のタスクが待ち解除の条件を満たす場合
2030 がある.このような場合の振舞いとして,次の2つのケースがある.どちらの振
2031 舞いをするかは,待ち行列毎に規定される【NGKI0215】.
2032
2033 (a) 待ち解除の条件を満たしたタスクの中で,待ち行列の前方につながれたも
2034 のから順に待ち解除される【NGKI0216】.すなわち,待ち行列の前方に待ち解
2035 除の条件を満たさないタスクがあっても,後方のタスクが待ち解除の条件を満
2036 たしていれば,先に待ち解除される.
2037
2038 (b) タスクの待ち解除は,待ち行列につながれている順序で行われる
2039 【NGKI0217】.すなわち,待ち行列の前方に待ち解除の条件を満たさないタス
2040 クがあると,後方のタスクが待ち解除の条件を満たしても,待ち解除されない.
2041
2042 ここで,(b)の振舞いをする待ち行列においては,待ち行列につながれたタスク
2043 の強制終了,タスク優先度の変更(待ち行列がタスクの優先度順の場合のみ),
2044 待ち状態の強制解除が行われた場合に,タスクの待ち解除が起こることがある.
2045 具体的には,これらの操作により新たに待ち行列の先頭になったタスクが,待
2046 ち解除の条件を満たしていれば,ただちに待ち解除される【NGKI0218】.さら
2047 に,この待ち解除により新たに待ち行列の先頭になったタスクに対しても,同
2048 じ処理が繰り返される【NGKI0219】.
2049
2050 2.6.5 タスク例外処理マスク状態と待ち禁止状態
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
42
2051
2052 保護機能対応カーネルにおいて,ユーザタスクについては特権モードで実行し
2053 ている間(特権モードを実行している間に,実行可能状態や広義の待ち状態に
2054 なっている場合を含む.また,サービスコールを呼び出して,実行可能状態や
2055 広義の待ち状態になっている場合も含む.タスクの実行開始前は含まない),
2056 システムタスクについては拡張サービスコールを実行している間(拡張サービ
2057 スコールを実行している間に,実行可能状態や広義の待ち状態になっている場
2058 合を含む)は,タスク例外処理ルーチンの実行は開始されない【NGKI0220】.
2059 これらの状態を,タスク例外処理マスク状態と呼ぶ.
2060
2061 タスクは,タスク例外処理マスク状態である時に,基本的なタスク状態と重複
2062 して,待ち禁止状態になることができる【NGKI0221】.待ち禁止状態とは,タ
2063 スクが待ち状態に入ることが一時的に禁止された状態である.待ち禁止状態に
2064 あるタスクが,サービスコールを呼び出して待ち状態に遷移しようとした場合,
2065 サービスコールはE_RLWAIエラーとなる【NGKI0222】.
2066
2067 タスクを待ち禁止状態に遷移させるサービスコールは,対象タスクがタスク例
2068 外処理マスク状態である場合に,対象タスクを待ち禁止状態に遷移させる
2069 【NGKI0223】.その後,タスクがタスク例外処理マスク状態でなくなる時点
2070 (ユーザタスクについては特権モードから戻る時点,システムタスクについて
2071 拡張サービスコールからリターンする時点)で,待ち禁止状態が解除される
2072 【NGKI0224】.また,タスクの待ち禁止状態を解除するサービスコールによっ
2073 ても,待ち禁止状態を解除することができる【NGKI0225】.
2074
2075 【仕様決定の理由】
2076
2077 タスク例外処理ルーチンでは,タスクの本体のための例外処理(例えば,タス
2078 クに対して終了要求があった時の処理)を行うことを想定しており,タスクか
2079 ら呼び出した拡張サービスコールのための例外処理を行うことは想定していな
2080 い.そのため,拡張サービスコールを実行している間にタスク例外処理が要求
2081 された場合に,すぐにタスク例外処理ルーチンを実行すると,拡張サービスコー
2082 ルのための例外処理が行われないことになる.
2083
2084 また,ユーザタスクの場合には,特権モードを実行中にタスク例外処理ルーチ
2085 ンを実行すると,システムスタックに情報を残したまま非特権モードに戻るこ
2086 とになる.この状態で,タスク例外処理ルーチンから大域脱出すると,システ
2087 ムスタック上に不要な情報が残ってしまう.
2088
2089 これらの理由から,タスクが拡張サービスコールを実行している間は,タスク
2090 例外処理マスク状態とし,タスク例外処理ルーチンの実行を開始しないことと
2091 する.さらに,ユーザタスクについては,特権モードを実行している間(拡張
2092 サービスコールを実行している間を含む)を,タスク例外処理マスク状態とす
2093 る.
2094
2095 対象タスクに,タスク例外処理ルーチンをすみやかに実行させたい場合には,
2096 タスク例外処理の要求に加えて,待ち状態の強制解除を行う(必要に応じて,
2097 強制待ち状態からの再開も行う).保護機能対応でないカーネルにおいては,
2098 この方法により,対象タスクが正常に待ち解除されるのを待たずに,タスク例
2099 外処理ルーチンを実行させることができる.
2100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
43
2101 それに対して,保護機能対応カーネルにおいては,対象タスクがタスク例外処
2102 理マスク状態で実行している間は,タスク例外処理ルーチンの実行が開始され
2103 ない.そのため,対象タスクに対して待ち状態の強制解除を行っても,その後
2104 に対象タスクが待ち状態に入ると,タスク例外処理ルーチンがすみやかに実行
2105 されないことになる.
2106
2107 待ち禁止状態は,この問題を解決するために導入したものである.タスク例外
2108 処理の要求(ras_tex/iras_tex)に加えて,待ち禁止状態への遷移(dis_wai/
2109 idis_wai)と待ち状態の強制解除(rel_wai/irel_wai)をこの順序で行うこと
2110 で,対象タスクが正常に待ち解除されるのを待たずに,タスク例外処理ルーチ
2111 ンを実行させることができる.
2112
2113 タスク例外処理マスク状態を,ユーザタスクについても拡張サービスコールを
2114 実行している間とせず,特権モードで実行している間とした理由は,拡張サー
2115 ビスコールを実行している間とした場合に次のような問題があるためである.
2116
2117 ユーザタスクが,ソフトウェア割込みにより自タスクを待ち状態に遷移させる
2118 サービスコールを呼び出した直後に割込みが発生し,その割込みハンドラの中
2119 でiras_tex,idis_wai,irel_waiが呼び出されると,この時点では待ち解除も
2120 されず待ち禁止状態にもならないために,割込みハンドラからのリターン後に
2121 待ち状態に入ってしまう.ソフトウェア割込みによりすべての割込みが禁止さ
2122 れないターゲットプロセッサでは,ソフトウェア割込みの発生とサービスコー
2123 ルの実行を不可分にできないため,このような状況を防ぐことができない.
2124
2125 なお,拡張サービスコールは,待ち状態に入るサービスコールからE_RLWAIが返
2126 された場合には,実行中の処理を取りやめて,E_RLWAIを返値としてリターンす
2127 るように実装すべきである.
2128
2129 【μITRON4.0仕様,μITRON4.0/PX仕様との関係】
2130
2131 待ち禁止状態は,μITRON4.0仕様にはない概念であり,μITRON4.0/PX仕様で導
2132 入された.ただし,μITRON4.0/PX仕様では,タスクの待ち状態を強制解除する
2133 サービスコールが,タスクを待ち禁止状態へ遷移させる機能も持つこととして
2134 いる.その結果μITRON4.0/PX仕様は,待ち状態を強制解除するサービスコール
2135 の仕様において,μITRON4.0仕様との互換性がなくなっている.
2136
2137 この仕様では,待ち状態の強制解除と待ち禁止状態への遷移を別々のサービス
2138 コールで行うこととした.これにより,待ち状態を強制解除するサービスコー
2139 ルの仕様が,μITRON4.0仕様と互換になっている.一方,μITRON4.0/PX仕様と
2140 は互換性がない.
2141
2142 2.6.6 ディスパッチ保留状態で実行中のタスクに対する強制待ち
2143
2144 ディスパッチ保留状態において,実行状態のタスクを強制待ち状態へ遷移させ
2145 るサービスコールを呼び出した場合,実行状態のタスクの切換えは,ディスパッ
2146 チ保留状態が解除されるまで保留される【NGKI0226】.
2147
2148 この間,それまで実行状態であったタスクは,実行状態と強制待ち状態の間の
2149 過渡的な状態にあると考える【NGKI0227】.この状態を,強制待ち状態[実行
2150 継続中]と呼ぶ.一方,ディスパッチ保留状態が解除された後に実行すべきタ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
44
2151 スクは,実行可能状態にとどまる【NGKI0228】.
2152
2153 タスクが強制待ち状態[実行継続中]にある時に,ディスパッチ保留状態が解
2154 除されると,ただちにディスパッチが起こり,タスクは強制待ち状態に遷移す
2155 る【NGKI0229】.
2156
2157 過渡的な状態も含めたタスクの状態遷移を図2-3に示す【NGKI0230】.
2158
2159 タスクが強制待ち状態[実行継続中]である時の扱いは次の通りである.
2160
2161 (a) プロセッサを占有して実行を継続する.
2162
2163 強制待ち状態[実行継続中]のタスクは,プロセッサを占有して,そのまま継
2164 続して実行される【NGKI0231】.
2165
2166 (b) 実行状態のタスクに関する情報を参照するサービスコールでは,実行状態
2167 であるものと扱う.
2168
2169 実行状態のタスクに関する情報を参照するサービスコール(get_tid/
2170 iget_tid,get_did,sns_tex)では,強制待ち状態[実行継続中]のタスクが,
2171 それを実行するプロセッサにおいて実行状態のタスクであるものと扱う.具体
2172 的には,強制待ち状態[実行継続中]のタスクが実行されている時にget_tid/
2173 iget_tidを発行すると,そのタスクのID番号を参照する【NGKI0232】.また,
2174 get_didを発行するとそのタスクが属する保護ドメインのID番号を,sns_texを
2175 発行するとそのタスクのタスク例外処理禁止フラグを参照する【NGKI0233】.
2176
2177 (c) その他のサービスコールでは,強制待ち状態であるものと扱う.
2178
2179 その他のサービスコールでは,強制待ち状態[実行継続中]のタスクは,強制
2180 待ち状態であるものと扱う【NGKI0234】.
2181
2182 【TOPPERS/ASPカーネルにおける規定】
2183
2184 ASPカーネルでは,ディスパッチ保留状態において実行状態のタスクを強制待ち
2185 状態へ遷移させるサービスコールはサポートしていないため,タスクが強制待
2186 ち状態[実行継続中]になることはない【ASPS0008】.
2187
2188 【TOPPERS/FMPカーネルにおける規定】
2189
2190 FMPカーネルでは,ディスパッチ保留状態において実行状態のタスクを強制待ち
2191 状態へ遷移させるサービスコールを,他のプロセッサから呼び出すことができ
2192 るため,タスクが強制待ち状態[実行継続中]になる場合がある【FMPS0005】.
2193
2194 【TOPPERS/HRP2カーネルにおける規定】
2195
2196 HRP2カーネルでは,ディスパッチ保留状態において実行状態のタスクを強制待
2197 ち状態へ遷移させるサービスコールはサポートしていないため,タスクが強制
2198 待ち状態[実行継続中]になることはない【HRPS0004】.
2199
2200 【TOPPERS/SSPカーネルにおける規定】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
45
2201
2202 SSPカーネルでは,タスクが広義の待ち状態になることはないため,タスクが強
2203 制待ち状態[実行継続中]になることもない【SSPS0005】.
2204
2205 【補足説明】
2206
2207 この仕様では,ディスパッチ保留状態において,実行状態のタスクを強制終了
2208 させるサービスコールはサポートしていない.そのため,実行状態と休止状態
2209 の間の過渡的な状態は存在しない.
2210
2211 2.6.7 制約タスク
2212
2213 制約タスク(restricted task)は,複数のタスクでスタック領域を共有するこ
2214 とによるメモリ使用量の削減を目的に,通常のタスクに対して,広義の待ち状
2215 態を持たないなどの機能制限を加えたものである.具体的には,制約タスクに
2216 は以下の機能制限がある.
2217
2218 (a) 広義の待ち状態に入ることができない【NGKI0235】.
2219
2220 (b) サービスコールにより優先度を変更することができない【NGKI0236】.
2221
2222 (c) 対象優先度の中の先頭のタスクが制約タスクである場合には,タスクの優
2223 先順位の回転(rot_rdq/irot_rdq)を行うことができない【NGKI0237】.
2224
2225 (d) マルチプロセッサ対応カーネルでは,割付けプロセッサを変更することが
2226 できない【NGKI0238】.
2227
2228 制約タスクに対して,機能制限により使用できなくなったサービスコールを呼
2229 び出した場合には,E_NOSPTエラーとなる【NGKI0239】.E_NOSPTエラーが返る
2230 ことに依存している場合を除いては,制約タスクを通常のタスクに置き換える
2231 ことができる【NGKI0240】.
2232
2233 【未決定事項】
2234
2235 現状では,制約タスクの優先度を変更するサービスコールは設けていないが,
2236 制約タスクが,自タスクの優先度を,起動時優先度(SSPカーネルにおいては,
2237 実行時優先度)と同じかそれよりも高い値に変更することは許してもよい.た
2238 だし,優先度の変更後は,同じ優先度内で最高優先順位としなければならない
2239 ため,chg_priとは振舞いが異なることになる.自タスクの優先度を起動時優先
2240 度と同じかそれよりも高い値に変更するサービスコールを設けるかどうかは,
2241 今後の課題である.
2242
2243 【TOPPERS/ASPカーネルにおける規定】
2244
2245 ASPカーネルでは,制約タスクをサポートしていない【ASPS0009】.ただし,制
2246 約タスク拡張パッケージを用いると,制約タスクの機能を追加することができ
2247 る【ASPS0010】.
2248
2249 【TOPPERS/FMPカーネルにおける規定】
2250
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
46
2251 FMPカーネルでは,制約タスクをサポートしていない【FMPS0006】.
2252
2253 【TOPPERS/HRP2カーネルにおける規定】
2254
2255 HRP2カーネルでは,制約タスクをサポートしていない【HRPS0005】.
2256
2257 【TOPPERS/SSPカーネルにおける規定】
2258
2259 SSPカーネルでは,制約タスクのみをサポートする【SSPS0006】.そのため,す
2260 べてのタスクと非タスクコンテキストがスタック領域を共有することができ,
2261 すべての処理単位で同一のスタック領域を使用している【SSPS0007】.このス
2262 タック領域を,共有スタック領域と呼ぶ.
2263
2264 【μITRON4.0仕様との関係】
2265
2266 制約タスクは,μITRON4.0仕様の自動車制御プロファイルで導入された機能で
2267 ある.この仕様における制約タスクは,μITRON4.0仕様の制約タスクよりも機
2268 能制限が少なくなっている.
2269
2270 2.7 割込み処理モデル
2271
2272 TOPPERS新世代カーネルにおける割込み処理のモデルは,TOPPERS標準割込み処
2273 理モデルに準拠している.
2274
2275 TOPPERS標準割込み処理モデルの概念図を図2-4に示す【NGKI0241】.この図は,
2276 割込み処理モデルの持つすべての機能が,ハードウェア(プロセッサおよび割
2277 込みコントローラ)で実現されているとして描いた概念図である.実際のハー
2278 ドウェアで不足している機能については,カーネル内の割込み処理のソフトウェ
2279 アで実現される.
2280
2281 【μITRON4.0仕様との関係】
2282
2283 割込み処理モデルは,μITRON4.0仕様から大幅に拡張している.
2284
2285 2.7.1 割込み処理の流れ
2286
2287 周辺デバイス(以下,デバイスと呼ぶ)からの割込み要求は,割込みコントロー
2288 ラ(IRC)を経由して,プロセッサに伝えられる.デバイスから割込みコントロー
2289 ラに割込み要求を伝えるための信号線を,割込み要求ラインと呼ぶ.一般には,
2290 1つの割込み要求ラインに,複数のデバイスからの割込み要求が接続される.
2291
2292 プロセッサは,デバイスからの割込み要求を受け付ける条件が満たされた場合,
2293 割込み要求を受け付ける【NGKI0242】.受け付けた割込み要求が,カーネル管
2294 理の割込みである場合には,カーネル内の割込みハンドラの入口処理(割込み
2295 入口処理)を経由して,カーネル内の割込みハンドラを実行する【NGKI0243】.
2296
2297 カーネル内の割込みハンドラは,アプリケーションが割込み要求ラインに対し
2298 て登録した割込みサービスルーチン(ISR)を呼び出す【NGKI0244】.割込みサー
2299 ビスルーチンは,プロセッサの割込みアーキテクチャや割込みコントローラに
2300 依存せず,割込みを要求したデバイスのみに依存して記述するのが原則である
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
47
2301 【NGKI0245】.1つの割込み要求ラインに対して複数のデバイスが接続されるこ
2302 とから,1つの割込み要求ラインに対して複数の割込みサービスルーチンを登録
2303 することができる【NGKI0246】.
2304
2305 ただし,カーネルが標準的に用意している割込みハンドラで対応できない特殊
2306 なケースも考えられる.このような場合に対応するために,アプリケーション
2307 が用意した割込みハンドラをカーネルに登録することもできる【NGKI0247】.
2308
2309 カーネルが用いるタイマデバイスからの割込み要求の場合,カーネル内の割込
2310 みハンドラにより,タイムイベントの処理が行われる.具体的には,タイムア
2311 ウト処理等が行われることに加えて,アプリケーションが登録したタイムイベ
2312 ントハンドラが呼び出される【NGKI0248】.
2313
2314 なお,受け付けた割込み要求に対して,割込みサービスルーチンも割込みハン
2315 ドラも登録していない場合の振舞いは,ターゲット定義である【NGKI0249】.
2316
2317 2.7.2 割込み優先度
2318
2319 割込み要求は,割込み処理の優先順位を指定するための割込み優先度を持つ
2320 【NGKI0250】.プロセッサは,割込み優先度マスクの現在値よりも高い割込み
2321 優先度を持つ割込み要求のみを受け付ける【NGKI0251】.逆に言うと,割込み
2322 優先度マスクの現在値と同じか,それより低い割込み優先度を持つ割込みは,
2323 マスクされる.
2324
2325 プロセッサは,割込み要求を受け付けると,割込み優先度マスクを,受け付け
2326 た割込み要求の割込み優先度に設定する(ただし,受け付けた割込みがNMIであ
2327 る場合には例外とする)【NGKI0252】.また,割込み処理からのリターンによ
2328 り,割込み優先度マスクを,割込み要求を受け付ける前の値に戻す
2329 【NGKI0253】.
2330
2331 これらのことから,他の方法で割込みをマスクしていない限り,ある割込み要
2332 求の処理中は,それと同じかそれより低い割込み優先度を持つ割込み要求は受
2333 け付けられず,それより高い割込み優先度を持つ割込み要求は受け付けられる
2334 ことになる.つまり,割込み優先度は,多重割込みを制御するためのものと位
2335 置付けることができる.それに対して,同時に発生している割込み要求の中で,
2336 割込み優先度の高い割込み要求が先に受け付けられるとは限らない
2337 【NGKI0254】.
2338
2339 割込み優先度は,PRI型で表現し,値が小さいほど優先度が高いものとするが,
2340 [NGKI0037]の原則には従わず,-1から連続した負の値を用いる【NGKI0255】.
2341
2342 割込み優先度の段階数は,ターゲット定義である【NGKI0256】.プロセッサが
2343 割込み優先度マスクを実現するための機能を持たないか,実現するために大き
2344 いオーバヘッドを生じる場合には,ターゲット定義で,割込み優先度の段階数
2345 を1にする(すなわち,多重割込みを許さない)場合がある.
2346
2347 【仕様決定の理由】
2348
2349 割込み優先度に-1から連続した負の値を用いるのは,割込み優先度とタスク優
2350 先度を比較できるようになることと,いずれの割込みもマスクしない割込み優
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
48
2351 先度マスクの値を0にできるためである.
2352
2353 2.7.3 割込み要求ラインの属性
2354
2355 各割込み要求ラインは,以下の属性を持つ.なお,1つの割込み要求ラインに複
2356 数のデバイスからの割込み要求が接続されている場合,それらの割込み要求は
2357 同一の属性を持つ【NGKI0257】.それらの割込み要求に別々の属性を設定する
2358 ことはできない.
2359
2360 (1) 割込み要求禁止フラグ
2361
2362 割込み要求ライン毎に,割込みをマスクするための割込み要求禁止フラグを持
2363 つ【NGKI0258】.割込み要求禁止フラグをセットすると,その割込み要求ライ
2364 ンによって伝えられる割込み要求はマスクされる【NGKI0259】.
2365
2366 プロセッサが割込み要求禁止フラグを実現するための機能を持たないか,実現
2367 するために大きいオーバヘッドを生じる場合には,ターゲット定義で,割込み
2368 要求禁止フラグをサポートしない場合がある【NGKI0260】.また,プロセッサ
2369 の持つ割込み要求禁止フラグの機能がこの仕様に合致しない場合には,ターゲッ
2370 ト定義で,割込み要求禁止フラグをサポートしないか,振舞いが異なるものと
2371 する場合がある【NGKI0261】.
2372
2373 (2) 割込み優先度
2374
2375 割込み要求ライン毎に,割込み優先度を設定することができる【NGKI0262】.
2376 割込み要求の割込み優先度とは,その割込み要求を伝える割込み要求ラインに
2377 対して設定された割込み優先度のことである【NGKI0263】.
2378
2379 (3) トリガモード
2380
2381 割込み要求ラインに対する割込み要求が,レベルトリガであるかエッジトリガ
2382 であるかを設定することができる【NGKI0264】.エッジトリガの場合には,さ
2383 らに,ターゲット定義で,ポジティブエッジトリガかネガティブエッジトリガ
2384 か両エッジトリガかを設定できる場合もある【NGKI0265】.また,レベルトリ
2385 ガの場合には,ターゲット定義で,ローレベルトリガかハイレベルトリガかを
2386 設定できる場合もある【NGKI0266】.
2387
2388 プロセッサがトリガモードを設定するための機能を持たないか,設定するため
2389 に大きいオーバヘッドを生じる場合には,ターゲット定義で,トリガモードの
2390 設定をサポートしない場合がある【NGKI0267】.
2391
2392 属性が設定されていない割込み要求ラインに対しては,割込み要求禁止フラグ
2393 がセットされ,割込み要求はマスクされる【NGKI0268】.また,割込み要求禁
2394 止フラグをクリアすることもできない【NGKI0269】.
2395
2396 【使用上の注意】
2397
2398 アプリケーションが,割込み要求禁止フラグを動的にセット/クリアする機能
2399 を用いると,次の理由でソフトウェアの再利用性が下がる可能性があるため,
2400 注意が必要である.プロセッサによっては,この割込み処理モデルに合致した
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
49
2401 割込み要求禁止フラグの機能を実現できない場合がある.また,割込み要求禁
2402 止フラグをセットすることで,複数のデバイスからの割込みがマスクされる場
2403 合がある.ソフトウェアの再利用性を上げるためには,あるデバイスからの割
2404 込みのみをマスクしたい場合には,そのデバイス自身の機能を使ってマスクを
2405 実現すべきである.
2406
2407 複数のデバイスからの割込み要求が接続されている割込み要求ラインを,エッ
2408 ジトリガに設定することは推奨されない.これは,次のような状況において,
2409 割込み要求を取りこぼす可能性があるためである.ある割込み要求ラインに,
2410 デバイスAとデバイスBからの割込み要求が接続されており,デバイスAの割込み
2411 処理を先に行う場合を考える.この時,デバイスB からの割込み要求によって
2412 割込みハンドラが実行され,デバイスAの割込み処理を行った後,デバイスBの
2413 割込み処理を行う前に,デバイスAからの割込み要求が発生した場合に,デバイ
2414 スAからの割込み要求を取りこぼしてしまう.
2415
2416 2.7.4 割込みを受け付ける条件
2417
2418 NMI以外の割込み要求は,次の4つの条件が揃った場合に受け付けられる
2419 【NGKI0270】.
2420
2421 (a) 割込み要求ラインに対する割込み要求禁止フラグがクリアされていること
2422
2423 (b) 割込み要求ラインに設定された割込み優先度が,割込み優先度マスクの現
2424 在値よりも高い(優先度の値としては小さい)こと
2425
2426 (c) 全割込みロックフラグがクリアされていること
2427
2428 (d) 割込み要求がカーネル管理の割込みである場合には,CPUロックフラグがク
2429 リアされていること
2430
2431 これらの条件が揃った割込み要求が複数ある場合に,どの割込み要求が最初に
2432 受け付けられるかは,この仕様では規定しない【NGKI0271】.すなわち,割込
2433 み優先度の高い割込み要求が先に受け付けられるとは限らない.
2434
2435 2.7.5 割込み番号と割込みハンドラ番号
2436
2437 割込み要求ラインを識別するための番号を,割込み番号と呼ぶ.割込み番号は,
2438 符号無しの整数型であるINTNO型で表し,ターゲットハードウェアの仕様から決
2439 まる自然な番号付けを基本として,ターゲット定義で付与される【NGKI0272】.
2440 そのため,1から連続した正の値であるとは限らない.
2441
2442 それに対して,アプリケーションが用意した割込みハンドラをカーネルに登録
2443 する場合に,割込みハンドラの登録対象となる割込みを識別するための番号を,
2444 割込みハンドラ番号と呼ぶ.割込みハンドラ番号は,符号無しの整数型である
2445 INHNO型で表し,ターゲットハードウェアの仕様から決まる自然な番号付けを基
2446 本として,ターゲット定義で付与される【NGKI0273】.そのため,1から連続し
2447 た正の値であるとは限らない.
2448
2449 割込みハンドラ番号は,割込み番号と1対1に対応するのが基本である(両者が
2450 一致する場合が多い)【NGKI0274】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
50
2451
2452 ただし,割込みを要求したデバイスが割込みベクタを生成してプロセッサに渡
2453 すアーキテクチャなどでは,割込み番号と割込みハンドラ番号の対応を,カー
2454 ネルが管理していない場合がある【NGKI0275】.そこで,ターゲット定義で,
2455 割込み番号に対応しない割込みハンドラ番号や,割込みハンドラ番号に対応し
2456 ない割込み番号を設ける場合もある【NGKI0276】.ただし,割込みサービスルー
2457 チンの登録対象にできる割込み番号は,割込みハンドラ番号との1対1の対応関
2458 係をカーネルが管理しているもののみである【NGKI0277】.
2459
2460 2.7.6 マルチプロセッサにおける割込み処理
2461
2462 この節では,マルチプロセッサにおける割込み処理について説明する.この節
2463 の内容は,マルチプロセッサ対応カーネルにのみ適用される.
2464
2465 マルチプロセッサ対応カーネルでは,TOPPERS標準割込み処理モデルの構成要素
2466 の中で,図2-4の破線に囲まれた部分はプロセッサ毎に持ち,それ以外の部分は
2467 システム全体で1つのみ持つ【NGKI0278】.すなわち,全割込みロックフラグ,
2468 CPUロックフラグ,割込み優先度マスクはプロセッサ毎に持つのに対して,割込
2469 み要求ラインおよびその属性(割込み要求禁止フラグ,割込み優先度,トリガ
2470 モード)はシステム全体で共通に持つ.
2471
2472 割込み番号は,割込み要求ラインを識別するための番号であることから,割込
2473 み要求ラインが複数のプロセッサに接続されている場合でも,1つの割込み要求
2474 ラインには1つの割込み番号を付与する【NGKI0279】.逆に,複数のプロセッサ
2475 が同じ種類のデバイスを持っている場合でも,別のデバイスからの割込み要求
2476 ラインには異なる割込み番号を付与する(図2-5)【NGKI0280】.図2-5におい
2477 て,ローカルIRCは個々のプロセッサに対する割込みを制御するための回路であ
2478 り,グローバルIRCはデバイスからの割込みをプロセッサに分配するための回路
2479 である.グローバルIRCは,必ず備わっているとは限らない.
2480
2481 割込み要求禁止フラグは,この仕様上はシステム全体で共通に持つこととして
2482 いるが,実際のターゲットハードウェア(特に,グローバルIRCを備えていない
2483 もの)では,プロセッサ毎に持っている場合がある.そのため,ターゲット定
2484 義で,あるプロセッサで割込み要求禁止フラグを動的にセット/クリアしても,
2485 他のプロセッサに対しては割込みがマスク/マスク解除されない場合があるも
2486 のとする【NGKI0281】.
2487
2488 複数のプロセッサに接続された割込み要求ラインに対して登録された割込みサー
2489 ビスルーチンは,それらのプロセッサのいずれによっても実行することができ
2490 る【NGKI0282】.ただし,その内のどのプロセッサで割込みサービスルーチン
2491 を実行するかは,割込みサービスルーチンが属するクラスの割付け可能プロセッ
2492 サにより決定される(「2.4.4 処理単位を実行するプロセッサ」の節を参照).
2493
2494 割込みサービスルーチンが属するクラスの割付け可能プロセッサは,登録対象
2495 の割込み要求ラインが接続されたプロセッサの集合に含まれていなければなら
2496 ない【NGKI0283】.また,同一の割込み要求ラインに対して登録する割込みサー
2497 ビスルーチンは,同一のクラスに属していなければならない【NGKI0284】.
2498
2499 それに対して,割込みハンドラはプロセッサ毎に登録する.そのため,同じ割
2500 込み要求に対応する割込みハンドラであっても,プロセッサ毎に異なる割込み
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
51
2501 ハンドラ番号を付与する(図2-5)【NGKI0285】.割込みハンドラが属するクラ
2502 スの初期割付けプロセッサは,割込みが要求されるプロセッサと一致していな
2503 ければならない【NGKI0286】.
2504
2505 【補足説明】
2506
2507 マルチプロセッサ対応カーネルにおける割込み番号の付与方法は,複数のプロ
2508 セッサに接続された割込み要求ラインに対しては,割込み番号の上位ビットを
2509 0とし,1つのプロセッサのみに接続された割込み要求ラインに対しては,割込
2510 み番号の上位ビットに,接続されたプロセッサのID番号を含める方法を基本と
2511 する.また,割込みハンドラ番号の付与方法は,割込みハンドラ番号の上位ビッ
2512 トに,その割込みハンドラを実行するプロセッサのID番号を含める方法を基本
2513 とする(図2-5).
2514
2515 1つのプロセッサのみに接続された割込み要求ラインに対して登録された割込み
2516 サービスルーチンは,そのプロセッサのみを割付け可能プロセッサとするクラ
2517 スに属していなければならない.
2518
2519 【使用上の注意】
2520
2521 複数のプロセッサで実行することができる割込みサービスルーチンは,それら
2522 のプロセッサのいずれかで実行されるものと設定した場合でも,複数回の割込
2523 み要求により,異なるプロセッサで同時に実行される可能性がある.
2524
2525 2.7.7 カーネル管理外の割込み
2526
2527 高い割込み応答性を求められるアプリケーションでは,カーネル内で割込みを
2528 マスクすることにより,割込み応答性の要求を満たせなくなる場合がある.こ
2529 のような要求に対応するために,カーネル内では,ある割込み優先度(これを,
2530 TMIN_INTPRIと書く)よりも高い割込み優先度を持つ割込みをマスクしないこと
2531 としている【NGKI0287】.TMIN_INTPRIを固定するか設定できるようにするか,
2532 設定できるようにする場合の設定方法は,ターゲット定義である【NGKI0288】.
2533
2534 TMIN_INTPRIよりも高い割込み優先度を持ち,カーネル内でマスクしない割込み
2535 を,カーネル管理外の割込みと呼ぶ.また,カーネル管理外の割込みによって
2536 起動される割込みハンドラを,カーネル管理外の割込みハンドラと呼ぶ.NMIは,
2537 カーネル管理外の割込みとして扱う.NMI以外にカーネル管理外の割込みを設け
2538 るか(設けられるようにするか)どうかは,ターゲット定義である【NGKI0289】.
2539
2540 それに対して,TMIN_INTPRIと同じかそれよりも低い割込み優先度を持つ割込み
2541 をカーネル管理の割込み,カーネル管理の割込みによって起動される割込みハ
2542 ンドラをカーネル管理の割込みハンドラと呼ぶ.
2543
2544 カーネル管理外の割込みハンドラは,カーネル内の割込み入口処理を経由せず
2545 に実行するのが基本である【NGKI0290】.ただし,すべての割込みで同じ番地
2546 に分岐するプロセッサでは,カーネル内の割込み入口処理を全く経由せずにカー
2547 ネル管理外の割込みハンドラを実行することができず,入口処理の一部分を経
2548 由してカーネル管理外の割込みハンドラが実行されることになる【NGKI0291】.
2549
2550 カーネル管理外の割込みハンドラが実行開始される時のシステム状態とコンテ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
52
2551 キスト,割込みハンドラの終了時に行われる処理,割込みハンドラの記述方法
2552 は,ターゲット定義である【NGKI0292】.カーネル管理外の割込みハンドラか
2553 らは,システムインタフェースレイヤのAPIとsns_ker,ext_kerのみを呼び出す
2554 ことができ,その他のサービスコールを呼び出すことはできない【NGKI0293】.
2555 カーネル管理外の割込みハンドラから,その他のサービスコールを呼び出した
2556 場合の動作は,保証されない【NGKI0294】.
2557
2558 2.7.8 カーネル管理外の割込みの設定方法
2559
2560 カーネル管理外の割込みの設定方法は,ターゲット定義で,次の3つの方法のい
2561 ずれかが採用される【NGKI0295】.
2562
2563 (a-1) NMI以外にカーネル管理外の割込みを設けない
2564 (a-2) カーネル構築時に特定の割込みをカーネル管理外にすると決める
2565
2566 これら場合には,カーネル管理外とする割込みはカーネル構築時(ターゲット
2567 依存部の実装時やカーネルのコンパイル時)に決まるため,カーネル管理外と
2568 する割込みをアプリケーション側で設定する必要はない【NGKI0296】.ここで,
2569 カーネル管理外とされた割込みに対して,カーネルのAPIにより割込みハンドラ
2570 を登録できるかと,割込み要求ラインの属性を設定できるかは,ターゲット定
2571 義である【NGKI0297】.割込みハンドラを登録できる場合には,それを定義す
2572 るAPIにおいて,カーネル管理外であることを示す割込みハンドラ属性
2573 (TA_NONKERNEL)を指定する【NGKI0298】.また,割込み要求ラインの属性を
2574 設定できる場合には,設定する割込み優先度をTMIN_INTPRIよりも高い値とする
2575 【NGKI0299】.
2576
2577 (b) カーネル管理外とする割込みをアプリケーションで設定できるようにする
2578
2579 この場合には,カーネル管理外とする割込みの設定は,次の方法で行う.まず,
2580 カーネル管理外とする割込みハンドラを定義するAPIにおいて,カーネル管理外
2581 であることを示す割込みハンドラ属性(TA_NONKERNEL)を指定する
2582 【NGKI0300】.また,カーネル管理外とする割込みの割込み要求ラインに対し
2583 て設定する割込み優先度を,TMIN_INTPRIよりも高い値とする【NGKI0301】.
2584
2585 いずれの場合にも,カーネル管理の割込みの割込み要求ラインに対して設定す
2586 る割込み優先度は,TMIN_INTPRIより高い値であってはならない【NGKI0302】.
2587 また,カーネル管理外の割込みに対して,割込みサービスルーチンを登録する
2588 ことはできない【NGKI0303】.
2589
2590 2.8 CPU例外処理モデル
2591
2592 プロセッサが検出するCPU例外の種類や,CPU例外検出時のプロセッサの振舞い
2593 は,プロセッサによって大きく異なる.そのため,CPU例外ハンドラをターゲッ
2594 トハードウェアに依存せずに記述することは,少なくとも現時点では困難であ
2595 る.そこでこの仕様では,CPU例外の処理モデルを厳密に標準化するのではなく,
2596 ターゲットハードウェアに依存せずに決められる範囲で規定する.
2597
2598 2.8.1 CPU例外処理の流れ
2599
2600 アプリケーションは,プロセッサが検出するCPU例外の種類毎に,CPU例外ハン
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
53
2601 ドラを登録することができる【NGKI0304】.プロセッサがCPU例外の発生を検出
2602 すると,カーネル内のCPU例外ハンドラの入口処理(CPU例外入口処理)を経由
2603 して,発生したCPU例外に対して登録したCPU例外ハンドラが呼び出される
2604 【NGKI0305】.
2605
2606 CPU例外ハンドラの登録対象となるCPU例外を識別するための番号を,CPU例外ハ
2607 ンドラ番号と呼ぶ.CPU例外ハンドラ番号は,符号無しの整数型であるEXCNO型
2608 で表し,ターゲットハードウェアの仕様から決まる自然な番号付けを基本とし
2609 て,ターゲット定義で付与される【NGKI0306】.そのため,1から連続した正の
2610 値であるとは限らない.
2611
2612 マルチプロセッサ対応カーネルでは,異なるプロセッサで発生するCPU例外は,
2613 異なるCPU例外であると扱う【NGKI0307】.すなわち,同じ種類のCPU例外であっ
2614 ても,異なるプロセッサのCPU例外には異なるCPU例外ハンドラ番号を付与し,
2615 プロセッサ毎にCPU例外ハンドラを登録する.CPU例外ハンドラが属するクラス
2616 の初期割付けプロセッサは,CPU例外が発生するプロセッサと一致していなけれ
2617 ばならない【NGKI0308】.
2618
2619 CPU例外ハンドラにおいては,CPU例外が発生した状態からのリカバリ処理を行
2620 う【NGKI0309】.どのようなリカバリ処理を行うかは,一般にはCPU例外の種類
2621 やそれが発生したコンテキストおよび状態に依存するが,大きく次の4つの方法
2622 が考えられる【NGKI0310】.
2623
2624 (a) カーネルに依存しない形でCPU例外の原因を取り除き,実行を継続する.
2625
2626 (b) CPU例外を起こしたタスクよりも優先度の高いタスクを起動または待ち解除
2627 し,そのタスクでリカバリ処理を行う(例えば,CPU例外を起こしたタスクを強
2628 制終了し,再度起動する).ただし,CPU例外を起こしたタスクが最高優先度の
2629 場合には,この方法でリカバリ処理を行うことはできない(リカバリ処理を行
2630 うタスクを最高優先度とし,タスクの起動または待ち解除後に優先順位を回転
2631 させることで,リカバリ処理を行える可能性があるが,CPU例外を起こしたタス
2632 クが制約タスクの場合には適用できないなど,推奨できる方法ではない)
2633 【NGKI0311】.
2634
2635 (c) CPU例外を起こしたタスクにタスク例外処理を要求し,タスク例外処理ルー
2636 チンでリカバリ処理を行う(例えば,CPU例外を起こしたタスクを終了する).
2637
2638 (d) システム全体に対してリカバリ処理を行う(例えば,システムを再起動す
2639 る).
2640
2641 この中で(a)と(d)の方法は,カーネルの機能を必要としないため,CPU例外が発
2642 生したコンテキストおよび状態に依存せずに常に行える【NGKI0312】.それに
2643 対して(b)と(c)の方法は,CPU例外ハンドラからそのためのサービスコールを呼
2644 び出せることが必要であり,それが行えるかどうかは,CPU例外が発生したコン
2645 テキストおよび状態に依存する【NGKI0313】.
2646
2647 なお,発生したCPU例外に対して,CPU例外ハンドラを登録していない場合の振
2648 舞いは,ターゲット定義である【NGKI0314】.
2649
2650 【使用上の注意】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
54
2651
2652 CPU例外入口処理でCPU例外が発生し,それを処理するためのCPU例外ハンドラの
2653 入口処理で同じ原因でCPU例外が発生すると,CPU例外が繰り返し発生し,アプ
2654 リケーションが登録したCPU例外ハンドラまで処理が到達しない状況が考えられ
2655 る.このような状況が発生するかどうかはターゲットによるが,これが許容で
2656 きない場合には,CPU例外入口処理を経由せずに,アプリケーションが用意した
2657 CPU例外ハンドラを直接実行するようにしなければならない.
2658
2659 【補足説明】
2660
2661 マルチプロセッサ対応カーネルにおけるCPU例外ハンドラ番号の付与方法は,
2662 CPU例外ハンドラ番号の上位ビットに,そのCPU例外が発生するプロセッサのID
2663 番号を含める方法を基本とする.
2664
2665 【μITRON4.0仕様との関係】
2666
2667 μITRON4.0仕様では,CPU例外からのリカバリ処理の方法については,記述され
2668 ていない.
2669
2670 2.8.2 CPU例外ハンドラから呼び出せるサービスコール
2671
2672 CPU例外ハンドラからは,CPU例外発生時のディスパッチ保留状態を参照するサー
2673 ビスコール(xsns_dpn)と,CPU例外発生時にタスク例外処理ルーチンを実行開
2674 始できない状態であったかを参照するサービスコール(xsns_xpn)を呼び出す
2675 ことができる【NGKI0315】.
2676
2677 xsns_dpnは,CPU例外がタスクコンテキストで発生し,そのタスクがディスパッ
2678 チできる状態であった場合にfalseを返す【NGKI0316】.xsns_dpnがfalseを返
2679 した場合,そのCPU例外ハンドラから,非タスクコンテキストから呼び出せるす
2680 べてのサービスコールを呼び出すことができ,(b)の方法によるリカバリ処理が
2681 可能である【NGKI0317】.ただし,CPU例外を起こしたタスクが最高優先度の場
2682 合には,この方法でリカバリ処理を行うことはできない【NGKI0318】.
2683
2684 xsns_xpnは,CPU例外がタスクコンテキストで発生し,そのタスクがタスク例外
2685 処理ルーチンを実行できる状態であった場合にfalseを返す【NGKI0319】.
2686 xsns_xpnがfalse を返した場合,そのCPU例外ハンドラから,非タスクコンテキ
2687 ストから呼び出せるすべてのサービスコールを呼び出すことができ,(c)の方法
2688 によるリカバリ処理が可能である【NGKI0320】.
2689
2690 xsns_dpnとxsns_xpnのいずれのサービスコールもtrueを返した場合,そのCPU例
2691 外ハンドラからは,xsns_dpnとxsns_xpnに加えて,システムインタフェースレ
2692 イヤのAPIとsns_ker,ext_kerのみを呼び出すことができ,その他のサービスコー
2693 ルを呼び出すことはできない【NGKI0321】.いずれのサービスコールもtrueを
2694 返したにもかかわらず,その他のサービスコールを呼び出した場合の動作は,
2695 保証されない【NGKI0322】.この場合には,(b)と(c)の方法によるリカバリ処
2696 理は行うことはできず,(a)または(d)の方法によるリカバリ処理を行うしかな
2697 いことになる.
2698
2699 【μITRON4.0仕様との関係】
2700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
55
2701 CPU例外ハンドラで行える操作に関しては,μITRON4.0仕様を見直し,全面的に
2702 修正した.
2703
2704 2.8.3 エミュレートされたCPU例外ハンドラ
2705
2706 エラーコードによってアプリケーションに通知できないエラーをカーネルが検
2707 出した場合に,アプリケーションが登録したエラー処理を,カーネルが呼び出
2708 す場合がある【NGKI0323】.この場合に,カーネルが検出するエラーをCPU例外
2709 と同等に扱うものとし,エミュレートされたCPU例外と呼ぶ【NGKI0324】.また,
2710 エラー処理のためのプログラムをCPU例外ハンドラと同等に扱うものとし,エミュ
2711 レートされたCPU例外ハンドラと呼ぶ【NGKI0325】.
2712
2713 具体的には,エミュレートされたCPU例外ハンドラに対してもCPU例外ハンドラ
2714 番号が付与され,CPU例外ハンドラと同じ方法で登録できる【NGKI0326】.また,
2715 エミュレートされたCPU例外ハンドラからも,CPU例外ハンドラから呼び出せる
2716 サービスコールを呼び出すことができ,CPU例外ハンドラと同様のリカバリ処理
2717 を行うことができる【NGKI0327】.
2718
2719 【μITRON4.0仕様との関係】
2720
2721 エミュレートされたCPU例外およびCPU例外ハンドラは,μITRON4.0仕様に定義
2722 されていない概念である.
2723
2724 2.8.4 カーネル管理外のCPU例外
2725
2726 カーネル非動作状態,カーネル内のクリティカルセクションの実行中(これを,
2727 カーネル実行中と呼ぶ),全割込みロック状態,CPUロック状態,カーネル管理
2728 外の割込みハンドラ実行中のいずれかで発生したCPU例外を,カーネル管理外の
2729 CPU例外と呼ぶ.また,それによって起動されるCPU例外ハンドラを,カーネル
2730 管理外のCPU例外ハンドラと呼ぶ.さらに,カーネル管理外のCPU例外ハンドラ
2731 実行中に発生したCPU例外も,カーネル管理外のCPU例外とする.
2732
2733 それに対して,カーネル管理外のCPU例外以外のCPU例外をカーネル管理のCPU例
2734 外,カーネル管理のCPU例外によって起動されるCPU例外ハンドラをカーネル管
2735 理のCPU例外ハンドラと呼ぶ.
2736
2737 カーネル管理外のCPU例外ハンドラからは,システムインタフェースレイヤの
2738 APIとsns_ker,ext_ker,xsns_dpn,xsns_xpnのみを呼び出すことができ,その
2739 他のサービスコールを呼び出すことはできない【NGKI0328】.カーネル管理外
2740 のCPU例外ハンドラから,その他のサービスコールを呼び出した場合の動作は,
2741 保証されない【NGKI0329】.
2742
2743 カーネル管理外のCPU例外ハンドラにおいては,xsns_dpnとxsns_xpnのいずれの
2744 サービスコールもtrueを返す【NGKI0330】.そのため,カーネル管理外のCPU例
2745 外からは,(a)または(d)の方法によるリカバリ処理しか行えない.
2746
2747 【補足説明】
2748
2749 カーネル管理外のCPU例外は,カーネル管理外の割込みと異なり,特定のCPU例
2750 外をカーネル外とするわけではない.同じCPU例外であっても,CPU例外が起こ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
56
2751 る状況によって,カーネル管理となる場合とカーネル管理外となる場合がある.
2752
2753 2.9 システムの初期化と終了
2754
2755 2.9.1 システム初期化手順
2756
2757 システムのリセット後,最初に実行するプログラムを,スタートアップモジュー
2758 ルと呼ぶ.スタートアップモジュールはカーネルの管理外であり,アプリケー
2759 ションで用意するのが基本であるが,スタートアップモジュールで行うべき処
2760 理を明確にするために,カーネルの配布パッケージの中に,標準のスタートアッ
2761 プモジュールが用意されている【NGKI0331】.
2762
2763 標準のスタートアップモジュールは,プロセッサのモードとスタックポインタ
2764 等の初期化,NMIを除くすべての割込みのマスク(全割込みロック状態と同等の
2765 状態にする),ターゲットシステム依存の初期化フックの呼出し,非初期化デー
2766 タセクション(bssセクション)のクリア,初期化データセクション(dataセク
2767 ション)の初期化,ソフトウェア環境(ライブラリなど)依存の初期化フック
2768 の呼出しを行った後,カーネルの初期化処理へ分岐する【NGKI0332】.ここで
2769 呼び出すターゲットシステム依存の初期化フックでは,リセット後に速やかに
2770 行うべき初期化処理を行うことが想定されている.
2771
2772 マルチプロセッサ対応カーネルでは,すべてのプロセッサがスタートアップモ
2773 ジュールを実行し,カーネルの初期化処理へ分岐する【NGKI0333】.ただし,
2774 共有リソースの初期化処理(非初期化データセクションのクリア,初期化デー
2775 タセクションの初期化,ソフトウェア環境依存の初期化フックの呼出しなど)
2776 は,マスタプロセッサのみで実行する【NGKI0334】.各プロセッサがカーネル
2777 の初期化処理へ分岐するのは,共有リソースの初期化処理が完了した後でなけ
2778 ればならないため,スレーブプロセッサは,カーネルの初期化処理へ分岐する
2779 前に,マスタプロセッサによる共有リソースの初期化処理の完了を待ち合わせ
2780 る必要がある【NGKI0335】.
2781
2782 カーネルの初期化処理においては,まず,カーネル自身の初期化処理(カーネ
2783 ル内のデータ構造の初期化,カーネルが用いるデバイスの初期化など)と静的
2784 APIの処理(オブジェクトの登録など)が行われる【NGKI0336】.静的APIのパ
2785 ラメータに関するエラーは,コンフィギュレータによって検出されるのが原則
2786 であるが,コンフィギュレータで検出できないエラーが,この処理中に検出さ
2787 れる場合もある【NGKI0337】.
2788
2789 静的APIの処理順序によりシステムの規定された振舞いが変化する場合には,シ
2790 ステムコンフィギュレーションファイルにおける静的APIの記述順と同じ順序で
2791 静的APIが処理された場合と,同じ振舞いとなる【NGKI0338】.例えば,静的
2792 APIによって同じ優先度のタスクを複数生成・起動した場合,静的APIの記述順
2793 が先のタスクが高い優先順位を持つ.それに対して,周期ハンドラの動作開始
2794 順序は,同じタイムティックで行うべき処理が複数ある場合の処理順序が規定
2795 されないことから(「4.6.1 システム時刻管理」の節を参照),静的APIの記述
2796 順となるとは限らない.
2797
2798 次に,静的API(ATT_INI)により登録した初期化ルーチンが,システムコンフィ
2799 ギュレーションファイルにおける静的APIの記述順と同じ順序で実行される
2800 【NGKI0339】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
57
2801
2802 マルチプロセッサ対応カーネルでは,すべてのプロセッサがカーネル自身の初
2803 期化処理と静的APIの処理を完了した後に,マスタプロセッサがグローバル初期
2804 化ルーチンを実行する【NGKI0340】.グローバル初期化ルーチンの実行が完了
2805 した後に,各プロセッサは,自プロセッサに割り付けられたローカル初期化ルー
2806 チンを実行する【NGKI0341】.すなわち,ローカル初期化ルーチンは,初期割
2807 付けプロセッサにより実行される.
2808
2809 以上が終了すると,カーネル非動作状態から動作状態に遷移し(「2.5.1 カー
2810 ネル動作状態と非動作状態」の節を参照),カーネルの動作が開始される
2811 【NGKI0342】.具体的には,システム状態が,全割込みロック解除状態・CPUロッ
2812 ク解除状態・割込み優先度マスク全解除状態・ディスパッチ許可状態に設定さ
2813 れ(すなわち,割込みがマスク解除され),タスクの実行が開始される.
2814
2815 マルチプロセッサ対応カーネルでは,すべてのプロセッサがローカル初期化ルー
2816 チンの実行を完了した後に,カーネル非動作状態から動作状態に遷移し,カー
2817 ネルの動作が開始される【NGKI0343】.マルチプロセッサ対応カーネルにおけ
2818 るシステム初期化の流れと,各プロセッサが同期を取るタイミングを,図2-6に
2819 示す【NGKI0344】.
2820
2821 【μITRON4.0仕様との関係】
2822
2823 μITRON4.0仕様においては,初期化ルーチンの実行は静的APIの処理に含まれる
2824 ものとしていたが,この仕様では,初期化ルーチンを登録する静的APIの処理は,
2825 初期化ルーチンを登録することのみを意味し,初期化ルーチンの実行は含まな
2826 いものとした.
2827
2828 2.9.2 システム終了手順
2829
2830 カーネルを終了させるサービスコール(ext_ker)を呼び出すと,カーネル動作
2831 状態から非動作状態に遷移する(「2.5.1 カーネル動作状態と非動作状態」の
2832 節を参照)【NGKI0345】.具体的には,NMIを除くすべての割込みがマスクされ,
2833 タスクの実行が停止される.
2834
2835 マルチプロセッサ対応カーネルでは,カーネルを終了させるサービスコール
2836 (ext_ker)は,どのプロセッサからでも呼び出すことができる【NGKI0346】.
2837 1つのプロセッサでカーネルを終了させるサービスコールを呼び出すと,そのプ
2838 ロセッサがカーネル動作状態から非動作状態に遷移した後,他のプロセッサに
2839 対してカーネル終了処理の開始を要求する【NGKI0347】.複数のプロセッサか
2840 ら,カーネルを終了させるサービスコール(ext_ker)を呼び出してもよい
2841 【NGKI0348】.
2842
2843 次に,静的API(ATT_TER)により登録した終了処理ルーチンが,システムコン
2844 フィギュレーションファイルにおける静的APIの記述順と逆の順序で実行される
2845 【NGKI0349】.
2846
2847 マルチプロセッサ対応カーネルでは,すべてのプロセッサがカーネル非動作状
2848 態に遷移した後に,各プロセッサが,自プロセッサに割り付けられたローカル
2849 終了処理ルーチンを実行する【NGKI0350】.すなわち,ローカル終了処理ルー
2850 チンは,初期割付けプロセッサにより実行される.すべてのプロセッサでロー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
58
2851 カル終了処理ルーチンの実行が完了した後に,マスタプロセッサがグローバル
2852 終了処理ルーチンを実行する【NGKI0351】.
2853
2854 以上が終了すると,ターゲットシステム依存の終了処理が呼び出される
2855 【NGKI0352】.ターゲットシステム依存の終了処理は,カーネルの管理外であ
2856 り,アプリケーションで用意するのが基本であるが,カーネルの配布パッケー
2857 ジの中に,ターゲットシステム毎に標準的なルーチンが用意されている
2858 【NGKI0353】.標準のターゲットシステム依存の終了処理では,ソフトウェア
2859 環境(ライブラリなど)依存の終了処理フックを呼び出す【NGKI0354】.
2860
2861 マルチプロセッサ対応カーネルでは,すべてのプロセッサで,ターゲットシス
2862 テム依存の終了処理が呼び出される【NGKI0355】.マルチプロセッサ対応カー
2863 ネルにおけるシステム終了処理の流れと,各プロセッサが同期を取るタイミン
2864 グを,図2-7に示す【NGKI0356】.
2865
2866 【使用上の注意】
2867
2868 マルチプロセッサ対応カーネルで,あるプロセッサからカーネルを終了させる
2869 サービスコール(ext_ker)を呼び出しても,他のプロセッサがカーネル動作状
2870 態で割込みをマスクしたまま実行し続けると,カーネルが終了しない.
2871
2872 プロセッサが割込みをマスクしたまま実行し続けないようにするのは,アプリ
2873 ケーションの責任である.例えば,ある時間を超えて割込みをマスクしたまま
2874 実行し続けていないかを,ウォッチドッグタイマを用いて監視する方法が考え
2875 られる.割込みをマスクしたまま実行し続けていた場合には,そのプロセッサ
2876 からもカーネルを終了させるサービスコール(ext_ker)を呼び出すことで,カー
2877 ネルを終了させることができる.
2878
2879 【μITRON4.0仕様との関係】
2880
2881 μITRON4.0仕様には,システム終了に関する規定はない.
2882
2883 2.10 オブジェクトの登録とその解除
2884
2885 2.10.1 ID番号で識別するオブジェクト
2886
2887 ID番号で識別するオブジェクトは,オブジェクトを生成する静的
2888 API(CRE_YYY),サービスコール(acre_yyy),またはオブジェクトを追加す
2889 る静的API(ATT_YYY,ATA_YYY)によってカーネルに登録する【NGKI0357】.オ
2890 ブジェクトを追加する静的APIによって登録されたオブジェクトはID番号を持た
2891 ないため,ID番号を指定して操作することができない【NGKI0358】.
2892
2893 オブジェクトを生成する静的API(CRE_YYY)は,生成するオブジェクトにID番
2894 号を割り付け,ID番号を指定するパラメータとして記述した識別名を,割り付
2895 けたID番号にマクロ定義する【NGKI0359】.同じ識別名のオブジェクトが生成
2896 済みの場合には,E_OBJエラーとなる【NGKI0360】.
2897
2898 オブジェクトを生成するサービスコール(acre_yyy)は,割付け可能なID番号
2899 の数を指定する静的API(AID_YYY)によって確保されたID番号の中から,使用
2900 されていないID番号を1つ選び,生成するオブジェクトに割り付ける
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
59
2901 【NGKI0361】.割り付けたID番号は,サービスコールの返値としてアプリケー
2902 ションに通知する【NGKI0362】.使用されていないID番号が残っていない場合
2903 には,E_NOID エラーとなる【NGKI0363】.
2904
2905 割付け可能なID番号の数を指定する静的API(AID_YYY)は,システムコンフィ
2906 ギュレーションファイル中に複数記述することができる【NGKI0364】.その場
2907 合,各静的APIで指定した数の合計の数のID番号が確保される【NGKI0365】.
2908
2909 オブジェクトを生成するサービスコール(acre_yyy)によって登録したオブジェ
2910 クトは,オブジェクトを削除するサービスコール(del_yyy)によって登録を解
2911 除することができる【NGKI0366】.登録解除したオブジェクトのID番号は,未
2912 使用の状態に戻され,そのID番号を用いて新しいオブジェクトを登録すること
2913 ができる【NGKI0367】.この場合に,登録解除前のオブジェクトに対して行う
2914 つもりの操作が,新たに登録したオブジェクトに対して行われないように,注
2915 意が必要である.
2916
2917 オブジェクトを生成または追加する静的APIによって登録したオブジェクトは,
2918 登録を解除することができない【NGKI0368】.登録を解除しようとした場合に
2919 は,E_OBJエラーとなる【NGKI0369】.
2920
2921 タスク以外の処理単位は,その処理単位が実行されている間でも,登録解除す
2922 ることができる【NGKI0370】.この場合,登録解除された処理単位に実行が強
2923 制的に終了させられることはなく,処理単位が自ら実行を終了するまで,処理
2924 単位の実行は継続される【NGKI0371】.
2925
2926 同期・通信オブジェクトを削除した時に,そのオブジェクトを待っているタス
2927 クがあった場合,それらのタスクは待ち解除され,待ち状態に遷移させたサー
2928 ビスコールはE_DLTエラーとなる【NGKI0372】.複数のタスクが待ち解除される
2929 場合には,待ち行列につながれていた順序で待ち解除される【NGKI0373】.削
2930 除した同期・通信オブジェクトが複数の待ち行列を持つ場合には,別の待ち行
2931 列で待っていたタスクの間の待ち解除の順序は,該当するサービスコール毎に
2932 規定する【NGKI0374】.
2933
2934 オブジェクトを再初期化するサービスコール(ini_yyy)は,指定したオブジェ
2935 クトを削除した後に,同じパラメータで再度生成したのと等価の振舞いをする
2936 【NGKI0375】.ただし,オブジェクトを生成または追加する静的APIによって登
2937 録したオブジェクトも,再初期化することができる【NGKI0376】.
2938
2939 なお,動的生成対応カーネル以外では,オブジェクトを生成するサービスコー
2940 ル(acre_yyy),割付け可能なID番号の数を指定する静的API(AID_YYY),オ
2941 ブジェクトを削除するサービスコール(del_yyy)は,サポートされない
2942 【NGKI0377】.
2943
2944 【μITRON4.0仕様との関係】
2945
2946 ID番号を指定してオブジェクトを生成するサービスコール(cre_yyy)を廃止し
2947 た.また,オブジェクトを生成または追加する静的APIによって登録したオブジェ
2948 クトは,登録解除できないこととした.
2949
2950 μITRON4.0仕様では,割付け可能なID番号の数を指定する静的API(AID_YYY)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
60
2951 は規定されていない.
2952
2953 複数の待ち行列を持つ同期・通信オブジェクトを削除した時に,別の待ち行列
2954 で待っていたタスクの間の待ち解除の順序は,μITRON4.0仕様では実装依存と
2955 されている.
2956
2957 【μITRON4.0/PX仕様との関係】
2958
2959 アクセス許可ベクタを指定してオブジェクトを生成する静的API(CRA_YYY)は
2960 廃止し,オブジェクトの登録後にアクセス許可ベクタを設定する静的
2961 API(SAC_YYY)をサポートすることとした.これにあわせて,アクセス許可ベ
2962 クタを指定してオブジェクトを登録するサービスコール(cra_yyy,acra_yyy,
2963 ata_yyy)も廃止した.
2964
2965 【仕様決定の理由】
2966
2967 ID番号を指定してオブジェクトを生成するサービスコール(cre_yyy)とアクセ
2968 ス許可ベクタを指定してオブジェクトを登録するサービスコール(cra_yyy,
2969 acra_yyy,ata_yyy)を廃止したのは,必要性が低いと考えたためである.
2970 静的APIについても,サービスコールに整合するよう変更した.
2971
2972 2.10.2 オブジェクト番号で識別するオブジェクト
2973
2974 オブジェクト番号で識別するオブジェクトは,オブジェクトを定義する静的
2975 API(DEF_YYY)またはサービスコール(def_yyy)によってカーネルに登録する
2976 【NGKI0378】.
2977
2978 オブジェクトを定義するサービスコール(def_yyy)によって登録したオブジェ
2979 クトは,同じサービスコールを,オブジェクトの定義情報を入れたパケットへ
2980 のポインタをNULLとして呼び出すことによって,登録を解除することができる
2981 【NGKI0379】.登録解除したオブジェクト番号は,オブジェクト登録前の状態
2982 に戻され,同じオブジェクト番号に対して新たにオブジェクトを定義すること
2983 ができる【NGKI0380】.登録解除されていないオブジェクト番号に対して再度
2984 オブジェクトを登録しようとした場合には,E_OBJエラーとなる【NGKI0381】.
2985
2986 オブジェクトを定義する静的APIによって登録したオブジェクトは,登録を解除
2987 することができない【NGKI0382】.登録を解除しようとした場合には,E_OBJエ
2988 ラーとなる【NGKI0383】.
2989
2990 なお,動的生成対応カーネル以外では,オブジェクトを定義するサービスコー
2991 ル(def_yyy)はサポートされない【NGKI0384】.
2992
2993 【μITRON4.0仕様との関係】
2994
2995 この仕様では,オブジェクトの定義を変更したい場合には,一度登録解除した
2996 後に,新たにオブジェクトを定義する必要がある.また,オブジェクトを定義
2997 する静的APIによって登録したオブジェクトは,この仕様では,登録解除できな
2998 いこととした.
2999
3000 2.10.3 識別番号を持たないオブジェクト
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
61
3001
3002 識別する必要がないために,識別番号を持たないオブジェクトは,オブジェク
3003 トを追加する静的API(ATT_YYY)によってカーネルに登録する.
3004
3005 2.10.4 オブジェクト生成に必要なメモリ領域
3006
3007 カーネルオブジェクトを生成する際に,サイズが一定でないメモリ領域を必要
3008 とする場合には,カーネルオブジェクトを生成する静的APIおよびサービスコー
3009 ルに,使用するメモリ領域の先頭番地を渡すパラメータを設けている
3010 【NGKI0385】.このパラメータをNULLとした場合,必要なメモリ領域は,コン
3011 フィギュレータまたはカーネルにより確保される【NGKI0386】.
3012
3013 オブジェクト生成に必要なメモリ領域の中で,カーネルの内部で用いるものを,
3014 カーネルの用いるオブジェクト管理領域と呼ぶ.この仕様では,以下のメモリ
3015 領域が,カーネルの用いるオブジェクト管理領域に該当する.
3016
3017 ・データキュー管理領域
3018 ・優先度データキュー管理領域
3019 ・優先度別のメッセージキューヘッダ領域
3020 ・固定長メモリプール管理領域
3021
3022 【補足説明】
3023
3024 カーネルオブジェクトを生成する際には,管理ブロックなどを置くためのメモ
3025 リ領域も必要になるが,サイズが一定のメモリ領域はコンフィギュレータによ
3026 り確保されるため,カーネルオブジェクトを生成する静的APIおよびサービスコー
3027 ルにそれらのメモリ領域の先頭番地を渡すパラメータを設けていない.
3028
3029 2.10.5 オブジェクトが属する保護ドメインの設定
3030
3031 保護機能対応カーネルにおいて,カーネルオブジェクトが属する保護ドメイン
3032 は,オブジェクトの登録時に決定し,登録後に変更することはできない
3033 【NGKI0387】.
3034
3035 カーネルオブジェクトを静的APIによって登録する場合には,オブジェクトを登
3036 録する静的APIを,そのオブジェクトを属させる保護ドメインの囲みの中に記述
3037 する【NGKI0388】.無所属のオブジェクトを登録する静的APIは,保護ドメイン
3038 の囲みの外に記述する(「2.12.3 保護ドメインの指定」の節を参照)
3039 【NGKI0389】.
3040
3041 カーネルオブジェクトをサービスコールによって登録する場合には,オブジェ
3042 クト属性にTA_DOM(domid)を指定することにより,オブジェクトを属させる保護
3043 ドメインを設定する【NGKI0390】.ここでdomidは,そのオブジェクトを属させ
3044 る保護ドメインのID番号であり,TDOM_KERNEL(=-1)を指定することでカーネ
3045 ルドメインに属させることができる.また,domidにTDOM_SELF(=0)を指定す
3046 るか,オブジェクト属性にTA_DOM(domid)を指定しないことで,自タスクが属す
3047 る保護ドメインに属させることができる.さらに,無所属のオブジェクトを登
3048 録する場合には,domidにTDOM_NONE(=-2)を指定する.
3049
3050 ただし,特定の保護ドメインのみに属することができるカーネルオブジェクト
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
62
3051 を登録するサービスコールの中には,オブジェクトを属させる保護ドメインを
3052 オブジェクト属性で設定する必要がないものもある【NGKI0391】.
3053
3054 割付け可能なID番号の数を指定する静的API(AID_YYY)で確保したID番号は,
3055 どの保護ドメインに属するオブジェクトにも(また,無所属のオブジェクトに
3056 も)割り付けられる【NGKI0392】.これらの静的APIは,保護ドメインの囲みの
3057 外に記述しなければならない.保護ドメインの囲みの中に記述した場合には,
3058 E_RSATRエラーとなる【NGKI0394】.
3059
3060 【補足説明】
3061
3062 この仕様では,カーネルオブジェクトの属する保護ドメインを参照する機能は
3063 用意していない.
3064
3065 【仕様決定の理由】
3066
3067 カーネルオブジェクトをサービスコールによって登録する場合に,オブジェク
3068 トを属させる保護ドメインをオブジェクト属性で指定することにしたのは,保
3069 護機能対応でないカーネルとの互換性のためには,サービスコールのパラメー
3070 タを増やさない方が望ましいためである.
3071
3072 2.10.6 オブジェクトが属するクラスの設定
3073
3074 マルチプロセッサ対応カーネルにおいて,カーネルオブジェクトが属するクラ
3075 スは,オブジェクトの登録時に決定し,登録後に変更することはできない
3076 【NGKI0395】.
3077
3078 カーネルオブジェクトを静的APIによって登録する場合には,オブジェクトを登
3079 録する静的APIを,そのオブジェクトを属させるクラスの囲みの中に記述する
3080 【NGKI0396】.クラスに属さないオブジェクトを登録する静的APIは,クラスの
3081 囲みの外に記述する(「2.12.4 クラスの指定」の節を参照)【NGKI0397】.
3082
3083 カーネルオブジェクトをサービスコールによって登録する場合には,オブジェ
3084 クト属性にTA_CLS(clsid)を指定することにより,オブジェクトを属させるクラ
3085 スを設定する【NGKI0398】.ここでclsidは,そのオブジェクトを属させるクラ
3086 スのID番号であり,clsidにTCLS_SELF(=0)を指定するか,オブジェクト属性
3087 にTA_CLS(clsid)を指定しないことで,自タスクが属するクラスに属させること
3088 ができる.
3089
3090 割付け可能なID番号の数を指定する静的API(AID_YYY)で確保したID番号は,
3091 静的APIを囲むクラスに属するオブジェクトにのみ割り付けられる【NGKI0399】.
3092 これらの静的APIは,確保したID番号を割り付けるオブジェクトの属すべきクラ
3093 スの囲みの中に記述しなければならない.クラスの囲みの外に記述した場合に
3094 は,E_RSATRエラーとなる【NGKI0401】.
3095
3096 【補足説明】
3097
3098 この仕様では,カーネルオブジェクトの属するクラスを参照する機能は用意し
3099 ていない.
3100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
63
3101 【仕様決定の理由】
3102
3103 カーネルオブジェクトをサービスコールによって登録する場合に,オブジェク
3104 トを属させるクラスをオブジェクト属性で指定することにしたのは,マルチプ
3105 ロセッサ対応でないカーネルとの互換性のためには,サービスコールのパラメー
3106 タを増やさない方が望ましいためである.
3107
3108 2.10.7 オブジェクトの状態参照
3109
3110 ID番号で識別するオブジェクトのすべてと,オブジェクト番号で識別するオブ
3111 ジェクトの一部に対して,オブジェクトの状態を参照するサービスコール
3112 (ref_yyy,get_yyy)を用意する【NGKI0402】.
3113
3114 オブジェクトの状態を参照するサービスコールでは,オブジェクトの登録時に
3115 指定し,その後に変化しない情報(例えば,タスクのタスク属性や初期優先度)
3116 を参照するための機能は用意しないことを原則とする【NGKI0403】.自タスク
3117 の拡張情報の参照するサービスコール(get_inf)は,この原則に対する例外で
3118 ある【NGKI0404】.
3119
3120 2.11 オブジェクトのアクセス保護
3121
3122 この節では,カーネルオブジェクトのアクセス保護について述べる.この節の
3123 内容は,保護機能対応カーネルにのみ適用される.
3124
3125 2.11.1 オブジェクトのアクセス保護とアクセス違反の通知
3126
3127 カーネルオブジェクトに対するアクセスは,そのオブジェクトに対して設定さ
3128 れたアクセス許可ベクタによって保護される【NGKI0405】.ただし,アクセス
3129 許可ベクタを持たないオブジェクトに対するアクセスは,システム状態に対す
3130 るアクセス許可ベクタによって保護される【NGKI0406】.また,オブジェクト
3131 を登録するサービスコールと,特定のオブジェクトに関連しないシステムの状
3132 態に対するアクセスについては,システム状態のアクセス許可ベクタによって
3133 保護される【NGKI0407】.
3134
3135 アクセス許可ベクタによって許可されていないアクセス(アクセス違反)は,
3136 カーネルによって検出され,以下の方法によって通知される.
3137
3138 サービスコールにより,メモリオブジェクト以外のカーネルオブジェクトに対
3139 して,許可されていないアクセスを行おうとした場合,サービスコールから
3140 E_OACVエラーが返る【NGKI0408】.また,メモリオブジェクトに対して,許可
3141 されていない管理操作または参照操作を行おうとした場合も,サービスコール
3142 からE_OACVエラーが返る【NGKI0409】.
3143
3144 メモリオブジェクトに対して,通常のメモリアクセスにより,許可されていな
3145 い書込みアクセスまたは読出しアクセス(実行アクセスを含む)を行おうとし
3146 た場合,CPU例外ハンドラが起動される【NGKI0410】.どのCPU例外ハンドラが
3147 起動されるかは,ターゲット定義である【NGKI0411】.ターゲットによっては,
3148 エミュレートされたCPU例外ハンドラの場合もある.また,ターゲット定義で,
3149 アクセス違反の状況に応じて異なるCPU例外ハンドラが起動される場合もある.
3150 この(これらの)CPU例外ハンドラを,メモリアクセス違反ハンドラと呼ぶ.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
64
3151
3152 メモリオブジェクトに対して,サービスコールを通じて,許可されていない書
3153 込みアクセスまたは読出しアクセスを行おうとした場合,サービスコールから
3154 E_MACVエラーが返るか,メモリアクセス違反ハンドラが起動される
3155 【NGKI0412】.E_MACVエラーが返るかメモリアクセス違反ハンドラされるかは,
3156 ターゲット定義である【NGKI0413】.
3157
3158 メモリアクセス違反ハンドラでは,アクセス違反を発生させたアクセスに関す
3159 る情報(アクセスした番地,アクセスの種別,アクセスした命令の番地など)
3160 を参照する方法を,ターゲット定義で用意する【NGKI0414】.
3161
3162 メモリオブジェクトとしてカーネルに登録されていないメモリ領域に対して,
3163 ユーザドメインから書込みアクセスまたは読出しアクセス(実行アクセスを含
3164 む)を行おうとした場合には,メモリオブジェクトに対するアクセスが許可さ
3165 れていない場合と同様に扱われる【NGKI0415】.カーネルドメインから同様の
3166 アクセスを行おうとした場合の動作は保証されない【NGKI0416】.
3167
3168 【未決定事項】
3169
3170 マルチプロセッサ対応カーネルにおいて,システム状態のアクセス許可ベクタ
3171 をシステム全体で1つ持つかプロセッサ毎に持つかは,今後の課題である.
3172
3173 【μITRON4.0/PX仕様との関係】
3174
3175 μITRON4.0/PX仕様では,アクセス保護の実装定義の制限について規定している
3176 が,この仕様では,メモリオブジェクトに対するアクセス許可ベクタのターゲッ
3177 ト定義の制限以外については規定していない.
3178
3179 【仕様決定の理由】
3180
3181 オブジェクトを登録するサービスコールを,そのオブジェクトのアクセス許可
3182 ベクタによって保護しないのは,オブジェクトを登録する前には,アクセス許
3183 可ベクタが設定されていないためである.
3184
3185 2.11.2 メモリオブジェクトに対するアクセス許可ベクタの制限
3186
3187 メモリオブジェクトの書込みアクセスと読出しアクセス(実行アクセスを含む)
3188 に対して設定できるアクセス許可パターンは,ターゲット定義で制限される場
3189 合がある【NGKI0417】.
3190
3191 ただし,少なくとも,次の5つの組み合わせの設定は,行うことができる.
3192
3193 (a) メモリオブジェクトが属する保護ドメインのみに,読出しアクセス(実行
3194 アクセスを含む)のみを許可する【NGKI0418】.これを,専有リードオン
3195 リー(private read only)と呼ぶ.
3196
3197 (b) メモリオブジェクトが属する保護ドメインのみに,書込みアクセスと読出
3198 しアクセス(実行アクセスを含む)を許可する【NGKI0419】.これを,専
3199 有リードライト(private read/write)と呼ぶ.
3200
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
65
3201 (c) すべての保護ドメインに,読出しアクセス(実行アクセスを含む)のみを
3202 許可する【NGKI0420】.これを,共有リードオンリー(shared read only)
3203 と呼ぶ.
3204
3205 (d) すべての保護ドメインに,書込みアクセスと読出しアクセス(実行アクセ
3206 スを含む)を許可する【NGKI0421】.これを,共有リードライト(shared
3207 read/write)と呼ぶ.
3208
3209 (e) メモリオブジェクトが属する保護ドメインに,書込みアクセスと読出しア
3210 クセス(実行アクセスを含む)を許可し,他の保護ドメインには,読出し
3211 アクセス(実行アクセスを含む)のみを許可する【NGKI0422】.これを,
3212 共有リード専有ライト(shared read private write)と呼ぶ.
3213
3214 また,ターゲット定義で,1つの保護ドメインに登録できるメモリオブジェクト
3215 の数が制限される場合がある【NGKI0423】.
3216
3217 2.11.3 デフォルトのアクセス許可ベクタ
3218
3219 静的APIによりカーネルオブジェクトを登録した直後は,次に規定されるデフォ
3220 ルトのアクセス許可ベクタが設定される.
3221
3222 保護ドメインに属するカーネルオブジェクトに対しては,4つの種別のアクセス
3223 がいずれも,その保護ドメインのみに許可される【NGKI0424】.すなわち,カー
3224 ネルドメインに属するオブジェクトに対しては,4つのアクセス許可パターンが
3225 いずれもTACP_KERNELに,ユーザドメインに属するオブジェクトに対しては,4
3226 つのアクセス許可パターンがいずれもTACP(domid)(domidはオブジェクトが属
3227 する保護ドメインのID番号)に設定される.
3228
3229 無所属のカーネルオブジェクトに対しては,4つの種別のアクセスがいずれも,
3230 すべての保護ドメインに許可される【NGKI0425】.すなわち,4つのアクセス許
3231 可パターンがいずれも,TACP_SHAREDに設定される.
3232
3233 システム状態のアクセス許可ベクタは,4つの種別のアクセスがいずれも,カー
3234 ネルドメインのみに許可される【NGKI0426】.すなわち,4つのアクセス許可パ
3235 ターンがいずれも,TACP_KERNELに設定される.
3236
3237 【未決定事項】
3238
3239 サービスコールによりカーネルオブジェクトを登録した直後のアクセス許可ベ
3240 クタについては,今後の課題である.
3241
3242 2.11.4 アクセス許可ベクタの設定
3243
3244 アクセス許可ベクタをデフォルト以外の値に設定するために,カーネルオブジェ
3245 クトのアクセス許可ベクタを設定する静的API(SAC_YYY)と,システム状態の
3246 アクセス許可ベクタを設定する静的API(SAC_SYS)が用意されている
3247 【NGKI0427】.
3248
3249 また,動的生成対応カーネルにおいては,カーネルオブジェクトのアクセス許
3250 可ベクタを設定するサービスコール(sac_yyy)と,システム状態のアクセス許
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
66
3251 可ベクタを設定するサービスコール(sac_sys)が用意されている【NGKI0428】.
3252 ただし,静的APIによって登録したオブジェクトは,サービスコール(sac_yyy)
3253 によってアクセス許可ベクタを設定することができない【NGKI0429】.アクセ
3254 ス許可ベクタを設定しようとした場合には,E_OBJエラーとなる【NGKI0430】.
3255
3256 メモリオブジェクトに対しては,アクセス許可ベクタを設定する静的APIは用意
3257 されておらず,オブジェクトの登録と同時にアクセス許可ベクタを設定する静
3258 的API(ATA_YYY)が用意されている【NGKI0431】.
3259
3260 オブジェクトに対するアクセスが許可されているかは,そのオブジェクトにア
3261 クセスするサービスコールを呼び出した時点でチェックされる【NGKI0432】.
3262 そのため,アクセス許可ベクタを変更しても,変更以前に呼び出されたサービ
3263 スコールの振舞いには影響しない.例えば,待ち行列を持つ同期・通信オブジェ
3264 クトのアクセス許可ベクタを変更しても,呼び出した時点ですでに待ち行列に
3265 つながれているタスクには影響しない.また,ミューテックスのアクセス許可
3266 ベクタを変更しても,呼び出した時点ですでにミューテックをロックしていた
3267 タスクには影響しない.
3268
3269 この仕様では,カーネルオブジェクトに設定されたアクセス許可ベクタを参照
3270 する機能は用意していない.
3271
3272 【μITRON4.0/PX仕様との関係】
3273
3274 アクセス許可ベクタを指定してオブジェクトを生成する静的API(CRA_YYY)は
3275 廃止し,オブジェクトの登録後にアクセス許可ベクタを設定する静的
3276 API(SAC_YYY)をサポートすることとした.
3277
3278 静的APIによって登録したオブジェクトは,サービスコール(sac_yyy)によっ
3279 てアクセス許可ベクタを設定することができないこととした.
3280
3281 オブジェクトの状態参照するサービスコール(ref_yyy)により,オブジェクト
3282 に設定されたアクセス許可ベクタを参照する機能サポートしないこととした.
3283 これは,[NGKI0403]の原則に合わせるための修正である.
3284
3285 2.11.5 カーネルの管理領域のアクセス保護
3286
3287 カーネルが動作するために,カーネルの内部で用いるメモリ領域を,カーネル
3288 の管理領域と呼ぶ.ユーザタスクからカーネルを保護するためには,カーネル
3289 の管理領域にアクセスできるのは,カーネルドメインのみでなければならない.
3290 そのため,カーネルの管理領域は,4つの種別のアクセスがカーネルドメインの
3291 みに許可されたメモリオブジェクト(これを,カーネル専用のメモリオブジェ
3292 クトと呼ぶ)の中に置かれる【NGKI0433】.
3293
3294 カーネルの用いるオブジェクト管理領域(カーネルの管理領域に該当する.
3295 「2.10.4 オブジェクト生成に必要なメモリ領域」の節を参照)として,カーネ
3296 ル専用のメモリオブジェクトに含まれないメモリ領域を指定した場合,E_OBJエ
3297 ラーとなる【NGKI0434】.また,カーネルの用いるオブジェクト管理領域の先
3298 頭番地にNULL を指定した場合,必要なメモリ領域が,カーネル専用のメモリオ
3299 ブジェクトの中に確保される【NGKI0435】.
3300
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
67
3301 システムタスクのスタック領域,ユーザタスクのシステムスタック領域,非タ
3302 スクコンテキスト用のスタック領域は,カーネルの用いるオブジェクト管理領
3303 域には該当しないが,カーネルドメインの実行中にのみアクセスされるため,
3304 カーネルの用いるオブジェクト管理領域と同様の扱いとなる【NGKI0436】.一
3305 方,ユーザタスクのユーザスタック領域と固定長メモリプール領域は,ユーザ
3306 ドメインの実行中にもアクセスされるため,カーネルの用いるオブジェクト管
3307 理領域とは異なる扱いとなる.
3308
3309 2.11.6 ユーザタスクのユーザスタック領域
3310
3311 ユーザタスクが非特権モードで実行する間に用いるスタック領域を,システム
3312 スタック領域(「4.1 タスク管理機能」の節を参照)と対比させて,ユーザス
3313 タック領域と呼ぶ.ユーザスタック領域は,そのタスクと同じ保護ドメインに
3314 属する1つのメモリオブジェクトとしてカーネルに登録される【NGKI0437】.た
3315 だし,他のメモリオブジェクトとは異なり,次のように扱われる.
3316
3317 タスクのユーザスタック領域に対しては,そのタスクのみが書込みアクセスお
3318 よび読出しアクセスを行うことができる【NGKI0438】.そのため,書込みアク
3319 セスと読出しアクセス(実行アクセスを含む)に対するアクセス許可パターン
3320 は意味を持たない【NGKI0439】.ユーザスタック領域に対して実行アクセスを
3321 行えるかどうかは,ターゲット定義である【NGKI0440】.
3322
3323 ただし,上記の仕様を実現するために大きいオーバヘッドを生じる場合には,
3324 ターゲット定義で,タスクのユーザスタック領域を,そのタスクが属する保護
3325 ドメイン全体からアクセスできるものとする場合がある【NGKI0441】.
3326
3327 【μITRON4.0/PX仕様との関係】
3328
3329 この仕様では,タスクのユーザスタック領域は,そのタスクのみがアクセスで
3330 きるものとした.
3331
3332 2.12 システムコンフィギュレーション手順
3333
3334 2.12.1 システムコンフィギュレーションファイル
3335
3336 カーネルやシステムサービスが管理するオブジェクトの生成情報や初期状態な
3337 どを記述するファイルを,システムコンフィギュレーションファイル(system
3338 configuration file)と呼ぶ.また,システムコンフィギュレーションファイ
3339 ルを解釈して,カーネルやシステムサービスの構成・初期化情報を含むファイ
3340 ルなどを生成するツールを,コンフィギュレータ(configurator)と呼ぶ.
3341
3342 システムコンフィギュレーションファイルには,カーネルの静的API,システム
3343 サービスの静的API,保護ドメインの囲み,クラスの囲み,コンフィギュレータ
3344 に対するINCLUDEディレクティブ,C言語プリプロセッサのインクルードディレ
3345 クティブ(#include)と条件ディレクティブ(#if,#ifdefなど)のみを記述す
3346 ることができる【NGKI0442】.
3347
3348 コンフィギュレータに対するINCLUDEディレクティブは,システムコンフィギュ
3349 レーションファイルを複数のファイルに分割して記述するために用いるもので,
3350 その文法は次のいずれかである(両者の違いは,指定されたファイルを探すディ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
68
3351 レクトリの違いのみ)【NGKI0443】.
3352
3353 INCLUDE("ファイル名");
3354 INCLUDE(<ファイル名>);
3355
3356 コンフィギュレータは,INCLUDEディレクティブによって指定されたファイル中
3357 の記述を,システムコンフィギュレーションファイルの一部分として解釈する
3358 【NGKI0444】.すなわち,INCLUDEディレクティブによって指定されたファイル
3359 中には,カーネルの静的API,システムサービスの静的API,コンフィギュレー
3360 タに対するINCLUDEディレクティブ,C言語プリプロセッサのインクルードディ
3361 レクティブと条件ディレクティブのみを記述することができる.
3362
3363 C言語プリプロセッサのインクルードディレクティブは,静的APIのパラメータ
3364 を解釈するために必要なC言語のヘッダファイルを指定するために用いる
3365 【NGKI0445】.また,条件ディレクティブは,有効とする静的APIを選択するた
3366 めに用いることができる【NGKI0446】.ただし,インクルードディレクティブ
3367 は,コンフィギュレータが生成するファイルでは先頭に集められる
3368 【NGKI0447】.そのため,条件ディレクティブの中にインクルードディレクティ
3369 ブを記述しても,インクルードディレクティブは常に有効となる.また,1つの
3370 静的APIの記述の途中に,条件ディレクティブを記述することはできない
3371 【NGKI0448】.
3372
3373 コンフィギュレータは,システムコンフィギュレーションファイル中の静的
3374 APIを,その記述順に解釈する【NGKI0449】.そのため例えば,タスクを生成す
3375 る静的APIの前に,そのタスクにタスク例外処理ルーチンを定義する静的APIが
3376 記述されていた場合,タスク例外処理ルーチンを定義する静的APIがE_NOEXSエ
3377 ラーとなる.
3378
3379 【μITRON4.0仕様との関係】
3380
3381 システムコンフィギュレーションファイルにおけるC言語プリプロセッサのディ
3382 レクティブの扱いを全面的に見直し,コンフィギュレータに対するINCLUDEディ
3383 レクティブを設けた.また,共通静的APIを廃止した.μITRON4.0仕様における
3384 #includeディレクティブの役割は,この仕様ではINCLUDEディレクティブに置き
3385 換わる.逆に,μITRON4.0仕様におけるINCLUDE静的APIの役割は,この仕様で
3386 は#includeディレクティブに置き換わる.
3387
3388 2.12.2 静的APIの文法とパラメータ
3389
3390 静的APIは,次に述べる例外を除いては,C言語の関数呼出しと同様の文法で記
3391 述する【NGKI0450】.すなわち,静的APIの名称に続けて,静的APIの各パラメー
3392 タを","で区切って列挙したものを"("と")"で囲んで記述し,最後に";"を記述
3393 する.ただし,静的APIのパラメータに構造体(または構造体へのポインタ)を
3394 記述する場合には,構造体の各フィールドを","で区切って列挙したものを"{"
3395 と"}"で囲んだ形で記述する【NGKI0451】.
3396
3397 サービスコールに対応する静的APIの場合,静的APIのパラメータは,対応する
3398 サービスコールのパラメータと同一とすることを原則とする【NGKI0452】.
3399
3400 静的APIのパラメータは,次の4種類に分類される.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
69
3401
3402 (a) オブジェクト識別名
3403
3404 オブジェクトのID番号を指定するパラメータ.オブジェクトの名称を表す単一
3405 の識別名のみを記述することができる.
3406
3407 コンフィギュレータは,オブジェクト生成のための静的API(CRE_YYY)を処理
3408 する際に,オブジェクトにID番号を割り付け,構成・初期化ヘッダファイルに,
3409 指定された識別名を割り付けたID番号にマクロ定義するC言語プリプロセッサの
3410 ディレクティブ(#define)を生成する【NGKI0453】.
3411
3412 オブジェクト生成以外の静的APIが,オブジェクトのID番号をパラメータに取る
3413 場合(カーネルの静的APIでは,SAC_TSKやDEF_TEXのtskidパラメータ等がこれ
3414 に該当する)には,パラメータとして記述する識別名は,生成済みのオブジェ
3415 クトの名称を表す識別名でなければならない.そうでない場合には,コンフィ
3416 ギュレータがエラーを報告する【NGKI0455】.
3417
3418 静的APIの整数定数式パラメータの記述に,オブジェクト識別名を使用すること
3419 はできない【NGKI0456】.
3420
3421 (b) 整数定数式パラメータ
3422
3423 オブジェクト番号や機能コード,オブジェクト属性,サイズや数,優先度など,
3424 整数値を指定するパラメータ.プログラムが配置される番地に依存せずに値の
3425 決まる整数定数式を記述することができる.
3426
3427 整数定数式の解釈に必要な定義や宣言等は,システムコンフィギュレーション
3428 ファイルからC言語プリプロセッサのインクルードディレクティブによってイン
3429 クルードするファイルに含まれていなければならない【NGKI0457】.
3430
3431 (c) 一般定数式パラメータ
3432
3433 処理単位のエントリ番地,メモリ領域の先頭番地,拡張情報など,番地を指定
3434 する可能性のあるパラメータ.任意の定数式を記述することができる.
3435
3436 定数式の解釈に必要な定義や宣言等は,システムコンフィギュレーションファ
3437 イルからC言語プリプロセッサのインクルードディレクティブによってインクルー
3438 ドするファイルに含まれていなければならない【NGKI0458】.
3439
3440 (d) 文字列パラメータ
3441
3442 オブジェクトモジュール名やセクション名など,文字列を指定するパラメータ.
3443 任意の文字列を,C言語の文字列の記法で記述することができる.
3444
3445 【μITRON4.0仕様との関係】
3446
3447 μITRON4.0仕様においては,静的APIのパラメータを次の4種類に分類していた
3448 が,コンフィギュレータの仕組みを見直したことに伴い全面的に見直した.
3449
3450 (A) 自動割付け対応整数値パラメータ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
70
3451 (B) 自動割付け非対応整数値パラメータ
3452 (C) プリプロセッサ定数式パラメータ
3453 (D) 一般定数式パラメータ
3454
3455 この仕様の(a)が,おおよそμITRON4.0仕様の(A)に相当するが,(a)には整数値
3456 を記述できない点が異なる.(b)~(c)と(B)~(D)の間には単純な対応関係がな
3457 いが,記述できる定数式の範囲には,(B)⊂(C)⊂(b)⊂(c)=(D)の関係がある.
3458
3459 μITRON4.0仕様では,静的APIのパラメータは基本的には(D)とし,コンフィギュ
3460 レータが値を知る必要があるパラメータを(B),構成・初期化ファイルに生成す
3461 るC言語プリプロセッサの条件ディレクティブ(#if)中に含めたい可能性のあ
3462 るパラメータを(C)としていた.
3463
3464 それに対して,この仕様におけるコンフィギュレータの処理モデル(「2.12.5
3465 コンフィギュレータの処理モデル」の節を参照)では,コンフィギュレータの
3466 パス2において定数式パラメータの値を知ることができるため,(B)~(D)の区別
3467 をする必要がない.そのため,静的APIのパラメータは基本的には(b)とし,パ
3468 ス2で値を知ることのできない定数式パラメータのみを(c)としている.
3469
3470 2.12.3 保護ドメインの指定
3471
3472 保護機能対応カーネルでは,オブジェクトを登録する静的API等を,そのオブジェ
3473 クトが属する保護ドメインの囲みの中に記述する【NGKI0459】.無所属のオブ
3474 ジェクトを登録する静的APIは,保護ドメインの囲みの外に記述する
3475 【NGKI0460】.保護ドメインに属すべきオブジェクトを登録する静的API等を,
3476 保護ドメインの囲みの外に記述した場合には,コンフィギュレータがE_RSATRエ
3477 ラーを報告する【NGKI0461】.
3478
3479 ユーザドメインの囲みの文法は次の通り【NGKI0462】.
3480
3481 DOMAIN(保護ドメイン名) {
3482 ユーザドメインに属するオブジェクトを登録する静的API等
3483 }
3484
3485 保護ドメイン名には,ユーザドメインの名称を表す単一の識別名のみを記述す
3486 ることができる【NGKI0463】.
3487
3488 コンフィギュレータは,ユーザドメインの囲みを処理する際に,ユーザドメイ
3489 ンに保護ドメインIDを割り付け,構成・初期化ヘッダファイルに,指定された
3490 保護ドメイン名を割り付けた保護ドメインIDにマクロ定義するC言語プリプロセッ
3491 サのディレクティブ(#define)を生成する【NGKI0464】.また,ユーザドメイ
3492 ンの囲みの中およびそれ以降に記述する静的APIの整数定数式パラメータの記述
3493 に保護ドメイン名を記述すると,割り付けた保護ドメインIDの値に評価される
3494 【NGKI0465】.
3495
3496 ユーザドメインの囲みの中を空にすることで,ユーザドメインへの保護ドメイ
3497 ンIDの割付けのみを行うことができる【NGKI0466】.
3498
3499 カーネルドメインの囲みの文法は次の通り【NGKI0467】.
3500
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
71
3501 KERNEL_DOMAIN {
3502 カーネルドメインに属するオブジェクトを登録する静的API等
3503 }
3504
3505 同じ保護ドメイン名を指定したユーザドメインの囲みや,カーネルドメインの
3506 囲みを,複数回記述してもよい【NGKI0468】.保護機能対応でないカーネルで
3507 保護ドメインの囲みを記述した場合や,保護ドメインの囲みの中に保護ドメイ
3508 ンの囲みを記述した場合には,コンフィギュレータがエラーを報告する
3509 【NGKI0469】.
3510
3511 【μITRON4.0/PX仕様との関係】
3512
3513 保護ドメインの囲みの文法を変更した.
3514
3515 【仕様決定の理由】
3516
3517 保護ドメインに属すべきオブジェクトを登録する静的API等を保護ドメインの囲
3518 みの外に記述した場合のエラーコードをE_RSATRとしたのは,オブジェクトを動
3519 的に登録するAPIにおいては,オブジェクトの属する保護ドメインを,オブジェ
3520 クト属性によって指定するためである.
3521
3522 2.12.4 クラスの指定
3523
3524 マルチプロセッサ対応カーネルでは,オブジェクトを登録する静的API等を,そ
3525 のオブジェクトが属するクラスの囲みの中に記述する【NGKI0470】.クラスに
3526 属すべきオブジェクトを登録する静的API等を,クラスの囲みの外に記述した場
3527 合には,コンフィギュレータがE_RSATRエラーを報告する【NGKI0471】.
3528
3529 クラスの囲みの文法は次の通り【NGKI0472】.
3530
3531 CLASS(クラスID) {
3532 クラスに属するオブジェクトを登録する静的API等
3533 }
3534
3535 クラスIDには,静的APIの整数定数式パラメータと同等の定数式を記述すること
3536 ができる【NGKI0473】.使用できないクラスIDを指定した場合には,コンフィ
3537 ギュレータがE_IDエラーを報告する【NGKI0474】.
3538
3539 同じクラスIDを指定したクラスの囲みを複数回記述してもよい【NGKI0475】.
3540 マルチプロセッサ対応でないカーネルでクラスの囲みを記述した場合や,クラ
3541 スの囲みの中にクラスの囲みを記述した場合には,コンフィギュレータがエラー
3542 を報告する【NGKI0476】.
3543
3544 なお,保護機能とマルチプロセッサの両方に対応するカーネルでは,保護ドメ
3545 インの囲みとクラスの囲みはどちらが外側になっていてもよい【NGKI0477】.
3546
3547 【仕様決定の理由】
3548
3549 クラスに属すべきオブジェクトを登録する静的API等をクラスの囲みの外に記述
3550 した場合のエラーコードをE_RSATRとしたのは,オブジェクトを動的に登録する
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
72
3551 APIにおいては,オブジェクトの属するクラスを,オブジェクト属性によって指
3552 定するためである.
3553
3554 2.12.5 コンフィギュレータの処理モデル
3555
3556 コンフィギュレータは,次の3つないしは4つのパスにより,システムコンフィ
3557 ギュレーションファイルを解釈し,構成・初期化情報を含むファイルなどを生
3558 成する(図2-8).
3559
3560 最初のパス1では,システムコンフィギュレーションファイルを解釈し,そこに
3561 含まれる静的APIの整数定数式パラメータの値をCコンパイラを用いて求めるた
3562 めに,パラメータ計算用C言語ファイル(cfg1_out.c)を生成する.この時,シ
3563 ステムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイン
3564 クルードディレクティブは,パラメータ計算用C言語ファイルの先頭に集めて生
3565 成する.また,条件ディレクティブは,順序も含めて,そのままの形でパラメー
3566 タ計算用C言語ファイルに出力する.システムコンフィギュレーションファイル
3567 に文法エラーや未サポートの記述があった場合には,この段階で検出される.
3568
3569 次に,Cコンパイラおよび関連ツールを用いて,パラメータ計算用C言語ファイ
3570 ルをコンパイルし,ロードモジュールを生成する.また,それをSレコードフォー
3571 マットの形に変換したSレコードファイル(cfg1_out.srec)と,その中の各シ
3572 ンボルとアドレスの対応表を含むシンボルファイル(cfg1_out.syms)を生成す
3573 る.静的APIの整数定数式パラメータに解釈できない式が記述された場合には,
3574 この段階でエラーが検出される.
3575
3576 コンフィギュレータのパス2では,パス1で生成されたロードモジュールのSレコー
3577 ドファイルとシンボルファイルから,C言語プリプロセッサの条件ディレクティ
3578 ブによりどの静的APIが有効となったかと,それらの静的APIの整数定数式パラ
3579 メータの値を取り出し,カーネルおよびシステムサービスの構成・初期化ファ
3580 イル(kernel_cfg.cなど)と構成・初期化ヘッダファイル(kernel_cfg.hなど)
3581 を生成する.構成・初期化ヘッダファイルには,登録できるオブジェクトの数
3582 (動的生成対応カーネル以外では,静的APIによって登録されたオブジェクトの
3583 数に一致)やオブジェクトのID番号などの定義を出力する.静的APIの整数定数
3584 式パラメータに不正がある場合には,この段階でエラーが検出される.
3585
3586 パス2で生成されたファイルを,他のソースファイルとあわせてコンパイルし,
3587 アプリケーションのロードモジュールを生成する.また,そのSレコードファイ
3588 ル(system.srec)とシンボルファイル(system.syms)を生成する.静的APIの
3589 一般定数式パラメータに解釈できない式が記述された場合には,この段階でエ
3590 ラーが検出される.
3591
3592 コンフィギュレータのパス3では,パス1およびパス2で生成されたロードモジュー
3593 ルのSレコードファイルとシンボルファイルから,静的APIのパラメータの値な
3594 どを取り出し,妥当性のチェックを行う.静的APIの一般定数式パラメータに不
3595 正がある場合には,この段階でエラーが検出される.
3596
3597 保護機能対応カーネルにおいては,メモリ配置を決定し,メモリ保護のための
3598 設定情報を生成するために,さらに以下の処理を行う(図2-9).
3599
3600 コンフィギュレータは,決定したメモリ配置に従ってロードモジュールを生成
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
73
3601 するために,リンクスクリプト(ldscript.ld)を生成する.また,メモリ保護
3602 のための設定情報を,メモリ構成・初期化ファイル(kernel_mem.c)に生成す
3603 る.これらのファイルを生成するためには,パス3以降で初めて得られる情報が
3604 必要となるため,これらのファイルはパス3以降でしか生成できず,最終的なロー
3605 ドモジュールも,パス3以降で生成する.
3606
3607 そのため,パス2で生成されたロードモジュールは,仮のロードモジュールとい
3608 う位置付けになる.ここで,パス3以降で必要な情報を取り出し,最終的なロー
3609 ドモジュールのサイズを割り出せるように,パス3以降でメモリ構成・初期化ファ
3610 イルに生成するのと同様のデータ構造を,パス2において仮のメモリ構成・初期
3611 化ファイル(kernel_mem2.c)に生成する.また,これをリンクするための仮の
3612 リンクスクリプト(cfg2_out.ld)を生成し,これらを用いて仮のロードモジュー
3613 ルを生成する.さらに,仮のロードモジュールのSレコードファイル
3614 (cfg2_out.srec)とシンボルファイル(cfg2_out.syms)も,最終的なものと
3615 混同しないように,異なるファイル名で生成する.
3616
3617 パス3は,ターゲット依存で用いるパスで,メモリ配置やメモリ保護のための設
3618 定情報のサイズを最適化するための処理を行う.パス2で生成された仮のロード
3619 モジュールのSレコードファイルとシンボルファイルから必要な情報を取り出し,
3620 再度,仮のメモリ構成・初期化ファイル(kernel_mem3.c)と仮のリンクスクリ
3621 プト(cfg3_out.ld)を生成する.また,これらのファイルを他のソースファイ
3622 ルとあわせてコンパイルして仮のロードモジュールを生成し,そのSレコードファ
3623 イル(cfg3_out.srec)とシンボルファイル(cfg3_out.syms)を生成する.こ
3624 の段階で,メモリオブジェクトに重なりがあるなどのエラーが検出される場合
3625 もある.
3626
3627 パス4では,パス3(パス3を用いない場合はパス2)で生成された仮のロードモ
3628 ジュールのSレコードファイルとシンボルファイルから必要な情報を取り出し,
3629 最終的なメモリ構成・初期化ファイル(kernel_mem.c)とリンクスクリプト
3630 (ldscript.ld)を生成する.またパス4では,保護機能対応でないカーネルに
3631 おいてパス3で行っていた静的APIパラメータの値などの妥当性のチェックも行
3632 う.そのため,静的APIの一般定数式パラメータに不正がある場合には,この段
3633 階でエラーが検出される.
3634
3635 パス4で生成されたファイルを,他のソースファイルとあわせてコンパイルし,
3636 アプリケーションの最終的なロードモジュールを生成する.また,そのSレコー
3637 ドファイル(system.srec,必要な場合のみ)とシンボルファイル
3638 (system.syms)を生成する.
3639
3640 最後に,最終的なロードモジュールが,パス3(パス3を用いない場合はパス2)
3641 で生成された仮のロードモジュールと同じメモリ配置であることをチェックす
3642 る.両者のメモリ配置が異なっていた場合には,ロードモジュールが正しく生
3643 成されていない可能性があるが,これは,コンフィギュレーション処理の不具
3644 合を示すものである.
3645
3646 【μITRON4.0仕様との関係】
3647
3648 コンフィギュレータの処理モデルは全面的に変更した.
3649
3650 2.12.6 静的APIのパラメータに関するエラー検出
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
74
3651
3652 静的APIのパラメータに関するエラー検出は,同じものがサービスコールとして
3653 呼ばれた場合と同等とすることを原則とする【NGKI0478】.言い換えると,サー
3654 ビスコールによっても検出できないエラーは,静的APIにおいても検出しない.
3655 静的APIの機能説明中の「E_XXXXXエラーとなる」または「E_XXXXXエラーが返る」
3656 という記述は,コンフィギュレータがそのエラーを検出することを意味する.
3657
3658 ただし,エラーの種類によっては,サービスコールと同等のエラー検出を行う
3659 ことが難しいため,そのようなものについては例外とする【NGKI0479】.例え
3660 ば,メモリ不足をコンフィギュレータによって検出するのは容易ではない.
3661
3662 逆に,オブジェクト属性については,サービスコールより強力なエラーチェッ
3663 クを行える可能性がある.例えば,タスク属性にTA_STAと記述されている場合,
3664 サービスコールではエラーを検出できないが,コンフィギュレータでは検出で
3665 きる可能性がある.ただし,このようなエラー検出を完全に行おうとするとコ
3666 ンフィギュレータが複雑になるため,このようなエラーを検出することは必須
3667 とせず,検出できた場合には警告として報告する【NGKI0480】.
3668
3669 【μITRON4.0仕様との関係】
3670
3671 μITRON4.0仕様では,静的APIのパラメータに関するエラー検出について規定さ
3672 れていない.
3673
3674 2.12.7 オブジェクトのID番号の指定
3675
3676 コンフィギュレータのオプション機能として,アプリケーション設計者がオブ
3677 ジェクトのID番号を指定するための次の機能を用意する.
3678
3679 コンフィギュレータのオプション指定により,オブジェクト識別名とID番号の
3680 対応表を含むファイルを渡すと,コンフィギュレータはそれに従ってオブジェ
3681 クトにID番号を割り付ける【NGKI0481】.それに従ったID番号割付けができな
3682 い場合(ID番号に抜けができる場合など)には,コンフィギュレータはエラー
3683 を報告する【NGKI0482】.
3684
3685 またコンフィギュレータは,オプション指定により,オブジェクト識別名とコ
3686 ンフィギュレータが割り付けたID番号の対応表を含むファイルを,コンフィギュ
3687 レータに渡すファイルと同じフォーマットで生成する【NGKI0483】.
3688
3689 【μITRON4.0仕様との関係】
3690
3691 μITRON4.0仕様では,オブジェクト生成のための静的APIのID番号を指定するパ
3692 ラメータに整数値を記述できるため,このような機能は用意されていない.
3693
3694 2.13 TOPPERSネーミングコンベンション
3695
3696 この節では,TOPPERSソフトウェアのAPIの構成要素の名称に関するネーミング
3697 コンベンションについて述べる.このネーミングコンベンションは,モジュー
3698 ル間のインタフェースに関わる名称に適用することを想定しているが,モジュー
3699 ル内部の名称に適用してもよい.
3700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
75
3701 2.13.1 モジュール識別名
3702
3703 異なるモジュールのAPIの構成要素の名称が衝突することを避けるために,各モ
3704 ジュールに対して,それを識別するためのモジュール識別名を定める.モジュー
3705 ル識別名は,英文字と数字で構成し,2~8文字程度の長さとする.
3706
3707 カーネルのモジュール識別名は"kernel",システムインタフェースレイヤのモ
3708 ジュール識別名は"sil"とする.
3709
3710 APIの構成要素の名称には,モジュール識別名を含めることを原則とするが,カー
3711 ネルのAPIなど,頻繁に使用されて衝突のおそれが少ない場合には,モジュール
3712 識別名を含めない名称を使用する.
3713
3714 以下では,モジュール識別名の英文字を英小文字としたものをwww,英大文字と
3715 したものをWWWと表記する.
3716
3717 2.13.2 データ型名
3718
3719 各サイズの整数型など,データの意味を定めない基本データ型の名称は,英小
3720 文字,数字,"_"で構成する.データ型であることを明示するために,末尾が
3721 "_t"である名称とする.
3722
3723 複合データ型やデータの意味を定めるデータ型の名称は,英大文字,数字,
3724 "_"で構成する.データ型であることを明示するために,先頭が"T_"または末尾
3725 が"_T"である名称とする場合もある.
3726
3727 データ型の種類毎に,次のネーミングコンベンションを定める.
3728
3729 (A) パケットのデータ型
3730
3731 T_CYYY acre_yyy に渡すパケットのデータ型
3732 T_DYYY def_yyyに渡すパケットのデータ型
3733 T_RYYY ref_yyy に渡すパケットのデータ型
3734 T_WWW_CYYY www_acre_yyy に渡すパケットのデータ型
3735 T_WWW_DYYY www_def_yyy に渡すパケットのデータ型
3736 T_WWW_RYYY www_ref_yyy に渡すパケットのデータ型
3737
3738 2.13.3 関数名
3739
3740 関数の名称は,英小文字,数字,"_"で構成する.
3741
3742 関数の種類毎に,次のネーミングコンベンションを定める.
3743
3744 (A) サービスコール
3745
3746 サービスコールは,xxx_yyyまたはwww_xxx_yyyの名称とする.ここで,xxxは操
3747 作の方法,yyyは操作の対象を表す.xxx_yyyまたはwww_xxx_yyyから派生したサー
3748 ビスコールは,それぞれzxxx_yyyまたはwww_zxxx_yyyの名称とする.ここでzは,
3749 派生したことを表す文字である.派生したことを表す文字を2つ付加する場合に
3750 は,zzxxx_yyyまたはwww_zzxxx_yyyの名称となる.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
76
3751
3752 非タスクコンテキスト専用のサービスコールの名称は,派生したことを表す文
3753 字として"i"を付加し,ixxx_yyy,izxxx_yyy,www_ixxx_yyy,www_izxxx_yyyと
3754 いった名称とする.
3755
3756 【補足説明】
3757
3758 サービスコールの名称を構成する省略名(xxx,yyy,z)の元になった英語につ
3759 いては,「5.10 省略名の元になった英語」の節を参照すること.
3760
3761 (B) コールバック
3762
3763 コールバックの名称は,サービスコールのネーミングコンベンションに従う.
3764
3765 2.13.4 変数名
3766
3767 変数(const修飾子のついたものを含む)の名称は,英小文字,数字,"_"で構
3768 成する.データ型が異なる変数には,異なる名称を付けることを原則とする.
3769
3770 変数の名称に関して,次のガイドラインを設ける.
3771
3772 ~id ~ID(オブジェクトのID番号,ID型)
3773 ~no ~番号(オブジェクト番号)
3774 ~atr ~属性(オブジェクト属性,ATR型)
3775 ~stat ~状態(オブジェクト状態,STAT型)
3776 ~mode ~モード(サービスコールの動作モード,MODE型)
3777 ~pri ~優先度(優先度,PRI型)
3778 ~sz ~サイズ(単位はバイト数,SIZE型またはuint_t型)
3779 ~cnt ~の個数(単位は個数,uint_t型)
3780 ~ptn ~パターン
3781 ~tim ~時刻,~時間
3782 ~cd ~コード
3783 i~ ~の初期値
3784 max~ ~の最大値
3785 min~ ~の最小値
3786 left~ ~の残り
3787
3788 また,ポインタ変数(関数ポインタを除く)の名称に関して,次のガイドライ
3789 ンを設ける.
3790
3791 p_~ ポインタ
3792 pp_~ ポインタを入れる領域へのポインタ
3793 pk_~ パケットへのポインタ
3794 ppk_~ パケットへのポインタを入れる領域へのポインタ
3795
3796 変数の種類毎に,次のネーミングコンベンションを定める.
3797
3798 (A) パケットへのポインタ
3799
3800 pk_cyyy acre_yyy に渡すパケットへのポインタ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
77
3801 pk_dyyy def_yyyに渡すパケットへのポインタ
3802 pk_ryyy ref_yyy に渡すパケットへのポインタ
3803 pk_www_cyyy www_acre_yyy に渡すパケットへのポインタ
3804 pk_www_dyyy www_def_yyy に渡すパケットへのポインタ
3805 pk_www_ryyy www_ref_yyy に渡すパケットへのポインタ
3806
3807 2.13.5 定数名
3808
3809 定数(C言語プリプロセッサのマクロ定義によるもの)の名称は,英大文字,数
3810 字,"_"で構成する.
3811
3812 定数の種類毎に,次のネーミングコンベンションを定める.
3813
3814 (A) メインエラーコード
3815
3816 メインエラーコードは,先頭が"E_"である名称とする.
3817
3818 (B) 機能コード
3819
3820 TFN_XXX_YYY xxx_yyy の機能コード
3821 TFN_WWW_XXX_YYY www_xxx_yyy の機能コード
3822
3823 (C) その他の定数
3824
3825 その他の定数は,先頭がTUU_またはTUU_WWW_である名称とする.ここでUUは,
3826 定数の種類またはデータ型を表す.同じパラメータまたはリターンパラメータ
3827 に用いられる定数の名称については,UUを同一にすることを原則とする.
3828
3829 また,定数の名称に関して,次のガイドラインを設ける.
3830
3831 TA_~ オブジェクトの属性値
3832 TSZ_~ ~のサイズ
3833 TBIT_~ ~のビット数
3834 TMAX_~ ~の最大値
3835 TMIN_~ ~の最小値
3836
3837 2.13.6 マクロ名
3838
3839 マクロ(C言語プリプロセッサのマクロ定義によるもの)の名称は,それが表す
3840 構成要素のネーミングコンベンションに従う.すなわち,関数を表すマクロは
3841 関数のネーミングコンベンションに,定数を表すマクロは定数のネーミングコ
3842 ンベンションに従う.ただし,簡単な関数を表すマクロや,副作用があるなど
3843 の理由でマクロであることを明示したい場合には,英大文字,数字,"_"で構成
3844 する場合もある.
3845
3846 マクロの種類毎に,次のネーミングコンベンションを定める.
3847
3848 (A) 構成マクロ
3849
3850 構成マクロの名称は,英大文字,数字,"_"で構成し,次のガイドラインを設け
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
78
3851 る.
3852
3853 TSZ_~ ~のサイズ
3854 TBIT_~ ~のビット数
3855 TMAX_~ ~の最大値
3856 TMIN_~ ~の最小値
3857
3858 2.13.7 静的API名
3859
3860 静的APIの名称は,英大文字,数字,"_"で構成し,対応するサービスコールの
3861 名称中の英小文字を英大文字で置き換えたものとする.対応するサービスコー
3862 ルがない場合には,サービスコールのネーミングコンベンションに従って定め
3863 た名称中の英小文字を英大文字で置き換えたものとする.
3864
3865 2.13.8 ファイル名
3866
3867 ファイルの名称は,英小文字,数字,"_","."で構成する.英大文字と英小文
3868 字を区別しないファイルシステムに対応するために,英大文字は使用しない.
3869 また,"-"も使用しない.
3870
3871 ファイルの種類毎に,次のネーミングコンベンションを定める.
3872
3873 (A) ヘッダファイル
3874
3875 モジュールを用いるために必要な定義を含むヘッダファイルは,そのモジュー
3876 ルのモジュール識別名の末尾に".h"を付加した名前(すなわち,www.h)とする.
3877
3878 2.13.9 モジュール内部の名称の衝突回避
3879
3880 モジュール内部の名称が,他のモジュール内部の名称と衝突することを避ける
3881 ために,次のガイドラインを設ける.
3882
3883 モジュール内部に閉じて使われる関数や変数などの名称で,オブジェクトファ
3884 イルのシンボル表に登録されて外部から参照できる名称は,C言語レベルで,先
3885 頭が_www_または_WWW_である名称とする.例えば,カーネルの内部シンボルは,
3886 C言語レベルで,先頭が"_kernel_"または"_KERNEL_"である名称とする.
3887
3888 また,モジュールを用いるために必要な定義を含むヘッダファイル中に用いる
3889 名称で,それをインクルードする他のモジュールで使用する名称と衝突する可
3890 能性のある名称は,"TOPPERS_"で始まる名称とする.
3891
3892 2.14 TOPPERS共通定義
3893
3894 TOPPERSソフトウェアに共通に用いる定義を,TOPPERS共通定義と呼ぶ.
3895
3896 2.14.1 TOPPERS共通ヘッダファイル
3897
3898 TOPPERS共通定義(共通データ型,共通定数,共通マクロ)は,TOPPERS共通ヘッ
3899 ダファイル(t_stddef.h)およびそこからインクルードされるファイルに含ま
3900 れている【NGKI0484】.TOPPERS共通定義を用いる場合には,TOPPERS共通ヘッ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
79
3901 ダファイルをインクルードする【NGKI0485】.
3902
3903 TOPPERS共通ヘッダファイルは,カーネルヘッダファイル(kernel.h)やシステ
3904 ムインタフェースレイヤヘッダファイル(sil.h)からインクルードされるため,
3905 これらのファイルをインクルードする場合には,TOPPERS共通ヘッダファイルを
3906 直接インクルードする必要はない【NGKI0486】.
3907
3908 2.14.2 TOPPERS共通データ型
3909
3910 C90に規定されているデータ型以外で,TOPPERSソフトウェアで共通に用いるデー
3911 タ型は次の通りである【NGKI0487】.
3912
3913 int8_t 符号付き8ビット整数(オプション,C99準拠)
3914 uint8_t 符号無し8ビット整数(オプション,C99準拠)
3915 int16_t 符号付き16ビット整数(C99準拠)
3916 uint16_t 符号無し16ビット整数(C99準拠)
3917 int32_t 符号付き32ビット整数(C99準拠)
3918 uint32_t 符号無し32ビット整数(C99準拠)
3919 int64_t 符号付き64ビット整数(オプション,C99準拠)
3920 uint64_t 符号無し64ビット整数(オプション,C99準拠)
3921 int128_t 符号付き128ビット整数(オプション,C99準拠)
3922 uint128_t 符号無し128ビット整数(オプション,C99準拠)
3923
3924 int_least8_t 8 ビット以上の符号付き整数(C99準拠)
3925 uint_least8_t int_least8_t 型と同じサイズの符号無し整数(C99準拠)
3926
3927 float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプション)
3928 double64_t IEEE754 準拠の64ビット倍精度浮動小数点数(オプション)
3929
3930 bool_t 真偽値(trueまたはfalse)
3931 int_t 16ビット以上の符号付き整数
3932 uint_t int_t 型と同じサイズの符号無し整数
3933 long_t 32ビット以上かつint_t型以上のサイズの符号付き整数
3934 ulong_t long_t 型と同じサイズの符号無し整数
3935
3936 intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠)
3937 uintptr_t intptr_t 型と同じサイズの符号無し整数(C99準拠)
3938
3939 FN 機能コード(符号付き整数,int_tに定義)
3940 ER 正常終了(E_OK)またはエラーコード(符号付き整数,int_t
3941 に定義)
3942 ID オブジェクトのID番号(符号付き整数,int_tに定義)
3943 ATR オブジェクト属性(符号無し整数,uint_tに定義)
3944 STAT オブジェクトの状態(符号無し整数,uint_tに定義)
3945 MODE サービスコールの動作モード(符号無し整数,uint_tに定義)
3946 PRI 優先度(符号付き整数,int_tに定義)
3947 SIZE メモリ領域のサイズ(符号無し整数,ポインタを格納できる
3948 サイズの符号無し整数型に定義)
3949
3950 TMO タイムアウト指定(符号付き整数,単位はミリ秒,int_tに定義)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
80
3951 RELTIM 相対時間(符号無し整数,単位はミリ秒,uint_tに定義)
3952 SYSTIM システム時刻(符号無し整数,単位はミリ秒,ulong_tに定義)
3953 SYSUTM 性能評価用システム時刻(符号無し整数,単位はマイクロ秒,
3954 ulong_tに定義)
3955
3956 FP プログラムの起動番地(型の定まらない関数ポインタ)
3957
3958 ER_BOOL エラーコードまたは真偽値(符号付き整数,int_tに定義)
3959 ER_ID エラーコードまたはID番号(符号付き整数,int_tに定義,
3960 負のID番号は格納できない)
3961 ER_UINT エラーコードまたは符号無し整数(符号付き整数,int_tに
3962 定義,符号無し整数を格納する場合の有効ビット数はuint_t
3963 より1ビット短い)
3964
3965 MB_T オブジェクト管理領域を確保するためのデータ型
3966
3967 ACPTN アクセス許可パターン(符号無し32ビット整数,uint32_tに
3968 定義)
3969 ACVCT アクセス許可ベクタ
3970
3971 ここで,データ型が「AまたはB」とは,AかBのいずれかの値を取ることを示す.
3972 例えばER_BOOLは,エラーコードまたは真偽値のいずれかの値を取る.
3973
3974 int8_t,uint8_t,int64_t,uint64_t,int128_t,uint128_t,float32_t,
3975 double64_tが使用できるかどうかは,ターゲット定義である【NGKI0488】.こ
3976 れらが使用できるかどうかは,それぞれ,INT8_MAX,UINT8_MAX,INT64_MAX,
3977 UINT64_MAX,INT128_MAX,UINT128_MAX,FLOAT32_MAX,DOUBLE64_MAXがマクロ
3978 定義されているかどうかで判別することができる【NGKI0489】.IEEE754準拠の
3979 浮動小数点数がサポートされていない場合には,ターゲット定義で,
3980 float32_tとdouble64_tは使用できないものとする【NGKI0490】.
3981
3982 【μITRON4.0仕様との関係】
3983
3984 B,UB,H,UH,W,UW,D,UD,VP_INTに代えて,C99準拠のint8_t,uint8_t,
3985 int16_t,uint16_t,int32_t,uint32_t,int64_t,uint64_t,intptr_tを用い
3986 ることにした.また,uintptr_t,int128_t,uint128_tを用意することにした.
3987
3988 VPは,void *と等価であるため,用意しないことにした.また,ターゲットシ
3989 ステムにより振舞いが一定しないことから,VB,VH,VW,VDに代わるデータ型
3990 は用意しないことにした.
3991
3992 INT,UINTに代えて,C99の型名と相性が良いint_t,uint_tを用いることにした.
3993 また,32ビット以上かつint_t型(またはuint_t型)以上のサイズが保証される
3994 整数型として,long_t,ulong_tを用意し,8ビット以上のサイズで必ず存在す
3995 る整数型として,C99準拠のint_least8_t,uint_least8_tを導入することにし
3996 た.int_least16_t,uint_least16_t,int_least32_t,uint_least32_tを導入
3997 しなかったのは,16ビットおよび32ビットの整数型があることを仮定しており,
3998 それぞれint16_t,uint16_t,int32_t,uint32_tで代用できるためである.
3999
4000 TECSとの整合性を取るために,BOOLに代えて,bool_tを用いることにした.ま
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
81
4001 た,IEEE754準拠の単精度浮動小数点数を表す型としてfloat32_t,IEEE754準拠
4002 の64ビットを表す型としてdouble64_tを導入した.
4003
4004 性能評価用システム時刻のためのデータ型としてSYSUTMを,オブジェクト管理
4005 領域を確保するためのデータ型としてMB_Tを用意することにした
4006
4007 2.14.3 TOPPERS共通定数
4008
4009 C90に規定されている定数以外で,TOPPERSソフトウェアで共通に用いる定数は
4010 次の通りである(一部,C90に規定されているものも含む).
4011
4012 (1) 一般定数【NGKI0491】
4013
4014 NULL 無効ポインタ
4015
4016 true 1 真
4017 false 0 偽
4018
4019 E_OK 0 正常終了
4020
4021 【μITRON4.0仕様との関係】
4022
4023 BOOLをbool_tに代えたことから,TRUEおよびFALSEに代えて,trueおよびfalse
4024 を用いることにした.
4025
4026 (2) 整数型に格納できる最大値と最小値【NGKI0492】
4027
4028 INT8_MAX int8_tに格納できる最大値(オプション,C99準拠)
4029 INT8_MIN int8_t に格納できる最小値(オプション,C99準拠)
4030 UINT8_MAX uint8_t に格納できる最大値(オプション,C99準拠)
4031 INT16_MAX int16_t に格納できる最大値(C99準拠)
4032 INT16_MIN int16_tに格納できる最小値(C99準拠)
4033 UINT16_MAX uint16_t に格納できる最大値(C99準拠)
4034 INT32_MAX int32_t に格納できる最大値(C99準拠)
4035 INT32_MIN int32_t に格納できる最小値(C99準拠)
4036 UINT32_MAX uint32_t に格納できる最大値(C99準拠)
4037 INT64_MAX int64_t に格納できる最大値(オプション,C99準拠)
4038 INT64_MIN int64_t に格納できる最小値(オプション,C99準拠)
4039 UINT64_MAX uint64_t に格納できる最大値(オプション,C99準拠)
4040 INT128_MAX int128_t に格納できる最大値(オプション,C99準拠)
4041 INT128_MIN int128_t に格納できる最小値(オプション,C99準拠)
4042 UINT128_MAX uint128_t に格納できる最大値(オプション,C99準拠)
4043
4044 INT_LEAST8_MAX int_least8_t に格納できる最大値(C99準拠)
4045 INT_LEAST8_MIN int_least8_t に格納できる最小値(C99準拠)
4046 UINT_LEAST8_MAX uint_least8_t に格納できる最大値(C99準拠)
4047 INT_MAX int_t に格納できる最大値(C90準拠)
4048 INT_MIN int_t に格納できる最小値(C90準拠)
4049 UINT_MAX uint_t に格納できる最大値(C90準拠)
4050 LONG_MAX long_t に格納できる最大値(C90準拠)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
82
4051 LONG_MIN long_t に格納できる最小値(C90準拠)
4052 ULONG_MAX ulong_t に格納できる最大値(C90準拠)
4053
4054 FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮
4055 動小数点数(オプション)
4056 FLOAT32_MAX float32_t に格納できる表現可能な最大の有限浮動
4057 小数点数(オプション)
4058 DOUBLE64_MIN double64_t に格納できる最小の正規化された正の浮
4059 動小数点数(オプション)
4060 DOUBLE64_MAX double64_t に格納できる表現可能な最大の有限浮動
4061 小数点数(オプション)
4062
4063 (3) 整数型のビット数【NGKI0493】
4064
4065 CHAR_BIT cha r型のビット数(C90準拠)
4066
4067 (4) オブジェクト属性【NGKI0494】
4068
4069 TA_NULL 0U オブジェクト属性を指定しない
4070
4071 (5) タイムアウト指定【NGKI0495】
4072
4073 TMO_POL 0 ポーリング
4074 TMO_FEVR -1 永久待ち
4075 TMO_NBLK -2 ノンブロッキング
4076
4077 (6) アクセス許可パターン【NGKI0496】
4078
4079 TACP_KERNEL 0U カーネルドメインのみにアクセスを許可
4080 TACP_SHARED ̃0U すべての保護ドメインにアクセスを許可
4081
4082 2.14.4 TOPPERS共通エラーコード
4083
4084 TOPPERSソフトウェアで共通に用いるメインエラーコードは次の通りである
4085 【NGKI0497】.
4086
4087 (A) 内部エラークラス(EC_SYS,-5~-8)
4088
4089 E_SYS -5 システムエラー
4090
4091 (B) 未サポートエラークラス(EC_NOSPT,-9~-16)
4092
4093 E_NOSPT -9 未サポート機能
4094 E_RSFN -10 予約機能コード
4095 E_RSATR -11 予約属性
4096
4097 (C) パラメータエラークラス(EC_PAR,-17~-24)
4098
4099 E_PAR -17 パラメータエラー
4100 E_ID -18 不正ID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
83
4101
4102 (D) 呼出しコンテキストエラークラス(EC_CTX,-25~-32)
4103
4104 E_CTX -25 コンテキストエラー
4105 E_MACV -26 メモリアクセス違反
4106 E_OACV -27 オブジェクトアクセス違反
4107 E_ILUSE -28 サービスコール不正使用
4108
4109 (E) 資源不足エラークラス(EC_NOMEM,-33~-40)
4110
4111 E_NOMEM -33 メモリ不足
4112 E_NOID -34 ID番号不足
4113 E_NORES -35 資源不足
4114
4115 (F) オブジェクト状態エラークラス(EC_OBJ,-41~-48)
4116
4117 E_OBJ -41 オブジェクト状態エラー
4118 E_NOEXS -42 オブジェクト未登録
4119 E_QOVR -43 キューイングオーバフロー
4120
4121 (G) 待ち解除エラークラス(EC_RLWAI,-49~-56)
4122
4123 E_RLWAI -49 待ち禁止状態または待ち状態の強制解除
4124 E_TMOUT -50 ポーリング失敗またはタイムアウト
4125 E_DLT -51 待ちオブジェクトの削除または再初期化
4126 E_CLS -52 待ちオブジェクトの状態変化
4127
4128 (H) 警告クラス(EC_WARN,-57~-64)
4129
4130 E_WBLK -57 ノンブロッキング受付け
4131 E_BOVR -58 バッファオーバフロー
4132
4133 このエラークラスに属するエラーコードは,警告を表すエラーコードであり,
4134 [NGKI0019]の原則では例外としている.
4135
4136 【μITRON4.0仕様との関係】
4137
4138 E_NORESは,μITRON4.0仕様に規定されていないエラーコードである.
4139
4140 2.14.5 TOPPERS共通マクロ
4141
4142 (1) 整数定数を作るマクロ【NGKI0498】
4143
4144 INT8_C(val) int_least8_t 型の定数を作るマクロ(C99準拠)
4145 UINT8_C(val) uint_least8_t 型の定数を作るマクロ(C99準拠)
4146 INT16_C(val) int16_t 型の定数を作るマクロ(C99準拠)
4147 UINT16_C(val) uint16_t 型の定数を作るマクロ(C99準拠)
4148 INT32_C(val) int32_t 型の定数を作るマクロ(C99準拠)
4149 UINT32_C(val) uint32_t 型の定数を作るマクロ(C99準拠)
4150 INT64_C(val) int64_t型の定数を作るマクロ(オプション,C99準拠)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
84
4151 UINT64_C(val) uint64_t 型の定数を作るマクロ(オプション,C99準拠)
4152 INT128_C(val) int128_t 型の定数を作るマクロ(オプション,C99準拠)
4153 UINT128_C(val) uint128_t 型の定数を作るマクロ(オプション,C99準拠)
4154
4155 UINT_C(val) uint_t 型の定数を作るマクロ
4156 ULONG_C(val) ulong_t 型の定数を作るマクロ
4157
4158 【仕様決定の理由】
4159
4160 C99に用意されていないUINT_CとULONG_Cを導入したのは,アセンブリ言語から
4161 も参照する定数を記述するためである.C言語のみで用いる定数をこれらのマク
4162 ロを使って記述する必要はない.
4163
4164 (2) 型に関する情報を取り出すためのマクロ【NGKI0499】
4165
4166 offsetof(structure, field) 構造体structure中のフィールドfieldの
4167 バイト位置を返すマクロ(C90準拠)
4168
4169 alignof(typ e) 型typeのアラインメント単位を返すマクロ
4170
4171 ALIGN_TYPE(addr, type) 番地addrが型typeに対してアラインしてい
4172 るかどうかを返すマクロ
4173
4174 (3) assertマクロ【NGKI0500】
4175
4176 assert(exp) expが成立しているかを検査するマクロ(C90準拠)
4177
4178 (4) コンパイラの拡張機能のためのマクロ【NGKI0501】
4179
4180 inline インライン関数
4181 Inline ファイルローカルなインライン関数
4182 asm インラインアセンブラ
4183 Asm インラインアセンブラ(最適化抑止)
4184 throw() 例外を発生しない関数
4185 NoReturn リターンしない関数
4186
4187 (5) エラーコード構成・分解マクロ【NGKI0502】
4188
4189 ERCD(mercd, sercd) メインエラーコードmercdとサブエラーコードsercdか
4190 ら,エラーコードを構成するためのマクロ
4191
4192 MERCD(ercd) エラーコードercdからメインエラーコードを抽出する
4193 ためのマクロ
4194 SERCD(ercd) エラーコードercdからサブエラーコードを抽出するた
4195 めのマクロ
4196
4197 (6) アクセス許可パターン構成マクロ【NGKI0503】
4198
4199 TACP(domid) domid で指定されるユーザドメインのみにアクセスを
4200 許可するアクセス許可パターンを構成するためのマ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
85
4201 クロ
4202
4203 ここで,TACPのパラメータ(domid)には,ユーザドメインのID番号のみを指定
4204 することができる【NGKI0504】.TDOM_SELF,TDOM_KERNEL,TDOM_NONEを指定し
4205 た場合の動作は,保証されない【NGKI0505】.
4206
4207 2.14.6 TOPPERS共通構成マクロ
4208
4209 (1) 相対時間の範囲【NGKI0506】
4210
4211 TMAX_RELTIM 相対時間に指定できる最大値
4212
4213 2.15 カーネル共通定義
4214
4215 カーネルの複数の機能で共通に用いる定義を,カーネル共通定義と呼ぶ.
4216
4217 2.15.1 カーネルヘッダファイル
4218
4219 カーネルを用いるために必要な定義は,カーネルヘッダファイル(kernel.h)
4220 およびそこからインクルードされるファイルに含まれている【NGKI0507】.カー
4221 ネルを用いる場合には,カーネルヘッダファイルをインクルードする
4222 【NGKI0508】.
4223
4224 ただし,カーネルを用いるために必要な定義の中で,コンフィギュレータによっ
4225 て生成されるものは,カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
4226 に含まれる【NGKI0509】.具体的には,登録できるオブジェクトの数
4227 (TNUM_YYY)やオブジェクトのID番号などの定義が,これに該当する.これら
4228 の定義を用いる場合には,カーネル構成・初期化ヘッダファイルをインクルー
4229 ドする【NGKI0510】.
4230
4231 μITRON4.0仕様で規定されており,この仕様で廃止されたデータ型および定数
4232 を用いる場合には,ITRON仕様互換ヘッダファイル(itron.h)をインクルード
4233 する【NGKI0511】.
4234
4235 【μITRON4.0仕様との関係】
4236
4237 この仕様では,コンフィギュレータが生成するヘッダファイルに,オブジェク
4238 トのID番号の定義に加えて,登録できるオブジェクトの数(TNUM_YYY)の定義
4239 が含まれることとした.これに伴い,ヘッダファイルの名称を,μITRON4.0仕
4240 様の自動割付け結果ヘッダファイル(kernel_id.h)から,カーネル構成・初期
4241 化ヘッダファイル(kernel_cfg.h)に変更した.
4242
4243 2.15.2 カーネル共通定数
4244
4245 (1) オブジェクト属性【NGKI0512】
4246
4247 TA_TPRI 0x01U タスクの待ち行列をタスクの優先度順に
4248
4249 【μITRON4.0仕様との関係】
4250
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
86
4251 値が0のオブジェクト属性(TA_HLNG,TA_TFIFO,TA_MFIFO,TA_WSGL)は,デフォ
4252 ルトの扱いにして廃止した.これは,「(tskatr & TA_HLNG) != 0U」のような
4253 間違いを防ぐためである.TA_ASMは,有効な使途がないために廃止した.
4254 TA_MPRIは,メールボックス機能でのみ使用するため,カーネル共通定義から外
4255 した.
4256
4257 (2) 保護ドメインID【NGKI0513】
4258
4259 TDOM_SELF 0 自タスクの属する保護ドメイン
4260 TDOM_KERNEL -1 カーネルドメイン
4261 TDOM_NONE -2 無所属(保護ドメインに属さない)
4262
4263 (3) その他のカーネル共通定数【NGKI0514】
4264
4265 TCLS_SELF 0 自タスクの属するクラス
4266
4267 TPRC_NONE 0 割付けプロセッサの指定がない
4268 TPRC_INI 0 初期割付けプロセッサ
4269
4270 TSK_SELF 0 自タスク指定
4271 TSK_NONE 0 該当するタスクがない
4272
4273 TPRI_SELF 0 自タスクのベース優先度の指定
4274 TPRI_INI 0 タスクの起動時優先度の指定
4275
4276 TIPM_ENAALL 0 割込み優先度マスク全解除
4277
4278 (4) カーネルで用いるメインエラーコード
4279
4280 「2.14.4 TOPPERS共通エラーコード」の節で定義したメインエラーコードの中
4281 で,E_CLS,E_WBLK,E_BOVRの3つは,カーネルでは使用しない【NGKI0515】.
4282
4283 【TOPPERS/ASPカーネルにおける規定】
4284
4285 ASPカーネルでは,サービスコールから,E_RSFN,E_RSATR,E_MACV,E_OACV,
4286 E_NOMEM,E_NOID,E_NORES,E_NOEXSが返る状況は起こらない【ASPS0011】.
4287 E_RSATRは,コンフィギュレータによって検出される【ASPS0012】.ただし,動
4288 的生成機能拡張パッケージでは,E_RSATR,E_NOMEM,E_NOID,E_NOEXSが返る状
4289 況が起こる【ASPS0013】.
4290
4291 【TOPPERS/FMPカーネルにおける規定】
4292
4293 FMPカーネルでは,サービスコールから,E_RSFN,E_RSATR,E_MACV,E_OACV,
4294 E_NOMEM,E_NOID,E_NORES,E_NOEXSが返る状況は起こらない【FMPS0007】.
4295 E_RSATRとE_NORESは,コンフィギュレータによって検出される【FMPS0008】.
4296
4297 【TOPPERS/HRP2カーネルにおける規定】
4298
4299 HRP2カーネルでは,サービスコールから,E_RSATR,E_NOID,E_NORES,
4300 E_NOEXSが返る状況は起こらない【HRPS0006】.E_RSATRは,コンフィギュレー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
87
4301 タによって検出される【HRPS0007】.
4302
4303 【TOPPERS/SSPカーネルにおける規定】
4304
4305 SSPカーネルでは,サービスコールから,E_RSFN,E_RSATR,E_MACV,E_OACV,
4306 E_ILUSE,E_NOMEM,E_NOID,E_NORES,E_NOEXS,E_RLWAI,E_TMOUT,E_DLTが返
4307 る状況は起こらない【SSPS0008】.E_RSATRは,コンフィギュレータによって検
4308 出される【SSPS0009】.
4309
4310 2.15.3 カーネル共通マクロ
4311
4312 (1) スタック領域をアプリケーションで確保するためのデータ型とマクロ
4313
4314 スタック領域をアプリケーションで確保するために,次のデータ型とマクロを
4315 用意している【NGKI0516】.
4316
4317 STK_T スタック領域を確保するためのデータ型
4318
4319 COUNT_STK_T(sz) サイズszのスタック領域を確保するために必要な
4320 STK_T 型の配列の要素数
4321 ROUND_STK_T(sz) 要素数COUNT_STK_T(sz)のSTK_T型の配列のサイズ(sz
4322 を,STK_T型のサイズの倍数になるように大きい方に
4323 丸めた値)
4324
4325 これらを用いてスタック領域を確保する方法は次の通り【NGKI0517】.
4326
4327 STK_T <スタック領域の変数名>[COUNT_STK_T(<スタック領域のサイズ>)];
4328
4329 この方法で確保したスタック領域を,サービスコールまたは静的APIに渡す場合
4330 には,スタック領域の先頭番地に<スタック領域の変数名>を,スタック領域の
4331 サイズにROUND_STK_T(<スタック領域のサイズ>)を指定する【NGKI0518】.
4332
4333 ただし,保護機能対応カーネルにおいては,上の方法によりタスクのユーザス
4334 タック領域を確保することはできない【NGKI0519】.詳しくは,「4.1 タスク
4335 管理機能」の節のCRE_TSKの機能の項を参照すること.
4336
4337 (2) オブジェクト属性を作るマクロ
4338
4339 保護機能対応カーネルでは,オブジェクトが属する保護ドメインを指定するた
4340 めのオブジェクト属性を作るマクロとして,次のマクロを用意している
4341 【NGKI0520】.
4342
4343 TA_DOM(domid) domid で指定される保護ドメインに属する
4344
4345 マルチプロセッサ対応カーネルでは,オブジェクトが属するクラスを指定する
4346 ためのオブジェクト属性を作るマクロとして,次のマクロを用意している
4347 【NGKI0521】.
4348
4349 TA_CLS(clsid) clsid で指定されるクラスに属する
4350
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
88
4351 (3) サービスコールの呼出し方法を指定するマクロ
4352
4353 保護機能対応カーネルでは,サービスコールの呼出し方法を指定するためのマ
4354 クロとして,次のマクロを用意している【NGKI0522】.
4355
4356 SVC_CALL(svc) svc で指定されるサービスコールを関数呼出しによっ
4357 て呼び出すための名称
4358
4359 2.15.4 カーネル共通構成マクロ
4360
4361 (1) サポートする機能【NGKI0523】
4362
4363 TOPPERS_SUPPORT_PROTECT 保護機能対応のカーネル
4364 TOPPERS_SUPPORT_MULTI_PRC マルチプロセッサ対応のカーネル
4365 TOPPERS_SUPPORT_DYNAMIC_CRE 動的生成対応のカーネル
4366
4367 【未決定事項】
4368
4369 マクロ名は,今後変更する可能性がある.
4370
4371 (2) 優先度の範囲【NGKI0524】
4372
4373 TMIN_TPRI タスク優先度の最小値(=1)
4374 TMAX_TPRI タスク優先度の最大値
4375
4376 【TOPPERS/ASPカーネルにおける規定】
4377
4378 ASPカーネルでは,タスク優先度の最大値(TMAX_TPRI)は16に固定されている
4379 【ASPS0014】.ただし,タスク優先度拡張パッケージを用いると,TMAX_TPRIを
4380 256に拡張することができる【ASPS0015】.
4381
4382 【TOPPERS/FMPカーネルにおける規定】
4383
4384 FMPカーネルでは,タスク優先度の最大値(TMAX_TPRI)は16に固定されている
4385 【FMPS0009】.
4386
4387 【TOPPERS/HRP2カーネルにおける規定】
4388
4389 HRP2カーネルでは,タスク優先度の最大値(TMAX_TPRI)は16に固定されている
4390 【HRPS0008】.
4391
4392 【TOPPERS/SSPカーネルにおける規定】
4393
4394 SSPカーネルでは,タスク優先度の最大値(TMAX_TPRI)は16に固定されている
4395 【SSPS0010】.
4396
4397 【μITRON4.0仕様との関係】
4398
4399 メッセージ優先度の最小値(TMIN_MPRI)と最大値(TMAX_MPRI)は,メールボッ
4400 クス機能でのみ使用するため,カーネル共通定義から外した.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
89
4401
4402 (3) プロセッサの数
4403
4404 マルチプロセッサ対応カーネルでは,プロセッサの数を知るためのマクロとし
4405 て,次の構成マクロを用意している【NGKI0525】.
4406
4407 TNUM_PRCID プロセッサの数
4408
4409 (4) 特殊な役割を持ったプロセッサ
4410
4411 マルチプロセッサ対応カーネルでは,特殊な役割を持ったプロセッサを知るた
4412 めのマクロとして,次の構成マクロを用意している【NGKI0526】.
4413
4414 TOPPERS_MASTER_PRCID マスタプロセッサのID番号
4415 TOPPERS_SYSTIM_PRCID システム時刻管理プロセッサのID番号(グ
4416 ローバルタイマ方式の場合のみ)
4417
4418 (5) タイマ方式
4419
4420 マルチプロセッサ対応カーネルでは,システム時刻の方式を知るためのマクロ
4421 として,次の構成マクロを用意している【NGKI0527】.
4422
4423 TOPPERS_SYSTIM_LOCAL ローカルタイマ方式の場合にマクロ定義
4424 TOPPERS_SYSTIM_GLOBAL グローバルタイマ方式の場合にマクロ定義
4425
4426 (6) バージョン情報【NGKI0528】
4427
4428 TKERNEL_MAKER カーネルのメーカコード(=0x0118)
4429 TKERNEL_PRID カーネルの識別番号
4430 TKERNEL_SPVER カーネル仕様のバージョン番号
4431 TKERNEL_PRVER カーネルのバージョン番号
4432
4433 カーネルのメーカコード(TKERNEL_MAKER)は,TOPPERSプロジェクトから配布
4434 するカーネルでは,TOPPERSプロジェクトを表す値(0x0118)に設定されている.
4435
4436 カーネルの識別番号(TKERNEL_PRID)は,TOPPERSカーネルの種類を表す.
4437
4438 0x0001 TOPPERS/JSP カーネル
4439 0x0002 予約(IIMPカーネル)
4440 0x0003 予約(IDLカーネル)
4441 0x0004 TOPPERS/FI4 カーネル
4442 0x0005 TOPPERS/FDMP カーネル
4443 0x0006 TOPPERS/HRP カーネル
4444 0x0007 TOPPERS/ASP カーネル
4445 0x0008 TOPPERS/FMP カーネル
4446 0x0009 TOPPERS/SSPカーネル
4447 0x000a TOPPERS/ASP Safety カーネル
4448
4449 カーネル仕様のバージョン番号(TKERNEL_SPVER)は,上位8ビット(0xf5)が
4450 TOPPERS新世代カーネル仕様であることを,中位4ビットがメジャーバージョン
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
90
4451 番号,下位4ビットがマイナーバージョン番号を表す.
4452
4453 カーネルのバージョン番号(TKERNEL_PRVER)は,上位4ビットがメジャーバー
4454 ジョン番号,中位8ビットがマイナーバージョン番号,下位4ビットがパッチレ
4455 ベルを表す.
4456
4457
4458 第3章 システムインタフェースレイヤAPI仕様
4459
4460 3.1 システムインタフェースレイヤの概要
4461
4462 システムインタフェースレイヤ(この章では,SILと略記する)は,デバイスを
4463 直接操作するプログラムが用いるための機能である.ITRONデバイスドライバ設
4464 計ガイドラインの一部分として検討されたものをベースに,TOPPERSプロジェク
4465 トにおいて修正を加えて用いている.
4466
4467 SILの機能は,プロセッサの特権モードで実行されているプログラムが使用する
4468 ことを想定している【NGKI0801】.非特権モードで実行されているプログラム
4469 からSILの機能を呼び出した場合の動作は,次の例外を除いては保証されない
4470 【NGKI0802】.
4471
4472 ・微少時間待ちの機能を呼び出すこと
4473 ・エンディアンの取得のためのマクロを参照すること
4474 ・メモリ空間アクセス関数により,アクセスを許可されたメモリ領域にアクセ
4475 スすること
4476 ・I/O空間アクセス関数により,アクセスを許可されたI/O領域にアクセスする
4477 こと
4478
4479 3.2 SILヘッダファイル
4480
4481 SILを用いるために必要な定義は,SILヘッダファイル(sil.h)およびそこから
4482 インクルードされるファイルに含まれている【NGKI0803】.SILを用いる場合に
4483 は,SILヘッダファイルをインクルードする【NGKI0804】.
4484
4485 3.3 全割込みロック状態の制御
4486
4487 デバイスを扱うプログラムの中では,すべての割込み(NMIを除く,以下同じ)
4488 をマスクしたい場合がある.カーネルで制御できるCPUロック状態は,カーネル
4489 管理外の割込み(NMI以外にカーネル管理外の割込みがあるかはターゲット定義)
4490 をマスクしないため,このような場合に用いることはできない.
4491
4492 そこで,SILでは,すべての割込みをマスクする全割込みロック状態を制御する
4493 ための以下の機能を用意している.
4494
4495 (1) SIL_PRE_LOC
4496
4497 全割込みロック状態の制御に必要な変数を宣言するマクロ【NGKI0805】.通常
4498 は,型と変数名を並べたもので,最後に";"を含まない.
4499
4500 このマクロは,SIL_LOC_INT,SIL_UNL_INTを用いる関数またはブロックの先頭
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
91
4501 の変数宣言部に記述しなければならない【NGKI0806】.SIL_LOC_INT,
4502 SIL_UNL_INTを1つの関数内でネストして用いることは可能であるが,その場合
4503 には,ネストレベル毎にブロックを作り,そのブロックの先頭の変数宣言部に
4504 SIL_PRE_LOCを記述しなければならない【NGKI0807】.そのように記述しなかっ
4505 た場合の動作は保証されない【NGKI0808】.
4506
4507 (2) SIL_LOC_INT()
4508
4509 全割込みロックフラグをセットすることで,NMIを除くすべての割込みをマスク
4510 し,全割込みロック状態に遷移する【NGKI0809】.
4511
4512 (3) SIL_UNL_INT()
4513
4514 全割込みロックフラグを,対応するSIL_LOC_INTを実行する前の状態に戻す
4515 【NGKI0810】.SIL_LOC_INTを実行せずにSIL_UNL_INTを呼び出した場合の動作
4516 は保証されない【NGKI0811】.
4517
4518 なお,全割込みロック状態で呼び出せるサービスコールなどの制限事項につい
4519 ては,「2.5.4 全割込みロック状態と全割込みロック解除状態」の節を参照す
4520 ること.
4521
4522 【補足説明】
4523
4524 全割込みロック状態の制御機能の使用例は次の通り.
4525
4526 {
4527 SIL_PRE_LOC;
4528
4529 SIL_LOC_INT();
4530 // この間はNMIを除くすべての割込みがマスクされる.
4531 // この間にサービスコールを呼び出してはならない(一部例外あり).
4532 SIL_UNL_INT();
4533 }
4534
4535 3.4 SILスピンロック
4536
4537 マルチプロセッサシステムにおいて,カーネルの機能を用いずに,他のプロセッ
4538 サとの間でも排他制御を実現したい場合がある.そこでSILでは,割込みのマス
4539 クとプロセッサ間ロックの取得により排他制御を行うためのスピンロックの機
4540 能を用意している.これを,カーネルのスピンロック機能と区別するために,
4541 SILスピンロックと呼ぶ.
4542
4543 プロセッサ間ロックを取得している間は,全割込みロック状態にすることです
4544 べての割込み(NMIを除く)がマスクされる【NGKI0812】.ロックが他のプロセッ
4545 サに取得されている場合には,ロックが取得できるまでループによって待つ
4546 【NGKI0813】.ロックの取得を待つ間は,割込みはマスクされない(ロックの
4547 取得を試みる前にマスクしていた割込みは,マスク解除されない)
4548 【NGKI0814】.プロセッサ間ロックを取得し割込みをマスクすることを,SILス
4549 ピンロックを取得するという.また,プロセッサ間ロックを返却し割込みをマ
4550 スク解除することを,SILスピンロックを返却するという.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
92
4551
4552 SILで取得・返却するプロセッサ間ロックは,システムに唯一存在する
4553 【NGKI0815】.
4554
4555 (1) SIL_PRE_LOC
4556
4557 全割込みロック状態の制御に必要な変数を宣言するマクロであるが,SILスピン
4558 ロックの取得・解放にも兼用する【NGKI0816】.
4559
4560 このマクロは,SIL_LOC_SPN,SIL_UNL_SPNを用いる関数またはブロックの先頭
4561 の変数宣言部に記述しなければならない【NGKI0817】.SIL_LOC_SPN,
4562 SIL_UNL_SPNを,同じ関数内のSIL_LOC_INT,SIL_UNL_INTとネストして用いるこ
4563 とは可能であるが,その場合には,ネストレベル毎にブロックを作り,そのブ
4564 ロックの先頭の変数宣言部にSIL_PRE_LOCを記述しなければならない
4565 【NGKI0818】.そのように記述しなかった場合の動作は保証されない
4566 【NGKI0819】.
4567
4568 (2) SIL_LOC_SPN()
4569
4570 SILスピンロックが取得されていない状態である場合には,プロセッサ間ロック
4571 の取得を試みる【NGKI0820】.ロックが他のプロセッサに取得されている状態
4572 である場合や,他のプロセッサがロックの取得に成功した場合には,ロックが
4573 返却されるまでループによって待ち,返却されたらロックの取得を試みる
4574 【NGKI0821】.ロックの取得に成功した場合には,全割込みロックフラグをセッ
4575 トし,全割込みロック状態に遷移する【NGKI0822】.
4576
4577 (3) SIL_UNL_SPN()
4578
4579 プロセッサ間ロックを返却し,全割込みロックフラグを対応するSIL_LOC_SPNを
4580 実行する前の状態に戻す【NGKI0823】.
4581
4582 SILスピンロックを取得している状態でSIL_LOC_SPNを呼び出した場合の動作は
4583 保証されない【NGKI0824】.逆に,SILスピンロックを取得していない状態で
4584 SIL_UNL_SPNを呼び出した場合の動作も保証されない【NGKI0825】.
4585
4586 なお,SILスピンロック取得中は全割込みロック状態となっているため,SILス
4587 ピンロック取得中に呼び出せるサービスコールなどについては,「2.5.4 全割
4588 込みロック状態と全割込みロック解除状態」の節の制限事項が適用される.
4589
4590 なお,マルチプロセッサシステム以外では,SIL_LOC_SPNとSIL_UNL_SPNは用意
4591 されていない【NGKI0826】.
4592
4593 【使用上の注意】
4594
4595 全割込ロック状態やCPUロック状態でSIL_LOC_SPNを呼び出すことはできるが,
4596 割込みがマスクされている時間が長くなるために,そのような使い方は避ける
4597 べきである.
4598
4599 【補足説明】
4600
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
93
4601 SILスピンロック機能の使用例は次の通り.
4602
4603 {
4604 SIL_PRE_LOC;
4605
4606 SIL_LOC_SPN();
4607 // この間はSILスピンロックを取得している.
4608 // この間はNMIを除くすべての割込みがマスクされる.
4609 // この間にサービスコールを呼び出してはならない(一部例外あり).
4610 SIL_UNL_SPN();
4611 }
4612
4613 3.5 微少時間待ち
4614
4615 デバイスをアクセスする際に,微少な時間待ちを入れなければならない場合が
4616 ある.そのような場合に,NOP命令をいくつか入れるなどの方法で対応すると,
4617 ポータビリティを損なうことになる.そこで,SILでは,微少な時間待ちを行う
4618 ための以下の機能を用意している.
4619
4620 (1) void sil_dly_nse(ulong_t dlytim)
4621
4622 dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ
4623 【NGKI0827】.指定した値によっては,指定した時間よりもかなり長く待つ場
4624 合があるので注意すること.
4625
4626 3.6 エンディアンの取得
4627
4628 プロセッサのバイトエンディアンを取得するためのマクロとして,SILでは,以
4629 下のマクロを定義している.
4630
4631 (1) SIL_ENDIAN_BIG,SIL_ENDIAN_LITTLE
4632
4633 ビッグエンディアンプロセッサではSIL_ENDIAN_BIGを,リトルエンディアンプ
4634 ロセッサではSIL_ENDIAL_LITTLEを,マクロ定義している【NGKI0828】.
4635
4636 3.7 メモリ空間アクセス関数
4637
4638 メモリ空間にマッピングされたデバイスレジスタや,デバイスとの共有メモリ
4639 をアクセスするために,SILでは,以下の関数を用意している.
4640
4641 (1) uint8_t sil_reb_mem(const uint8_t *mem)
4642
4643 memで指定されるアドレスから8ビット単位で読み出した値を返す【NGKI0829】.
4644
4645 (2) void sil_wrb_mem(uint8_t *mem, uint8_t data)
4646
4647 memで指定されるアドレスにdataで指定される値を8ビット単位で書き込む
4648 【NGKI0830】.
4649
4650 (3) uint16_t sil_reh _mem(const uint16_t *mem)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
94
4651
4652 memで指定されるアドレスから16ビット単位で読み出した値を返す【NGKI0831】.
4653
4654 (4) void sil_wrh_mem(uint16_t *mem, uint16_t data)
4655
4656 memで指定されるアドレスにdataで指定される値を16ビット単位で書き込む
4657 【NGKI0832】.
4658
4659 (5) uint16_t sil_reh_lem(const uint16_t *mem)
4660
4661 memで指定されるアドレスから16ビット単位でリトルエンディアンで読み出した
4662 値を返す【NGKI0833】.リトルエンディアンプロセッサでは,sil_reh_memと一
4663 致する.ビッグエンディアンプロセッサでは,sil_reh_memが返す値を,エンディ
4664 アン変換した値を返す.
4665
4666 (6) void sil_wrh_lem(uint16_t *mem, uint16_t data)
4667
4668 memで指定されるアドレスにdataで指定される値を16ビット単位でリトルエンディ
4669 アンで書き込む【NGKI0834】.リトルエンディアンプロセッサでは,
4670 sil_wrh_memと一致する.ビッグエンディアンプロセッサでは,dataをエンディ
4671 アン変換した値を,sil_wrh_memで書き込むのと同じ結果となる.
4672
4673 (7) uint16_t sil_reh_bem(const uint16_t *mem)
4674
4675 memで指定されるアドレスから16ビット単位でビッグエンディアンで読み出した
4676 値を返す【NGKI0835】.ビッグエンディアンプロセッサでは,sil_reh_memと一
4677 致する.リトルエンディアンプロセッサでは,sil_reh_memが返す値を,エンディ
4678 アン変換した値を返す.
4679
4680 (8) void sil_wrh_bem(uint16_t *mem, uint16_t data)
4681
4682 memで指定されるアドレスにdataで指定される値を16ビット単位でビッグエンディ
4683 アンで書き込む【NGKI0836】.ビッグエンディアンプロセッサでは,
4684 sil_wrh_memと一致する.リトルエンディアンプロセッサでは,dataをエンディ
4685 アン変換した値を,sil_wrh_memで書き込むのと同じ結果となる.
4686
4687 (9) uint32_t sil_rew_mem(const uint32_t *mem)
4688
4689 memで指定されるアドレスから32ビット単位で読み出した値を返す【NGKI0837】.
4690
4691 (10) void sil_wrw_mem(uint32_t *mem, uint32_t data)
4692
4693 memで指定されるアドレスにdataで指定される値を32ビット単位で書き込む
4694 【NGKI0838】.
4695
4696 (11) uint32_t sil_rew_lem(const uint32_t *mem)
4697
4698 memで指定されるアドレスから32ビット単位でリトルエンディアンで読み出した
4699 値を返す【NGKI0839】.リトルエンディアンプロセッサでは,sil_rew_memと一
4700 致する.ビッグエンディアンプロセッサでは,sil_rew_memが返す値を,エンディ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
95
4701 アン変換した値を返す.
4702
4703 (12) void sil_wrw_lem(uint32_t *mem, uint32_t data)
4704
4705 memで指定されるアドレスにdataで指定される値を32ビット単位でリトルエンディ
4706 アンで書き込む【NGKI0840】.リトルエンディアンプロセッサでは,
4707 sil_wrw_memと一致する.ビッグエンディアンプロセッサでは,dataをエンディ
4708 アン変換した値を,sil_wrw_memで書き込むのと同じ結果となる.
4709
4710 (13) uint32_t sil_rew_bem(const uint32_t *mem)
4711
4712 memで指定されるアドレスから32ビット単位でビッグエンディアンで読み出した
4713 値を返す【NGKI0841】.ビッグエンディアンプロセッサでは,sil_rew_memと一
4714 致する.リトルエンディアンプロセッサでは,sil_rew_memが返す値を,エンディ
4715 アン変換した値を返す.
4716
4717 (14) void sil_wrw_bem(uint32_t *mem, uint32_t data)
4718
4719 memで指定されるアドレスにdataで指定される値を32ビット単位でビッグエンディ
4720 アンで書き込む【NGKI0842】.ビッグエンディアンプロセッサでは,
4721 sil_wrw_memと一致する.リトルエンディアンプロセッサでは,dataをエンディ
4722 アン変換した値を,sil_wrw_memで書き込むのと同じ結果となる.
4723
4724 3.8 I/O空間アクセス関数
4725
4726 メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
4727 ジスタをアクセスするために,メモリ空間アクセス関数と同等の以下の関数を
4728 用意している【NGKI0843】.
4729
4730 (1) uint8_t sil_reb_iop(const uint8_t *iop)
4731 (2) void sil_wrb_iop(uint8_t *iop, uint8_t data)
4732 (3) uint16_t sil_reh_iop(const uint16_t *iop)
4733 (4) void sil_wrh_iop(uint16_t *iop, uint16_t data)
4734 (5) uint16_t sil_reh_lep(const uint16_t *iop)
4735 (6) void sil_wrh_lep(uint16_t *iop, uint16_t data)
4736 (7) uint16_t sil_reh_b ep(const uint16_t *iop)
4737 (8) void sil_wrh_bep(uint16_t *iop, uint16_t data)
4738 (9) uint32_t sil_rew_iop(const uint32_t *iop)
4739 (10) void sil_wrw_iop(uint32_t *iop, uint32_t data)
4740 (11) uint32_t sil_rew_lep(const uint32_t *i op)
4741 (12) void sil_wrw_lep(uint32_t *iop, uint32_t data)
4742 (13) uint32_t sil_rew_bep(const uint32_t *iop)
4743 (14) void sil_wrw_bep(uint32_t *iop, uint32_t data)
4744
4745 3.9 プロセッサIDの参照
4746
4747 マルチプロセッサシステムにおいては,プログラムがどのプロセッサで実行さ
4748 れているかを参照するために,以下の関数を用意している.
4749
4750 (1) void sil_get_pid(ID *p_prcid)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
96
4751
4752 この関数を呼び出したプログラムを実行しているプロセッサのID番号を参照し,
4753 p_prcidで指定したメモリ領域に返す【NGKI0844】.
4754
4755 【使用上の注意】
4756
4757 タスクは,sil_get_pidを用いて,自タスクを実行しているプロセッサを正しく
4758 参照できるとは限らない.これは,sil_get_pidを呼び出し,自タスクを実行し
4759 ているプロセッサのID番号を参照した直後に割込みが発生した場合,
4760 sil_get_pidから戻ってきた時には自タスクを実行しているプロセッサが変化し
4761 ている可能性があるためである.
4762
4763
4764 第4章 カーネルAPI仕様
4765
4766 この章では,カーネルのAPI仕様について規定する.
4767
4768 【μITRON4.0仕様との関係】
4769
4770 TOPPERS共通データ型に従い,パラメータのデータ型を次の通り変更した.これ
4771 らの変更については,個別のAPI仕様では記述しない.
4772
4773 INT → int_t
4774 UINT → uint_t
4775 VP → void *
4776 VP_INT → intptr_t
4777
4778 【μITRON4.0/PX仕様との関係】
4779
4780 ID番号で識別するオブジェクトのアクセス許可ベクタをデフォルト以外に設定
4781 する場合には,オブジェクトを生成した後に設定することとし,アクセス許可
4782 ベクタを設定する静的API(SAC_YYY)を新設した.逆に,アクセス許可ベクタ
4783 を指定してオブジェクトを生成する機能(CRA_YYY,cra_yyy,acra_yyy)は廃
4784 止した.これらの変更については,個別のAPI仕様では記述しない.
4785
4786 4.1 タスク管理機能
4787
4788 タスクは,プログラムの並行実行の単位で,カーネルが実行を制御する処理単
4789 位である.タスクは,タスクIDと呼ぶID番号によって識別する【NGKI1001】.
4790
4791 タスク管理機能に関連して,各タスクが持つ情報は次の通り【NGKI1002】.
4792
4793 ・タスク属性
4794 ・タスク状態
4795 ・ベース優先度
4796 ・現在優先度
4797 ・起動要求キューイング数
4798 ・割付けプロセッサ(マルチプロセッサ対応カーネルの場合)
4799 ・次回起動時の割付けプロセッサ(マルチプロセッサ対応カーネルの場合)
4800 ・拡張情報
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
97
4801 ・メインルーチンの先頭番地
4802 ・起動時優先度
4803 ・実行時優先度(TOPPERS/SSPカーネルの場合)
4804 ・スタック領域
4805 ・システムスタック領域(保護機能対応カーネルの場合)
4806 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
4807 ・属する保護ドメイン(保護機能対応カーネルの場合)
4808 ・属するクラス(マルチプロセッサ対応カーネルの場合)
4809
4810 タスクのベース優先度は,タスクの現在優先度を決定するために使われる優先
4811 度であり,タスクの起動時に起動時優先度に初期化される【NGKI1003】.
4812
4813 タスクの現在優先度は,タスクの実行順位を決定するために使われる優先度で
4814 ある.単にタスクの優先度と言った場合には,現在優先度のことを指す.タス
4815 クがミューテックスをロックしていない間は,タスクの現在優先度はベース優
4816 先度に一致する【NGKI1004】.ミューテックスをロックしている間のタスクの
4817 現在優先度については,「4.4.6 ミューテックス」の節を参照すること.
4818
4819 タスクの起動要求キューイング数は,処理されていないタスクの起動要求の数
4820 であり,タスクの生成時に0に初期化される【NGKI1005】.
4821
4822 割付けプロセッサは,マルチプロセッサ対応カーネルにおいて,タスクを実行
4823 するプロセッサで,タスクの生成時に,タスクが属するクラスによって定まる
4824 初期割付けプロセッサに初期化される【NGKI1006】.
4825
4826 次回起動時の割付けプロセッサは,マルチプロセッサ対応カーネルにおいて,
4827 タスクが次に起動される時に割り付けられるプロセッサで,タスクの生成時に
4828 未設定の状態に初期化される【NGKI1007】.タスクの起動時に,次回起動時の
4829 割付けプロセッサが設定されていれば,タスクの割付けプロセッサがそのプロ
4830 セッサに変更され,次回起動時の割付けプロセッサは未設定の状態に戻される
4831 【NGKI1008】.次回起動時の割付けプロセッサが未設定の場合には,タスクの
4832 割付けプロセッサは変更されない(つまり,タスクが前に実行されていたのと
4833 同じプロセッサで実行される)【NGKI1009】.
4834
4835 保護機能対応カーネルにおいては,スタック領域の扱いは,ユーザタスクとシ
4836 ステムタスクで異なる.ユーザタスクのスタック領域は,ユーザタスクが非特
4837 権モードで実行する間に用いるスタック領域であり,ユーザスタック領域と呼
4838 ぶ【NGKI1010】.その扱いについては,「2.11.6 ユーザタスクのユーザスタッ
4839 ク領域」の節を参照すること.システムタスクのスタック領域は,カーネルの
4840 用いるオブジェクト管理領域と同様に扱われる【NGKI1011】.
4841
4842 システムスタック領域は,保護機能対応カーネルにおいて,ユーザタスクがサー
4843 ビスコール(拡張サービスコールを含む)を呼び出し,特権モードで実行する
4844 間に用いるスタック領域である【NGKI1012】.システムスタック領域は,カー
4845 ネルの用いるオブジェクト管理領域と同様に扱われる【NGKI1013】.
4846
4847 タスク属性には,次の属性を指定することができる【NGKI1014】.
4848
4849 TA_ACT 0x02U タスクの生成時にタスクを起動する
4850 TA_RSTR 0x04U 生成するタスクを制約タスクとする
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
98
4851
4852 TA_ACTを指定しない場合,タスクの生成直後には,タスクは休止状態となる
4853 【NGKI1015】.また,ターゲットによっては,ターゲット定義のタスク属性を
4854 指定できる場合がある【NGKI1016】.ターゲット定義のタスク属性として,次
4855 の属性を予約している【NGKI1017】.
4856
4857 TA_FPU FPU レジスタをコンテキストに含める
4858
4859 C言語によるタスクの記述形式は次の通り【NGKI1018】.
4860
4861 void task(intptr_t exinf)
4862 {
4863 タスク本体
4864 ext_tsk();
4865 }
4866
4867 exinfには,タスクの拡張情報が渡される【NGKI1019】.ext_tskを呼び出さず,
4868 タスクのメインルーチンからリターンした場合,ext_tskを呼び出した場合と同
4869 じ動作をする【NGKI1020】.
4870
4871 タスク管理機能に関連するカーネル構成マクロは次の通り.
4872
4873 TMAX_ACTCNT タスクの起動要求キューイング数の最大値【NGKI1021】
4874
4875 TNUM_TSKID 登録できるタスクの数(動的生成対応でないカーネルで
4876 は,静的APIによって登録されたタスクの数に一致)
4877 【NGKI1022】
4878
4879 【TOPPERS/ASPカーネルにおける規定】
4880
4881 ASPカーネルでは,TMAX_ACTCNTは1に固定されている【ASPS0101】.また,制約
4882 タスクはサポートしていない【ASPS0102】.ただし,制約タスク拡張パッケー
4883 ジを用いると,制約タスクの機能を追加することができる【ASPS0103】.
4884
4885 【TOPPERS/FMPカーネルにおける規定】
4886
4887 FMPカーネルでは,TMAX_ACTCNTは1に固定されている【FMPS0101】.また,制約
4888 タスクはサポートしていない【FMPS0102】.
4889
4890 【TOPPERS/HRP2カーネルにおける規定】
4891
4892 HRP2カーネルでは,TMAX_ACTCNTは1に固定されている【HRPS0101】.また,制
4893 約タスクはサポートしていない【HRPS0102】.
4894
4895 【TOPPERS/SSPカーネルにおける規定】
4896
4897 SSPカーネルでは,TMAX_ACTCNTは1に固定されている【SSPS0101】.
4898
4899 SSPカーネルは,制約タスクのみをサポートすることから,すべてのタスクでス
4900 タック領域を共有しており,タスク毎にスタック領域の情報を持たない
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
99
4901 【SSPS0102】.
4902
4903 SSPカーネルにおける追加機能として,タスクに対して,実行時優先度の情報を
4904 持つ【SSPS0103】.SSPカーネルにおいては,タスクが起動された後,最初に実
4905 行状態になる時に,タスクのベース優先度が,タスクの実行時優先度に設定さ
4906 れる【SSPS0104】.実行時優先度の機能は,起動時優先度よりも高い優先度で
4907 タスクを実行することで,同時期に共有スタック領域を使用している状態にな
4908 るタスクの組み合わせを限定し,スタック領域を節約するための機能である.
4909
4910 タスクの実行時優先度は,実行時優先度を定義する静的API(DEF_EPR)によっ
4911 て設定する【SSPS0105】.実行時優先度を定義しない場合,タスクの実行時優
4912 先度は,起動時優先度と同じ値に設定される【SSPS0106】.
4913
4914 〔実行時優先度によるスタック領域の節約〕
4915
4916 いずれのタスクにも実行時優先度が設定されていない場合には,すべてのタス
4917 クが同時期に共有スタック領域を使用している状態になる可能性があるため,
4918 すべてのタスクのスタック領域のサイズの和に,非タスクコンテキスト用のス
4919 タック領域のサイズを加えたものが,共有スタック領域に必要なサイズとなる.
4920
4921 タスクAに対して実行時優先度が設定されており,タスクAの起動時優先度より
4922 も高く,タスクAの実行時優先度と同じかそれよりも低い起動時優先度を持つタ
4923 スクBがある場合,タスクAとタスクBは同時期に共有スタック領域を使用してい
4924 る状態にならない.そのため,タスクAとタスクBの内,サイズが小さい方のス
4925 タック領域のサイズは,共有スタック領域のサイズに加える必要がなくなり,
4926 スタック領域を節約できることになる.
4927
4928 【μITRON4.0仕様との関係】
4929
4930 この仕様では,自タスクの拡張情報の参照するサービスコール(get_inf)をサ
4931 ポートし,起動コードを指定してタスクを起動するサービスコール(sta_tsk),
4932 タスクを終了と同時に削除するサービスコール(exd_tsk),タスクの状態を参
4933 照するサービスコールの簡易版(ref_tst)はサポートしないこととした.
4934
4935 TNUM_TSKIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
4936 ----------------------------------------------------------------------
4937 CRE_TSK タスクの生成〔S〕【NGKI1023】
4938 acre_tsk タスクの生成〔TD〕【NGKI1024】
4939
4940 【静的API】
4941 *保護機能対応でないカーネルの場合
4942 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
4943 PRI itskpri, SIZE stksz, STK_T *stk })
4944
4945 *保護機能対応カーネルの場合
4946 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
4947 PRI itskpri, SIZE stksz, STK_T *stk, SIZE sstksz, STK_T *sstk })
4948 ※ sstkszおよびsstkの記述は省略することができる【NGKI1025】.
4949
4950 【C言語API】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
100
4951 ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)
4952
4953 【パラメータ】
4954 ID tskid 生成するタスクのID番号(CRE_TSKの場合)
4955 T_CTSK * pk_ctsk タスクの生成情報を入れたパケットへのポイン
4956 タ(静的APIを除く)
4957
4958 *タスクの生成情報(パケットの内容)
4959 ATR tskatr タスク属性
4960 intptr_t exinf タスクの拡張情報
4961 TASK task タスクのメインルーチンの先頭番地
4962 PRI itskpri タスクの起動時優先度
4963 SIZE stksz タスクのスタック領域のサイズ(バイト数)
4964 STK_T * stk タスクのスタック領域の先頭番地
4965 SIZE sstksz タスクのシステムスタック領域のサイズ(バイ
4966 ト数,保護機能対応カーネルの場合,静的API
4967 においては省略可)
4968 STK_T * sstk タスクのシステムスタック領域の先頭番地(保
4969 護機能対応カーネルの場合,静的APIにおいて
4970 は省略可)
4971
4972 【リターンパラメータ】
4973 ER_ID tskid 生成されたタスクのID番号(正の値)またはエ
4974 ラーコード
4975
4976 【エラーコード】
4977 E_CTX コンテキストエラー
4978 ・非タスクコンテキストからの呼出し〔s〕【NGKI1026】
4979 ・CPUロック状態からの呼出し〔s〕【NGKI1027】
4980 E_RSATR 予約属性
4981 ・tskatrが無効【NGKI1028】
4982 ・属する保護ドメインの指定が有効範囲外または無所属〔sP〕
4983 【NGKI1029】
4984 ・保護ドメインの囲みの中に記述されていない〔SP〕【NGKI1030】
4985 ・属するクラスの指定が有効範囲外〔sM〕【NGKI1031】
4986 ・クラスの囲みの中に記述されていない〔SM〕【NGKI1032】
4987 E_PAR パラメータエラー
4988 ・taskがプログラムの先頭番地として正しくない【NGKI1033】
4989 ・itskpriが有効範囲外【NGKI1034】
4990 ・その他の条件については機能の項を参照
4991 E_OACV オブジェクトアクセス違反
4992 ・システム状態に対する管理操作が許可されていない〔sP〕
4993 【NGKI1035】
4994 E_MACV メモリアクセス違反
4995 ・pk_ctskが指すメモリ領域への読出しアクセスが許可されて
4996 いない〔sP〕【NGKI1036】
4997 E_NOID ID番号不足
4998 ・割り付けられるタスクIDがない〔sD〕【NGKI1037】
4999 E_NOMEM メモリ不足
5000 ・スタック領域が確保できない【NGKI1038】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
101
5001 ・システムスタック領域が確保できない【NGKI1039】
5002 E_OBJ オブジェクト状態エラー
5003 ・tskidで指定したタスクが登録済み(CRE_TSKの場合)【NGKI1040】
5004 ・その他の条件については機能の項を参照
5005
5006 【機能】
5007
5008 各パラメータで指定したタスク生成情報に従って,タスクを生成する.具体的
5009 な振舞いは以下の通り.
5010
5011 まず,stkとstkszからタスクが用いるスタック領域が設定される【NGKI1041】.
5012 ただし,保護機能対応カーネルで,生成するタスクがシステムタスクの場合に
5013 は,スタック領域の設定にsstkszも用いられる.stkszに0以下の値を指定した
5014 時や,設定されるスタック領域のサイズがターゲット定義の最小値よりも小さ
5015 くなる時には,E_PARエラーとなる【NGKI1042】.
5016
5017 また,保護機能対応カーネルで,生成するタスクがユーザタスクの場合には,
5018 sstkとsstkszからシステムスタック領域が設定される【NGKI1043】.この場合,
5019 sstkszに0以下の値を指定した時や,ターゲット定義の最小値よりも小さい値を
5020 指定した時には,E_PARエラーとなる【NGKI1044】.
5021
5022 次に,生成されたタスクに対してタスク生成時に行うべき初期化処理が行われ,
5023 生成されたタスクは休止状態になる【NGKI1045】.さらに,tskatrにTA_ACTを
5024 指定した場合には,タスク起動時に行うべき初期化処理が行われ,生成された
5025 タスクは実行できる状態になる【NGKI1046】.
5026
5027 静的APIにおいては,tskidはオブジェクト識別名,tskatr,itskpri,stkszは
5028 整数定数式パラメータ,exinf,task,stkは一般定数式パラメータである
5029 【NGKI1047】.コンフィギュレータは,静的APIのメモリ不足(E_NOMEM)エラー
5030 を検出することができない【NGKI1048】.
5031
5032 〔stkにNULLを指定した場合〕
5033
5034 stkをNULLとした場合,stkszで指定したサイズのスタック領域が,コンフィギュ
5035 レータまたはカーネルにより確保される【NGKI1049】.stkszにターゲット定義
5036 の制約に合致しないサイズを指定した時には,ターゲット定義の制約に合致す
5037 るように大きい方に丸めたサイズで確保される【NGKI1050】.
5038
5039 保護機能対応カーネルにおいて,生成するタスクがユーザタスクの場合,コン
5040 フィギュレータまたはカーネルにより確保されるスタック領域(ユーザスタッ
5041 ク領域)は,「2.11.6 ユーザタスクのユーザスタック領域」の節の規定に従っ
5042 て,メモリオブジェクトとしてカーネルに登録される【NGKI1051】.
5043
5044 静的APIにより制約タスクを生成する場合(tskatrにTA_RSTRを指定して生成す
5045 る場合),スタック領域は,制約タスクの起動時優先度毎に確保され,同じ起
5046 動時優先度を持つ制約タスクで共有される【NGKI1052】.確保されるスタック
5047 領域のサイズは,それを共有する制約タスクのスタック領域のサイズ(stksz)
5048 の最大値となる【NGKI1053】.マルチプロセッサ対応カーネルでは,以上のス
5049 タック領域の確保処理を,制約タスクの初期割付けプロセッサ毎に行う
5050 【NGKI1054】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
102
5051
5052 〔stkにNULL以外を指定した場合〕
5053
5054 stkにNULL以外を指定した場合,stkとstkszで指定したスタック領域は,アプリ
5055 ケーションで確保しておく必要がある【NGKI1055】.スタック領域をアプリケー
5056 ションで確保する方法については,「2.15.3 カーネル共通マクロ」の節を参照
5057 すること.その方法に従わず,stkやstkszにターゲット定義の制約に合致しな
5058 い先頭番地やサイズを指定した時には,E_PARエラーとなる【NGKI1056】.
5059
5060 保護機能対応カーネルにおいて,生成するタスクがシステムタスクの場合に,
5061 stkとstkszで指定したスタック領域がカーネル専用のメモリオブジェクトに含
5062 まれない場合,E_OBJエラーとなる【NGKI1057】.
5063
5064 保護機能対応カーネルにおいて,生成するタスクがユーザタスクの場合,stkと
5065 stkszで指定したスタック領域(ユーザスタック領域)は,「2.11.6 ユーザタ
5066 スクのユーザスタック領域」の節の規定に従って,メモリオブジェクトとして
5067 カーネルに登録される【NGKI1058】.そのため,上の方法を用いてスタック領
5068 域を確保しても,ターゲット定義の制約に合致する先頭番地とサイズとなると
5069 は限らず,スタック領域をアプリケーションで確保する方法は,ターゲット定
5070 義である【NGKI1059】.また,stkとstkszで指定したスタック領域が,登録済
5071 みのメモリオブジェクトとメモリ領域が重なる場合には,E_OBJエラーとなる
5072 【NGKI1060】.
5073
5074 〔sstkとsstkszの扱い〕
5075
5076 保護機能対応カーネルにおけるsstkとsstkszの扱いは,生成するタスクがユー
5077 ザタスクの場合とシステムタスクの場合で異なる.
5078
5079 生成するタスクがユーザタスクの場合の扱いは次の通り.
5080
5081 sstkの記述を省略するか,sstkをNULLとした場合,sstkszで指定したサイズの
5082 システムスタック領域が,コンフィギュレータまたはカーネルにより確保され
5083 る【NGKI1061】.sstkszにターゲット定義の制約に合致しないサイズを指定し
5084 た時には,ターゲット定義の制約に合致するように大きい方に丸めたサイズで
5085 確保される【NGKI1062】.sstkszの記述も省略した場合には,ターゲット定義
5086 のデフォルトのサイズで確保される【NGKI1063】.
5087
5088 sstkにNULL以外を指定した場合,sstkとsstkszで指定したスタック領域は,ア
5089 プリケーションで確保しておく必要がある【NGKI1064】.スタック領域をアプ
5090 リケーションで確保する方法については,「2.15.3 カーネル共通マクロ」の節
5091 を参照すること.その方法に従わず,sstkやsstkszにターゲット定義の制約に
5092 合致しない先頭番地やサイズを指定した時には,E_PARエラーとなる
5093 【NGKI1065】.また,stkとstkszで指定したシステムスタック領域がカーネル
5094 専用のメモリオブジェクトに含まれない場合,E_OBJエラーとなる【NGKI1066】.
5095
5096 生成するタスクがシステムタスクの場合の扱いは次の通り.
5097
5098 sstkに指定することができるのは,NULLのみである.sstkにNULL以外を指定し
5099 た場合には,E_PARエラーとなる【NGKI1068】.
5100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
103
5101 sstkszに0以外の値を指定した場合で,stkがNULLの場合には,コンフィギュレー
5102 タまたはカーネルにより確保されるスタック領域のサイズに,sstkszが加えら
5103 れる【NGKI1069】.stkszにsstkszを加えた値が,ターゲット定義の制約に合致
5104 しないサイズになる時には,ターゲット定義の制約に合致するように大きい方
5105 に丸めたサイズで確保される【NGKI1070】.
5106
5107 sstkszに0以外の値を指定した場合で,stkがNULLでない場合には,E_PARエラー
5108 となる【NGKI1071】.
5109
5110 sstkszに0を指定した場合,これらの処理は行わず,E_PARエラーにもならない
5111 【NGKI1072】.
5112
5113 【TOPPERS/ASPカーネルにおける規定】
5114
5115 ASPカーネルでは,CRE_TSKのみをサポートする【ASPS0104】.ただし,動的生
5116 成機能拡張パッケージでは,acre_tskもサポートする【ASPS0105】.
5117
5118 【TOPPERS/FMPカーネルにおける規定】
5119
5120 FMPカーネルでは,CRE_TSKのみをサポートする【FMPS0103】.
5121
5122 【TOPPERS/HRP2カーネルにおける規定】
5123
5124 HRP2カーネルでは,CRE_TSKのみをサポートする【HRPS0103】.
5125
5126 【TOPPERS/SSPカーネルにおける規定】
5127
5128 SSPカーネルでは,CRE_TSKのみをサポートする【SSPS0107】.
5129
5130 SSPカーネルでは,複数のタスクに対して,同じ起動時優先度を設定することは
5131 できない.設定した場合には,コンフィギュレータがE_PARエラーを報告する
5132 【SSPS0109】.
5133
5134 SSPカーネルでは,制約タスクのみをサポートするため,タスク属性にTA_RSTR
5135 を指定しない場合でも,生成されるタスクは制約タスクとなる【SSPS0110】.
5136
5137 SSPカーネルでは,stkにはNULLを指定しなくてはならず,その場合でも,コン
5138 フィギュレータはタスクのスタック領域を確保しない【SSPS0111】.これは,
5139 SSPカーネルでは,すべての処理単位が共有スタック領域を使用し,タスク毎に
5140 スタック領域を持たないためである.stkにNULL以外を指定した場合には,
5141 E_PARエラーとなる【SSPS0112】.
5142
5143 共有スタック領域の設定方法については,DEF_STKの項を参照すること.
5144
5145 【μITRON4.0仕様との関係】
5146
5147 taskのデータ型をTASKに,stkのデータ型をSTK_T *に変更した.COUNT_STK_Tと
5148 ROUND_STK_Tを新設し,スタック領域をアプリケーションで確保する方法を規定
5149 した.
5150
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
104
5151 【μITRON4.0/PX仕様との関係】
5152
5153 sstkのデータ型をSTK_T *に変更した.システムスタック領域をアプリケーショ
5154 ンで確保する方法を規定した.
5155
5156 【未決定事項】
5157
5158 サービスコール(acre_tsk)により,stkにNULLを指定して制約タスクを生成し
5159 た場合のスタック領域の確保方法については,今後の課題である.
5160
5161 【仕様決定の理由】
5162
5163 保護機能対応カーネルにおいて,sstkszおよびsstkの記述は省略することがで
5164 きることとしたのは,保護機能対応でないカーネル用のシステムコンフィギュ
5165 レーションファイルを,保護機能対応カーネルにも変更なしに使えるようにす
5166 るためである.
5167 ----------------------------------------------------------------------
5168 AID_TSK 割付け可能なタスクIDの数の指定〔SD〕【NGKI1073】
5169
5170 【静的API】
5171 AID_TSK(uint_t notsk)
5172
5173 【パラメータ】
5174 uint_t notsk 割付け可能なタスクIDの数
5175
5176 【エラーコード】
5177 E_RSATR 予約属性
5178 ・保護ドメインの囲みの中に記述されていない〔P〕【NGKI1074】
5179 ・クラスの囲みの中に記述されていない〔M〕【NGKI1075】
5180 E_PAR パラメータエラー
5181 ・notskが負の値【NGKI3276】
5182
5183 【機能】
5184
5185 notskで指定した数のタスクIDを,タスクを生成するサービスコールによって割
5186 付け可能なタスクIDとして確保する【NGKI1076】.
5187
5188 notskは整数定数式パラメータである【NGKI1077】.
5189 ----------------------------------------------------------------------
5190 SAC_TSK タスクのアクセス許可ベクタの設定〔SP〕【NGKI1078】
5191 sac_tsk タスクのアクセス許可ベクタの設定〔TPD〕【NGKI1079】
5192
5193 【静的API】
5194 SAC_TSK(ID tskid, { ACPTN acptn1, ACPTN acptn2,
5195 ACPTN acptn3, ACPTN acptn4 })
5196
5197 【C言語API】
5198 ER ercd = sac_tsk(ID tskid, const ACVCT *p_acvct)
5199
5200 【パラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
105
5201 ID tskid 対象タスクのID番号
5202 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
5203 インタ(静的APIを除く)
5204
5205 *アクセス許可ベクタ(パケットの内容)
5206 ACPTN acptn1 通常操作1のアクセス許可パターン
5207 ACPTN acptn2 通常操作2のアクセス許可パターン
5208 ACPTN acptn3 管理操作のアクセス許可パターン
5209 ACPTN acptn4 参照操作のアクセス許可パターン
5210
5211 【リターンパラメータ】
5212 ER ercd 正常終了(E_OK)またはエラーコード
5213
5214 【エラーコード】
5215 E_CTX コンテキストエラー
5216 ・非タスクコンテキストからの呼出し〔s〕【NGKI1080】
5217 ・CPUロック状態からの呼出し〔s〕【NGKI1081】
5218 E_ID 不正ID番号
5219 ・tskidが有効範囲外〔s〕【NGKI1082】
5220 E_RSATR 予約属性
5221 ・対象タスクが属する保護ドメインの囲みの中に記述されて
5222 いない〔S〕【NGKI1083】
5223 ・対象タスクが属するクラスの囲みの中に記述されていない
5224 〔SM〕【NGKI1084】
5225 E_NOEXS オブジェクト未登録
5226 ・対象タスクが未登録【NGKI1085】
5227 E_OACV オブジェクトアクセス違反
5228 ・対象タスクに対する管理操作が許可されていない〔s〕【NGKI1086】
5229 E_MACV メモリアクセス違反
5230 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
5231 いない〔s〕【NGKI1087】
5232 E_OBJ オブジェクト状態エラー
5233 ・対象タスクは静的APIで生成された〔s〕【NGKI1088】
5234 ・対象タスクに対してアクセス許可ベクタが設定済み〔S〕
5235 【NGKI1089】
5236
5237 【機能】
5238
5239 tskidで指定したタスク(対象タスク)のアクセス許可ベクタ(4つのアクセス
5240 許可パターンの組)を,各パラメータで指定した値に設定する【NGKI1090】.
5241
5242 静的APIにおいては,tskidはオブジェクト識別名,acptn1~acptn4は整数定数
5243 式パラメータである【NGKI1091】.
5244
5245 sac_tskにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
5246 となる【NGKI1092】.
5247
5248 【TOPPERS/ASPカーネルにおける規定】
5249
5250 ASPカーネルでは,SAC_TSK,sac_tskをサポートしない【ASPS0106】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
106
5251
5252 【TOPPERS/FMPカーネルにおける規定】
5253
5254 FMPカーネルでは,SAC_TSK,sac_tskをサポートしない【FMPS0104】.
5255
5256 【TOPPERS/HRP2カーネルにおける規定】
5257
5258 HRP2カーネルでは,SAC_TSKのみをサポートする【HRPS0104】.
5259
5260 【TOPPERS/SSPカーネルにおける規定】
5261
5262 SSPカーネルでは,SAC_TSK,sac_tskをサポートしない【SSPS0113】.
5263 ----------------------------------------------------------------------
5264 DEF_EPR タスクの実行時優先度の定義〔S〕【NGKI1093】
5265
5266 【静的API】
5267 DEF_EPR(ID tskid, { PRI exepri })
5268
5269 【パラメータ】
5270 ID tskid 対象タスクのID番号
5271 PRI exepri タスクの実行時優先度
5272
5273 【エラーコード】
5274 E_PAR パラメータエラー
5275 ・exepriが有効範囲外【NGKI1094】
5276 E_ILUSE サービスコール不正使用
5277 ・条件については機能の項を参照
5278 E_OBJ オブジェクト状態エラー
5279 ・対象タスクに対して実行優先度が設定済み【NGKI1095】
5280
5281 【サポートするカーネル】
5282
5283 DEF_EPRは,TOPPERS/SSPカーネルのみがサポートする静的APIである.他のカー
5284 ネルは,DEF_EPRをサポートしない【NGKI1096】.
5285
5286 【機能】
5287
5288 tskidで指定したタスク(対象タスク)の実行時優先度を,exepriで指定した優
5289 先度に設定する【NGKI1097】.
5290
5291 tskidはオブジェクト識別名,exepriは整数定数式パラメータである【NGKI1098】.
5292
5293 exepriが,対象タスクの起動時優先度よりも低い場合には,E_ILUSEエラーとな
5294 る【NGKI1099】.
5295
5296 【μITRON4.0仕様との関係】
5297
5298 μITRON4.0仕様に定義されていない静的APIである.
5299 ----------------------------------------------------------------------
5300 del_tsk タスクの削除〔TD〕【NGKI1100】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
107
5301
5302 【C言語API】
5303 ER ercd = del_tsk(ID tskid)
5304
5305 【パラメータ】
5306 ID tskid 対象タスクのID番号
5307
5308 【リターンパラメータ】
5309 ER ercd 正常終了(E_OK)またはエラーコード
5310
5311 【エラーコード】
5312 E_CTX コンテキストエラー
5313 ・非タスクコンテキストからの呼出し【NGKI1101】
5314 ・CPUロック状態からの呼出し【NGKI1102】
5315 E_ID 不正ID番号
5316 ・tskidが有効範囲外【NGKI1103】
5317 E_NOEXS オブジェクト未登録
5318 ・対象タスクが未登録【NGKI1104】
5319 E_OACV オブジェクトアクセス違反
5320 ・対象タスクに対する管理操作が許可されていない〔P〕【NGKI1105】
5321 E_OBJ オブジェクト状態エラー
5322 ・対象タスクが休止状態でない【NGKI1106】
5323 ・対象タスクは静的APIで生成された【NGKI1107】
5324
5325 【機能】
5326
5327 tskidで指定したタスク(対象タスク)を削除する.具体的な振舞いは以下の通
5328 り.
5329
5330 対象タスクが休止状態である場合には,対象タスクの登録が解除され,そのタ
5331 スクIDが未使用の状態に戻される【NGKI1108】.また,タスクの生成時にタス
5332 クのスタック領域およびシステムスタック領域がカーネルによって確保された
5333 場合は,それらのメモリ領域が解放される【NGKI1109】.
5334
5335 【TOPPERS/ASPカーネルにおける規定】
5336
5337 ASPカーネルでは,del_tskをサポートしない【ASPS0107】.ただし,動的生成
5338 機能拡張パッケージでは,del_tskをサポートする【ASPS0108】.
5339
5340 【TOPPERS/FMPカーネルにおける規定】
5341
5342 FMPカーネルでは,del_tskをサポートしない【FMPS0105】.
5343
5344 【TOPPERS/HRP2カーネルにおける規定】
5345
5346 HRP2カーネルでは,del_tskをサポートしない【HRPS0105】.
5347
5348 【TOPPERS/SSPカーネルにおける規定】
5349
5350 SSPカーネルでは,del_tskをサポートしない【SSPS0114】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
108
5351 ----------------------------------------------------------------------
5352 act_tsk タスクの起動〔T〕【NGKI1110】
5353 iact_tsk タスクの起動〔I〕【NGKI1111】
5354
5355 【C言語API】
5356 ER ercd = act_tsk(ID tskid)
5357 ER ercd = iact_tsk(ID tskid)
5358
5359 【パラメータ】
5360 ID tskid 対象タスクのID番号
5361
5362 【リターンパラメータ】
5363 ER ercd 正常終了(E_OK)またはエラーコード
5364
5365 【エラーコード】
5366 E_CTX コンテキストエラー
5367 ・非タスクコンテキストからの呼出し(act_tskの場合)【NGKI1112】
5368 ・タスクコンテキストからの呼出し(iact_tskの場合)【NGKI1113】
5369 ・CPUロック状態からの呼出し【NGKI1114】
5370 E_ID 不正ID番号
5371 ・tskidが有効範囲外【NGKI1115】
5372 E_NOEXS オブジェクト未登録
5373 ・対象タスクが未登録〔D〕【NGKI1116】
5374 E_OACV オブジェクトアクセス違反
5375 ・対象タスクに対する通常操作1が許可されていない(act_tsk
5376 の場合)〔P〕【NGKI1117】
5377 E_QOVR キューイングオーバフロー
5378 ・条件については機能の項を参照
5379
5380 【機能】
5381
5382 tskidで指定したタスク(対象タスク)に対して起動要求を行う.具体的な振舞
5383 いは以下の通り.
5384
5385 対象タスクが休止状態である場合には,対象タスクに対してタスク起動時に行
5386 うべき初期化処理が行われ,対象タスクは実行できる状態になる【NGKI1118】.
5387
5388 対象タスクが休止状態でない場合には,対象タスクの起動要求キューイング数
5389 に1が加えられる【NGKI1119】.起動要求キューイング数に1を加えると
5390 TMAX_ACTCNTを超える場合には,E_QOVRエラーとなる【NGKI1120】.
5391
5392 act_tskにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
5393 となる【NGKI1121】.
5394
5395 【補足説明】
5396
5397 マルチプロセッサ対応カーネルでは,act_tsk/iact_tskは,対象タスクの次回
5398 起動時の割付けプロセッサを変更しない.
5399 ----------------------------------------------------------------------
5400 mact_tsk 割付けプロセッサ指定でのタスクの起動〔TM〕【NGKI1122】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
109
5401 imact_tsk 割付けプロセッサ指定でのタスクの起動〔IM〕【NGKI1123】
5402
5403 【C言語API】
5404 ER ercd = mact_tsk(ID tskid, ID prcid)
5405 ER ercd = imact_tsk(ID tskid, ID prcid)
5406
5407 【パラメータ】
5408 ID tskid 対象タスクのID番号
5409 ID prcid タスクの割付け対象のプロセッサのID番号
5410
5411 【リターンパラメータ】
5412 ER ercd 正常終了(E_OK)またはエラーコード
5413
5414 【エラーコード】
5415 E_CTX コンテキストエラー
5416 ・非タスクコンテキストからの呼出し(mact_tskの場合)
5417 【NGKI1124】
5418 ・タスクコンテキストからの呼出し(imact_tskの場合)
5419 【NGKI1125】
5420 ・CPUロック状態からの呼出し【NGKI1126】
5421 E_NOSPT 未サポート機能
5422 ・対象タスクが制約タスク【NGKI1127】
5423 E_ID 不正ID番号
5424 ・tskidが有効範囲外【NGKI1128】
5425 ・prcidが有効範囲外【NGKI1129】
5426 E_PAR パラメータエラー
5427 ・条件については機能の項を参照
5428 E_NOEXS オブジェクト未登録
5429 ・対象タスクが未登録〔D〕【NGKI1130】
5430 E_OACV オブジェクトアクセス違反
5431 ・対象タスクに対する通常操作1が許可されていない(mact_tsk
5432 の場合)〔P〕【NGKI1131】
5433 E_QOVR キューイングオーバフロー
5434 ・条件については機能の項を参照
5435
5436 【機能】
5437
5438 prcidで指定したプロセッサを割付けプロセッサとして,tskidで指定したタス
5439 ク(対象タスク)に対して起動要求を行う.具体的な振舞いは以下の通り.
5440
5441 対象タスクが休止状態である場合には,対象タスクの割付けプロセッサが
5442 prcidで指定したプロセッサに変更された後,対象タスクに対してタスク起動時
5443 に行うべき初期化処理が行われ,対象タスクは実行できる状態になる
5444 【NGKI1132】.
5445
5446 対象タスクが休止状態でない場合には,対象タスクの起動要求キューイング数
5447 に1が加えられ,次回起動時の割付けプロセッサがprcidで指定したプロセッサ
5448 に変更される【NGKI1133】.起動要求キューイング数に1を加えると
5449 TMAX_ACTCNTを超える場合には,E_QOVRエラーとなる【NGKI1134】.
5450
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
110
5451 mact_tskにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タス
5452 クとなる【NGKI1135】.
5453
5454 対象タスクの属するクラスの割付け可能プロセッサが,prcidで指定したプロセッ
5455 サを含んでいない場合には,E_PARエラーとなる【NGKI1136】.
5456
5457 prcidにTPRC_INI(=0)を指定すると,対象タスクの割付けプロセッサを,そ
5458 れが属するクラスの初期割付けプロセッサとする【NGKI1137】.
5459
5460 【補足説明】
5461
5462 TMAX_ACTCNTが2以上の場合でも,対象タスクが次に起動される時の割付けプロ
5463 セッサは,キューイングされない.すなわち,プロセッサAに割り付けられた休
5464 止状態でないタスクを対象として,プロセッサBを割付けプロセッサとして
5465 mact_tskを呼び出し,さらにプロセッサCを割付けプロセッサとしてmact_tskを
5466 呼び出すと,対象タスクの次回起動時の割付けプロセッサがプロセッサCに変更
5467 され,対象タスクがプロセッサBで実行されることはない.なお,TMAX_ACTCNT
5468 が1の場合には,プロセッサCを割付けプロセッサとした2回目のmact_tskが
5469 E_QOVRエラーとなるため,次回起動時の割付けプロセッサはプロセッサBのまま
5470 変更されない.
5471
5472 【TOPPERS/ASPカーネルにおける規定】
5473
5474 ASPカーネルでは,mact_tsk,imact_tskをサポートしない【ASPS0109】.
5475
5476 【TOPPERS/HRP2カーネルにおける規定】
5477
5478 HRP2カーネルでは,mact_tsk,imact_tskをサポートしない【HRPS0106】.
5479
5480 【TOPPERS/SSPカーネルにおける規定】
5481
5482 SSPカーネルでは,mact_tsk,imact_tskをサポートしない【SSPS0115】.
5483
5484 【μITRON4.0仕様との関係】
5485
5486 μITRON4.0仕様に定義されていないサービスコールである.
5487 ----------------------------------------------------------------------
5488 can_act タスク起動要求のキャンセル〔T〕【NGKI1138】
5489
5490 【C言語API】
5491 ER_UINT actcnt = can_act(ID tskid)
5492
5493 【パラメータ】
5494 ID tskid 対象タスクのID番号
5495
5496 【リターンパラメータ】
5497 ER_UINT actcnt キューイングされていた起動要求の数(正の値
5498 または0)またはエラーコード
5499
5500 【エラーコード】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
111
5501 E_CTX コンテキストエラー
5502 ・非タスクコンテキストからの呼出し【NGKI1139】
5503 ・CPUロック状態からの呼出し【NGKI1140】
5504 E_ID 不正ID番号
5505 ・tskidが有効範囲外【NGKI1141】
5506 E_NOEXS オブジェクト未登録
5507 ・対象タスクが未登録〔D〕【NGKI1142】
5508 E_OACV オブジェクトアクセス違反
5509 ・対象タスクに対する通常操作1が許可されていない〔P〕
5510 【NGKI1143】
5511
5512 【機能】
5513
5514 tskidで指定したタスク(対象タスク)に対する処理されていない起動要求をす
5515 べてキャンセルし,キャンセルした起動要求の数を返す.具体的な振舞いは以
5516 下の通り.
5517
5518 対象タスクの起動要求キューイング数が0に設定され,0に設定する前の起動要
5519 求キューイング数が,サービスコールの返値として返される【NGKI1144】.ま
5520 た,マルチプロセッサ対応カーネルにおいては,対象タスクの次回起動時の割
5521 付けプロセッサが未設定状態に戻される【NGKI1145】.
5522
5523 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
5524 【NGKI1146】.
5525
5526 【TOPPERS/SSPカーネルにおける規定】
5527
5528 SSPカーネルでは,can_actをサポートしない【SSPS0116】.
5529 ----------------------------------------------------------------------
5530 mig_tsk タスクの割付けプロセッサの変更〔TM〕【NGKI1147】
5531
5532 【C言語API】
5533 ER ercd = mig_tsk(ID tskid, ID prcid)
5534
5535 【パラメータ】
5536 ID tskid 対象タスクのID番号
5537 ID prcid タスクの割付けプロセッサのID番号
5538
5539 【リターンパラメータ】
5540 ER ercd 正常終了(E_OK)またはエラーコード
5541
5542 【エラーコード】
5543 E_CTX コンテキストエラー
5544 ・非タスクコンテキストからの呼出し【NGKI1148】
5545 ・CPUロック状態からの呼出し【NGKI1149】
5546 ・その他の条件については機能の項を参照
5547 E_NOSPT 未サポート機能
5548 ・対象タスクが制約タスク【NGKI1150】
5549 E_ID 不正ID番号
5550 ・tskidが有効範囲外【NGKI1151】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
112
5551 ・prcidが有効範囲外【NGKI1152】
5552 E_PAR パラメータエラー
5553 ・条件については機能の項を参照
5554 E_NOEXS オブジェクト未登録
5555 ・対象タスクが未登録〔D〕【NGKI1153】
5556 E_OACV オブジェクトアクセス違反
5557 ・対象タスクに対する通常操作1が許可されていない〔P〕
5558 【NGKI1154】
5559 E_OBJ オブジェクト状態エラー
5560 ・条件については機能の項を参照
5561
5562 【機能】
5563
5564 tskidで指定したタスクの割付けプロセッサを,prcidで指定したプロセッサに
5565 変更する.具体的な振舞いは以下の通り.
5566
5567 対象タスクが,自タスクが割り付けられたプロセッサに割り付けられている場
5568 合には,対象タスクをprcidで指定したプロセッサに割り付ける【NGKI1155】.
5569 対象タスクが実行できる状態の場合には,prcidで指定したプロセッサに割り付
5570 けられた同じ優先度のタスクの中で,最も優先順位が低い状態となる
5571 【NGKI1156】.
5572
5573 対象タスクが,自タスクが割付けられたプロセッサと異なるプロセッサに割り
5574 付けられている場合には,E_OBJエラーとなる【NGKI1157】.
5575
5576 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
5577 【NGKI1158】.
5578
5579 ディスパッチ保留状態で,対象タスクを自タスクとしてmig_tskを呼び出すと,
5580 E_CTXエラーとなる【NGKI1159】.
5581
5582 対象タスクの属するクラスの割付け可能プロセッサが,prcidで指定したプロセッ
5583 サを含んでいない場合には,E_PARエラーとなる【NGKI1160】.
5584
5585 prcidにTPRC_INI(=0)を指定すると,対象タスクの割付けプロセッサを,そ
5586 れが属するクラスの初期割付けプロセッサに変更する【NGKI1161】.
5587
5588 【補足説明】
5589
5590 この仕様では,タスクをマイグレーションさせることができるのは,そのタス
5591 クと同じプロセッサに割り付けられたタスクのみである.そのため,CPUロック
5592 状態やディスパッチ禁止状態を用いて,他のタスクへのディスパッチが起こら
5593 ないようにすることで,自タスクが他のプロセッサへマイグレーションされる
5594 のを防ぐことができる.
5595
5596 対象タスクが,最初からprcidで指定したプロセッサに割り付けられている場合
5597 には,割付けプロセッサの変更は起こらないが,優先順位が同一優先度のタス
5598 クの中で最低となる.
5599
5600 【TOPPERS/ASPカーネルにおける規定】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
113
5601
5602 ASPカーネルでは,mig_tskをサポートしない【ASPS0110】.
5603
5604 【TOPPERS/HRP2カーネルにおける規定】
5605
5606 HRP2カーネルでは,mig_tskをサポートしない【HRPS0107】.
5607
5608 【TOPPERS/SSPカーネルにおける規定】
5609
5610 SSPカーネルでは,mig_tskをサポートしない【SSPS0117】.
5611
5612 【μITRON4.0仕様との関係】
5613
5614 μITRON4.0仕様に定義されていないサービスコールである.
5615 ----------------------------------------------------------------------
5616 ext_tsk 自タスクの終了〔T〕【NGKI1162】
5617
5618 【C言語API】
5619 ER ercd = ext_tsk()
5620
5621 【パラメータ】
5622 なし
5623
5624 【リターンパラメータ】
5625 ER ercd エラーコード
5626
5627 【エラーコード】
5628 E_SYS システムエラー
5629 ・カーネルの誤動作【NGKI1163】
5630 E_CTX コンテキストエラー
5631 ・非タスクコンテキストからの呼出し【NGKI1164】
5632
5633 【機能】
5634
5635 自タスクを終了させる.具体的な振舞いは以下の通り.
5636
5637 自タスクに対してタスク終了時に行うべき処理が行われ,自タスクは休止状態
5638 になる【NGKI1165】.さらに,自タスクの起動要求キューイング数が0でない場
5639 合には,自タスクに対してタスク起動時に行うべき処理が行われ,自タスクは
5640 実行できる状態になる【NGKI1166】.またこの時,起動要求キューイング数か
5641 ら1が減ぜられる【NGKI1167】.
5642
5643 ext_tskは,CPUロック解除状態,割込み優先度マスク全解除状態,ディスパッ
5644 チ許可状態で呼び出すのが原則であるが,そうでない状態で呼び出された場合
5645 には,CPUロック解除状態,割込み優先度マスク全解除状態,ディスパッチ許可
5646 状態に遷移させた後,自タスクを終了させる【NGKI1168】.
5647
5648 ext_tskが正常に処理された場合,ext_tskからはリターンしない【NGKI1169】.
5649
5650 【TOPPERS/SSPカーネルにおける規定】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
114
5651
5652 SSPカーネルでは,ext_tskをサポートしない【SSPS0118】.自タスクを終了さ
5653 せる場合には,タスクのメインルーチンからリターンする【SSPS0119】.
5654
5655 【μITRON4.0仕様との関係】
5656
5657 ext_tskを非タスクコンテキストから呼び出した場合に,E_CTXエラーが返るこ
5658 ととした.μITRON4.0仕様においては,ext_tskからはリターンしないと規定さ
5659 れている.
5660 ----------------------------------------------------------------------
5661 ter_tsk タスクの強制終了〔T〕【NGKI1170】
5662
5663 【C言語API】
5664 ER ercd = ter_tsk(ID tskid)
5665
5666 【パラメータ】
5667 ID tskid 対象タスクのID番号
5668
5669 【リターンパラメータ】
5670 ER ercd 正常終了(E_OK)またはエラーコード
5671
5672 【エラーコード】
5673 E_CTX コンテキストエラー
5674 ・非タスクコンテキストからの呼出し【NGKI1171】
5675 ・CPUロック状態からの呼出し【NGKI1172】
5676 E_ID 不正ID番号
5677 ・tskidが有効範囲外【NGKI1173】
5678 E_NOEXS オブジェクト未登録
5679 ・対象タスクが未登録〔D〕【NGKI1174】
5680 E_OACV オブジェクトアクセス違反
5681 ・対象タスクに対する通常操作2が許可されていない〔P〕
5682 【NGKI1175】
5683 E_ILUSE サービスコール不正使用
5684 ・対象タスクが自タスク【NGKI1176】
5685 E_OBJ オブジェクト状態エラー
5686 ・対象タスクが休止状態【NGKI1177】
5687 ・その他の条件については機能の項を参照
5688
5689 【機能】
5690
5691 tskidで指定したタスク(対象タスク)を終了させる.具体的な振舞いは以下の
5692 通り.
5693
5694 対象タスクが休止状態でない場合には,対象タスクに対してタスク終了時に行
5695 うべき処理が行われ,対象タスクは休止状態になる【NGKI1178】.さらに,対
5696 象タスクの起動要求キューイング数が0でない場合には,対象タスクに対してタ
5697 スク起動時に行うべき処理が行われ,対象タスクは実行できる状態になる
5698 【NGKI1179】.またこの時,起動要求キューイング数から1が減ぜられる
5699 【NGKI1180】.
5700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
115
5701 マルチプロセッサ対応カーネルでは,対象タスクは,自タスクと同じプロセッ
5702 サに割り付けられているタスクに限られる【NGKI1181】.対象タスクが自タス
5703 クと異なるプロセッサに割り付けられている場合には,E_OBJエラーとなる
5704 【NGKI1182】.
5705
5706 【TOPPERS/FMPカーネルにおける使用上の注意】
5707
5708 現時点のFMPカーネルの実装では,デッドロック回避のためのリトライ処理によ
5709 り,サービスコールの処理時間に上限がないため,注意が必要である(ロック
5710 方式にも依存する).
5711
5712 【TOPPERS/SSPカーネルにおける規定】
5713
5714 SSPカーネルでは,ter_tskをサポートしない【SSPS0120】.
5715 ----------------------------------------------------------------------
5716 chg_pri タスクのベース優先度の変更〔T〕【NGKI1183】
5717
5718 【C言語API】
5719 ER ercd = chg_pri(ID tskid, PRI tskpri)
5720
5721 【パラメータ】
5722 ID tskid 対象タスクのID番号
5723 PRI tskpri ベース優先度
5724
5725 【リターンパラメータ】
5726 ER ercd 正常終了(E_OK)またはエラーコード
5727
5728 【エラーコード】
5729 E_CTX コンテキストエラー
5730 ・非タスクコンテキストからの呼出し【NGKI1184】
5731 ・CPUロック状態からの呼出し【NGKI1185】
5732 E_NOSPT 未サポート機能
5733 ・対象タスクが制約タスク【NGKI1186】
5734 E_ID 不正ID番号
5735 ・tskidが有効範囲外【NGKI1187】
5736 E_PAR パラメータエラー
5737 ・tskpriが有効範囲外【NGKI1188】
5738 E_NOEXS オブジェクト未登録
5739 ・対象タスクが未登録〔D〕【NGKI1189】
5740 E_OACV オブジェクトアクセス違反
5741 ・対象タスクに対する通常操作2が許可されていない〔P〕
5742 【NGKI1190】
5743 E_ILUSE サービスコール不正使用
5744 ・条件については機能の項を参照
5745 E_OBJ オブジェクト状態エラー
5746 ・対象タスクが休止状態【NGKI1191】
5747
5748 【機能】
5749
5750 tskidで指定したタスク(対象タスク)のベース優先度を,tskpriで指定した優
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
116
5751 先度に変更する.具体的な振舞いは以下の通り.
5752
5753 対象タスクが休止状態でない場合には,対象タスクのベース優先度が,tskpri
5754 で指定した優先度に変更される【NGKI1192】.それに伴って,対象タスクの現
5755 在優先度も変更される【NGKI1193】.
5756
5757 対象タスクが,優先度上限ミューテックスをロックしていない場合には,次の
5758 処理が行われる.対象タスクが実行できる状態の場合には,同じ優先度のタス
5759 クの中で最低優先順位となる【NGKI1194】.対象タスクが待ち状態で,タスク
5760 の優先度順の待ち行列につながれている場合には,対象タスクの変更後の現在
5761 優先度に従って,その待ち行列中での順序が変更される【NGKI1195】.待ち行
5762 列中に同じ現在優先度のタスクがある場合には,対象タスクの順序はそれらの
5763 中で最後になる【NGKI1196】.
5764
5765 対象タスクが,優先度上限ミューテックスをロックしている場合には,対象タ
5766 スクの現在優先度が変更されることはなく,優先順位も変更されない
5767 【NGKI1197】.
5768
5769 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
5770 【NGKI1198】.また,tskpriにTPRI_INI(=0)を指定すると,対象タスクのベー
5771 ス優先度が,起動時優先度に変更される【NGKI1199】.
5772
5773 対象タスクが優先度上限ミューテックスをロックしているかロックを待ってい
5774 る場合,tskpriは,それらのミューテックスの上限優先度と同じかそれより低
5775 くなければならない.そうでない場合には,E_ILUSEエラーとなる【NGKI1201】.
5776
5777 【TOPPERS/SSPカーネルにおける規定】
5778
5779 SSPカーネルでは,chg_priをサポートしない【SSPS0121】.
5780
5781 【μITRON4.0仕様との関係】
5782
5783 対象タスクが,同じ優先度のタスクの中で最低の優先順位となる(対象タスク
5784 が待ち状態で,タスクの優先度順の待ち行列につながれている場合には,同じ
5785 優先度のタスクの中での順序が最後になる)条件を変更した.
5786 ----------------------------------------------------------------------
5787 get_pri タスク優先度の参照〔T〕【NGKI1202】
5788
5789 【C言語API】
5790 ER ercd = get_pri(ID tskid, PRI *p_tskpri)
5791
5792 【パラメータ】
5793 ID tskid 対象タスクのID番号
5794 PRI * p_tskpri 現在優先度を入れるメモリ領域へのポインタ
5795
5796 【リターンパラメータ】
5797 ER ercd 正常終了(E_OK)またはエラーコード
5798 PRI tskpri 現在優先度
5799
5800 【エラーコード】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
117
5801 E_CTX コンテキストエラー
5802 ・非タスクコンテキストからの呼出し【NGKI1203】
5803 ・CPUロック状態からの呼出し【NGKI1204】
5804 E_ID 不正ID番号
5805 ・tskidが有効範囲外【NGKI1205】
5806 E_NOEXS オブジェクト未登録
5807 ・対象タスクが未登録〔D〕【NGKI1206】
5808 E_OACV オブジェクトアクセス違反
5809 ・対象タスクに対する参照操作が許可されていない〔P〕【NGKI1207】
5810 E_MACV メモリアクセス違反
5811 ・p_tskpriが指すメモリ領域への書込みアクセスが許可され
5812 ていない〔P〕【NGKI1208】
5813 E_OBJ オブジェクト状態エラー
5814 ・対象タスクが休止状態【NGKI1209】
5815
5816 【機能】
5817
5818 tskidで指定したタスク(対象タスク)の現在優先度を参照する.具体的な振舞
5819 いは以下の通り.
5820
5821 対象タスクが休止状態でない場合には,対象タスクの現在優先度が,p_tskpri
5822 が指すメモリ領域に返される【NGKI1210】.
5823
5824 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
5825 【NGKI1211】.
5826
5827 【TOPPERS/SSPカーネルにおける規定】
5828
5829 SSPカーネルでは,get_priをサポートしない【SSPS0122】.
5830 ----------------------------------------------------------------------
5831 get_inf 自タスクの拡張情報の参照〔T〕【NGKI1212】
5832
5833 【C言語API】
5834 ER ercd = get_inf(intptr_t *p_exinf)
5835
5836 【パラメータ】
5837 intptr_t * p_exinf 拡張情報を入れるメモリ領域へのポインタ
5838
5839 【リターンパラメータ】
5840 ER ercd 正常終了(E_OK)またはエラーコード
5841 intptr_t exinf 拡張情報
5842
5843 【エラーコード】
5844 E_CTX コンテキストエラー
5845 ・非タスクコンテキストからの呼出し【NGKI1213】
5846 ・CPUロック状態からの呼出し【NGKI1214】
5847 E_MACV メモリアクセス違反
5848 ・p_exinfが指すメモリ領域への書込みアクセスが許可されて
5849 いない〔P〕【NGKI1215】
5850
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
118
5851 【機能】
5852
5853 自タスクの拡張情報を参照する.参照した拡張情報は,p_exinfが指すメモリ領
5854 域に返される【NGKI1216】.
5855
5856 【TOPPERS/SSPカーネルにおける規定】
5857
5858 SSPカーネルでは,get_infをサポートしない【SSPS0123】.
5859
5860 【μITRON4.0仕様との関係】
5861
5862 μITRON4.0仕様に定義されていないサービスコールである.
5863 ----------------------------------------------------------------------
5864 ref_tsk タスクの状態参照〔T〕【NGKI1217】
5865
5866 【C言語API】
5867 ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk)
5868
5869 【パラメータ】
5870 ID tskid 対象タスクのID番号
5871 T_RTSK * pk_rtsk タスクの現在状態を入れるパケットへのポインタ
5872
5873 【リターンパラメータ】
5874 ER ercd 正常終了(E_OK)またはエラーコード
5875
5876 *タスクの現在状態(パケットの内容)
5877 STAT tskstat タスク状態
5878 PRI tskpri タスクの現在優先度
5879 PRI tskbpri タスクのベース優先度
5880 STAT tskwait タスクの待ち要因
5881 ID wobjid タスクの待ち対象のオブジェクトのID
5882 TMO lefttmo タスクがタイムアウトするまでの時間
5883 uint_t actcnt タスクの起動要求キューイング数
5884 uint_t wupcnt タスクの起床要求キューイング数
5885 bool_t texmsk タスクがタスク例外処理マスク状態か否か(保
5886 護機能対応カーネルの場合)
5887 bool_t waifbd タスクが待ち禁止状態か否か(保護機能対応カー
5888 ネルの場合)
5889 uint_t svclevel タスクの拡張サービスコールのネストレベル(保
5890 護機能対応カーネルの場合)
5891 ID prcid タスクの割付けプロセッサのID(マルチプロセッ
5892 サ対応カーネルの場合)
5893 ID actprc タスクの次回起動時の割付けプロセッサのID(マ
5894 ルチプロセッサ対応カーネルの場合)
5895
5896 【エラーコード】
5897 E_CTX コンテキストエラー
5898 ・非タスクコンテキストからの呼出し【NGKI1218】
5899 ・CPUロック状態からの呼出し【NGKI1219】
5900 E_ID 不正ID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
119
5901 ・tskidが有効範囲外【NGKI1220】
5902 E_NOEXS オブジェクト未登録
5903 ・対象タスクが未登録〔D〕【NGKI1221】
5904 E_OACV オブジェクトアクセス違反
5905 ・対象タスクに対する参照操作が許可されていない〔P〕【NGKI1222】
5906 E_MACV メモリアクセス違反
5907 ・pk_rtskが指すメモリ領域への書込みアクセスが許可されて
5908 いない〔P〕【NGKI1223】
5909
5910 【機能】
5911
5912 tskidで指定したタスク(対象タスク)の現在状態を参照する.参照した現在状
5913 態は,pk_rtskで指定したメモリ領域に返される【NGKI1224】.
5914
5915 tskstatには,対象タスクの現在のタスク状態を表す次のいずれかの値が返され
5916 る【NGKI1225】.
5917
5918 TTS_RUN 0x01U 実行状態
5919 TTS_RDY 0x02U 実行可能状態
5920 TTS_WAI 0x04U 待ち状態
5921 TTS_SUS 0x08U 強制待ち状態
5922 TTS_WAS 0x0cU 二重待ち状態
5923 TTS_DMT 0x10U 休止状態
5924
5925 マルチプロセッサ対応カーネルでは,対象タスクが自タスクの場合にも,
5926 tskstatがTTS_SUSとなる場合がある【NGKI1226】.この状況は,自タスクに対
5927 してref_tskを発行するのと同じタイミングで,他のプロセッサで実行されてい
5928 るタスクから同じタスクに対してsus_tskが発行された場合に発生する可能性が
5929 ある.
5930
5931 対象タスクが休止状態でない場合には,tskpriには対象タスクの現在優先度が,
5932 tskbpriには対象タスクのベース優先度が返される【NGKI1227】.対象タスクが
5933 休止状態である場合には,tskpriとtskbpriの値は保証されない【NGKI1228】.
5934
5935 対象タスクが待ち状態である場合には,tskwaitには,対象タスクが何を待って
5936 いる状態であるかを表す次のいずれかの値が返される【NGKI1229】.
5937
5938 TTW_SLP 0x0001U 起床待ち
5939 TTW_DLY 0x0002U 時間経過待ち
5940 TTW_SEM 0x0004U セマフォの資源獲得待ち
5941 TTW_FLG 0x0008U イベントフラグ待ち
5942 TTW_SDTQ 0x0010U データキューへの送信待ち
5943 TTW_RDTQ 0x0020U データキューからの受信待ち
5944 TTW_SPDQ 0x0100U 優先度データキューへの送信待ち
5945 TTW_RPDQ 0x0200U 優先度データキューからの受信待ち
5946 TTW_MBX 0x0040U メールボックスからの受信待ち
5947 TTW_MTX 0x0080U ミューテックスのロック待ち状態
5948 TTW_SMBF 0x0400U メッセージバッファへの送信待ち
5949 TTW_RMBF 0x0800U メッセージバッファからの受信待ち
5950 TTW_MPF 0x2000U 固定長メモリブロックの獲得待ち
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
120
5951
5952 対象タスクが待ち状態でない場合には,tskwaitの値は保証されない
5953 【NGKI1230】.
5954
5955 対象タスクが起床待ち状態および時間経過待ち状態以外の待ち状態である場合
5956 には,wobjidに,対象タスクが待っているオブジェクトのID番号が返される
5957 【NGKI1231】.対象タスクが待ち状態でない場合や,起床待ち状態または時間
5958 経過待ち状態である場合には,wobjidの値は保証されない【NGKI1232】.
5959
5960 対象タスクが時間経過待ち状態以外の待ち状態である場合には,lefttmoに,タ
5961 スクがタイムアウトを起こすまでの相対時間が返される【NGKI1233】.タスク
5962 がタイムアウトを起こさない場合には,TMO_FEVR(=-1)が返される
5963 【NGKI1234】.
5964
5965 対象タスクが時間経過待ち状態である場合には,lefttmoに,タスクの遅延時間
5966 が経過して待ち解除されるまでの相対時間が返される【NGKI1235】.ただし,
5967 返されるべき相対時間がTMO型に格納することができない場合がありうる.この
5968 場合には,相対時間(RELTIM型,uint_t型に定義される)をTMO型(int_t型に
5969 定義される)に型キャストした値が返される【NGKI1236】.
5970
5971 対象タスクが待ち状態でない場合には,lefttmoの値は保証されない
5972 【NGKI1237】.
5973
5974 actcntには,対象タスクの起動要求キューイング数が返される【NGKI1238】.
5975
5976 対象タスクが休止状態でない場合には,wupcntに,タスクの起床要求キューイ
5977 ング数が返される【NGKI1239】.対象タスクが休止状態である場合には,
5978 wupcntの値は保証されない【NGKI1240】.
5979
5980 保護機能対応カーネルで,対象タスクが休止状態でない場合には,texmskに,
5981 対象タスクがタスク例外処理マスク状態の場合にtrue,そうでない場合に
5982 falseが返される【NGKI1241】.waifbdには,対象タスクが待ち禁止状態の場合
5983 にtrue,そうでない場合にfalseが返される【NGKI1242】.またsvclevelには,
5984 対象タスクが拡張サービスコールを呼び出していない場合には0,呼び出してい
5985 る場合には,実行中の拡張サービスコールがネスト段数が返される
5986 【NGKI1243】.対象タスクが休止状態である場合には,texmsk,waifbd,
5987 svclevelの値は保証されない【NGKI1244】.
5988
5989 マルチプロセッサ対応カーネルでは,prcidに,対象タスクの割付けプロセッサ
5990 のID番号が返される【NGKI1245】.またactprcには,対象タスクの次回起動時
5991 の割付けプロセッサのID番号が返される【NGKI1246】.次回起動時の割付けプ
5992 ロセッサが未設定の場合には,actprcにTPRC_NONE(=0)が返される
5993 【NGKI1247】.
5994
5995 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
5996 【NGKI1248】.
5997
5998 【補足説明】
5999
6000 対象タスクが時間経過待ち状態である場合に,lefttmo(TMO型)に返される値
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
121
6001 をRELTIM型に型キャストすることで,タスクが待ち解除されるまでの相対時間
6002 を正しく得ることができる.
6003
6004 【TOPPERS/ASPカーネルにおける規定】
6005
6006 ASPカーネルでは,tskwaitにTTW_MTX,TTW_SMBF,TTW_RMBFが返ることはない
6007 【ASPS0111】.ただし,ミューテックス機能拡張パッケージを用いると,
6008 tskwaitにTTW_MTXが返る場合がある【ASPS0112】.また,メッセージバッファ
6009 機能拡張パッケージを用いると,tskwaitにTTW_SMBFとTTW_RMBFが返る場合があ
6010 る【ASPS0208】.
6011
6012 【TOPPERS/FMPカーネルにおける規定】
6013
6014 FMPカーネルでは,tskwaitにTTW_MTX,TTW_SMBF,TTW_RMBFが返ることはない
6015 【FMPS0106】.
6016
6017 【TOPPERS/HRP2カーネルにおける規定】
6018
6019 HRP2カーネルでは,tskwaitにTTW_MBX,TTW_SMBF,TTW_RMBFが返ることはない
6020 【HRPS0108】.ただし,メッセージバッファ機能拡張パッケージを用いると,
6021 tskwaitにTTW_SMBFとTTW_RMBFが返る場合がある【HRPS0174】.
6022
6023 【TOPPERS/SSPカーネルにおける規定】
6024
6025 SSPカーネルでは,ref_tskをサポートしない【SSPS0124】.
6026
6027 【使用上の注意】
6028
6029 ref_tskはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
6030 ない.これは,ref_tskを呼び出し,対象タスクの現在状態を参照した直後に割
6031 込みが発生した場合,ref_tskから戻ってきた時には対象タスクの状態が変化し
6032 ている可能性があるためである.
6033
6034 【μITRON4.0仕様との関係】
6035
6036 対象タスクが時間経過待ち状態の時にlefttmoに返される値について規定した.
6037 また,参照できるタスクの状態から,強制待ち要求ネスト数(suscnt)を除外
6038 した.
6039
6040 マルチプロセッサ対応カーネルで参照できる情報として,割付けプロセッサの
6041 ID(prcid)と次回起動時の割付けプロセッサのID(actprc)を追加した.
6042
6043 【μITRON4.0/PX仕様との関係】
6044
6045 保護機能対応カーネルで参照できる情報として,タスク例外処理マスク状態か
6046 否か(texmsk),待ち禁止状態か否か(waifbd),拡張サービスコールのネス
6047 トレベル(svclevel)を追加した.
6048 ----------------------------------------------------------------------
6049
6050 4.2 タスク付属同期機能
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
122
6051
6052 タスク付属同期機能は,タスクとタスクの間,または非タスクコンテキストの
6053 処理とタスクの間で同期を取るために,タスク単独で持っている機能である.
6054
6055 タスク付属同期機能に関連して,各タスクが持つ情報は次の通り【NGKI1249】.
6056
6057 ・起床要求キューイング数
6058
6059 タスクの起床要求キューイング数は,処理されていないタスクの起床要求の数
6060 であり,タスクの起動時に0に初期化される【NGKI1250】.
6061
6062 タスク付属同期機能に関連するカーネル構成マクロは次の通り.
6063
6064 TMAX_WUPCNT タスクの起床要求キューイング数の最大値【NGKI1251】
6065
6066 【TOPPERS/ASPカーネルにおける規定】
6067
6068 ASPカーネルでは,TMAX_WUPCNTは1に固定されている【ASPS0113】.
6069
6070 【TOPPERS/FMPカーネルにおける規定】
6071
6072 FMPカーネルでは,TMAX_WUPCNTは1に固定されている【FMPS0107】.
6073
6074 【TOPPERS/HRP2カーネルにおける規定】
6075
6076 HRP2カーネルでは,TMAX_WUPCNTは1に固定されている【HRPS0109】.
6077
6078 【TOPPERS/SSPカーネルにおける規定】
6079
6080 SSPカーネルでは,タスク付属同期機能をサポートしない【SSPS0125】.
6081
6082 【μITRON4.0仕様との関係】
6083
6084 この仕様では,強制待ち要求をネストする機能をサポートしないこととした.
6085 言い換えると,強制待ち要求ネスト数の最大値を1に固定する.これに伴い,強
6086 制待ち状態から強制再開するサービスコール(frsm_tsk)とタスクの強制待ち
6087 要求ネスト数の最大値を表すカーネル構成マクロ(TMAX_SUSCNT)は廃止した.
6088 また,ref_tskで参照できる情報(T_RTSKのフィールド)から,強制待ち要求ネ
6089 スト数(suscnt)を除外した.
6090 ----------------------------------------------------------------------
6091 slp_tsk 起床待ち〔T〕【NGKI1252】
6092 tslp_tsk 起床待ち(タイムアウト付き)〔T〕【NGKI1253】
6093
6094 【C言語API】
6095 ER ercd = slp_tsk()
6096 ER ercd = tslp_tsk(TMO tmout)
6097
6098 【パラメータ】
6099 TMO tmout タイムアウト時間(tslp_tskの場合)
6100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
123
6101 【リターンパラメータ】
6102 ER ercd 正常終了(E_OK)またはエラーコード
6103
6104 【エラーコード】
6105 E_CTX コンテキストエラー
6106 ・ディスパッチ保留状態からの呼出し【NGKI1254】
6107 E_NOSPT 未サポート機能
6108 ・制約タスクからの呼出し【NGKI1255】
6109 E_PAR パラメータエラー
6110 ・tmoutが無効(tslp_tskの場合)【NGKI1256】
6111 E_TMOUT ポーリング失敗またはタイムアウト(slp_tskを除く)【NGKI1257】
6112 E_RLWAI 待ち禁止状態または待ち状態の強制解除【NGKI1258】
6113
6114 【機能】
6115
6116 自タスクを起床待ちさせる.具体的な振舞いは以下の通り.
6117
6118 自タスクの起床要求キューイング数が0でない場合には,起床要求キューイング
6119 数から1が減ぜられる【NGKI1259】.起床要求キューイング数が0の場合には,
6120 自タスクは起床待ち状態となる【NGKI1260】.
6121
6122 【補足説明】
6123
6124 自タスクの起床要求キューイング数が0でない場合には,自タスクは実行できる
6125 状態を維持し,自タスクの優先順位は変化しない.
6126 ----------------------------------------------------------------------
6127 wup_tsk タスクの起床〔T〕【NGKI1261】
6128 iwup_tsk タスクの起床〔I〕【NGKI1262】
6129
6130 【C言語API】
6131 ER ercd = wup_tsk(ID tskid)
6132 ER ercd = iwup_tsk(ID tskid)
6133
6134 【パラメータ】
6135 ID tskid 対象タスクのID番号
6136
6137 【リターンパラメータ】
6138 ER ercd 正常終了(E_OK)またはエラーコード
6139
6140 【エラーコード】
6141 E_CTX コンテキストエラー
6142 ・非タスクコンテキストからの呼出し(wup_tskの場合)【NGKI1263】
6143 ・タスクコンテキストからの呼出し(iwup_tskの場合)【NGKI1264】
6144 ・CPUロック状態からの呼出し【NGKI1265】
6145 E_NOSPT 未サポート機能
6146 ・対象タスクが制約タスク【NGKI1266】
6147 E_ID 不正ID番号
6148 ・tskidが有効範囲外【NGKI1267】
6149 E_NOEXS オブジェクト未登録
6150 ・対象タスクが未登録〔D〕【NGKI1268】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
124
6151 E_OACV オブジェクトアクセス違反
6152 ・対象タスクに対する通常操作1が許可されていない(wup_tsk
6153 の場合)〔P〕【NGKI1269】
6154 E_OBJ オブジェクト状態エラー
6155 ・対象タスクが休止状態【NGKI1270】
6156 E_QOVR キューイングオーバフロー
6157 ・条件については機能の項を参照
6158
6159 【機能】
6160
6161 tskidで指定したタスク(対象タスク)を起床する.具体的な振舞いは以下の通
6162 り.
6163
6164 対象タスクが起床待ち状態である場合には,対象タスクが待ち解除される
6165 【NGKI1271】.待ち解除されたタスクには,待ち状態となったサービスコール
6166 からE_OKが返る【NGKI1272】.
6167
6168 対象タスクが起床待ち状態でなく,休止状態でもない場合には,対象タスクの
6169 起床要求キューイング数に1が加えられる【NGKI1273】.起床要求キューイング
6170 数に1を加えるとTMAX_WUPCNTを超える場合には,E_QOVRエラーとなる
6171 【NGKI1274】.
6172
6173 wup_tskにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
6174 となる【NGKI1275】.
6175 ----------------------------------------------------------------------
6176 can_wup タスク起床要求のキャンセル〔T〕【NGKI1276】
6177
6178 【C言語API】
6179 ER_UINT wupcnt = can_wup(ID tskid)
6180
6181 【パラメータ】
6182 ID tskid 対象タスクのID番号
6183
6184 【リターンパラメータ】
6185 ER_UINT wupcnt キューイングされていた起床要求の数(正の値
6186 または0)またはエラーコード
6187
6188 【エラーコード】
6189 E_CTX コンテキストエラー
6190 ・非タスクコンテキストからの呼出し【NGKI1277】
6191 ・CPUロック状態からの呼出し【NGKI1278】
6192 E_NOSPT 未サポート機能
6193 ・対象タスクが制約タスク【NGKI1279】
6194 E_ID 不正ID番号
6195 ・tskidが有効範囲外【NGKI1280】
6196 E_NOEXS オブジェクト未登録
6197 ・対象タスクが未登録〔D〕【NGKI1281】
6198 E_OACV オブジェクトアクセス違反
6199 ・対象タスクに対する通常操作1が許可されていない〔P〕
6200 【NGKI1282】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
125
6201 E_OBJ オブジェクト状態エラー
6202 ・対象タスクが休止状態【NGKI1283】
6203
6204 【機能】
6205
6206 tskidで指定したタスク(対象タスク)に対する処理されていない起床要求をす
6207 べてキャンセルし,キャンセルした起床要求の数を返す.具体的な振舞いは以
6208 下の通り.
6209
6210 対象タスクが休止状態でない場合には,対象タスクの起床要求キューイング数
6211 が0に設定され,0に設定する前の起床要求キューイング数が,サービスコール
6212 の返値として返される【NGKI1284】.
6213
6214 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
6215 【NGKI1285】.
6216 ----------------------------------------------------------------------
6217 rel_wai 強制的な待ち解除〔T〕【NGKI1286】
6218 irel_wai 強制的な待ち解除〔I〕【NGKI1287】
6219
6220 【C言語API】
6221 ER ercd = rel_wai(ID tskid)
6222 ER ercd = irel_wai(ID t skid)
6223
6224 【パラメータ】
6225 ID tskid 対象タスクのID番号
6226
6227 【リターンパラメータ】
6228 ER ercd 正常終了(E_OK)またはエラーコード
6229
6230 【エラーコード】
6231 E_CTX コンテキストエラー
6232 ・非タスクコンテキストからの呼出し(rel_waiの場合)【NGKI1288】
6233 ・タスクコンテキストからの呼出し(irel_waiの場合)【NGKI1289】
6234 ・CPUロック状態からの呼出し【NGKI1290】
6235 E_NOSPT 未サポート機能
6236 ・対象タスクが制約タスク【NGKI1291】
6237 E_ID 不正ID番号
6238 ・tskidが有効範囲外【NGKI1292】
6239 E_NOEXS オブジェクト未登録
6240 ・対象タスクが未登録〔D〕【NGKI1293】
6241 E_OACV オブジェクトアクセス違反
6242 ・対象タスクに対する通常操作2が許可されていない(rel_wai
6243 の場合)〔P〕【NGKI1294】
6244 E_OBJ オブジェクト状態エラー
6245 ・対象タスクが待ち状態でない【NGKI1295】
6246
6247 【機能】
6248
6249 tskidで指定したタスク(対象タスク)を,強制的に待ち解除する.具体的な振
6250 舞いは以下の通り.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
126
6251
6252 対象タスクが待ち状態である場合には,対象タスクが待ち解除される
6253 【NGKI1296】.待ち解除されたタスクには,待ち状態となったサービスコール
6254 からE_RLWAIが返る【NGKI1297】.
6255 ----------------------------------------------------------------------
6256 sus_tsk 強制待ち状態への遷移〔T〕【NGKI1298】
6257
6258 【C言語API】
6259 ER ercd = sus_tsk(ID tskid)
6260
6261 【パラメータ】
6262 ID tskid 対象タスクのID番号
6263
6264 【リターンパラメータ】
6265 ER e rcd 正常終了(E_OK)またはエラーコード
6266
6267 【エラーコード】
6268 E_CTX コンテキストエラー
6269 ・非タスクコンテキストからの呼出し【NGKI1299】
6270 ・CPUロック状態からの呼出し【NGKI1300】
6271 ・その他の条件については機能の項を参照
6272 E_NOSPT 未サポート機能
6273 ・対象タスクが制約タスク【NGKI1301】
6274 E_ID 不正ID番号
6275 ・tskidが有効範囲外【NGKI1302】
6276 E_NOEXS オブジェクト未登録
6277 ・対象タスクが未登録〔D〕【NGKI1303】
6278 E_OACV オブジェクトアクセス違反
6279 ・対象タスクに対する通常操作2が許可されていない〔P〕
6280 【NGKI1304】
6281 E_OBJ オブジェクト状態エラー
6282 ・対象タスクが休止状態【NGKI1305】
6283 E_QOVR キューイングオーバフロー
6284 ・対象タスクが強制待ち状態(二重待ち状態を含む)【NGKI1306】
6285
6286 【機能】
6287
6288 tskidで指定したタスク(対象タスク)を強制待ちにする.具体的な振舞いは以
6289 下の通り.
6290
6291 対象タスクが実行できる状態である場合には,対象タスクは強制待ち状態とな
6292 る【NGKI1307】.また,待ち状態(二重待ち状態を除く)である場合には,二
6293 重待ち状態となる【NGKI1308】.
6294
6295 マルチプロセッサ対応カーネルでは,対象タスクが自タスクの場合にも,
6296 E_QOVRエラーとなる場合がある【NGKI1309】.この状況は,自タスクに対して
6297 sus_tskを発行するのと同じタイミングで,他のプロセッサで実行されているタ
6298 スクから同じタスクに対してsus_tskが発行された場合に発生する可能性がある.
6299
6300 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
127
6301 【NGKI1310】.
6302
6303 ディスパッチ保留状態で,対象タスクを自タスクとしてsus_tskを呼び出すと,
6304 E_CTXエラーとなる【NGKI1311】.
6305 ----------------------------------------------------------------------
6306 rsm_tsk 強制待ち状態からの再開〔T〕【NGKI1312】
6307
6308 【C言語API】
6309 ER ercd = rsm_tsk(ID tskid)
6310
6311 【パラメータ】
6312 ID tskid 対象タスクのID番号
6313
6314 【リターンパラメータ】
6315 ER ercd 正常終了(E_OK)またはエラーコード
6316
6317 【エラーコード】
6318 E_CTX コンテキストエラー
6319 ・非タスクコンテキストからの呼出し【NGKI1313】
6320 ・CPUロック状態からの呼出し【NGKI1314】
6321 E_NOSPT 未サポート機能
6322 ・対象タスクが制約タスク【NGKI1315】
6323 E_ID 不正ID番号
6324 ・tskidが有効範囲外【NGKI1316】
6325 E_NOEXS オブジェクト未登録
6326 ・対象タスクが未登録〔D〕【NGKI1317】
6327 E_OACV オブジェクトアクセス違反
6328 ・対象タスクに対する通常操作2が許可されていない〔P〕
6329 【NGKI1318】
6330 E_OBJ オブジェクト状態エラー
6331 ・対象タスクが強制待ち状態(二重待ち状態を含む)でない
6332 【NGKI1319】
6333
6334 【機能】
6335
6336 tskidで指定したタスク(対象タスク)を,強制待ちから再開する.具体的な振
6337 舞いは以下の通り.
6338
6339 対象タスクが強制待ち状態である場合には,対象タスクは強制待ちから再開さ
6340 れる【NGKI1320】.
6341 ----------------------------------------------------------------------
6342 dis_wai 待ち禁止状態への遷移〔TP〕【NGKI1321】
6343 idis_wai 待ち禁止状態への遷移〔IP〕【NGKI1322】
6344
6345 【C言語API】
6346 ER ercd = dis_wai(ID tskid)
6347 ER ercd = idis_wai(ID tskid)
6348
6349 【パラメータ】
6350 ID tskid 対象タスクのID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
128
6351
6352 【リターンパラメータ】
6353 ER ercd 正常終了(E_OK)またはエラーコード
6354
6355 【エラーコード】
6356 E_CTX コンテキストエラー
6357 ・非タスクコンテキストからの呼出し(dis_waiの場合)【NGKI1323】
6358 ・タスクコンテキストからの呼出し(idis_waiの場合)【NGKI1324】
6359 ・CPUロック状態からの呼出し【NGKI1325】
6360 E_NOSPT 未サポート機能
6361 ・対象タスクが制約タスク【NGKI1326】
6362 E_ID 不正ID番号
6363 ・tskidが有効範囲外【NGKI1327】
6364 E_NOEXS オブジェクト未登録
6365 ・対象タスクが未登録〔D〕【NGKI1328】
6366 E_OACV オブジェクトアクセス違反
6367 ・対象タスクに対する通常操作2が許可されていない(dis_wai
6368 の場合)【NGKI1329】
6369 E_OBJ オブジェクト状態エラー
6370 ・対象タスクが休止状態【NGKI1330】
6371 ・対象タスクがタスク例外処理マスク状態でない【NGKI1331】
6372 E_QOVR キューイングオーバフロー
6373 ・対象タスクが待ち禁止状態【NGKI1332】
6374
6375 【機能】
6376
6377 tskidで指定したタスク(対象タスク)を待ち禁止状態にする.具体的な振舞い
6378 は以下の通り.
6379
6380 対象タスクがタスク例外処理マスク状態であり,待ち禁止状態でない場合には,
6381 対象タスクは待ち禁止状態になる【NGKI1333】.
6382
6383 dis_waiにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
6384 となる【NGKI1334】.
6385
6386 【TOPPERS/ASPカーネルにおける規定】
6387
6388 ASPカーネルでは,dis_waiをサポートしない【ASPS0114】.
6389
6390 【TOPPERS/FMPカーネルにおける規定】
6391
6392 FMPカーネルでは,dis_waiをサポートしない【FMPS0108】.
6393
6394 【補足説明】
6395
6396 dis_waiは,対象タスクの待ち解除は行わない.対象タスクを待ち禁止状態にす
6397 ることに加えて待ち解除したい場合には,dis_waiを呼び出した後に,rel_wai
6398 を呼び出せばよい.
6399
6400 【未決定事項】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
129
6401
6402 マルチプロセッサ対応カーネルでは,対象タスクを,自タスクと同じプロセッ
6403 サに割り付けられているタスクに限るなどの制限を導入する可能性があるが,
6404 現時点では未決定である.
6405
6406 【μITRON4.0/PX仕様との関係】
6407
6408 μITRON4.0/PX仕様に定義されていないサービスコールである.
6409 ----------------------------------------------------------------------
6410 ena_wai 待ち禁止状態の解除〔TP〕【NGKI1335】
6411 iena_wai 待ち禁止状態の解除〔IP〕【NGKI1336】
6412
6413 【C言語API】
6414 ER ercd = ena_wai(ID tskid)
6415 ER ercd = iena_wai(ID tskid)
6416
6417 【パラメータ】
6418 ID ts kid 対象タスクのID番号
6419
6420 【リターンパラメータ】
6421 ER ercd 正常終了(E_OK)またはエラーコード
6422
6423 【エラーコード】
6424 E_CTX コンテキストエラー
6425 ・非タスクコンテキストからの呼出し(ena_waiの場合)【NGKI1337】
6426 ・タスクコンテキストからの呼出し(iena_waiの場合)【NGKI1338】
6427 ・CPUロック状態からの呼出し【NGKI1339】
6428 E_NOSPT 未サポート機能
6429 ・対象タスクが制約タスク【NGKI1340】
6430 E_ID 不正ID番号
6431 ・tskidが有効範囲外【NGKI1341】
6432 E_NOEXS オブジェクト未登録
6433 ・対象タスクが未登録〔D〕【NGKI1342】
6434 E_OACV オブジェクトアクセス違反
6435 ・対象タスクに対する通常操作2が許可されていない(ena_wai
6436 の場合)【NGKI1343】
6437 E_OBJ オブジェクト状態エラー
6438 ・対象タスクが休止状態【NGKI1344】
6439 ・対象タスクが待ち禁止状態でない【NGKI1345】
6440
6441 【機能】
6442
6443 tskidで指定したタスク(対象タスク)の待ち禁止状態を解除する.具体的な振
6444 舞いは以下の通り.
6445
6446 対象タスクが待ち禁止状態である場合には,待ち禁止状態は解除される
6447 【NGKI1346】.
6448
6449 ena_waiにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
6450 となる【NGKI1347】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
130
6451
6452 【TOPPERS/ASPカーネルにおける規定】
6453
6454 ASPカーネルでは,ena_waiをサポートしない【ASPS0115】.
6455
6456 【TOPPERS/FMPカーネルにおける規定】
6457
6458 FMPカーネルでは,ena_waiをサポートしない【FMPS0109】.
6459
6460 【未決定事項】
6461
6462 マルチプロセッサ対応カーネルでは,対象タスクを,自タスクと同じプロセッ
6463 サに割り付けられているタスクに限るなどの制限を導入する可能性があるが,
6464 現時点では未決定である.
6465
6466 【μITRON4.0/PX仕様との関係】
6467
6468 μITRON4.0/PX仕様に定義されていないサービスコールである.
6469 ----------------------------------------------------------------------
6470 dly_tsk 自タスクの遅延〔T〕【NGKI1348】
6471
6472 【C言語API】
6473 ER ercd = dly_tsk(RELTIM dlytim)
6474
6475 【パラメータ】
6476 RELTIM dlytim 遅延時間
6477
6478 【リターンパラメータ】
6479 ER ercd 正常終了(E_OK)またはエラーコード
6480
6481 【エラーコード】
6482 E_CTX コンテキストエラー
6483 ・ディスパッチ保留状態からの呼出し【NGKI1349】
6484 E_NOSPT 未サポート機能
6485 ・制約タスクからの呼出し【NGKI1350】
6486 E_PAR パラメータエラー
6487 ・dlytimがTMAX_RELTIMより大きい【NGKI1351】
6488 E_RLWAI 待ち禁止状態または待ち状態の強制解除【NGKI1352】
6489
6490 【機能】
6491
6492 dlytimで指定した時間,自タスクを遅延させる.具体的な振舞いは以下の通り.
6493
6494 自タスクは,dlytimで指定した時間が経過するまでの間,時間経過待ち状態と
6495 なる【NGKI1353】.dly_tskを呼び出してからdlytimで指定した相対時間後に,
6496 自タスクは待ち解除され,dly_tskからE_OKが返る【NGKI1354】.
6497 ----------------------------------------------------------------------
6498
6499 4.3 タスク例外処理機能
6500
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
131
6501 タスク例外処理ルーチンは,カーネルが実行を制御する処理単位で,タスクと
6502 同一のコンテキスト内で実行される.タスク例外処理ルーチンは,各タスクに
6503 1つのみ登録できるため,タスクIDによって識別する【NGKI1355】.
6504
6505 タスク例外処理機能に関連して,各タスクが持つ情報は次の通り【NGKI1356】.
6506
6507 ・タスク例外処理ルーチン属性
6508 ・タスク例外処理禁止フラグ
6509 ・保留例外要因
6510 ・タスク例外処理ルーチンの先頭番地
6511
6512 タスク例外処理ルーチン属性に指定できる属性はない【NGKI1357】.そのため,
6513 タスク例外処理ルーチン属性には,TA_NULLを指定しなければならない
6514 【NGKI1358】.
6515
6516 タスクは,タスク例外処理ルーチンの実行を保留するためのタスク例外処理禁
6517 止フラグを持つ【NGKI1359】.タスク例外処理禁止フラグがセットされた状態
6518 をタスク例外処理禁止状態,クリアされた状態をタスク例外処理許可状態と呼
6519 ぶ【NGKI1360】.タスク例外処理禁止フラグは,タスクの起動時に,セットし
6520 た状態に初期化される【NGKI1361】.
6521
6522 タスクの保留例外要因は,タスクに対して要求された例外要因を蓄積するため
6523 のビットマップであり,タスクの起動時に0に初期化される【NGKI1362】.
6524
6525 タスク例外処理ルーチンは,「タスク例外処理許可状態である」「保留例外要
6526 因が0でない」「タスクが実行状態である」「タスクコンテキストが実行されて
6527 いる」「割込み優先度マスク全解除状態である」「CPUロック状態でない」の6
6528 つの条件が揃った場合に実行が開始される【NGKI1363】.保護機能対応カーネ
6529 ルにおいては,さらに,「タスク例外処理マスク状態でない」という条件が追
6530 加される【NGKI1364】.タスク例外処理マスク状態については,「2.6.5 タス
6531 ク例外処理マスク状態と待ち禁止状態」の節を参照すること.
6532
6533 タスク例外処理ルーチンの実行が開始される時,タスク例外処理禁止フラグは
6534 セットされ,保留例外要因は0にクリアされる【NGKI1365】.また,タスク例外
6535 処理ルーチンからのリターン時には,タスク例外処理禁止フラグはクリアされ
6536 る【NGKI1366】.
6537
6538 保護機能対応カーネルでは,ユーザタスクのタスク例外処理ルーチンの実行開
6539 始時に,リターン先の番地やシステム状態等が,ユーザスタック上に保存され
6540 る【NGKI1367】.ここで,ユーザスタック領域に十分な空きがない場合や,ユー
6541 ザスタックポインタがユーザスタック領域以外を指している場合,カーネルは,
6542 エミュレートされたCPU例外を発生させる【NGKI1368】.これを,タスク例外実
6543 行開始時スタック不正例外と呼ぶ.
6544
6545 逆に,タスク例外処理ルーチンからのリターン時には,リターン先の番地やシ
6546 ステム状態等が,ユーザスタック上から取り出される【NGKI1369】.ここで,
6547 ユーザスタック領域に積まれている情報が足りない場合や,ユーザスタックポ
6548 インタがユーザスタック領域以外を指している場合,カーネルは,エミュレー
6549 トされたCPU例外を発生させる【NGKI1370】.これを,タスク例外リターン時ス
6550 タック不正例外と呼ぶ.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
132
6551
6552 タスク例外実行開始時スタック不正例外またはタスク例外リターン時スタック
6553 不正例外を起こしたタスクの実行を継続した場合の動作は保証されないため,
6554 アプリケーションは,これらのCPU例外を処理するCPU例外ハンドラで,
6555 「2.8.1 CPU例外処理の流れ」の節の(b)または(d)の方法でリカバリ処理を行う
6556 必要がある【NGKI1371】.この方法に従わなかった場合の動作は,保証されな
6557 い【NGKI1372】.
6558
6559 保護機能対応カーネルにおいて,タスク例外処理ルーチンは,タスクと同じ保
6560 護ドメインに属する【NGKI1373】.
6561
6562 タスク例外処理機能に用いるデータ型は次の通り.
6563
6564 TEXPTN タスク例外要因のビットパターン(符号無し整数,uint_tに
6565 定義)【NGKI1374】
6566
6567 C言語によるタスク例外処理ルーチンの記述形式は次の通り【NGKI1375】.
6568
6569 void task_exception_routine(TEXPTN texptn, intptr_t exinf)
6570 {
6571 タスク例外処理ルーチン本体
6572 }
6573
6574 texptnにはタスク例外処理ルーチン起動時の保留例外要因が,exinfにはタスク
6575 の拡張情報が,それぞれ渡される【NGKI1376】.
6576
6577 タスク例外処理機能に関連するカーネル構成マクロは次の通り.
6578
6579 TBIT_TEXPTN タスク例外要因のビット数(TEXPTNの有効ビット数)
6580 【NGKI1377】
6581
6582 【補足説明】
6583
6584 保護機能対応でないカーネルでは,タスク例外処理ルーチンの実行開始条件の
6585 内,「CPUロック状態でない」は省いても同じ結果になる.これは,CPUロック
6586 状態で他の条件が揃うことはないためである.一方,保護機能対応カーネルで
6587 は,CPUロック状態で拡張サービスコールからリターンした場合(言い換えると,
6588 タスク例外処理マスク状態が解除された場合)に,CPUロック状態で他の条件が
6589 揃うことになる.
6590
6591 【TOPPERS/ASPカーネルにおける規定】
6592
6593 ASPカーネルでは,タスク例外要因のビット数(TBIT_TEXPTN)は16以上である
6594 【ASPS0116】.
6595
6596 【TOPPERS/FMPカーネルにおける規定】
6597
6598 FMPカーネルでは,タスク例外要因のビット数(TBIT_TEXPTN)は16以上である
6599 【FMPS0110】.
6600
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
133
6601 【TOPPERS/HRP2カーネルにおける規定】
6602
6603 HRP2カーネルでは,タスク例外要因のビット数(TBIT_TEXPTN)は16以上である
6604 【HRPS0110】.
6605
6606 【TOPPERS/SSPカーネルにおける規定】
6607
6608 SSPカーネルでは,タスク例外処理機能をサポートしない【SSPS0126】.
6609
6610 【μITRON4.0仕様との関係】
6611
6612 割込み優先度マスク全解除状態でない場合には,タスク例外処理ルーチンの実
6613 行が開始されないという仕様に変更した.
6614
6615 【μITRON4.0/PX仕様との関係】
6616
6617 ユーザタスクのタスク例外処理ルーチンの実行開始時とリターン時にユーザス
6618 タックが不正となる問題に関して,μITRON4.0/PX仕様では考慮されていない.
6619
6620 【仕様変更の経緯】
6621
6622 この仕様のRelease 1.2以前では,タスク例外処理ルーチンの実行開始条件に
6623 「割込み優先度マスク全解除状態である」の条件がなかったが,Release1.3以
6624 降で追加した.これは,マルチプロセッサ対応カーネルにおいて,他プロセッ
6625 サで実行中のタスクに対してタスク例外処理を要求した場合に,割込み優先度
6626 マスクが全解除でないと,タスク例外処理ルーチンをただちに実行開始するこ
6627 とができないためである.なお,ASPカーネル Release 1.6以前と,FMPカーネ
6628 ル Release 1.1.1以前のバージョンは,古い仕様に従って実装されている.
6629 ----------------------------------------------------------------------
6630 DEF_TEX タスク例外処理ルーチンの定義〔S〕【NGKI1378】
6631 def_tex タスク例外処理ルーチンの定義〔TD〕【NGKI1379】
6632
6633 【静的API】
6634 DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })
6635
6636 【C言語API】
6637 ER ercd = def_tex(ID tskid, const T_DTEX *pk_dtex)
6638
6639 【パラメータ】
6640 ID tskid 対象タスクのID番号
6641 T_DTEX * pk_dtex タスク例外処理ルーチンの定義情報を入れたパ
6642 ケットへのポインタ(静的APIを除く)
6643
6644 *タスク例外処理ルーチンの定義情報(パケットの内容)
6645 ATR texatr タスク例外処理ルーチン属性
6646 TEXRTN texrtn タスク例外処理ルーチンの先頭番地
6647
6648 【リターンパラメータ】
6649 ER ercd 正常終了(E_OK)またはエラーコード
6650
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
134
6651 【エラーコード】
6652 E_CTX コンテキストエラー
6653 ・非タスクコンテキストからの呼出し〔s〕【NGKI1380】
6654 ・CPUロック状態からの呼出し〔s〕【NGKI1381】
6655 E_ID 不正ID番号
6656 ・tskidが有効範囲外〔s〕【NGKI1382】
6657 E_RSATR 予約属性
6658 ・texatrが無効【NGKI1383】
6659 ・その他の条件については機能の項を参照
6660 E_PAR パラメータエラー
6661 ・texrtnがプログラムの先頭番地として正しくない【NGKI1384】
6662 E_NOEXS オブジェクト未登録
6663 ・対象タスクが未登録【NGKI1385】
6664 E_OACV オブジェクトアクセス違反
6665 ・対象タスクに対する管理操作が許可されていない〔sP〕
6666 【NGKI1386】
6667 E_MACV メモリアクセス違反
6668 ・pk_dtexが指すメモリ領域への読出しアクセスが許可されて
6669 いない〔sP〕【NGKI1387】
6670 E_OBJ オブジェクト状態エラー
6671 ・対象タスクは静的APIで生成された〔s〕【NGKI1388】
6672 ・その他の条件については機能の項を参照
6673
6674 【機能】
6675
6676 tskidで指定したタスク(対象タスク)に対して,各パラメータで指定したタス
6677 ク例外処理ルーチン定義情報に従って,タスク例外処理ルーチンを定義する
6678 【NGKI1389】.
6679
6680 ただし,def_texにおいてpk_dtexをNULLにした場合には,対象タスクに対する
6681 タスク例外処理ルーチンの定義を解除する【NGKI1390】.また,対象タスクの
6682 タスク例外処理禁止フラグをセットし,保留例外要因を0に初期化する
6683 【NGKI1391】.
6684
6685 静的APIにおいては,tskidはオブジェクト識別名,texatrは整数定数式パラメー
6686 タ,texrtnは一般定数式パラメータである【NGKI1392】.
6687
6688 タスク例外処理ルーチンを定義する場合(DEF_TEXの場合およびdef_texにおい
6689 てpk_dtexをNULL以外にした場合)で,対象タスクに対してすでにタスク例外処
6690 理ルーチンが定義されている場合には,E_OBJエラーとなる【NGKI1393】.
6691
6692 保護機能対応カーネルにおいて,DEF_TEXは,対象タスクが属する保護ドメイン
6693 の囲みの中に記述しなければならない.そうでない場合には,E_RSATRエラーと
6694 なる【NGKI1395】.また,def_texでタスク例外処理ルーチンを定義する場合に
6695 は,タスク例外処理ルーチンの属する保護ドメインを設定する必要はなく,タ
6696 スク例外処理ルーチン属性にTA_DOM(domid)を指定した場合にはE_RSATRエラー
6697 となる【NGKI1396】.ただし,TA_DOM(TDOM_SELF)を指定した場合には,指定が
6698 無視され,E_RSATRエラーは検出されない【NGKI1397】.
6699
6700 マルチプロセッサ対応カーネルにおいて,DEF_TEXは,対象タスクが属するクラ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
135
6701 スの囲みの中に記述しなければならない.そうでない場合には,E_RSATRエラー
6702 となる【NGKI1399】.また,def_texでタスク例外処理ルーチンを定義する場合
6703 には,タスク例外処理ルーチンの属するクラスを設定する必要はなく,タスク
6704 例外処理ルーチン属性にTA_CLS(clsid)を指定した場合にはE_RSATRエラーとな
6705 る【NGKI1400】.ただし,TA_CLS(CLS_SELF)を指定した場合には,指定が無視
6706 され,E_RSATRエラーは検出されない【NGKI1401】.
6707
6708 タスク例外処理ルーチンの定義を解除する場合(def_texにおいてpk_dtexを
6709 NULLにした場合)で,対象タスクに対してタスク例外処理ルーチンが定義され
6710 ていない場合には,E_OBJエラーとなる【NGKI1402】.
6711
6712 def_texにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
6713 となる【NGKI1403】.
6714
6715 【TOPPERS/ASPカーネルにおける規定】
6716
6717 ASPカーネルでは,DEF_TEXのみをサポートする【ASPS0117】.ただし,動的生
6718 成機能拡張パッケージでは,def_texもサポートする【ASPS0118】.
6719
6720 【TOPPERS/FMPカーネルにおける規定】
6721
6722 FMPカーネルでは,DEF_TEXのみをサポートする【FMPS0111】.
6723
6724 【TOPPERS/HRP2カーネルにおける規定】
6725
6726 HRP2カーネルでは,DEF_TEXのみをサポートする【HRPS0111】.
6727
6728 【μITRON4.0仕様との関係】
6729
6730 texrtnのデータ型をTEXRTNに変更した.
6731
6732 def_texによって,定義済みのタスク例外処理ルーチンを再定義しようとした場
6733 合に,E_OBJエラーとすることにした.
6734 ----------------------------------------------------------------------
6735 ras_tex タスク例外処理の要求〔T〕【NGKI1404】
6736 iras_tex タスク例外処理の要求〔I〕【NGKI1405】
6737
6738 【C言語API】
6739 ER ercd = ras_tex(ID tskid, TEXPTN rasptn)
6740 ER ercd = iras_tex(ID tskid, TEXPTN rasptn)
6741
6742 【パラメータ】
6743 ID tskid 対象タスクのID番号
6744 TEXPTN rasptn 要求するタスク例外処理のタスク例外要因
6745
6746 【リターンパラメータ】
6747 ER ercd 正常終了(E_OK)またはエラーコード
6748
6749 【エラーコード】
6750 E_CTX コンテキストエラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
136
6751 ・非タスクコンテキストからの呼出し(ras_texの場合)【NGKI1406】
6752 ・タスクコンテキストからの呼出し(iras_texの場合)【NGKI1407】
6753 ・CPUロック状態からの呼出し【NGKI1408】
6754 E_ID 不正ID番号
6755 ・tskidが有効範囲外【NGKI1409】
6756 E_PAR パラメータエラー
6757 ・rasptnが0【NGKI1410】
6758 E_NOEXS オブジェクト未登録
6759 ・対象タスクが未登録〔D〕【NGKI1411】
6760 E_OACV オブジェクトアクセス違反
6761 ・対象タスクに対する通常操作2が許可されていない(ras_tex
6762 の場合)〔P〕【NGKI1412】
6763 E_OBJ オブジェクト状態エラー
6764 ・対象タスクが休止状態【NGKI1413】
6765 ・対象タスクに対してタスク例外処理ルーチンが定義されてい
6766 ない【NGKI1414】
6767
6768 【機能】
6769
6770 tskidで指定したタスク(対象タスク)に対して,rasptnで指定したタスク例外
6771 要因のタスク例外処理を要求する.対象タスクの保留例外要因が,それまでの
6772 値とrasptnで指定した値のビット毎論理和(C言語の"¦")に更新される
6773 【NGKI1415】.
6774
6775 ras_texにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
6776 となる【NGKI1416】.
6777 ----------------------------------------------------------------------
6778 dis_tex タスク例外処理の禁止〔T〕【NGKI1417】
6779
6780 【C言語API】
6781 ER ercd = dis_tex()
6782
6783 【パラメータ】
6784 なし
6785
6786 【リターンパラメータ】
6787 ER ercd 正常終了(E_OK)またはエラーコード
6788
6789 【エラーコード】
6790 E_CTX コンテキストエラー
6791 ・非タスクコンテキストからの呼出し【NGKI1419】
6792 ・CPUロック状態からの呼出し【NGKI1420】
6793 E_OBJ オブジェクト状態エラー
6794 ・自タスクに対してタスク例外処理ルーチンが定義されていな
6795 い【NGKI1421】
6796
6797 【機能】
6798
6799 自タスクのタスク例外処理禁止フラグをセットする【NGKI1422】.すなわち,
6800 自タスクをタスク例外処理禁止状態に遷移させる.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
137
6801 ----------------------------------------------------------------------
6802 ena_tex タスク例外処理の許可〔T〕【NGKI1423】
6803
6804 【C言語API】
6805 ER ercd = ena_tex()
6806
6807 【パラメータ】
6808 なし
6809
6810 【リターンパラメータ】
6811 ER ercd 正常終了(E_OK)またはエラーコード
6812
6813 【エラーコード】
6814 E_CTX コンテキストエラー
6815 ・非タスクコンテキストからの呼出し【NGKI1424】
6816 ・CPUロック状態からの呼出し【NGKI1425】
6817 E_OBJ オブジェクト状態エラー
6818 ・自タスクに対してタスク例外処理ルーチンが定義されていな
6819 い【NGKI1426】
6820
6821 【機能】
6822
6823 自タスクのタスク例外処理禁止フラグをクリアする【NGKI1427】.すなわち,
6824 自タスクをタスク例外処理許可状態に遷移させる.
6825
6826 【補足説明】
6827
6828 タスク例外処理ルーチン中でena_texを呼び出すことにより,タスク例外処理ルー
6829 チンの多重起動を行うことができる.ただし,多重起動の最大段数を制限する
6830 のは,アプリケーションの責任である.
6831 ----------------------------------------------------------------------
6832 sns_tex タスク例外処理禁止状態の参照〔TI〕【NGKI1428】
6833
6834 【C言語API】
6835 bool_t stat e = sns_tex()
6836
6837 【パラメータ】
6838 なし
6839
6840 【リターンパラメータ】
6841 bool_t state タスク例外処理禁止状態
6842
6843 【機能】
6844
6845 実行状態のタスクのタスク例外処理禁止フラグを参照する.具体的な振舞いは
6846 以下の通り.
6847
6848 実行状態のタスクが,タスク例外処理禁止状態の場合にtrue,タスク例外処理
6849 許可状態の場合にfalseが返る【NGKI1429】.sns_texを非タスクコンテキスト
6850 から呼び出した場合で,実行状態のタスクがない場合には,trueが返る
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
138
6851 【NGKI1430】.
6852
6853 マルチプロセッサ対応カーネルにおいては,サービスコールを呼び出した処理
6854 単位を実行しているプロセッサにおいて実行状態のタスクのタスク例外処理禁
6855 止フラグを参照する【NGKI1431】.
6856
6857 【補足説明】
6858
6859 sns_texをタスクコンテキストから呼び出した場合,実行状態のタスクは自タス
6860 クに一致する.
6861 ----------------------------------------------------------------------
6862 ref_tex タスク例外処理の状態参照〔T〕【NGKI1432】
6863
6864 【C言語API】
6865 ER ercd = ref_tex(ID tskid, T_RTEX *pk_rtex)
6866
6867 【パラメータ】
6868 ID tskid 対象タスクのID番号
6869 T_RTEX * pk_rtex タスク例外処理の現在状態を入れるパケットへ
6870 のポインタ
6871
6872 【リターンパラメータ】
6873 ER ercd 正常終了(E_OK)またはエラーコード
6874
6875 *タスク例外処理の現在状態(パケットの内容)
6876 STAT texstat タスク例外処理の状態
6877 TEXPTN pndptn タスクの保留例外要因
6878
6879 【エラーコード】
6880 E_CTX コンテキストエラー
6881 ・非タスクコンテキストからの呼出し【NGKI1433】
6882 ・CPUロック状態からの呼出し【NGKI1434】
6883 E_ID 不正ID番号
6884 ・tskidが有効範囲外【NGKI1435】
6885 E_NOEXS オブジェクト未登録
6886 ・対象タスクが未登録〔D〕【NGKI1436】
6887 E_OACV オブジェクトアクセス違反
6888 ・対象タスクに対する参照操作が許可されていない〔P〕【NGKI1437】
6889 E_MACV メモリアクセス違反
6890 ・pk_rtexが指すメモリ領域への書込みアクセスが許可されて
6891 いない〔P〕【NGKI1438】
6892 E_OBJ オブジェクト状態エラー
6893 ・対象タスクが休止状態【NGKI1439】
6894 ・対象タスクに対してタスク例外処理ルーチンが定義されてい
6895 ない【NGKI1440】
6896
6897 【機能】
6898
6899 tskidで指定したタスク(対象タスク)のタスク例外処理に関する現在状態を参
6900 照する.参照した現在状態は,pk_rtexで指定したパケットに返される
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
139
6901 【NGKI1441】.
6902
6903 texstatには,対象タスクの現在のタスク例外処理禁止フラグを表す次のいずれ
6904 かの値が返される【NGKI1442】.
6905
6906 TTEX_ENA 0x01U タスク例外処理許可状態
6907 TTEX_DIS 0x02U タスク例外処理禁止状態
6908
6909 pndptnには,対象タスクの現在の保留例外要因が返される【NGKI1443】.
6910
6911 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
6912 【NGKI1444】.
6913 ----------------------------------------------------------------------
6914
6915 4.4 同期・通信機能
6916
6917 【TOPPERS/SSPカーネルにおける規定】
6918
6919 SSPカーネルでは,同期・通信機能をサポートしない【SSPS0127】.
6920
6921 【μITRON4.0仕様との関係】
6922
6923 この仕様では,ランデブ機能はサポートしていない.今後の検討により,ラン
6924 デブ機能をサポートすることに変更する可能性もある.
6925
6926 4.4.1 セマフォ
6927
6928 セマフォは,資源の数を表す0以上の整数値を取るカウンタ(資源数)を介して,
6929 排他制御やイベント通知を行うための同期・通信オブジェクトである.セマフォ
6930 の資源数から1を減ずることを資源の獲得,資源数に1を加えることを資源の返
6931 却と呼ぶ.セマフォは,セマフォIDと呼ぶID番号によって識別する【NGKI1445】.
6932
6933 各セマフォが持つ情報は次の通り【NGKI1446】.
6934
6935 ・セマフォ属性
6936 ・資源数(の現在値)
6937 ・待ち行列(セマフォの資源獲得待ち状態のタスクのキュー)
6938 ・初期資源数
6939 ・最大資源数
6940 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
6941 ・属する保護ドメイン(保護機能対応カーネルの場合)
6942 ・属するクラス(マルチプロセッサ対応カーネルの場合)
6943
6944 待ち行列は,セマフォの資源が獲得できるまで待っている状態(セマフォの資
6945 源獲得待ち状態)のタスクが,資源を獲得できる順序でつながれているキュー
6946 である.
6947
6948 セマフォの初期資源数は,セマフォを生成または再初期化した際の,資源数の
6949 初期値である.また,セマフォの最大資源数は,資源数が取りうる最大値であ
6950 る.資源数が最大資源数に一致している時に資源を返却しようとすると,
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
140
6951 E_QOVRエラーとなる【NGKI1447】.
6952
6953 セマフォ属性には,次の属性を指定することができる【NGKI1448】.
6954
6955 TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
6956
6957 TA_TPRIを指定しない場合,待ち行列はFIFO順になる【NGKI1449】.
6958
6959 セマフォ機能に関連するカーネル構成マクロは次の通り.
6960
6961 TMAX_MAXSEM セマフォの最大資源数の最大値(=UINT_MAX)【NGKI1450】
6962
6963 TNUM_SEMID 登録できるセマフォの数(動的生成対応でないカーネル
6964 では,静的APIによって登録されたセマフォの数に一致)
6965 【NGKI1451】
6966
6967 【μITRON4.0仕様との関係】
6968
6969 TNUM_SEMIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
6970 ----------------------------------------------------------------------
6971 CRE_SEM セマフォの生成〔S〕【NGKI1452】
6972 acre_sem セマフォの生成〔TD〕【NGKI1453】
6973
6974 【静的API】
6975 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
6976
6977 【C言語API】
6978 ER_ID semid = acre_sem(const T_CSEM *pk_csem)
6979
6980 【パラメータ】
6981 ID semid 生成するセマフォのID番号(CRE_SEMの場合)
6982 T_CSEM * pk_csem セマフォの生成情報を入れたパケットへのポイ
6983 ンタ(静的APIを除く)
6984
6985 *セマフォの生成情報(パケットの内容)
6986 ATR sematr セマフォ属性
6987 uint_t isemcnt セマフォの初期資源数
6988 uint_t maxsem セマフォの最大資源数
6989
6990 【リターンパラメータ】
6991 ER_ID semid 生成されたセマフォのID番号(正の値)または
6992 エラーコード
6993
6994 【エラーコード】
6995 E_CTX コンテキストエラー
6996 ・非タスクコンテキストからの呼出し〔s〕【NGKI1454】
6997 ・CPUロック状態からの呼出し〔s〕【NGKI1455】
6998 E_RSATR 予約属性
6999 ・sematrが無効【NGKI1456】
7000 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI1457】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
141
7001 ・属するクラスの指定が有効範囲外〔sM〕【NGKI1458】
7002 ・クラスの囲みの中に記述されていない〔SM〕【NGKI1459】
7003 E_PAR パラメータエラー
7004 ・maxsemが有効範囲(1以上TMAX_MAXSEM以下)外【NGKI1468】
7005 ・isemcntが有効範囲(0以上maxsem以下)外【NGKI1466】
7006 E_OACV オブジェクトアクセス違反
7007 ・システム状態に対する管理操作が許可されていない〔sP〕
7008 【NGKI1460】
7009 E_MACV メモリアクセス違反
7010 ・pk_csemが指すメモリ領域への読出しアクセスが許可されて
7011 いない〔sP〕【NGKI1461】
7012 E_NOID ID番号不足
7013 ・割り付けられるセマフォIDがない〔sD〕【NGKI1462】
7014 E_OBJ オブジェクト状態エラー
7015 ・semidで指定したセマフォが登録済み(CRE_SEMの場合)
7016 【NGKI1463】
7017
7018 【機能】
7019
7020 各パラメータで指定したセマフォ生成情報に従って,セマフォを生成する.生
7021 成されたセマフォの資源数は初期資源数に,待ち行列は空の状態に初期化され
7022 る【NGKI1464】.
7023
7024 静的APIにおいては,semidはオブジェクト識別名,sematr,isemcnt,maxsemは
7025 整数定数式パラメータである【NGKI1465】.
7026
7027 【TOPPERS/ASPカーネルにおける規定】
7028
7029 ASPカーネルでは,CRE_SEMのみをサポートする【ASPS0119】.ただし,動的生
7030 成機能拡張パッケージでは,acre_semもサポートする【ASPS0120】.
7031
7032 【TOPPERS/FMPカーネルにおける規定】
7033
7034 FMPカーネルでは,CRE_SEMのみをサポートする【FMPS0112】.
7035
7036 【TOPPERS/HRP2カーネルにおける規定】
7037
7038 HRP2カーネルでは,CRE_SEMのみをサポートする【HRPS0112】.
7039 ----------------------------------------------------------------------
7040 AID_SEM 割付け可能なセマフォIDの数の指定〔SD〕【NGKI1469】
7041
7042 【静的API】
7043 AID_SEM(uint_t nosem)
7044
7045 【パラメータ】
7046 uint_t n osem 割付け可能なセマフォIDの数
7047
7048 【エラーコード】
7049 E_RSATR 予約属性
7050 ・クラスの囲みの中に記述されていない〔M〕【NGKI1470】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
142
7051 E_PAR パラメータエラー
7052 ・nosemが負の値【NGKI3277】
7053
7054 【機能】
7055
7056 nosemで指定した数のセマフォIDを,セマフォを生成するサービスコールによっ
7057 て割付け可能なセマフォIDとして確保する【NGKI1471】.
7058
7059 nosemは整数定数式パラメータである【NGKI1472】.
7060 ----------------------------------------------------------------------
7061 SAC_SEM セマフォのアクセス許可ベクタの設定〔SP〕【NGKI1473】
7062 sac_sem セマフォのアクセス許可ベクタの設定〔TPD〕【NGKI1474】
7063
7064 【静的API】
7065 SAC_SEM(ID semid, { ACPTN acptn1, ACPTN acptn2,
7066 ACPTN acptn3, ACPTN acptn4 })
7067
7068 【C言語API】
7069 ER ercd = sac_sem(ID semid, const ACVCT *p_acvct)
7070
7071 【パラメータ】
7072 ID semid 対象セマフォのID番号
7073 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
7074 インタ(静的APIを除く)
7075
7076 *アクセス許可ベクタ(パケットの内容)
7077 ACPTN acptn1 通常操作1のアクセス許可パターン
7078 ACPTN acptn2 通常操作2のアクセス許可パターン
7079 ACPTN acptn3 管理操作のアクセス許可パターン
7080 ACPTN acptn4 参照操作のアクセス許可パターン
7081
7082 【リターンパラメータ】
7083 ER ercd 正常終了(E_OK)またはエラーコード
7084
7085 【エラーコード】
7086 E_CTX コンテキストエラー
7087 ・非タスクコンテキストからの呼出し〔s〕【NGKI1475】
7088 ・CPUロック状態からの呼出し〔s〕【NGKI1476】
7089 E_ID 不正ID番号
7090 ・semidが有効範囲外〔s〕【NGKI1477】
7091 E_RSATR 予約属性
7092 ・対象セマフォが属する保護ドメインの囲みの中に記述され
7093 ていない〔S〕【NGKI1478】
7094 ・対象セマフォが属するクラスの囲みの中に記述されていな
7095 い〔SM〕【NGKI1479】
7096 E_NOEXS オブジェクト未登録
7097 ・対象セマフォが未登録【NGKI1480】
7098 E_OACV オブジェクトアクセス違反
7099 ・対象セマフォに対する管理操作が許可されていない〔s〕
7100 【NGKI1481】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
143
7101 E_MACV メモリアクセス違反
7102 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
7103 いない〔s〕【NGKI1482】
7104 E_OBJ オブジェクト状態エラー
7105 ・対象セマフォは静的APIで生成された〔s〕【NGKI1483】
7106 ・対象セマフォに対してアクセス許可ベクタが設定済み〔S〕
7107 【NGKI1484】
7108
7109 【機能】
7110
7111 semidで指定したセマフォ(対象セマフォ)のアクセス許可ベクタ(4つのアク
7112 セス許可パターンの組)を,各パラメータで指定した値に設定する
7113 【NGKI1485】.
7114
7115 静的APIにおいては,semidはオブジェクト識別名,acptn1~acptn4は整数定数
7116 式パラメータである【NGKI1486】.
7117
7118 【TOPPERS/ASPカーネルにおける規定】
7119
7120 ASPカーネルでは,SAC_SEM,sac_semをサポートしない【ASPS0121】.
7121
7122 【TOPPERS/FMPカーネルにおける規定】
7123
7124 FMPカーネルでは,SAC_SEM,sac_semをサポートしない【FMPS0113】.
7125
7126 【TOPPERS/HRP2カーネルにおける規定】
7127
7128 HRP2カーネルでは,SAC_SEMのみをサポートする【HRPS0113】.
7129 ----------------------------------------------------------------------
7130 del_sem セマフォの削除〔TD〕【NGKI1487】
7131
7132 【C言語API】
7133 ER ercd = del_sem(ID semid)
7134
7135 【パラメータ】
7136 ID semi d 対象セマフォのID番号
7137
7138 【リターンパラメータ】
7139 ER ercd 正常終了(E_OK)またはエラーコード
7140
7141 【エラーコード】
7142 E_CTX コンテキストエラー
7143 ・非タスクコンテキストからの呼出し【NGKI1488】
7144 ・CPUロック状態からの呼出し【NGKI1489】
7145 E_ID 不正ID番号
7146 ・semidが有効範囲外【NGKI1490】
7147 E_NOEXS オブジェクト未登録
7148 ・対象セマフォが未登録【NGKI1491】
7149 E_OACV オブジェクトアクセス違反
7150 ・対象セマフォに対する管理操作が許可されていない〔P〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
144
7151 【NGKI1492】
7152 E_OBJ オブジェクト状態エラー
7153 ・対象セマフォは静的APIで生成された【NGKI1493】
7154
7155 【機能】
7156
7157 semidで指定したセマフォ(対象セマフォ)を削除する.具体的な振舞いは以下
7158 の通り.
7159
7160 対象セマフォの登録が解除され,そのセマフォIDが未使用の状態に戻される
7161 【NGKI1494】.また,対象セマフォの待ち行列につながれたタスクは,待ち行
7162 列の先頭のタスクから順に待ち解除される【NGKI1495】.待ち解除されたタス
7163 クには,待ち状態となったサービスコールからE_DLTエラーが返る【NGKI1496】.
7164
7165 【使用上の注意】
7166
7167 del_semにより複数のタスクが待ち解除される場合,サービスコールの処理時間
7168 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
7169 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
7170 み禁止時間が長くなるため,注意が必要である.
7171
7172 【TOPPERS/ASPカーネルにおける規定】
7173
7174 ASPカーネルでは,del_semをサポートしない【ASPS0122】.ただし,動的生成
7175 機能拡張パッケージでは,del_semをサポートする【ASPS0123】.
7176
7177 【TOPPERS/FMPカーネルにおける規定】
7178
7179 FMPカーネルでは,del_semをサポートしない【FMPS0114】.
7180
7181 【TOPPERS/HRP2カーネルにおける規定】
7182
7183 HRP2カーネルでは,del_semをサポートしない【HRPS0114】.
7184 ----------------------------------------------------------------------
7185 sig_sem セマフォの資源の返却〔T〕【NGKI1497】
7186 isig_sem セマフォの資源の返却〔I〕【NGKI1498】
7187
7188 【C言語API】
7189 ER ercd = sig_sem(ID semid)
7190 ER ercd = isig_sem(ID semid)
7191
7192 【パラメータ】
7193 ID semid 対象セマフォのID番号
7194
7195 【リターンパラメータ】
7196 ER ercd 正常終了(E_OK)またはエラーコード
7197
7198 【エラーコード】
7199 E_CTX コンテキストエラー
7200 ・非タスクコンテキストからの呼出し(sig_semの場合)【NGKI1499】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
145
7201 ・タスクコンテキストからの呼出し(isig_semの場合)【NGKI1500】
7202 ・CPUロック状態からの呼出し【NGKI1501】
7203 E_ID 不正ID番号
7204 ・semidが有効範囲外【NGKI1502】
7205 E_NOEXS オブジェクト未登録
7206 ・対象セマフォが未登録〔D〕【NGKI1503】
7207 E_OACV オブジェクトアクセス違反
7208 ・対象セマフォに対する通常操作1が許可されていない(sig_sem
7209 の場合)〔P〕【NGKI1504】
7210 E_QOVR キューイングオーバフロー
7211 ・条件については機能の項を参照
7212
7213 【機能】
7214
7215 semidで指定したセマフォ(対象セマフォ)に資源を返却する.具体的な振舞い
7216 は以下の通り.
7217
7218 対象セマフォの待ち行列にタスクが存在する場合には,待ち行列の先頭のタス
7219 クが待ち解除される【NGKI1505】.この時,待ち解除されたタスクが資源を獲
7220 得したことになるため,対象セマフォの資源数は変化しない【NGKI1506】.待
7221 ち解除されたタスクには,待ち状態となったサービスコールからE_OKが返る
7222 【NGKI1507】.
7223
7224 待ち行列にタスクが存在しない場合には,対象セマフォの資源数に1が加えられ
7225 る【NGKI1508】.資源数に1を加えるとそのセマフォの最大資源数を越える場合
7226 には,E_QOVRエラーとなる【NGKI1509】.
7227 ----------------------------------------------------------------------
7228 wai_sem セマフォの資源の獲得〔T〕【NGKI1510】
7229 pol_sem セマフォの資源の獲得(ポーリング)〔T〕【NGKI1511】
7230 twai_sem セマフォの資源の獲得(タイムアウト付き)〔T〕【NGKI1512】
7231
7232 【C言語API】
7233 ER ercd = wai_sem(ID semid)
7234 ER ercd = pol_sem(ID semid)
7235 ER ercd = twai_sem(ID semid, TMO tmout)
7236
7237 【パラメータ】
7238 ID semid 対象セマフォのID番号
7239 TMO tmout タイムアウト時間(twai_semの場合)
7240
7241 【リターンパラメータ】
7242 ER ercd 正常終了(E_OK)またはエラーコード
7243
7244 【エラーコード】
7245 E_CTX コンテキストエラー
7246 ・非タスクコンテキストからの呼出し【NGKI1513】
7247 ・CPUロック状態からの呼出し【NGKI1514】
7248 ・ディスパッチ保留状態からの呼出し(pol_semを除く)【NGKI1515】
7249 E_NOSPT 未サポート機能
7250 ・制約タスクからの呼出し(pol_semを除く)【NGKI1516】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
146
7251 E_ID 不正ID番号
7252 ・semidが有効範囲外【NGKI1517】
7253 E_PAR パラメータエラー
7254 ・tmoutが無効(twai_semの場合)【NGKI1518】
7255 E_NOEXS オブジェクト未登録
7256 ・対象セマフォが未登録〔D〕【NGKI1519】
7257 E_OACV オブジェクトアクセス違反
7258 ・対象セマフォに対する通常操作2が許可されていない〔P〕
7259 【NGKI1520】
7260 E_TMOUT ポーリング失敗またはタイムアウト(wai_semを除く)【NGKI1521】
7261 E_RLWAI 待ち禁止状態または待ち状態の強制解除(pol_semを除く)
7262 【NGKI1522】
7263 E_DLT 待ちオブジェクトの削除または再初期化(pol_semを除く)
7264 【NGKI1523】
7265
7266 【機能】
7267
7268 semidで指定したセマフォ(対象セマフォ)から資源を獲得する.具体的な振舞
7269 いは以下の通り.
7270
7271 対象セマフォの資源数が1以上の場合には,資源数から1が減ぜられる
7272 【NGKI1524】.資源数が0の場合には,自タスクはセマフォの資源獲得待ち状態
7273 となり,対象セマフォの待ち行列につながれる【NGKI1525】.
7274 ----------------------------------------------------------------------
7275 ini_sem セマフォの再初期化〔T〕【NGKI1526】
7276
7277 【C言語API】
7278 ER ercd = ini_sem(ID semid)
7279
7280 【パラメータ】
7281 ID semid 対象セマフォのID番号
7282
7283 【リターンパラメータ】
7284 ER ercd 正常終了(E_OK)またはエラーコード
7285
7286 【エラーコード】
7287 E_CTX コンテキストエラー
7288 ・非タスクコンテキストからの呼出し【NGKI1527】
7289 ・CPUロック状態からの呼出し【NGKI1528】
7290 E_ID 不正ID番号
7291 ・semidが有効範囲外【NGKI1529】
7292 E_NOEXS オブジェクト未登録
7293 ・対象セマフォが未登録〔D〕【NGKI1530】
7294 E_OACV オブジェクトアクセス違反
7295 ・対象セマフォに対する管理操作が許可されていない〔P〕
7296 【NGKI1531】
7297
7298 【機能】
7299
7300 semidで指定したセマフォ(対象セマフォ)を再初期化する.具体的な振舞いは
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
147
7301 以下の通り.
7302
7303 対象セマフォの資源数は,初期資源数に初期化される【NGKI1532】.また,対
7304 象セマフォの待ち行列につながれたタスクは,待ち行列の先頭のタスクから順
7305 に待ち解除される【NGKI1533】.待ち解除されたタスクには,待ち状態となっ
7306 たサービスコールからE_DLTエラーが返る【NGKI1534】.
7307
7308 【使用上の注意】
7309
7310 ini_semにより複数のタスクが待ち解除される場合,サービスコールの処理時間
7311 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
7312 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
7313 み禁止時間が長くなるため,注意が必要である.
7314
7315 セマフォを再初期化した場合に,アプリケーションとの整合性を保つのは,ア
7316 プリケーションの責任である.
7317
7318 【μITRON4.0仕様との関係】
7319
7320 μITRON4.0仕様に定義されていないサービスコールである.
7321 ----------------------------------------------------------------------
7322 ref_sem セマフォの状態参照〔T〕【NGKI1535】
7323
7324 【C言語API】
7325 ER ercd = ref_sem(ID semid, T_RSEM *pk_rsem)
7326
7327 【パラメータ】
7328 ID semid 対象セマフォのID番号
7329 T_RSEM * pk_rsem セマフォの現在状態を入れるパケットへのポイ
7330 ンタ
7331
7332 【リターンパラメータ】
7333 ER ercd 正常終了(E_OK)またはエラーコード
7334
7335 *セマフォの現在状態(パケットの内容)
7336 ID wtskid セマフォの待ち行列の先頭のタスクのID番号
7337 uint_t semcnt セマフォの資源数
7338
7339 【エラーコード】
7340 E_CTX コンテキストエラー
7341 ・非タスクコンテキストからの呼出し【NGKI1536】
7342 ・CPUロック状態からの呼出し【NGKI1537】
7343 E_ID 不正ID番号
7344 ・semidが有効範囲外【NGKI1538】
7345 E_NOEXS オブジェクト未登録
7346 ・対象セマフォが未登録〔D〕【NGKI1539】
7347 E_OACV オブジェクトアクセス違反
7348 ・対象セマフォに対する参照操作が許可されていない〔P〕
7349 【NGKI1540】
7350 E_MACV メモリアクセス違反
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
148
7351 ・pk_rsemが指すメモリ領域への書込みアクセスが許可されて
7352 いない〔P〕【NGKI1541】
7353
7354 【機能】
7355
7356 semidで指定したセマフォ(対象セマフォ)の現在状態を参照する.参照した現
7357 在状態は,pk_rsemで指定したパケットに返される【NGKI1542】.
7358
7359 対象セマフォの待ち行列にタスクが存在しない場合,wtskidにはTSK_NONE(=
7360 0)が返る【NGKI1543】.
7361
7362 【使用上の注意】
7363
7364 ref_semはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
7365 ない.これは,ref_semを呼び出し,対象セマフォの現在状態を参照した直後に
7366 割込みが発生した場合,ref_semから戻ってきた時には対象セマフォの状態が変
7367 化している可能性があるためである.
7368 ----------------------------------------------------------------------
7369
7370 4.4.2 イベントフラグ
7371
7372 イベントフラグは,イベントの発生の有無を表すビットの集合(ビットパター
7373 ン)を介して,イベント通知を行うための同期・通信オブジェクトである.イ
7374 ベントが発生している状態を1,発生していない状態を0とし,ビットパターン
7375 により複数のイベントの発生の有無を表す【NGKI1544】.イベントフラグは,
7376 イベントフラグIDと呼ぶID番号によって識別する【NGKI1545】.
7377
7378 1つまたは複数のビットをセットする1にする(セットする)ことを,イベント
7379 フラグをセットするといい,0にする(クリアする)ことを,イベントフラグを
7380 クリアするという.イベントフラグによりイベントを通知する側のタスクは,
7381 イベントフラグをセットまたはクリアすることで,イベントの発生を通知する.
7382
7383 イベントフラグによりイベントの通知を受ける側のタスクは,待ちビットパター
7384 ンと待ちモードにより,どのビットがセットされるのを待つかを指定する.待
7385 ちモードにTWF_ORW(=0x01U)を指定した場合,待ちビットパターンに含まれ
7386 るいずれかのビットがセットされるのを待つ【NGKI1546】.待ちモードに
7387 TWF_ANDW(=0x02U)を指定した場合,待ちビットパターンに含まれるすべての
7388 ビットがセットされるのを待つ【NGKI1547】.この条件を,イベントフラグの
7389 待ち解除の条件と呼ぶ.
7390
7391 各イベントフラグが持つ情報は次の通り【NGKI1548】.
7392
7393 ・イベントフラグ属性
7394 ・ビットパターン(の現在値)
7395 ・待ち行列(イベントフラグ待ち状態のタスクのキュー)
7396 ・初期ビットパターン
7397 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
7398 ・属する保護ドメイン(保護機能対応カーネルの場合)
7399 ・属するクラス(マルチプロセッサ対応カーネルの場合)
7400
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
149
7401 待ち行列は,イベントフラグが指定した待ち解除の条件を満たすまで待ってい
7402 る状態(イベントフラグ待ち状態)のタスクがつながれているキューである.
7403 待ち行列につながれたタスクの待ち解除は,待ち解除の条件を満たした中で,
7404 待ち行列の前方につながれたものから順に行われる(〔NGKI0216〕に該当)
7405 【NGKI1549】.
7406
7407 イベントフラグの初期ビットパターンは,イベントフラグを生成または再初期
7408 化した際の,ビットパターンの初期値である.
7409
7410 イベントフラグ属性には,次の属性を指定することができる【NGKI1550】.
7411
7412 TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
7413 TA_WMUL 0x02U 複数のタスクが待つのを許す
7414 TA_CLR 0x04U タスクの待ち解除時にイベントフラグをクリアする
7415
7416 TA_TPRIを指定しない場合,待ち行列はFIFO順になる【NGKI1551】.TA_WMULを
7417 指定しない場合,1つのイベントフラグに複数のタスクが待つことを禁止する
7418 【NGKI1552】.
7419
7420 TA_CLRを指定した場合,タスクの待ち解除時に,イベントフラグのビットパター
7421 ンを0にクリアする【NGKI1553】.TA_CLRを指定しない場合,タスクの待ち解除
7422 時にイベントフラグをクリアしない【NGKI1554】.
7423
7424 イベントフラグ機能に用いるデータ型は次の通り.
7425
7426 FLGPTN イベントフラグのビットパターン(符号無し整数,uint_tに
7427 定義)【NGKI1555】
7428
7429 イベントフラグ機能に関連するカーネル構成マクロは次の通り.
7430
7431 TBIT_FLGPTN イベントフラグのビット数(FLGPTNの有効ビット数)
7432 【NGKI1556】
7433
7434 TNUM_FLGID 登録できるイベントフラグの数(動的生成対応でないカー
7435 ネルでは,静的APIによって登録されたイベントフラグの
7436 数に一致)【NGKI1557】
7437
7438 【TOPPERS/ASPカーネルにおける規定】
7439
7440 ASPカーネルでは,イベントフラグのビット数(TBIT_FLGPTN)は16以上である
7441 【ASPS0124】.
7442
7443 【TOPPERS/FMPカーネルにおける規定】
7444
7445 FMPカーネルでは,イベントフラグのビット数(TBIT_FLGPTN)は16以上である
7446 【FMPS0115】.
7447
7448 【TOPPERS/HRP2カーネルにおける規定】
7449
7450 HRP2カーネルでは,イベントフラグのビット数(TBIT_FLGPTN)は16以上である
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
150
7451 【HRPS0115】.
7452
7453 【μITRON4.0仕様との関係】
7454
7455 TNUM_FLGIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
7456 ----------------------------------------------------------------------
7457 CRE_FLG イベントフラグの生成〔S〕【NGKI1558】
7458 acre_flg イベントフラグの生成〔TD〕【NGKI1559】
7459
7460 【静的API】
7461 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
7462
7463 【C言語API】
7464 ER_ID flgid = acre_flg(const T_CFLG *pk_cflg)
7465
7466 【パラメータ】
7467 ID flgid 生成するイベントフラグのID番号(CRE_FLGの
7468 場合)
7469 T_CFLG * pk_cflg イベントフラグの生成情報を入れたパケットへ
7470 のポインタ(静的APIを除く)
7471
7472 *イベントフラグの生成情報(パケットの内容)
7473 ATR flgatr イベントフラグ属性
7474 FLGPTN iflgptn イベントフラグの初期ビットパターン
7475
7476 【リターンパラメータ】
7477 ER_ID flgid 生成されたイベントフラグのID番号(正の値)
7478 またはエラーコード
7479
7480 【エラーコード】
7481 E_CTX コンテキストエラー
7482 ・非タスクコンテキストからの呼出し〔s〕【NGKI1560】
7483 ・CPUロック状態からの呼出し〔s〕【NGKI1561】
7484 E_RSATR 予約属性
7485 ・flgatrが無効【NGKI1562】
7486 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI1563】
7487 ・属するクラスの指定が有効範囲外〔sM〕【NGKI1564】
7488 ・クラスの囲みの中に記述されていない〔SM〕【NGKI1565】
7489 E_PAR パラメータエラー
7490 ・iflgptnがFLGPTNに格納できない〔S〕【NGKI3275】
7491 E_OACV オブジェクトアクセス違反
7492 ・システム状態に対する管理操作が許可されていない〔sP〕
7493 【NGKI1566】
7494 E_MACV メモリアクセス違反
7495 ・pk_cflgが指すメモリ領域への読出しアクセスが許可されて
7496 いない〔sP〕【NGKI1567】
7497 E_NOID ID番号不足
7498 ・割り付けられるイベントフラグIDがない〔sD〕【NGKI1568】
7499 E_OBJ オブジェクト状態エラー
7500 ・flgidで指定したイベントフラグが登録済み(CRE_FLGの場合)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
151
7501 【NGKI1569】
7502
7503 【機能】
7504
7505 各パラメータで指定したイベントフラグ生成情報に従って,イベントフラグを
7506 生成する.生成されたイベントフラグのビットパターンは初期ビットパターン
7507 に,待ち行列は空の状態に初期化される【NGKI1570】.
7508
7509 静的APIにおいては,flgidはオブジェクト識別名,flgatrとiflgptnは整数定数
7510 式パラメータである【NGKI1571】.
7511
7512 【TOPPERS/ASPカーネルにおける規定】
7513
7514 ASPカーネルでは,CRE_FLGのみをサポートする【ASPS0125】.ただし,動的生
7515 成機能拡張パッケージでは,acre_flgもサポートする【ASPS0126】.
7516
7517 【TOPPERS/FMPカーネルにおける規定】
7518
7519 FMPカーネルでは,CRE_FLGのみをサポートする【FMPS0116】.
7520
7521 【TOPPERS/HRP2カーネルにおける規定】
7522
7523 HRP2カーネルでは,CRE_FLGのみをサポートする【HRPS0116】.
7524 ----------------------------------------------------------------------
7525 AID_FLG 割付け可能なイベントフラグIDの数の指定〔SD〕【NGKI1572】
7526
7527 【静的API】
7528 AID_FLG(uint_t noflg)
7529
7530 【パラメータ】
7531 uint_t noflg 割付け可能なイベントフラグIDの数
7532
7533 【エラーコード】
7534 E_RSATR 予約属性
7535 ・クラスの囲みの中に記述されていない〔M〕【NGKI1573】
7536 E_PAR パラメータエラー
7537 ・noflgが負の値【NGKI3278】
7538
7539 【機能】
7540
7541 noflgで指定した数のイベントフラグIDを,イベントフラグを生成するサービス
7542 コールによって割付け可能なイベントフラグIDとして確保する【NGKI1574】.
7543
7544 noflgは整数定数式パラメータである【NGKI1575】.
7545 ----------------------------------------------------------------------
7546 SAC_FLG イベントフラグのアクセス許可ベクタの設定〔SP〕【NGKI1576】
7547 sac_flg イベントフラグのアクセス許可ベクタの設定〔TPD〕【NGKI1577】
7548
7549 【静的API】
7550 SAC_FLG(ID flgid, { ACPTN acptn1, ACPTN acptn2,
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
152
7551 ACPTN acptn3, ACPTN acptn4 })
7552
7553 【C言語API】
7554 ER ercd = sac_flg(ID flgid, const ACVCT *p_acvct)
7555
7556 【パラメータ】
7557 ID flgid 対象イベントフラグのID番号
7558 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
7559 インタ(静的APIを除く)
7560
7561 *アクセス許可ベクタ(パケットの内容)
7562 ACPTN acptn 1 通常操作1のアクセス許可パターン
7563 ACPTN acptn2 通常操作2のアクセス許可パターン
7564 ACPTN acptn3 管理操作のアクセス許可パターン
7565 ACPTN acptn4 参照操作のアクセス許可パターン
7566
7567 【リターンパラメータ】
7568 ER ercd 正常終了(E_OK)またはエラーコード
7569
7570 【エラーコード】
7571 E_CTX コンテキストエラー
7572 ・非タスクコンテキストからの呼出し〔s〕【NGKI1578】
7573 ・CPUロック状態からの呼出し〔s〕【NGKI1579】
7574 E_ID 不正ID番号
7575 ・flgidが有効範囲外〔s〕【NGKI1580】
7576 E_RSATR 予約属性
7577 ・対象イベントフラグが属する保護ドメインの囲みの中に記
7578 述されていない〔S〕【NGKI1581】
7579 ・対象イベントフラグが属するクラスの囲みの中に記述され
7580 ていない〔SM〕【NGKI1582】
7581 E_NOEXS オブジェクト未登録
7582 ・対象イベントフラグが未登録【NGKI1583】
7583 E_OACV オブジェクトアクセス違反
7584 ・対象イベントフラグに対する管理操作が許可されていない〔s〕
7585 【NGKI1584】
7586 E_MACV メモリアクセス違反
7587 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
7588 いない〔s〕【NGKI1585】
7589 E_OBJ オブジェクト状態エラー
7590 ・対象イベントフラグは静的APIで生成された〔s〕【NGKI1586】
7591 ・対象イベントフラグに対してアクセス許可ベクタが設定済
7592 み〔S〕【NGKI1587】
7593
7594 【機能】
7595
7596 flgidで指定したイベントフラグ(対象イベントフラグ)のアクセス許可ベクタ
7597 (4つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する
7598 【NGKI1588】.
7599
7600 静的APIにおいては,flgidはオブジェクト識別名,acptn1~acptn4は整数定数
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
153
7601 式パラメータである【NGKI1589】.
7602
7603 【TOPPERS/ASPカーネルにおける規定】
7604
7605 ASPカーネルでは,SAC_FLG,sac_flgをサポートしない【ASPS0127】.
7606
7607 【TOPPERS/FMPカーネルにおける規定】
7608
7609 FMPカーネルでは,SAC_FLG,sac_flgをサポートしない【FMPS0117】.
7610
7611 【TOPPERS/HRP2カーネルにおける規定】
7612
7613 HRP2カーネルでは,SAC_FLGのみをサポートする【HRPS0117】.
7614 ----------------------------------------------------------------------
7615 del_flg イベントフラグの削除〔TD〕【NGKI1590】
7616
7617 【C言語API】
7618 ER ercd = del_flg(ID flgid)
7619
7620 【パラメータ】
7621 ID flgid 対象イベントフラグのID番号
7622
7623 【リターンパラメータ】
7624 ER e rcd 正常終了(E_OK)またはエラーコード
7625
7626 【エラーコード】
7627 E_CTX コンテキストエラー
7628 ・非タスクコンテキストからの呼出し【NGKI1591】
7629 ・CPUロック状態からの呼出し【NGKI1592】
7630 E_ID 不正ID番号
7631 ・flgidが有効範囲外【NGKI1593】
7632 E_NOEXS オブジェクト未登録
7633 ・対象イベントフラグが未登録【NGKI1594】
7634 E_OACV オブジェクトアクセス違反
7635 ・対象イベントフラグに対する管理操作が許可されていない〔P〕
7636 【NGKI1595】
7637 E_OBJ オブジェクト状態エラー
7638 ・対象イベントフラグは静的APIで生成された【NGKI1596】
7639
7640 【機能】
7641
7642 flgidで指定したイベントフラグ(対象イベントフラグ)を削除する.具体的な
7643 振舞いは以下の通り.
7644
7645 対象イベントフラグの登録が解除され,そのイベントフラグIDが未使用の状態
7646 に戻される【NGKI1597】.また,対象イベントフラグの待ち行列につながれた
7647 タスクは,待ち行列の先頭のタスクから順に待ち解除される【NGKI1598】.待
7648 ち解除されたタスクには,待ち状態となったサービスコールからE_DLTエラーが
7649 返る【NGKI1599】.
7650
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
154
7651 【使用上の注意】
7652
7653 del_flgにより複数のタスクが待ち解除される場合,サービスコールの処理時間
7654 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
7655 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
7656 み禁止時間が長くなるため,注意が必要である.
7657
7658 【TOPPERS/ASPカーネルにおける規定】
7659
7660 ASPカーネルでは,del_flgをサポートしない【ASPS0128】.ただし,動的生成
7661 機能拡張パッケージでは,del_flgをサポートする【ASPS0129】.
7662
7663 【TOPPERS/FMPカーネルにおける規定】
7664
7665 FMPカーネルでは,del_flgをサポートしない【FMPS0118】.
7666
7667 【TOPPERS/HRP2カーネルにおける規定】
7668
7669 HRP2カーネルでは,del_flgをサポートしない【HRPS0118】.
7670 ----------------------------------------------------------------------
7671 set_flg イベントフラグのセット〔T〕【NGKI1600】
7672 iset_flg イベントフラグのセット〔I〕【NGKI1601】
7673
7674 【C言語API】
7675 ER ercd = set_flg(ID flgid, FLGPTN setptn)
7676 ER ercd = iset_flg(ID flgid, FLGPTN setptn)
7677
7678 【パラメータ】
7679 ID flgid 対象イベントフラグのID番号
7680 FLGPTN setptn セットするビットパターン
7681
7682 【リターンパラメータ】
7683 ER ercd 正常終了(E_OK)またはエラーコード
7684
7685 【エラーコード】
7686 E_CTX コンテキストエラー
7687 ・非タスクコンテキストからの呼出し(set_flgの場合)【NGKI1602】
7688 ・タスクコンテキストからの呼出し(iset_flgの場合)【NGKI1603】
7689 ・CPUロック状態からの呼出し【NGKI1604】
7690 E_ID 不正ID番号
7691 ・flgidが有効範囲外【NGKI1605】
7692 E_NOEXS オブジェクト未登録
7693 ・対象イベントフラグが未登録〔D〕【NGKI1606】
7694 E_OACV オブジェクトアクセス違反
7695 ・対象イベントフラグに対する通常操作1が許可されていない
7696 (set_flgの場合)〔P〕【NGKI1607】
7697
7698 【機能】
7699
7700 flgidで指定したイベントフラグ(対象イベントフラグ)のsetptnで指定したビッ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
155
7701 トをセットする.具体的な振舞いは以下の通り.
7702
7703 対象イベントフラグのビットパターンは,それまでの値とsetptnで指定した値
7704 のビット毎論理和(C言語の"¦")に更新される【NGKI1608】.対象イベントフ
7705 ラグの待ち行列にタスクが存在する場合には,待ち解除の条件を満たしたタス
7706 クが,待ち行列の前方につながれたものから順に待ち解除される【NGKI1609】.
7707 待ち解除されたタスクには,待ち状態となったサービスコールからE_OKが返る
7708 【NGKI1610】.
7709
7710 ただし,対象イベントフラグがTA_CLR属性である場合には,待ち解除の条件を
7711 満たしたタスクを1つ待ち解除した時点で,対象イベントフラグのビットパター
7712 ンが0にクリアされるため,他のタスクが待ち解除されることはない.
7713
7714 【使用上の注意】
7715
7716 対象イベントフラグが,TA_WMUL属性であり,TA_CLR属性でない場合,set_flg
7717 またはiset_flgにより複数のタスクが待ち解除される場合がある.この場合,
7718 サービスコールの処理時間およびカーネル内での割込み禁止時間が,待ち解除
7719 されるタスクの数に比例して長くなる.特に,多くのタスクが待ち解除される
7720 場合,カーネル内での割込み禁止時間が長くなるため,注意が必要である.
7721 ----------------------------------------------------------------------
7722 clr_flg イベントフラグのクリア〔T〕【NGKI1611】
7723
7724 【C言語API】
7725 ER ercd = clr_flg(ID flgid, FLGPTN clrptn)
7726
7727 【パラメータ】
7728 ID flgid 対象イベントフラグのID番号
7729 FLGPTN clrptn クリアするビットパターン(クリアしないビッ
7730 トを1,クリアするビットを0とする)
7731
7732 【リターンパラメータ】
7733 ER ercd 正常終了(E_OK)またはエラーコード
7734
7735 【エラーコード】
7736 E_CTX コンテキストエラー
7737 ・非タスクコンテキストからの呼出し【NGKI1612】
7738 ・CPUロック状態からの呼出し【NGKI1613】
7739 E_ID 不正ID番号
7740 ・flgidが有効範囲外【NGKI1614】
7741 E_NOEXS オブジェクト未登録
7742 ・対象イベントフラグが未登録〔D〕【NGKI1615】
7743 E_OACV オブジェクトアクセス違反
7744 ・対象イベントフラグに対する通常操作1が許可されていない〔P〕
7745 【NGKI1616】
7746
7747 【機能】
7748
7749 flgidで指定したイベントフラグ(対象イベントフラグ)のclrptnで指定したビッ
7750 トをクリアする.対象イベントフラグのビットパターンは,それまでの値と
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
156
7751 clrptnで指定した値のビット毎論理積(C言語の"&")に更新される
7752 【NGKI1617】.
7753 ----------------------------------------------------------------------
7754 wai_flg イベントフラグ待ち〔T〕【NGKI1618】
7755 pol_flg イベントフラグ待ち(ポーリング)〔T〕【NGKI1619】
7756 twai_flg イベントフラグ待ち(タイムアウト付き)〔T〕【NGKI1620】
7757
7758 【C言語API】
7759 ER ercd = wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
7760 ER ercd = pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
7761 ER ercd = twai_flg(ID flgid, FLGPTN waiptn,
7762 MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
7763
7764 【パラメータ】
7765 ID flgid 対象イベントフラグのID番号
7766 FLGPTN waiptn 待ちビットパターン
7767 MODE wfmode 待ちモード
7768 FLGPTN * p_flgptn 待ち解除時のビットパターンを入れるメモリ領
7769 域へのポインタ
7770 TMO tmout タイムアウト時間(twai_flgの場合)
7771
7772 【リターンパラメータ】
7773 ER ercd 正常終了(E_OK)またはエラーコード
7774 FLGPTN flgptn 待ち解除時のビットパターン
7775
7776 【エラーコード】
7777 E_CTX コンテキストエラー
7778 ・非タスクコンテキストからの呼出し【NGKI1621】
7779 ・CPUロック状態からの呼出し【NGKI1622】
7780 ・ディスパッチ保留状態からの呼出し(pol_flgを除く)【NGKI1623】
7781 E_NOSPT 未サポート機能
7782 ・制約タスクからの呼出し(pol_flgを除く)【NGKI1624】
7783 E_ID 不正ID番号
7784 ・flgidが有効範囲外【NGKI1625】
7785 E_PAR パラメータエラー
7786 ・waiptnが0【NGKI1626】
7787 ・wfmodeが無効(TWF_ORWまたはTWF_ANDWでない)【NGKI1627】
7788 ・tmoutが無効(twai_flgの場合)【NGKI1628】
7789 E_NOEXS オブジェクト未登録
7790 ・対象イベントフラグが未登録〔D〕【NGKI1629】
7791 E_OACV オブジェクトアクセス違反
7792 ・対象イベントフラグに対する通常操作2が許可されていない〔P〕
7793 【NGKI1630】
7794 E_MACV メモリアクセス違反
7795 ・p_flgptnが指すメモリ領域への書込みアクセスが許可され
7796 ていない〔P〕【NGKI1631】
7797 E_ILUSE サービスコール不正使用
7798 ・TA_WMUL属性でないイベントフラグで待ちタスクあり【NGKI1632】
7799 E_TMOUT ポーリング失敗またはタイムアウト(wai_flgを除く)【NGKI1633】
7800 E_RLWAI 待ち禁止状態または待ち状態の強制解除(pol_flgを除く)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
157
7801 【NGKI1634】
7802 E_DLT 待ちオブジェクトの削除または再初期化(pol_flgを除く)
7803 【NGKI1635】
7804
7805 【機能】
7806
7807 flgidで指定したイベントフラグ(対象イベントフラグ)が,waiptnとwfmodeで
7808 指定した待ち解除の条件を満たすのを待つ.具体的な振舞いは以下の通り.
7809
7810 対象イベントフラグが,waiptnとwfmodeで指定した待ち解除の条件を満たして
7811 いる場合には,対象イベントフラグのビットパターンの現在値がp_flgptnが指
7812 すメモリ領域に返される【NGKI1636】.対象イベントフラグがTA_CLR属性であ
7813 る場合には,対象イベントフラグのビットパターンが0にクリアされる
7814 【NGKI1637】.
7815
7816 待ち解除の条件を満たしていない場合には,自タスクはイベントフラグ待ち状
7817 態となり,対象イベントフラグの待ち行列につながれる【NGKI1638】.
7818 ----------------------------------------------------------------------
7819 ini_flg イベントフラグの再初期化〔T〕【NGKI1639】
7820
7821 【C言語API】
7822 ER ercd = ini_flg(ID fl gid)
7823
7824 【パラメータ】
7825 ID flgid 対象イベントフラグのID番号
7826
7827 【リターンパラメータ】
7828 ER ercd 正常終了(E_OK)またはエラーコード
7829
7830 【エラーコード】
7831 E_CTX コンテキストエラー
7832 ・非タスクコンテキストからの呼出し【NGKI1640】
7833 ・CPUロック状態からの呼出し【NGKI1641】
7834 E_ID 不正ID番号
7835 ・flgidが有効範囲外【NGKI1642】
7836 E_NOEXS オブジェクト未登録
7837 ・対象イベントフラグが未登録〔D〕【NGKI1643】
7838 E_OACV オブジェクトアクセス違反
7839 ・対象イベントフラグに対する管理操作が許可されていない〔P〕
7840 【NGKI1644】
7841
7842 【機能】
7843
7844 flgidで指定したイベントフラグ(対象イベントフラグ)を再初期化する.具体
7845 的な振舞いは以下の通り.
7846
7847 対象イベントフラグのビットパターンは,初期ビットパターンに初期化される
7848 【NGKI1645】.また,対象イベントフラグの待ち行列につながれたタスクは,
7849 待ち行列の先頭のタスクから順に待ち解除される【NGKI1646】.待ち解除され
7850 たタスクには,待ち状態となったサービスコールからE_DLTエラーが返る
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
158
7851 【NGKI1647】.
7852
7853 【使用上の注意】
7854
7855 ini_flgにより複数のタスクが待ち解除される場合,サービスコールの処理時間
7856 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
7857 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
7858 み禁止時間が長くなるため,注意が必要である.
7859
7860 イベントフラグを再初期化した場合に,アプリケーションとの整合性を保つの
7861 は,アプリケーションの責任である.
7862
7863 【μITRON4.0仕様との関係】
7864
7865 μITRON4.0仕様に定義されていないサービスコールである.
7866 ----------------------------------------------------------------------
7867 ref_flg イベントフラグの状態参照〔T〕【NGKI1648】
7868
7869 【C言語API】
7870 ER ercd = ref_flg(ID flgid, T_RFLG *pk_rflg)
7871
7872 【パラメータ】
7873 ID flgid 対象イベントフラグのID番号
7874 T_RFLG * pk_rflg イベントフラグの現在状態を入れるパケットへ
7875 のポインタ
7876
7877 【リターンパラメータ】
7878 ER ercd 正常終了(E_OK)またはエラーコード
7879
7880 *イベントフラグの現在状態(パケットの内容)
7881 ID wtskid イベントフラグの待ち行列の先頭のタスクのID
7882 番号
7883 uint_t flgptn イベントフラグのビットパターン
7884
7885 【エラーコード】
7886 E_CTX コンテキストエラー
7887 ・非タスクコンテキストからの呼出し【NGKI1649】
7888 ・CPUロック状態からの呼出し【NGKI1650】
7889 E_ID 不正ID番号
7890 ・flgidが有効範囲外【NGKI1651】
7891 E_NOEXS オブジェクト未登録
7892 ・対象イベントフラグが未登録〔D〕【NGKI1652】
7893 E_OACV オブジェクトアクセス違反
7894 ・対象イベントフラグに対する参照操作が許可されていない
7895 〔P〕【NGKI1653】
7896 E_MACV メモリアクセス違反
7897 ・pk_rflgが指すメモリ領域への書込みアクセスが許可されて
7898 いない〔P〕【NGKI1654】
7899
7900 【機能】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
159
7901
7902 flgidで指定したイベントフラグ(対象イベントフラグ)の現在状態を参照する.
7903 参照した現在状態は,pk_rflgで指定したパケットに返される【NGKI1655】.
7904
7905 対象イベントフラグの待ち行列にタスクが存在しない場合,wtskidには
7906 TSK_NONE(=0)が返る【NGKI1656】.
7907
7908 【使用上の注意】
7909
7910 ref_flgはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
7911 ない.これは,ref_flgを呼び出し,対象イベントフラグの現在状態を参照した
7912 直後に割込みが発生した場合,ref_flgから戻ってきた時には対象イベントフラ
7913 グの状態が変化している可能性があるためである.
7914 ----------------------------------------------------------------------
7915
7916 4.4.3 データキュー
7917
7918 データキューは,1ワードのデータをメッセージとして,FIFO順で送受信するた
7919 めの同期・通信オブジェクトである.より大きいサイズのメッセージを送受信
7920 したい場合には,メッセージを置いたメモリ領域へのポインタを1ワードのデー
7921 タとして送受信する方法がある.データキューは,データキューIDと呼ぶID番
7922 号によって識別する【NGKI1657】.
7923
7924 各データキューが持つ情報は次の通り【NGKI1658】.
7925
7926 ・データキュー属性
7927 ・データキュー管理領域
7928 ・送信待ち行列(データキューへの送信待ち状態のタスクのキュー)
7929 ・受信待ち行列(データキューからの受信待ち状態のタスクのキュー)
7930 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
7931 ・属する保護ドメイン(保護機能対応カーネルの場合)
7932 ・属するクラス(マルチプロセッサ対応カーネルの場合)
7933
7934 データキュー管理領域は,データキューに送信されたデータを,送信された順
7935 に格納しておくためのメモリ領域である.データキュー生成時に,データキュー
7936 管理領域に格納できるデータ数を0とすることで,データキュー管理領域のサイ
7937 ズを0とすることができる【NGKI1659】.
7938
7939 保護機能対応カーネルにおいて,データキュー管理領域は,カーネルの用いる
7940 オブジェクト管理領域として扱われる【NGKI1660】.
7941
7942 送信待ち行列は,データキューに対してデータが送信できるまで待っている状
7943 態(データキューへの送信待ち状態)のタスクが,データを送信できる順序で
7944 つながれているキューである.また,受信待ち行列は,データキューからデー
7945 タが受信できるまで待っている状態(データキューからの受信待ち状態)のタ
7946 スクが,データを受信できる順序でつながれているキューである.
7947
7948 データキュー属性には,次の属性を指定することができる【NGKI1661】.
7949
7950 TA_TPRI 0x01U 送信待ち行列をタスクの優先度順にする
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
160
7951
7952 TA_TPRIを指定しない場合,送信待ち行列はFIFO順になる【NGKI1662】.受信待
7953 ち行列は,FIFO順に固定されている【NGKI1663】.
7954
7955 データキュー機能に関連するカーネル構成マクロは次の通り.
7956
7957 TNUM_DTQID 登録できるデータキューの数(動的生成対応でないカー
7958 ネルでは,静的APIによって登録されたデータキューの数
7959 に一致)【NGKI1664】
7960
7961 【μITRON4.0仕様との関係】
7962
7963 TNUM_DTQIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
7964 ----------------------------------------------------------------------
7965 CRE_DTQ データキューの生成〔S〕【NGKI1665】
7966 acre_dtq データキューの生成〔TD〕【NGKI1666】
7967
7968 【静的API】
7969 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
7970
7971 【C言語API】
7972 ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq)
7973
7974 【パラメータ】
7975 ID dtqid 生成するデータキューのID番号(CRE_DTQの場合)
7976 T_CDTQ * pk_cdtq データキューの生成情報を入れたパケットへの
7977 ポインタ(静的APIを除く)
7978
7979 *データキューの生成情報(パケットの内容)
7980 ATR dtqatr データキュー属性
7981 uint_t dtqcnt データキュー管理領域に格納できるデータ数
7982 void * dtqmb データキュー管理領域の先頭番地
7983
7984 【リターンパラメータ】
7985 ER_ID dtqid 生成されたデータキューのID番号(正の値)ま
7986 たはエラーコード
7987
7988 【エラーコード】
7989 E_CTX コンテキストエラー
7990 ・非タスクコンテキストからの呼出し〔s〕【NGKI1667】
7991 ・CPUロック状態からの呼出し〔s〕【NGKI1668】
7992 E_RSATR 予約属性
7993 ・dtqatrが無効【NGKI1669】
7994 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI1670】
7995 ・属するクラスの指定が有効範囲外〔sM〕【NGKI1671】
7996 ・クラスの囲みの中に記述されていない〔SM〕【NGKI1672】
7997 E_NOSPT 未サポート機能
7998 ・条件については各カーネルにおける規定の項を参照
7999 E_PAR パラメータエラー
8000 ・dtqcntが負の値〔S〕【NGKI3288】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
161
8001 ・その他の条件については機能の項を参照
8002 E_OACV オブジェクトアクセス違反
8003 ・システム状態に対する管理操作が許可されていない〔sP〕
8004 【NGKI1673】
8005 E_MACV メモリアクセス違反
8006 ・pk_cdtqが指すメモリ領域への読出しアクセスが許可されて
8007 いない〔sP〕【NGKI1674】
8008 E_NOID ID番号不足
8009 ・割り付けられるデータキューIDがない〔sD〕【NGKI1675】
8010 E_NOMEM メモリ不足
8011 ・データキュー管理領域が確保できない【NGKI1676】
8012 E_OBJ オブジェクト状態エラー
8013 ・dtqidで指定したデータキューが登録済み(CRE_DTQの場合)
8014 【NGKI1677】
8015 ・その他の条件については機能の項を参照
8016
8017 【機能】
8018
8019 各パラメータで指定したデータキュー生成情報に従って,データキューを生成
8020 する.dtqcntとdtqmbからデータキュー管理領域が設定され,格納されているデー
8021 タがない状態に初期化される【NGKI1678】.また,送信待ち行列と受信待ち行
8022 列は,空の状態に初期化される【NGKI1679】.
8023
8024 静的APIにおいては,dtqidはオブジェクト識別名,dtqatrとdtqcntは整数定数
8025 式パラメータ,dtqmbは一般定数式パラメータである【NGKI1680】.コンフィギュ
8026 レータは,静的APIのメモリ不足(E_NOMEM)エラーを検出することができない
8027 【NGKI1681】.
8028
8029 dtqmbをNULLとした場合,dtqcntで指定した数のデータを格納できるデータキュー
8030 管理領域が,コンフィギュレータまたはカーネルにより確保される【NGKI1682】.
8031
8032 〔dtqmbにNULL以外を指定した場合〕
8033
8034 dtqmbにNULL以外を指定した場合,dtqmbを先頭番地とするデータキュー管理領
8035 域は,アプリケーションで確保しておく必要がある【NGKI1683】.データキュー
8036 管理領域をアプリケーションで確保するために,次のマクロを用意している
8037 【NGKI1684】.
8038
8039 TSZ_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータ
8040 キュー管理領域のサイズ(バイト数)
8041 TCNT_DTQ MB(dtqcnt) dtqcntで指定した数のデータを格納できるデータ
8042 キュー管理領域を確保するために必要なMB_T型の配
8043 列の要素数
8044
8045 これらを用いてデータキュー管理領域を確保する方法は次の通り【NGKI1685】.
8046
8047 MB_T <データキュー管理領域の変数名>[TCNT_DTQMB(dtqcnt)];
8048
8049 この時,dtqmbには<データキュー管理領域の変数名>を指定する【NGKI1686】.
8050
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
162
8051 この方法に従わず,dtqmbにターゲット定義の制約に合致しない先頭番地を指定
8052 した時には,E_PARエラーとなる【NGKI1687】.また,保護機能対応カーネルに
8053 おいて,dtqmbで指定したデータキュー管理領域がカーネル専用のメモリオブジェ
8054 クトに含まれない場合,E_OBJエラーとなる【NGKI1688】.
8055
8056 【TOPPERS/ASPカーネルにおける規定】
8057
8058 ASPカーネルでは,CRE_DTQのみをサポートする【ASPS0130】.また,dtqmbには
8059 NULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエラー
8060 となる【ASPS0132】.ただし,動的生成機能拡張パッケージでは,acre_dtqも
8061 サポートする【ASPS0133】.acre_dtqに対しては,dtqmbにNULL以外を指定でき
8062 ないという制限はない【ASPS0134】.
8063
8064 【TOPPERS/FMPカーネルにおける規定】
8065
8066 FMPカーネルでは,CRE_DTQのみをサポートする【FMPS0119】.また,dtqmbには
8067 NULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエラー
8068 となる【FMPS0121】.
8069
8070 【TOPPERS/HRP2カーネルにおける規定】
8071
8072 HRP2カーネルでは,CRE_DTQのみをサポートする【HRPS0119】.また,dtqmbに
8073 はNULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエ
8074 ラーとなる【HRPS0121】.
8075
8076 【μITRON4.0仕様との関係】
8077
8078 μITRON4.0/PX仕様にあわせて,データキュー生成情報の最後のパラメータを,
8079 dtq(データキュー領域の先頭番地)から,dtqmb(データキュー管理領域の先
8080 頭番地)に改名した.また,TSZ_DTQをTSZ_DTQMBに改名した.
8081
8082 TCNT_DTQMBを新設し,データキュー管理領域をアプリケーションで確保する方
8083 法を規定した.
8084 ----------------------------------------------------------------------
8085 AID_DTQ 割付け可能なデータキューIDの数の指定〔SD〕【NGKI1689】
8086
8087 【静的API】
8088 AID_DTQ (uint_t nodtq)
8089
8090 【パラメータ】
8091 uint_t nodtq 割付け可能なデータキューIDの数
8092
8093 【エラーコード】
8094 E_RSATR 予約属性
8095 ・クラスの囲みの中に記述されていない〔M〕【NGKI1690】
8096 E_PAR パラメータエラー
8097 ・nodtqが負の値【NGKI3279】
8098
8099 【機能】
8100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
163
8101 nodtqで指定した数のデータキューIDを,データキューを生成するサービスコー
8102 ルによって割付け可能なデータキューIDとして確保する【NGKI1691】.
8103
8104 nodtqは整数定数式パラメータである【NGKI1692】.
8105 ----------------------------------------------------------------------
8106 SAC_DTQ データキューのアクセス許可ベクタの設定〔SP〕【NGKI1693】
8107 sac_dtq データキューのアクセス許可ベクタの設定〔TPD〕【NGKI1694】
8108
8109 【静的API】
8110 SAC_DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2,
8111 ACPTN acptn3, ACPTN acptn4 })
8112
8113 【C言語API】
8114 ER ercd = sac_dtq(ID dtqid, const ACVCT *p_acvct)
8115
8116 【パラメータ】
8117 ID dtqid 対象データキューのID番号
8118 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
8119 インタ(静的APIを除く)
8120
8121 *アクセス許可ベクタ(パケットの内容)
8122 ACPTN acptn1 通常操作1のアクセス許可パターン
8123 ACPTN acptn2 通常操作2のアクセス許可パターン
8124 ACPTN acptn3 管理操作のアクセス許可パターン
8125 ACPTN acptn4 参照操作のアクセス許可パターン
8126
8127 【リターンパラメータ】
8128 ER ercd 正常終了(E_OK)またはエラーコード
8129
8130 【エラーコード】
8131 E_CTX コンテキストエラー
8132 ・非タスクコンテキストからの呼出し〔s〕【NGKI1695】
8133 ・CPUロック状態からの呼出し〔s〕【NGKI1696】
8134 E_ID 不正ID番号
8135 ・dtqidが有効範囲外〔s〕【NGKI1697】
8136 E_RSATR 予約属性
8137 ・対象データキューが属する保護ドメインの囲みの中に記述
8138 されていない〔S〕【NGKI1698】
8139 ・対象データキューが属するクラスの囲みの中に記述されて
8140 いない〔SM〕【NGKI1699】
8141 E_NOEXS オブジェクト未登録
8142 ・対象データキューが未登録【NGKI1700】
8143 E_OACV オブジェクトアクセス違反
8144 ・対象データキューに対する管理操作が許可されていない〔s〕
8145 【NGKI1701】
8146 E_MACV メモリアクセス違反
8147 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
8148 いない〔s〕【NGKI1702】
8149 E_OBJ オブジェクト状態エラー
8150 ・対象データキューは静的APIで生成された〔s〕【NGKI1703】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
164
8151 ・対象データキューに対してアクセス許可ベクタが設定済み〔S〕
8152 【NGKI1704】
8153
8154 【機能】
8155
8156 dtqidで指定したデータキュー(対象データキュー)のアクセス許可ベクタ(4
8157 つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する
8158 【NGKI1705】.
8159
8160 静的APIにおいては,dtqidはオブジェクト識別名,acptn1~acptn4は整数定数
8161 式パラメータである【NGKI1706】.
8162
8163 【TOPPERS/ASPカーネルにおける規定】
8164
8165 ASPカーネルでは,SAC_DTQ,sac_dtqをサポートしない【ASPS0135】.
8166
8167 【TOPPERS/FMPカーネルにおける規定】
8168
8169 FMPカーネルでは,SAC_DTQ,sac_dtqをサポートしない【FMPS0122】.
8170
8171 【TOPPERS/HRP2カーネルにおける規定】
8172
8173 HRP2カーネルでは,SAC_DTQのみをサポートする【HRPS0122】.
8174 ----------------------------------------------------------------------
8175 del_dtq データキューの削除〔TD〕【NGKI1707】
8176
8177 【C言語API】
8178 ER ercd = del_dtq(ID dtqid)
8179
8180 【パラメータ】
8181 ID dtqid 対象データキューのID番号
8182
8183 【リターンパラメータ】
8184 ER ercd 正常終了(E_OK)またはエラーコード
8185
8186 【エラーコード】
8187 E_CTX コンテキストエラー
8188 ・非タスクコンテキストからの呼出し【NGKI1708】
8189 ・CPUロック状態からの呼出し【NGKI1709】
8190 E_ID 不正ID番号
8191 ・dtqidが有効範囲外【NGKI1710】
8192 E_NOEXS オブジェクト未登録
8193 ・対象データキューが未登録【NGKI1711】
8194 E_OACV オブジェクトアクセス違反
8195 ・対象データキューに対する管理操作が許可されていない〔P〕
8196 【NGKI1712】
8197 E_OBJ オブジェクト状態エラー
8198 ・対象データキューは静的APIで生成された【NGKI1713】
8199
8200 【機能】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
165
8201
8202 dtqidで指定したデータキュー(対象データキュー)を削除する.具体的な振舞
8203 いは以下の通り.
8204
8205 対象データキューの登録が解除され,そのデータキューIDが未使用の状態に戻
8206 される【NGKI1714】.また,対象データキューの送信待ち行列と受信待ち行列
8207 につながれたタスクは,それぞれの待ち行列の先頭のタスクから順に待ち解除
8208 される【NGKI1715】.待ち解除されたタスクには,待ち状態となったサービス
8209 コールからE_DLTエラーが返る【NGKI1716】.
8210
8211 データキューの生成時に,データキュー管理領域がカーネルによって確保され
8212 た場合は,そのメモリ領域が解放される【NGKI1717】.
8213
8214 【補足説明】
8215
8216 送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため,
8217 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな
8218 い.
8219
8220 【使用上の注意】
8221
8222 del_dtqにより複数のタスクが待ち解除される場合,サービスコールの処理時間
8223 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
8224 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
8225 み禁止時間が長くなるため,注意が必要である.
8226
8227 【TOPPERS/ASPカーネルにおける規定】
8228
8229 ASPカーネルでは,del_dtqをサポートしない【ASPS0136】.ただし,動的生成
8230 機能拡張パッケージでは,del_dtqをサポートする【ASPS0137】.
8231
8232 【TOPPERS/FMPカーネルにおける規定】
8233
8234 FMPカーネルでは,del_dtqをサポートしない【FMPS0123】.
8235
8236 【TOPPERS/HRP2カーネルにおける規定】
8237
8238 HRP2カーネルでは,del_dtqをサポートしない【HRPS0123】.
8239 ----------------------------------------------------------------------
8240 snd_dtq データキューへの送信〔T〕【NGKI1718】
8241 psnd_dtq データキューへの送信(ポーリング)〔T〕【NGKI1719】
8242 ipsnd_dtq データキューへの送信(ポーリング)〔I〕【NGKI1720】
8243 tsnd_dtq データキューへの送信(タイムアウト付き)〔T〕【NGKI1721】
8244
8245 【C言語API】
8246 ER ercd = snd_dtq(ID dtqid, intptr_t data)
8247 ER ercd = psnd_dtq(ID dtqid, intptr_t data)
8248 ER ercd = ipsnd_dtq(ID dtqid, intptr_t data)
8249 ER ercd = tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
8250
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
166
8251 【パラメータ】
8252 ID dtqid 対象データキューのID番号
8253 intptr_t data 送信データ
8254 TMO tmout タイムアウト時間(tsnd_dtqの場合)
8255
8256 【リターンパラメータ】
8257 ER ercd 正常終了(E_OK)またはエラーコード
8258
8259 【エラーコード】
8260 E_CTX コンテキストエラー
8261 ・非タスクコンテキストからの呼出し(ipsnd_dtqを除く)
8262 【NGKI1722】
8263 ・タスクコンテキストからの呼出し(ipsnd_dtqの場合)
8264 【NGKI1723】
8265 ・CPUロック状態からの呼出し【NGKI1724】
8266 ・ディスパッチ保留状態からの呼出し(snd_dtqとtsnd_dtqの
8267 場合)【NGKI1725】
8268 E_NOSPT 未サポート機能
8269 ・制約タスクからの呼出し(snd_dtqとtsnd_dtqの場合)【NGKI1726】
8270 E_ID 不正ID番号
8271 ・dtqidが有効範囲外【NGKI1727】
8272 E_PAR パラメータエラー
8273 ・tmoutが無効(tsnd_dtqの場合)【NGKI1728】
8274 E_NOEXS オブジェクト未登録
8275 ・対象データキューが未登録〔D〕【NGKI1729】
8276 E_OACV オブジェクトアクセス違反
8277 ・対象データキューに対する通常操作1が許可されていない
8278 (ipsnd_dtqを除く)〔P〕【NGKI1730】
8279 E_TMOUT ポーリング失敗またはタイムアウト(snd_dtqを除く)【NGKI1731】
8280 E_RLWAI 待ち禁止状態または待ち状態の強制解除(snd_dtqとtsnd_dtq
8281 の場合)【NGKI1732】
8282 E_DLT 待ちオブジェクトの削除または再初期化(snd_dtqとtsnd_dtq
8283 の場合)【NGKI1733】
8284
8285 【機能】
8286
8287 dtqidで指定したデータキュー(対象データキュー)に,dataで指定したデータ
8288 を送信する.具体的な振舞いは以下の通り.
8289
8290 対象データキューの受信待ち行列にタスクが存在する場合には,受信待ち行列
8291 の先頭のタスクが,dataで指定したデータを受信し,待ち解除される
8292 【NGKI1734】.待ち解除されたタスクには,待ち状態となったサービスコール
8293 からE_OKが返る【NGKI1735】.
8294
8295 対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域
8296 にデータを格納するスペースがある場合には,dataで指定したデータが,FIFO
8297 順でデータキュー管理領域に格納される【NGKI1736】.
8298
8299 対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域
8300 にデータを格納するスペースがない場合には,自タスクはデータキューへの送
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
167
8301 信待ち状態となり,対象データキューの送信待ち行列につながれる
8302 【NGKI1737】.
8303 ----------------------------------------------------------------------
8304 fsnd_dtq データキューへの強制送信〔T〕【NGKI1738】
8305 ifsnd_dtq データキューへの強制送信〔I〕【NGKI1739】
8306
8307 【C言語API】
8308 ER ercd = fsnd_dtq(ID dtqid, intptr_t data)
8309 ER ercd = ifsnd_dtq(ID dtqid, intptr_t data)
8310
8311 【パラメータ】
8312 ID dtqid 対象データキューのID番号
8313 intptr_t data 送信データ
8314
8315 【リターンパラメータ】
8316 ER ercd 正常終了(E_OK)またはエラーコード
8317
8318 【エラーコード】
8319 E_CTX コンテキストエラー
8320 ・非タスクコンテキストからの呼出し(fsnd_dtqの場合)【NGKI1740】
8321 ・タスクコンテキストからの呼出し(ifsnd_dtqの場合)【NGKI1741】
8322 ・CPUロック状態からの呼出し【NGKI1742】
8323 E_ID 不正ID番号
8324 ・dtqidが有効範囲外【NGKI1743】
8325 E_NOEXS オブジェクト未登録
8326 ・対象データキューが未登録〔D〕【NGKI1744】
8327 E_OACV オブジェクトアクセス違反
8328 ・対象データキューに対する通常操作1が許可されていない
8329 (fsnd_dtqの場合)〔P〕【NGKI1745】
8330 E_ILUSE サービスコール不正使用
8331 ・対象データキューのデータキュー管理領域のサイズが0【NGKI1746】
8332
8333 【機能】
8334
8335 dtqidで指定したデータキュー(対象データキュー)に,dataで指定したデータ
8336 を強制送信する.具体的な振舞いは以下の通り.
8337
8338 対象データキューの受信待ち行列にタスクが存在する場合には,受信待ち行列
8339 の先頭のタスクが,dataで指定したデータを受信し,待ち解除される
8340 【NGKI1747】.待ち解除されたタスクには,待ち状態となったサービスコール
8341 からE_OKが返る【NGKI1748】.
8342
8343 対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域
8344 にデータを格納するスペースがある場合には,dataで指定したデータが,FIFO
8345 順でデータキュー管理領域に格納される【NGKI1749】.
8346
8347 対象データキューの受信待ち行列にタスクが存在せず,データキュー管理領域
8348 にデータを格納するスペースがない場合には,データキュー管理領域の先頭に
8349 格納されたデータを削除し,空いたスペースを用いて,dataで指定したデータ
8350 が,FIFO順でデータキュー管理領域に格納される【NGKI1750】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
168
8351 ----------------------------------------------------------------------
8352 rcv_dtq データキューからの受信〔T〕【NGKI1751】
8353 prcv_dtq データキューからの受信(ポーリング)〔T〕【NGKI1752】
8354 trcv_dtq データキューからの受信(タイムアウト付き)〔T〕【NGKI1753】
8355
8356 【C言語API】
8357 ER ercd = rcv_dtq(ID dtqid, intptr_t *p_data)
8358 ER ercd = prcv_dtq(ID dtqid, intptr_t *p_data)
8359 ER ercd = trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
8360
8361 【パラメータ】
8362 ID dtqid 対象データキューのID番号
8363 intptr_t * p_data 受信データを入れるメモリ領域へのポインタ
8364 TMO tmout タイムアウト時間(trcv_dtqの場合)
8365
8366 【リターンパラメータ】
8367 ER ercd 正常終了(E_OK)またはエラーコード
8368 intptr_t data 受信データ
8369
8370 【エラーコード】
8371 E_CTX コンテキストエラー
8372 ・非タスクコンテキストからの呼出し【NGKI1754】
8373 ・CPUロック状態からの呼出し【NGKI1755】
8374 ・ディスパッチ保留状態からの呼出し(prcv_dtqを除く)
8375 【NGKI1756】
8376 E_NOSPT 未サポート機能
8377 ・制約タスクからの呼出し(prcv_dtqを除く)【NGKI1757】
8378 E_ID 不正ID番号
8379 ・dtqidが有効範囲外【NGKI1758】
8380 E_PAR パラメータエラー
8381 ・tmoutが無効(trcv_dtqの場合)【NGKI1759】
8382 E_NOEXS オブジェクト未登録
8383 ・対象データキューが未登録〔D〕【NGKI1760】
8384 E_OACV オブジェクトアクセス違反
8385 ・対象データキューに対する通常操作2が許可されていない〔P〕
8386 【NGKI1761】
8387 E_MACV メモリアクセス違反
8388 ・p_dataが指すメモリ領域への書込みアクセスが許可されて
8389 いない〔P〕【NGKI1762】
8390 E_TMOUT ポーリング失敗またはタイムアウト(rcv_dtqを除く)【NGKI1763】
8391 E_RLWAI 待ち禁止状態または待ち状態の強制解除(prcv_dtqを除く)
8392 【NGKI1764】
8393 E_DLT 待ちオブジェクトの削除または再初期化(prcv_dtqを除く)
8394 【NGKI1765】
8395
8396 【機能】
8397
8398 dtqidで指定したデータキュー(対象データキュー)からデータを受信する.デー
8399 タの受信に成功した場合,受信したデータはp_dataが指すメモリ領域に返され
8400 る【NGKI3421】.具体的な振舞いは以下の通り.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
169
8401
8402 対象データキューのデータキュー管理領域にデータが格納されている場合には,
8403 データキュー管理領域の先頭に格納されたデータを受信する【NGKI1766】.ま
8404 た,送信待ち行列にタスクが存在する場合には,送信待ち行列の先頭のタスク
8405 の送信データが,FIFO順でデータキュー管理領域に格納され,そのタスクは待
8406 ち解除される【NGKI1767】.待ち解除されたタスクには,待ち状態となったサー
8407 ビスコールからE_OKが返る【NGKI1768】.
8408
8409 対象データキューのデータキュー管理領域にデータが格納されておらず,送信
8410 待ち行列にタスクが存在する場合には,送信待ち行列の先頭のタスクの送信デー
8411 タを受信する【NGKI1769】.送信待ち行列の先頭のタスクは,待ち解除される
8412 【NGKI3422】.待ち解除されたタスクには,待ち状態となったサービスコール
8413 からE_OKが返る【NGKI1770】.
8414
8415 対象データキューのデータキュー管理領域にデータが格納されておらず,送信
8416 待ち行列にタスクが存在しない場合には,自タスクはデータキューからの受信
8417 待ち状態となり,対象データキューの受信待ち行列につながれる【NGKI1771】.
8418 ----------------------------------------------------------------------
8419 ini_dtq データキューの再初期化〔T〕【NGKI1772】
8420
8421 【C言語API】
8422 ER ercd = ini_dtq(ID dtqid)
8423
8424 【パラメータ】
8425 ID d tqid 対象データキューのID番号
8426
8427 【リターンパラメータ】
8428 ER ercd 正常終了(E_OK)またはエラーコード
8429
8430 【エラーコード】
8431 E_CTX コンテキストエラー
8432 ・非タスクコンテキストからの呼出し【NGKI1773】
8433 ・CPUロック状態からの呼出し【NGKI1774】
8434 E_ID 不正ID番号
8435 ・dtqidが有効範囲外【NGKI1775】
8436 E_NOEXS オブジェクト未登録
8437 ・対象データキューが未登録〔D〕【NGKI1776】
8438 E_OACV オブジェクトアクセス違反
8439 ・対象データキューに対する管理操作が許可されていない〔P〕
8440 【NGKI1777】
8441
8442 【機能】
8443
8444 dtqidで指定したデータキュー(対象データキュー)を再初期化する.具体的な
8445 振舞いは以下の通り.
8446
8447 対象データキューのデータキュー管理領域は,格納されているデータがない状
8448 態に初期化される【NGKI1778】.また,対象データキューの送信待ち行列と受
8449 信待ち行列につながれたタスクは,それぞれの待ち行列の先頭のタスクから順
8450 に待ち解除される【NGKI1779】.待ち解除されたタスクには,待ち状態となっ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
170
8451 たサービスコールからE_DLTエラーが返る【NGKI1780】.
8452
8453 【補足説明】
8454
8455 送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため,
8456 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな
8457 い.
8458
8459 【使用上の注意】
8460
8461 ini_dtqにより複数のタスクが待ち解除される場合,サービスコールの処理時間
8462 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
8463 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
8464 み禁止時間が長くなるため,注意が必要である.
8465
8466 データキューを再初期化した場合に,アプリケーションとの整合性を保つのは,
8467 アプリケーションの責任である.
8468
8469 【μITRON4.0仕様との関係】
8470
8471 μITRON4.0仕様に定義されていないサービスコールである.
8472 ----------------------------------------------------------------------
8473 ref_dtq データキューの状態参照〔T〕【NGKI1781】
8474
8475 【C言語API】
8476 ER ercd = ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
8477
8478 【パラメータ】
8479 ID dtqid 対象データキューのID番号
8480 T_RDTQ * pk_rdtq データキューの現在状態を入れるパケットへの
8481 ポインタ
8482
8483 【リターンパラメータ】
8484 ER ercd 正常終了(E_OK)またはエラーコード
8485
8486 *データキューの現在状態(パケットの内容)
8487 ID stskid データキューの送信待ち行列の先頭のタスクの
8488 ID 番号
8489 ID rtskid データキューの受信待ち行列の先頭のタスクの
8490 ID 番号
8491 uint_t sdtqcnt データキュー管理領域に格納されているデータ
8492 の数
8493
8494 【エラーコード】
8495 E_CTX コンテキストエラー
8496 ・非タスクコンテキストからの呼出し【NGKI1782】
8497 ・CPUロック状態からの呼出し【NGKI1783】
8498 E_ID 不正ID番号
8499 ・dtqidが有効範囲外【NGKI1784】
8500 E_NOEXS オブジェクト未登録
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
171
8501 ・対象データキューが未登録〔D〕【NGKI1785】
8502 E_OACV オブジェクトアクセス違反
8503 ・対象データキューに対する参照操作が許可されていない〔P〕
8504 【NGKI1786】
8505 E_MACV メモリアクセス違反
8506 ・pk_rdtqが指すメモリ領域への書込みアクセスが許可されて
8507 いない〔P〕【NGKI1787】
8508
8509 【機能】
8510
8511 dtqidで指定したデータキュー(対象データキュー)の現在状態を参照する.参
8512 照した現在状態は,pk_rdtqで指定したパケットに返される【NGKI1788】.
8513
8514 対象データキューの送信待ち行列にタスクが存在しない場合,stskidには
8515 TSK_NONE(=0)が返る【NGKI1789】.また,受信待ち行列にタスクが存在しな
8516 い場合,rtskidにはTSK_NONE(=0)が返る【NGKI1790】.
8517
8518 【使用上の注意】
8519
8520 ref_dtqはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
8521 ない.これは,ref_dtqを呼び出し,対象データキューの現在状態を参照した直
8522 後に割込みが発生した場合,ref_dtqから戻ってきた時には対象データキューの
8523 状態が変化している可能性があるためである.
8524 ----------------------------------------------------------------------
8525
8526 4.4.4 優先度データキュー
8527
8528 優先度データキューは,1ワードのデータをメッセージとして,データの優先度
8529 順で送受信するための同期・通信カーネルオブジェクトである.より大きいサ
8530 イズのメッセージを送受信したい場合には,メッセージを置いたメモリ領域へ
8531 のポインタを1ワードのデータとして送受信する方法がある.優先度データキュー
8532 は,優先度データキューIDと呼ぶID番号によって識別する【NGKI1791】.
8533
8534 各優先度データキューが持つ情報は次の通り【NGKI1792】.
8535
8536 ・優先度データキュー属性
8537 ・優先度データキュー管理領域
8538 ・送信待ち行列(優先度データキューへの送信待ち状態のタスクのキュー)
8539 ・受信待ち行列(優先度データキューからの受信待ち状態のタスクのキュー)
8540 ・送信できるデータ優先度の最大値
8541 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
8542 ・属する保護ドメイン(保護機能対応カーネルの場合)
8543 ・属するクラス(マルチプロセッサ対応カーネルの場合)
8544
8545 優先度データキュー管理領域は,優先度データキューに送信されたデータを,
8546 データの優先度順に格納しておくためのメモリ領域である.優先度データキュー
8547 生成時に,優先度データキュー管理領域に格納できるデータ数を0とすることで,
8548 優先度データキュー管理領域のサイズを0とすることができる【NGKI1793】.
8549
8550 保護機能対応カーネルにおいて,優先度データキュー管理領域は,カーネルの
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
172
8551 用いるオブジェクト管理領域として扱われる【NGKI1794】.
8552
8553 送信待ち行列は,優先度データキューに対してデータが送信できるまで待って
8554 いる状態(優先度データキューへの送信待ち状態)のタスクが,データを送信
8555 できる順序でつながれているキューである.また,受信待ち行列は,優先度デー
8556 タキューからデータが受信できるまで待っている状態(優先度データキューか
8557 らの受信待ち状態)のタスクが,データを受信できる順序でつながれている
8558 キューである.
8559
8560 優先度データキュー属性には,次の属性を指定することができる【NGKI1795】.
8561
8562 TA_TPRI 0x01U 送信待ち行列をタスクの優先度順にする
8563
8564 TA_TPRIを指定しない場合,送信待ち行列はFIFO順になる【NGKI1796】.受信待
8565 ち行列は,FIFO順に固定されている【NGKI1797】.
8566
8567 優先度データキュー機能に関連するカーネル構成マクロは次の通り.
8568
8569 TMIN_DPRI データ優先度の最小値(=1) 【NGKI1798】
8570 TMAX_DPRI データ優先度の最大値
8571
8572 TNUM_PDQID 登録できる優先度データキューの数(動的生成対応でな
8573 いカーネルでは,静的APIによって登録された優先度デー
8574 タキューの数に一致)【NGKI1799】
8575
8576 【TOPPERS/ASPカーネルにおける規定】
8577
8578 ASPカーネルでは,データ優先度の最大値(TMAX_DPRI)は16に固定されている
8579 【ASPS0138】.ただし,タスク優先度拡張パッケージでは,TMAX_DPRIを256に
8580 拡張する【ASPS0139】.
8581
8582 【TOPPERS/FMPカーネルにおける規定】
8583
8584 FMPカーネルでは,データ優先度の最大値(TMAX_DPRI)は16に固定されている
8585 【FMPS0124】.
8586
8587 【TOPPERS/HRP2カーネルにおける規定】
8588
8589 HRP2カーネルでは,データ優先度の最大値(TMAX_DPRI)は16に固定されている
8590 【HRPS0124】.
8591
8592 【使用上の注意】
8593
8594 データの優先度が使われるのは,データが優先度データキュー管理領域に格納
8595 される場合のみであり,データを送信するタスクが送信待ち行列につながれて
8596 いる間には使われない.そのため,送信待ち行列につながれているタスクが,
8597 優先度データキュー管理領域に格納されているデータよりも高い優先度のデー
8598 タを送信しようとしている場合でも,最初に送信されるのは,優先度データ
8599 キュー管理領域に格納されているデータである.また,TA_TPRI属性の優先度デー
8600 タキューにおいても,送信待ち行列はタスクの優先度順となり,タスクが送信
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
173
8601 しようとしているデータの優先度順となるわけではない.
8602
8603 【μITRON4.0仕様との関係】
8604
8605 μITRON4.0仕様に規定されていない機能である.
8606 ----------------------------------------------------------------------
8607 CRE_PDQ 優先度データキューの生成〔S〕【NGKI1800】
8608 acre_pdq 優先度データキューの生成〔TD〕【NGKI1801】
8609
8610 【静的API】
8611 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
8612
8613 【C言語API】
8614 ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)
8615
8616 【パラメータ】
8617 ID pdqid 生成する優先度データキューのID番号(CRE_PDQ
8618 の場合)
8619 T_CPDQ * pk_cpdq 優先度データキューの生成情報を入れたパケッ
8620 トへのポインタ(静的APIを除く)
8621
8622 *優先度データキューの生成情報(パケットの内容)
8623 ATR pdqatr 優先度データキュー属性
8624 uint_t pdqcnt 優先度データキュー管理領域に格納できるデー
8625 タ数
8626 PRI maxdpri 優先度データキューに送信できるデータ優先度
8627 の最大値
8628 void * pdqmb 優先度データキュー管理領域の先頭番地
8629
8630 【リターンパラメータ】
8631 ER_ID pdqid 生成された優先度データキューのID番号(正の
8632 値)またはエラーコード
8633
8634 【エラーコード】
8635 E_CTX コンテキストエラー
8636 ・非タスクコンテキストからの呼出し〔s〕【NGKI1802】
8637 ・CPUロック状態からの呼出し〔s〕【NGKI1803】
8638 E_RSATR 予約属性
8639 ・pdqatrが無効【NGKI1804】
8640 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI1805】
8641 ・属するクラスの指定が有効範囲外〔sM〕【NGKI1806】
8642 ・クラスの囲みの中に記述されていない〔SM〕【NGKI1807】
8643 E_NOSPT 未サポート機能
8644 ・条件については各カーネルにおける規定の項を参照
8645 E_PAR パラメータエラー
8646 ・pdqcntが負の値〔S〕【NGKI3289】
8647 ・maxdpriがTMIN_DPRIより小さい,またはTMAX_DPRIより大き
8648 い【NGKI1819】
8649 ・その他の条件については機能の項を参照
8650 E_OACV オブジェクトアクセス違反
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
174
8651 ・システム状態に対する管理操作が許可されていない〔sP〕
8652 【NGKI1808】
8653 E_MACV メモリアクセス違反
8654 ・pk_cpdqが指すメモリ領域への読出しアクセスが許可されて
8655 いない〔sP〕【NGKI1809】
8656 E_NOID ID番号不足
8657 ・割り付けられる優先度データキューIDがない〔sD〕【NGKI1810】
8658 E_NOMEM メモリ不足
8659 ・優先度データキュー管理領域が確保できない【NGKI1811】
8660 E_OBJ オブジェクト状態エラー
8661 ・pdqidで指定した優先度データキューが登録済み(CRE_PDQ
8662 の場合)【NGKI1812】
8663 ・その他の条件については機能の項を参照
8664
8665 【機能】
8666
8667 各パラメータで指定した優先度データキュー生成情報に従って,優先度データ
8668 キューを生成する.pdqcntとpdqmbから優先度データキュー管理領域が設定され,
8669 格納されているデータがない状態に初期化される【NGKI1813】.また,送信待
8670 ち行列と受信待ち行列は,空の状態に初期化される【NGKI1814】.
8671
8672 静的APIにおいては,pdqidはオブジェクト識別名,pdqatr,pdqcnt,maxdpriは
8673 整数定数式パラメータ,pdqmbは一般定数式パラメータである【NGKI1815】.コ
8674 ンフィギュレータは,静的APIのメモリ不足(E_NOMEM)エラーを検出すること
8675 ができない【NGKI1816】.
8676
8677 pdqmbをNULLとした場合,pdqcntで指定した数のデータを格納できる優先度デー
8678 タキュー管理領域が,コンフィギュレータまたはカーネルにより確保される
8679 【NGKI1817】.
8680
8681 〔pdqmbにNULL以外を指定した場合〕
8682
8683 pdqmbにNULL以外を指定した場合,pdqmbを先頭番地とする優先度データキュー
8684 管理領域は,アプリケーションで確保しておく必要がある【NGKI1820】.優先
8685 度データキュー管理領域をアプリケーションで確保するために,次のマクロを
8686 用意している【NGKI1821】.
8687
8688 TSZ_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度デー
8689 タキュー管理領域のサイズ(バイト数)
8690 TCNT_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度デー
8691 タキュー管理領域を確保するために必要なMB_T型の
8692 配列の要素数
8693
8694 これらを用いて優先度データキュー管理領域を確保する方法は次の通り
8695 【NGKI1822】.
8696
8697 MB_T <優先度データキュー管理領域の変数名>[TCNT_PDQMB(pdqcnt)];
8698
8699 この時,pdqmbには<優先度データキュー管理領域の変数名>を指定する
8700 【NGKI1823】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
175
8701
8702 この方法に従わず,pdqmbにターゲット定義の制約に合致しない先頭番地を指定
8703 した時には,E_PARエラーとなる【NGKI1824】.また,保護機能対応カーネルに
8704 いて,pdqmbで指定した優先度データキュー管理領域がカーネル専用のメモリ
8705 オブジェクトに含まれない場合,E_OBJエラーとなる【NGKI1825】.
8706
8707 【TOPPERS/ASPカーネルにおける規定】
8708
8709 ASPカーネルでは,CRE_PDQのみをサポートする【ASPS0140】.また,pdqmbには
8710 NULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエラー
8711 となる【ASPS0142】.ただし,動的生成機能拡張パッケージでは,acre_pdqも
8712 サポートする【ASPS0143】.acre_pdqに対しては,pdqmbにNULL以外を指定でき
8713 ないという制限はない【ASPS0144】.
8714
8715 【TOPPERS/FMPカーネルにおける規定】
8716
8717 FMPカーネルでは,CRE_PDQのみをサポートする【FMPS0125】.また,pdqmbには
8718 NULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエラー
8719 となる【FMPS0127】.
8720
8721 【TOPPERS/HRP2カーネルにおける規定】
8722
8723 HRP2カーネルでは,CRE_PDQのみをサポートする【HRPS0125】.また,pdqmbに
8724 はNULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエ
8725 ラーとなる【HRPS0127】.
8726 ----------------------------------------------------------------------
8727 AID_PDQ 割付け可能な優先度データキューIDの数の指定〔SD〕【NGKI1826】
8728
8729 【静的API】
8730 AID_PDQ(uint_t nopdq)
8731
8732 【パラメータ】
8733 uint_t nopdq 割付け可能な優先度データキューIDの数
8734
8735 【エラーコード】
8736 E_RSATR 予約属性
8737 ・クラスの囲みの中に記述されていない〔M〕【NGKI1827】
8738 E_PAR パラメータエラー
8739 ・nopdqが負の値【NGKI3280】
8740
8741 【機能】
8742
8743 nopdqで指定した数の優先度データキューIDを,優先度データキューを生成する
8744 サービスコールによって割付け可能な優先度データキューIDとして確保する
8745 【NGKI1828】.
8746
8747 nopdqは整数定数式パラメータである【NGKI1829】.
8748 ----------------------------------------------------------------------
8749 SAC_PDQ 優先度データキューのアクセス許可ベクタの設定〔SP〕【NGKI1830】
8750 sac_pdq 優先度データキューのアクセス許可ベクタの設定〔TPD〕【NGKI1831】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
176
8751
8752 【静的API】
8753 SAC_PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2,
8754 ACPTN acptn3, ACPTN acptn4 })
8755
8756 【C言語API】
8757 ER ercd = sac_pdq(ID pdqid, const ACVCT *p_acvct)
8758
8759 【パラメータ】
8760 ID pdqid 対象優先度データキューのID番号
8761 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
8762 インタ(静的APIを除く)
8763
8764 *アクセス許可ベクタ(パケットの内容)
8765 ACPTN acptn1 通常操作1のアクセス許可パターン
8766 ACPTN acptn2 通常操作2のアクセス許可パターン
8767 ACPTN acptn3 管理操作のアクセス許可パターン
8768 ACPTN acptn4 参照操作のアクセス許可パターン
8769
8770 【リターンパラメータ】
8771 ER ercd 正常終了(E_OK)またはエラーコード
8772
8773 【エラーコード】
8774 E_CTX コンテキストエラー
8775 ・非タスクコンテキストからの呼出し〔s〕【NGKI1832】
8776 ・CPUロック状態からの呼出し〔s〕【NGKI1833】
8777 E_ID 不正ID番号
8778 ・pdqidが有効範囲外〔s〕【NGKI1834】
8779 E_RSATR 予約属性
8780 ・対象優先度データキューが属する保護ドメインの囲みの中
8781 に記述されていない〔S〕【NGKI1835】
8782 ・対象優先度データキューが属するクラスの囲みの中に記述
8783 されていない〔SM〕【NGKI1836】
8784 E_NOEXS オブジェクト未登録
8785 ・対象優先度データキューが未登録【NGKI1837】
8786 E_OACV オブジェクトアクセス違反
8787 ・対象優先度データキューに対する管理操作が許可されてい
8788 ない〔s〕【NGKI1838】
8789 E_MACV メモリアクセス違反
8790 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
8791 いない〔s〕【NGKI1839】
8792 E_OBJ オブジェクト状態エラー
8793 ・対象優先度データキューは静的APIで生成された〔s〕【NGKI1840】
8794 ・対象優先度データキューに対してアクセス許可ベクタが設
8795 定済み〔S〕【NGKI1841】
8796
8797 【機能】
8798
8799 pdqidで指定した優先度データキュー(対象優先度データキュー)のアクセス許
8800 可ベクタ(4つのアクセス許可パターンの組)を,各パラメータで指定した値に
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
177
8801 設定する【NGKI1842】.
8802
8803 静的APIにおいては,pdqidはオブジェクト識別名,acptn1~acptn4は整数定数
8804 式パラメータである【NGKI1843】.
8805
8806 【TOPPERS/ASPカーネルにおける規定】
8807
8808 ASPカーネルでは,SAC_PDQ,sac_pdqをサポートしない【ASPS0145】.
8809
8810 【TOPPERS/FMPカーネルにおける規定】
8811
8812 FMPカーネルでは,SAC_PDQ,sac_pdqをサポートしない【FMPS0128】.
8813
8814 【TOPPERS/HRP2カーネルにおける規定】
8815
8816 HRP2カーネルでは,SAC_PDQのみをサポートする【HRPS0128】.
8817 ----------------------------------------------------------------------
8818 del_pdq 優先度データキューの削除〔TD〕【NGKI1844】
8819
8820 【C言語API】
8821 ER ercd = del_pdq(ID pdqid)
8822
8823 【パラメータ】
8824 ID pdqid 対象優先度データキューのID番号
8825
8826 【リターンパラメータ】
8827 ER ercd 正常終了(E_OK)またはエラーコード
8828
8829 【エラーコード】
8830 E_CTX コンテキストエラー
8831 ・非タスクコンテキストからの呼出し【NGKI1845】
8832 ・CPUロック状態からの呼出し【NGKI1846】
8833 E_ID 不正ID番号
8834 ・pdqidが有効範囲外【NGKI1847】
8835 E_NOEXS オブジェクト未登録
8836 ・対象優先度データキューが未登録【NGKI1848】
8837 E_OACV オブジェクトアクセス違反
8838 ・対象優先度データキューに対する管理操作が許可されてい
8839 ない〔P〕【NGKI1849】
8840 E_OBJ オブジェクト状態エラー
8841 ・対象優先度データキューは静的APIで生成された【NGKI1850】
8842
8843 【機能】
8844
8845 pdqidで指定した優先度データキュー(対象優先度データキュー)を削除する.
8846 具体的な振舞いは以下の通り.
8847
8848 対象優先度データキューの登録が解除され,その優先度データキューIDが未使
8849 用の状態に戻される【NGKI1851】.また,対象優先度データキューの送信待ち
8850 行列と受信待ち行列につながれたタスクは,それぞれの待ち行列の先頭のタス
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
178
8851 クから順に待ち解除される【NGKI1852】.待ち解除されたタスクには,待ち状
8852 態となったサービスコールからE_DLTエラーが返る【NGKI1853】.
8853
8854 優先度データキューの生成時に,優先度データキュー管理領域がカーネルによっ
8855 て確保された場合は,そのメモリ領域が解放される【NGKI1854】.
8856
8857 【補足説明】
8858
8859 送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため,
8860 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな
8861 い.
8862
8863 【使用上の注意】
8864
8865 del_pdqにより複数のタスクが待ち解除される場合,サービスコールの処理時間
8866 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
8867 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
8868 み禁止時間が長くなるため,注意が必要である.
8869
8870 【TOPPERS/ASPカーネルにおける規定】
8871
8872 ASPカーネルでは,del_pdqをサポートしない【ASPS0146】.ただし,動的生成
8873 機能拡張パッケージでは,del_pdqをサポートする【ASPS0147】.
8874
8875 【TOPPERS/FMPカーネルにおける規定】
8876
8877 FMPカーネルでは,del_pdqをサポートしない【FMPS0129】.
8878
8879 【TOPPERS/HRP2カーネルにおける規定】
8880
8881 HRP2カーネルでは,del_pdqをサポートしない【HRPS0129】.
8882 ----------------------------------------------------------------------
8883 snd_pdq 優先度データキューへの送信〔T〕【NGKI1855】
8884 psnd_pdq 優先度データキューへの送信(ポーリング)〔T〕【NGKI1856】
8885 ipsnd_pdq 優先度データキューへの送信(ポーリング)〔I〕【NGKI1857】
8886 tsnd_pdq 優先度データキューへの送信(タイムアウト付き)〔T〕【NGKI1858】
8887
8888 【C言語API】
8889 ER ercd = snd_pdq(ID pdqid, intptr_t data, PRI datapri)
8890 ER ercd = psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
8891 ER ercd = ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
8892 ER ercd = tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
8893
8894 【パラメータ】
8895 ID pdqid 対象優先度データキューのID番号
8896 intptr_t data 送信データ
8897 PRI datapri 送信データの優先度
8898 TMO tmout タイムアウト時間(tsnd_pdqの場合)
8899
8900 【リターンパラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
179
8901 ER ercd 正常終了(E_OK)またはエラーコード
8902
8903 【エラーコード】
8904 E_CTX コンテキストエラー
8905 ・非タスクコンテキストからの呼出し(ipsnd_pdqを除く)
8906 【NGKI1859】
8907 ・タスクコンテキストからの呼出し(ipsnd_pdqの場合)【NGKI1860】
8908 ・CPUロック状態からの呼出し【NGKI1861】
8909 ・ディスパッチ保留状態からの呼出し(snd_pdqとtsnd_pdqの
8910 場合)【NGKI1862】
8911 E_NOSPT 未サポート機能
8912 ・制約タスクからの呼出し(snd_pdqとtsnd_pdqの場合)【NGKI1863】
8913 E_ID 不正ID番号
8914 ・pdqidが有効範囲外【NGKI1864】
8915 E_PAR パラメータエラー
8916 ・tmoutが無効(tsnd_pdqの場合)【NGKI1865】
8917 ・その他の条件については機能の項を参照
8918 E_NOEXS オブジェクト未登録
8919 ・対象優先度データキューが未登録〔D〕【NGKI1866】
8920 E_OACV オブジェクトアクセス違反
8921 ・対象優先度データキューに対する通常操作1が許可されてい
8922 ない(ipsnd_pdqを除く)〔P〕【NGKI1867】
8923 E_TMOUT ポーリング失敗またはタイムアウト(snd_pdqを除く)【NGKI1868】
8924 E_RLWAI 待ち禁止状態または待ち状態の強制解除(snd_pdqとtsnd_pdq
8925 の場合)【NGKI1869】
8926 E_DLT 待ちオブジェクトの削除または再初期化(snd_pdqとtsnd_pdq
8927 の場合)【NGKI1870】
8928
8929 【機能】
8930
8931 pdqidで指定した優先度データキュー(対象優先度データキュー)に,dataで指
8932 定したデータを,datapriで指定した優先度で送信する.具体的な振舞いは以下
8933 の通り.
8934
8935 対象優先度データキューの受信待ち行列にタスクが存在する場合には,受信待
8936 ち行列の先頭のタスクが,dataで指定したデータを受信し,待ち解除される
8937 【NGKI1871】.待ち解除されたタスクには,待ち状態となったサービスコール
8938 からE_OKが返る【NGKI1872】.
8939
8940 対象優先度データキューの受信待ち行列にタスクが存在せず,優先度データ
8941 キュー管理領域にデータを格納するスペースがある場合には,dataで指定した
8942 データが,datapriで指定したデータの優先度順で優先度データキュー管理領域
8943 に格納される【NGKI1873】.
8944
8945 対象優先度データキューの受信待ち行列にタスクが存在せず,優先度データ
8946 キュー管理領域にデータを格納するスペースがない場合には,自タスクは優先
8947 度データキューへの送信待ち状態となり,対象優先度データキューの送信待ち
8948 行列につながれる【NGKI1874】.
8949
8950 datapriは,TMIN_DPRI以上で,対象データキューに送信できるデータ優先度の
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
180
8951 最大値以下でなければならない.そうでない場合には,E_PARエラーとなる
8952 【NGKI1876】.
8953 ----------------------------------------------------------------------
8954 rcv_pdq 優先度データキューからの受信〔T〕【NGKI1877】
8955 prcv_pdq 優先度データキューからの受信(ポーリング)〔T〕【NGKI1878】
8956 trcv_pdq 優先度データキューからの受信(タイムアウト付き)〔T〕【NGKI1879】
8957
8958 【C言語API】
8959 ER ercd = rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
8960 ER ercd = prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
8961 ER ercd = trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
8962
8963 【パラメータ】
8964 ID pdqid 対象優先度データキューのID番号
8965 intptr_t * p_data 受信データを入れるメモリ領域へのポインタ
8966 PRI * p_datapri 受信データの優先度を入れるメモリ領域へのポ
8967 インタ
8968 TMO tmout タイムアウト時間(trcv_pdqの場合)
8969
8970 【リターンパラメータ】
8971 ER ercd 正常終了(E_OK)またはエラーコード
8972 intptr_t data 受信データ
8973 PRI datapri 受信データの優先度
8974
8975 【エラーコード】
8976 E_CTX コンテキストエラー
8977 ・非タスクコンテキストからの呼出し【NGKI1880】
8978 ・CPUロック状態からの呼出し【NGKI1881】
8979 ・ディスパッチ保留状態からの呼出し(prcv_pdqを除く)【NGKI1882】
8980 E_NOSPT 未サポート機能
8981 ・制約タスクからの呼出し(prcv_pdqを除く)【NGKI1883】
8982 E_ID 不正ID番号
8983 ・pdqidが有効範囲外【NGKI1884】
8984 E_PAR パラメータエラー
8985 ・tmoutが無効(trcv_pdqの場合)【NGKI1885】
8986 E_NOEXS オブジェクト未登録
8987 ・対象優先度データキューが未登録〔D〕【NGKI1886】
8988 E_OACV オブジェクトアクセス違反
8989 ・対象優先度データキューに対する通常操作2が許可されてい
8990 ない〔P〕【NGKI1887】
8991 E_MACV メモリアクセス違反
8992 ・p_dataが指すメモリ領域への書込みアクセスが許可されて
8993 いない〔P〕【NGKI1888】
8994 ・p_datapriが指すメモリ領域への書込みアクセスが許可され
8995 ていない〔P〕【NGKI1889】
8996 E_TMOUT ポーリング失敗またはタイムアウト(rcv_pdqを除く)【NGKI1890】
8997 E_RLWAI 待ち禁止状態または待ち状態の強制解除(prcv_pdqを除く)
8998 【NGKI1891】
8999 E_DLT 待ちオブジェクトの削除または再初期化(prcv_pdqを除く)
9000 【NGKI1892】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
181
9001
9002 【機能】
9003
9004 pdqidで指定した優先度データキュー(対象優先度データキュー)からデータを
9005 受信する.データの受信に成功した場合,受信したデータはp_dataが指すメモ
9006 リ領域に,その優先度はp_datapriが指すメモリ領域に返される【NGKI1894】.
9007 具体的な振舞いは以下の通り.
9008
9009 対象優先度データキューの優先度データキュー管理領域にデータが格納されて
9010 いる場合には,優先度データキュー管理領域の先頭に格納されたデータを受信
9011 する【NGKI1893】.また,送信待ち行列にタスクが存在する場合には,送信待
9012 ち行列の先頭のタスクの送信データが,データの優先度順で優先度データキュー
9013 管理領域に格納され,そのタスクは待ち解除される【NGKI1895】.待ち解除さ
9014 れたタスクには,待ち状態となったサービスコールからE_OKが返る
9015 【NGKI1896】.
9016
9017 対象優先度データキューの優先度データキュー管理領域にデータが格納されて
9018 おらず,送信待ち行列にタスクが存在する場合には,送信待ち行列の先頭のタ
9019 スクの送信データを受信する【NGKI1897】.送信待ち行列の先頭のタスクは,
9020 待ち解除される【NGKI1899】.待ち解除されたタスクには,待ち状態となった
9021 サービスコールからE_OKが返る【NGKI1900】.
9022
9023 対象優先度データキューの優先度データキュー管理領域にデータが格納されて
9024 おらず,送信待ち行列にタスクが存在しない場合には,自タスクは優先度デー
9025 タキューからの受信待ち状態となり,対象優先度データキューの受信待ち行列
9026 につながれる【NGKI1901】.
9027 ----------------------------------------------------------------------
9028 ini_pdq 優先度データキューの再初期化〔T〕【NGKI1902】
9029
9030 【C言語API】
9031 ER ercd = ini_pdq(ID pdqid)
9032
9033 【パラメータ】
9034 ID pdqid 対象優先度データキューのID番号
9035
9036 【リターンパラメータ】
9037 ER ercd 正常終了(E_OK)またはエラーコード
9038
9039 【エラーコード】
9040 E_CTX コンテキストエラー
9041 ・非タスクコンテキストからの呼出し【NGKI1903】
9042 ・CPUロック状態からの呼出し【NGKI1904】
9043 E_ID 不正ID番号
9044 ・pdqidが有効範囲外【NGKI1905】
9045 E_NOEXS オブジェクト未登録
9046 ・対象優先度データキューが未登録〔D〕【NGKI1906】
9047 E_OACV オブジェクトアクセス違反
9048 ・対象優先度データキューに対する管理操作が許可されてい
9049 ない〔P〕【NGKI1907】
9050
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
182
9051 【機能】
9052
9053 pdqidで指定した優先度データキュー(対象優先度データキュー)を再初期化す
9054 る.具体的な振舞いは以下の通り.
9055
9056 対象優先度データキューの優先度データキュー管理領域は,格納されているデー
9057 タがない状態に初期化される【NGKI1908】.また,対象優先度データキューの
9058 送信待ち行列と受信待ち行列につながれたタスクは,それぞれの待ち行列の先
9059 頭のタスクから順に待ち解除される【NGKI1909】.待ち解除されたタスクには,
9060 待ち状態となったサービスコールからE_DLTエラーが返る【NGKI1910】.
9061
9062 【補足説明】
9063
9064 送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため,
9065 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな
9066 い.
9067
9068 【使用上の注意】
9069
9070 ini_pdqにより複数のタスクが待ち解除される場合,サービスコールの処理時間
9071 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
9072 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
9073 み禁止時間が長くなるため,注意が必要である.
9074
9075 優先度データキューを再初期化した場合に,アプリケーションとの整合性を保
9076 つのは,アプリケーションの責任である.
9077 ----------------------------------------------------------------------
9078 ref_pdq 優先度データキューの状態参照〔T〕【NGKI1911】
9079
9080 【C言語API】
9081 ER ercd = ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
9082
9083 【パラメータ】
9084 ID pdqid 対象優先度データキューのID番号
9085 T_RPDQ * pk_rpdq 優先度データキューの現在状態を入れるパケッ
9086 トへのポインタ
9087
9088 【リターンパラメータ】
9089 ER ercd 正常終了(E_OK)またはエラーコード
9090
9091 *優先度データキューの現在状態(パケットの内容)
9092 ID stskid 優先度データキューの送信待ち行列の先頭のタ
9093 スクのID番号
9094 ID rtskid 優先度データキューの受信待ち行列の先頭のタ
9095 スクのID番号
9096 uint_t spdqcnt 優先度データキュー管理領域に格納されている
9097 データの数
9098
9099 【エラーコード】
9100 E_CTX コンテキストエラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
183
9101 ・非タスクコンテキストからの呼出し【NGKI1912】
9102 ・CPUロック状態からの呼出し【NGKI1913】
9103 E_ID 不正ID番号
9104 ・pdqidが有効範囲外【NGKI1914】
9105 E_NOEXS オブジェクト未登録
9106 ・対象優先度データキューが未登録〔D〕【NGKI1915】
9107 E_OACV オブジェクトアクセス違反
9108 ・対象優先度データキューに対する参照操作が許可されてい
9109 ない〔P〕【NGKI1916】
9110 E_MACV メモリアクセス違反
9111 ・pk_rpdqが指すメモリ領域への書込みアクセスが許可されて
9112 いない〔P〕【NGKI1917】
9113
9114 【機能】
9115
9116 pdqidで指定した優先度データキュー(対象優先度データキュー)の現在状態を
9117 参照する.参照した現在状態は,pk_rpdqで指定したパケットに返される
9118 【NGKI1918】.
9119
9120 対象優先度データキューの送信待ち行列にタスクが存在しない場合,stskidに
9121 はTSK_NONE(=0)が返る【NGKI1919】.また,受信待ち行列にタスクが存在し
9122 ない場合,rtskidにはTSK_NONE(=0)が返る【NGKI1920】.
9123
9124 【使用上の注意】
9125
9126 ref_pdqはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
9127 ない.これは,ref_pdqを呼び出し,対象優先度データキューの現在状態を参照
9128 した直後に割込みが発生した場合,ref_pdqから戻ってきた時には対象優先度デー
9129 タキューの状態が変化している可能性があるためである.
9130 ----------------------------------------------------------------------
9131
9132 4.4.5 メールボックス
9133
9134 メールボックスは,共有メモリ上に置いたメッセージを,FIFO順またはメッセー
9135 ジの優先度順で送受信するための同期・通信オブジェクトである.メールボッ
9136 クスは,メールボックスIDと呼ぶID番号によって識別する【NGKI1921】.
9137
9138 各メールボックスが持つ情報は次の通り【NGKI1922】.
9139
9140 ・メールボックス属性
9141 ・メッセージキュー
9142 ・待ち行列(メールボックスからの受信待ち状態のタスクのキュー)
9143 ・送信できるメッセージ優先度の最大値
9144 ・優先度別のメッセージキューヘッダ領域
9145 ・属するクラス(マルチプロセッサ対応カーネルの場合)
9146
9147 メッセージキューは,メールボックスに送信されたメッセージを,FIFO順また
9148 はメッセージの優先度順につないでおくためのキューである.
9149
9150 待ち行列は,メールボックスからメッセージが受信できるまで待っている状態
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
184
9151 (メールボックスからの受信待ち状態)のタスクが,メッセージを受信できる
9152 順序でつながれているキューである.
9153
9154 メールボックス属性には,次の属性を指定することができる【NGKI1923】.
9155
9156 TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
9157 TA_MPRI 0x02U メッセージキューをメッセージの優先度順にする
9158
9159 TA_TPRIを指定しない場合,待ち行列はFIFO順になる【NGKI1924】.TA_MPRIを
9160 指定しない場合,メッセージキューはFIFO順になる【NGKI1925】.
9161
9162 優先度別のメッセージキューヘッダ領域は,TA_MPRI属性のメールボックスに対
9163 して,メッセージキューを優先度別に設ける場合に使用する領域である.
9164
9165 カーネルは,メールボックスに送信されたメッセージをメッセージキューにつ
9166 なぐために,メッセージの先頭のメモリ領域を使用する【NGKI1926】.そのた
9167 めアプリケーションは,メールボックスに送信するメッセージの先頭に,カー
9168 ネルが利用するためのメッセージヘッダを置かなければならない【NGKI1927】.
9169 メッセージヘッダのデータ型として,メールボックス属性にTA_MPRIが指定され
9170 ているか否かにより,以下のいずれかを用いる【NGKI1928】.
9171
9172 T_MSG TA_MPRI 属性でないメールボックス用のメッセージヘッダ
9173 T_MSG_PRI TA_MPRI 属性のメールボックス用のメッセージヘッダ
9174
9175 メッセージヘッダの領域は,メッセージがメッセージキューにつながれている
9176 間(すなわち,メールボックスに送信してから受信するまでの間),カーネル
9177 によって使用される【NGKI1929】.そのため,メッセージキューにつながれて
9178 いるメッセージのメッセージヘッダの領域をアプリケーションが書き換えた場
9179 合や,メッセージキューにつながれているメッセージを再度メールボックスに
9180 送信した場合の動作は保証されない【NGKI1930】.
9181
9182 TA_MPRI属性のメールボックスにメッセージを送信する場合,アプリケーション
9183 は,メッセージの優先度を,T_MSG_PRI型のメッセージヘッダ中のmsgpriフィー
9184 ルドに設定する【NGKI1931】.
9185
9186 保護機能対応カーネルでは,メールボックス機能はサポートしない【NGKI1932】.
9187
9188 メールボックス機能に関連するカーネル構成マクロは次の通り.
9189
9190 TMIN_MPRI メッセージ優先度の最小値(=1) 【NGKI1933】
9191 TMAX_MPRI メッセージ優先度の最大値
9192
9193 TNUM_MBXID 登録できるメールボックスの数(動的生成対応でないカー
9194 ネルでは,静的APIによって登録されたメールボックスの
9195 数に一致)【NGKI1934】
9196
9197 【補足説明】
9198
9199 TOPPERS新世代カーネルの現時点の実装では,優先度別のメッセージキューヘッ
9200 ダ領域は用いていない.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
185
9201
9202 【使用上の注意】
9203
9204 メールボックス機能は,μITRON4.0仕様との互換性のために残した機能であり,
9205 保護機能対応カーネルではサポートしないため,使用することは推奨しない.
9206 メールボックス機能は,ほとんどの場合に,データキュー機能または優先度デー
9207 タキュー機能を用いて,メッセージを置いたメモリ領域へのポインタを送受信
9208 する方法で置き換えることができる.
9209
9210 【TOPPERS/ASPカーネルにおける規定】
9211
9212 ASPカーネルでは,メールボックス機能をサポートする【ASPS0147】.メッセー
9213 ジ優先度の最大値(TMAX_MPRI)は16に固定されている【ASPS0148】.ただし,
9214 タスク優先度拡張パッケージでは,TMAX_MPRIを256に拡張する【ASPS0149】.
9215
9216 【TOPPERS/FMPカーネルにおける規定】
9217
9218 FMPカーネルでは,メールボックス機能をサポートする【FMPS0130】.メッセー
9219 ジ優先度の最大値(TMAX_MPRI)は16に固定されている【FMPS0131】.
9220
9221 【TOPPERS/HRP2カーネルにおける規定】
9222
9223 HRP2カーネルでは,メールボックス機能をサポートしない【HRPS0130】.
9224
9225 【μITRON4.0仕様との関係】
9226
9227 TNUM_MBXIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
9228 ----------------------------------------------------------------------
9229 CRE_MBX メールボックスの生成〔Sp〕【NGKI1935】
9230 acre_mbx メールボックスの生成〔TpD〕【NGKI1936】
9231
9232 【静的API】
9233 CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })
9234
9235 【C言語API】
9236 ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx)
9237
9238 【パラメータ】
9239 ID mbxid 生成するメールボックスのID番号(CRE_MBXの場
9240 合)
9241 T_CMBX * pk_cmbx メールボックスの生成情報を入れたパケットへ
9242 のポインタ(静的APIを除く)
9243
9244 *メールボックスの生成情報(パケットの内容)
9245 ATR mbxatr メールボックス属性
9246 PRI maxmpri 優先度メールボックスに送信できるメッセージ
9247 優先度の最大値
9248 void * mprihd 優先度別のメッセージキューヘッダ領域の先頭
9249 番地
9250
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
186
9251 【リターンパラメータ】
9252 ER_ID mbxid 生成されたメールボックスのID番号(正の値)
9253 またはエラーコード
9254
9255 【エラーコード】
9256 E_CTX コンテキストエラー
9257 ・非タスクコンテキストからの呼出し〔s〕【NGKI1937】
9258 ・CPUロック状態からの呼出し〔s〕【NGKI1938】
9259 E_RSATR 予約属性
9260 ・mbxatrが無効【NGKI1939】
9261 ・属するクラスの指定が有効範囲外〔sM〕【NGKI1940】
9262 ・クラスの囲みの中に記述されていない〔SM〕【NGKI1941】
9263 E_NOSPT 未サポート機能
9264 ・条件については各カーネルにおける規定の項を参照
9265 E_PAR パラメータエラー
9266 ・maxmpriがTMIN_MPRIより小さい,またはTMAX_MPRIより大き
9267 い【NGKI1951】
9268 E_NOID ID番号不足
9269 ・割り付けられるメールボックスIDがない〔sD〕【NGKI1942】
9270 E_NOMEM メモリ不足
9271 ・優先度別のメッセージキューヘッダ領域が確保できない
9272 【NGKI1943】
9273 E_OBJ オブジェクト状態エラー
9274 ・mbxidで指定したメールボックスが登録済み(CRE_MBXの場
9275 合)【NGKI1944】
9276
9277 【機能】
9278
9279 各パラメータで指定したメールボックス生成情報に従って,メールボックスを
9280 生成する.メッセージキューはつながれているメッセージがない状態に初期化
9281 され,mprihdとmaxmpriから優先度別のメッセージキューヘッダ領域が設定され
9282 る【NGKI1945】.また,待ち行列は空の状態に初期化される【NGKI1946】.
9283
9284 静的APIにおいては,mbxidはオブジェクト識別名,mbxatrとmaxmpriは整数定数
9285 式パラメータ,mprihdは一般定数式パラメータである【NGKI1947】.コンフィ
9286 ギュレータは,静的APIのメモリ不足(E_NOMEM)エラーを検出することができ
9287 ない【NGKI1948】.
9288
9289 mprihdをNULLとした場合,maxmpriの指定に合致したサイズの優先度別のメッセー
9290 ジキューヘッダ領域が,コンフィギュレータまたはカーネルにより確保される
9291 【NGKI1949】.
9292
9293 【未決定事項】
9294
9295 mprihdにNULL以外を指定した場合の扱いについては,この仕様では規定してい
9296 ない.
9297
9298 【TOPPERS/ASPカーネルにおける規定】
9299
9300 ASPカーネルでは,CRE_MBXのみをサポートする【ASPS0150】.また,優先度別
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
187
9301 のメッセージキューヘッダ領域は使用しておらず,mprihdにはNULLのみを指定
9302 することができる.NULL以外を指定した場合には,E_NOSPTエラーとなる
9303 【ASPS0152】.ただし,動的生成機能拡張パッケージでは,acre_mbxもサポー
9304 トする【ASPS0153】.acre_mbxに対しても,mprihdにはNULLのみを指定するこ
9305 とができる【ASPS0154】.優先度別のメッセージキューヘッダ領域を使用しな
9306 いため,E_NOMEMが返ることはない【ASPS0155】.
9307
9308 【TOPPERS/FMPカーネルにおける規定】
9309
9310 FMPカーネルでは,CRE_MBXのみをサポートする【FMPS0132】.また,優先度別
9311 のメッセージキューヘッダ領域は使用しておらず,mprihdにはNULLのみを指定
9312 することができる.NULL以外を指定した場合には,E_NOSPTエラーとなる
9313 【FMPS0134】.優先度別のメッセージキューヘッダ領域を使用しないため,
9314 E_NOMEMが返ることはない【FMPS0135】.
9315 ----------------------------------------------------------------------
9316 AID_MBX 割付け可能なメールボックスIDの数の指定〔SpD〕【NGKI1952】
9317
9318 【静的API】
9319 AID_MBX(uint_t nombx)
9320
9321 【パラメータ】
9322 uint_t n ombx 割付け可能なメールボックスIDの数
9323
9324 【エラーコード】
9325 E_RSATR 予約属性
9326 ・クラスの囲みの中に記述されていない〔M〕【NGKI1953】
9327 E_PAR パラメータエラー
9328 ・nombxが負の値【NGKI3281】
9329
9330 【機能】
9331
9332 nombxで指定した数のメールボックスIDを,メールボックスを生成するサービス
9333 コールによって割付け可能なメールボックスIDとして確保する【NGKI1954】.
9334
9335 nombxは整数定数式パラメータである【NGKI1955】.
9336 ----------------------------------------------------------------------
9337 del_mbx メールボックスの削除〔TpD〕【NGKI1956】
9338
9339 【C言語API】
9340 ER ercd = del_mbx(ID mbxid)
9341
9342 【パラメータ】
9343 ID mbxid 対象メールボックスのID番号
9344
9345 【リターンパラメータ】
9346 ER ercd 正常終了(E_OK)またはエラーコード
9347
9348 【エラーコード】
9349 E_CTX コンテキストエラー
9350 ・非タスクコンテキストからの呼出し【NGKI1957】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
188
9351 ・CPUロック状態からの呼出し【NGKI1958】
9352 E_ID 不正ID番号
9353 ・mbxidが有効範囲外【NGKI1959】
9354 E_NOEXS オブジェクト未登録
9355 ・対象メールボックスが未登録【NGKI1960】
9356 E_OBJ オブジェクト状態エラー
9357 ・対象メールボックスは静的APIで生成された【NGKI1961】
9358
9359 【機能】
9360
9361 mbxidで指定したメールボックス(対象メールボックス)を削除する.具体的な
9362 振舞いは以下の通り.
9363
9364 対象メールボックスの登録が解除され,そのメールボックスIDが未使用の状態
9365 に戻される【NGKI1962】.また,対象メールボックスの待ち行列につながれた
9366 タスクは,待ち行列の先頭のタスクから順に待ち解除される【NGKI1963】.待
9367 ち解除されたタスクには,待ち状態となったサービスコールからE_DLTエラーが
9368 返る【NGKI1964】.
9369
9370 メールボックスの生成時に,優先度別のメッセージキューヘッダ領域がカーネ
9371 ルによって確保された場合は,そのメモリ領域が解放される【NGKI1965】.
9372
9373 【使用上の注意】
9374
9375 del_mbxにより複数のタスクが待ち解除される場合,サービスコールの処理時間
9376 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
9377 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
9378 み禁止時間が長くなるため,注意が必要である.
9379
9380 【TOPPERS/ASPカーネルにおける規定】
9381
9382 ASPカーネルでは,del_mbxをサポートしない【ASPS0156】.ただし,動的生成
9383 機能拡張パッケージでは,del_mbxをサポートする【ASPS0157】.
9384
9385 【TOPPERS/FMPカーネルにおける規定】
9386
9387 FMPカーネルでは,del_mbxをサポートしない【FMPS0136】.
9388 ----------------------------------------------------------------------
9389 snd_mbx メールボックスへの送信〔Tp〕【NGKI1966】
9390
9391 【C言語API】
9392 ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg)
9393
9394 【パラメータ】
9395 ID mbxid 対象メールボックスのID番号
9396 T_MSG *pk_msg 送信メッセージの先頭番地
9397
9398 【リターンパラメータ】
9399 ER ercd 正常終了(E_OK)またはエラーコード
9400
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
189
9401 【エラーコード】
9402 E_CTX コンテキストエラー
9403 ・非タスクコンテキストからの呼出し【NGKI1967】
9404 ・CPUロック状態からの呼出し【NGKI1968】
9405 E_ID 不正ID番号
9406 ・mbxidが有効範囲外【NGKI1969】
9407 E_PAR パラメータエラー
9408 ・条件については機能の項を参照
9409 E_NOEXS オブジェクト未登録
9410 ・対象メールボックスが未登録〔D〕【NGKI1970】
9411
9412 【機能】
9413
9414 mbxidで指定したメールボックス(対象メールボックス)に,pk_msgで指定した
9415 メッセージを送信する.具体的な振舞いは以下の通り.
9416
9417 対象メールボックスの待ち行列にタスクが存在する場合には,待ち行列の先頭
9418 のタスクが,pk_msgで指定したメッセージを受信し,待ち解除される
9419 【NGKI1971】.待ち解除されたタスクには,待ち状態となったサービスコール
9420 からE_OKが返る【NGKI1972】.
9421
9422 対象メールボックスの待ち行列にタスクが存在しない場合には,pk_msgで指定
9423 したメッセージが,メールボックス属性のTA_MPRI指定の有無によって指定され
9424 る順序で,メッセージキューにつながれる【NGKI1973】.
9425
9426 対象メールボックスがTA_MPRI属性である場合には,pk_msgで指定したメッセー
9427 ジの先頭のメッセージヘッダ中のmsgpriフィールドの値が,TMIN_MPRI以上で,
9428 対象メールボックスに送信できるメッセージ優先度の最大値以下でなければな
9429 らない.そうでない場合には,E_PARエラーとなる【NGKI1975】.
9430 ----------------------------------------------------------------------
9431 rcv_mbx メールボックスからの受信〔Tp〕【NGKI1976】
9432 prcv_mbx メールボックスからの受信(ポーリング)〔Tp〕【NGKI1977】
9433 trcv_mbx メールボックスからの受信(タイムアウト付き)〔Tp〕【NGKI1978】
9434
9435 【C言語API】
9436 ER ercd = rcv_mbx(ID mb xid, T_MSG **ppk_msg)
9437 ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg)
9438 ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
9439
9440 【パラメータ】
9441 ID mbxid 対象メールボックスのID番号
9442 T_MSG * * ppk_msg 受信メッセージの先頭番地を入れるメモリ領域
9443 へのポインタ
9444 TMO tmout タイムアウト時間(trcv_mbxの場合)
9445
9446 【リターンパラメータ】
9447 ER ercd 正常終了(E_OK)またはエラーコード
9448 T_MSG * ppk_msg 受信メッセージの先頭番地
9449
9450 【エラーコード】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
190
9451 E_CTX コンテキストエラー
9452 ・非タスクコンテキストからの呼出し【NGKI1979】
9453 ・CPUロック状態からの呼出し【NGKI1980】
9454 ・ディスパッチ保留状態からの呼出し(prcv_mbxを除く)【NGKI1981】
9455 E_NOSPT 未サポート機能
9456 ・制約タスクからの呼出し(prcv_mbxを除く)【NGKI1982】
9457 E_ID 不正ID番号
9458 ・mbxidが有効範囲外【NGKI1983】
9459 E_PAR パラメータエラー
9460 ・tmoutが無効(trcv_mbxの場合)【NGKI1984】
9461 E_NOEXS オブジェクト未登録
9462 ・対象メールボックスが未登録〔D〕【NGKI1985】
9463 E_TMOUT ポーリング失敗またはタイムアウト(rcv_mbxを除く)【NGKI1986】
9464 E_RLWAI 待ち禁止状態または待ち状態の強制解除(prcv_mbxを除く)
9465 【NGKI1987】
9466 E_DLT 待ちオブジェクトの削除または再初期化(prcv_mbxを除く)
9467 【NGKI1988】
9468
9469 【機能】
9470
9471 mbxidで指定したメールボックス(対象メールボックス)からメッセージを受信
9472 する.受信したメッセージの先頭番地は,ppk_msgで指定したメモリ領域に返さ
9473 れる.具体的な振舞いは以下の通り.
9474
9475 対象メールボックスのメッセージキューにメッセージがつながれている場合に
9476 は,メッセージキューの先頭につながれたメッセージが取り出され,ppk_msgで
9477 指定したメモリ領域に返される【NGKI1989】.
9478
9479 対象メールボックスのメッセージキューにメッセージがつながれていない場合
9480 には,自タスクはメールボックスからの受信待ち状態となり,対象メールボッ
9481 クスの待ち行列につながれる【NGKI1990】.
9482 ----------------------------------------------------------------------
9483 ini_mbx メールボックスの再初期化〔Tp〕【NGKI1991】
9484
9485 【C言語API】
9486 ER ercd = ini_mbx(ID mbxid)
9487
9488 【パラメータ】
9489 ID mbxid 対象メールボックスのID番号
9490
9491 【リターンパラメータ】
9492 ER ercd 正常終了(E_OK)またはエラーコード
9493
9494 【エラーコード】
9495 E_CTX コンテキストエラー
9496 ・非タスクコンテキストからの呼出し【NGKI1992】
9497 ・CPUロック状態からの呼出し【NGKI1993】
9498 E_ID 不正ID番号
9499 ・mbxidが有効範囲外【NGKI1994】
9500 E_NOEXS オブジェクト未登録
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
191
9501 ・対象メールボックスが未登録〔D〕【NGKI1995】
9502
9503 【機能】
9504
9505 mbxidで指定したメールボックス(対象メールボックス)を再初期化する.具体
9506 的な振舞いは以下の通り.
9507
9508 対象メールボックスのメールボックス管理領域は,メッセージキューはつなが
9509 れているメッセージがない状態に初期化される【NGKI1996】.また,対象メー
9510 ルボックスの待ち行列につながれたタスクは,待ち行列の先頭のタスクから順
9511 に待ち解除される【NGKI1997】.待ち解除されたタスクには,待ち状態となっ
9512 たサービスコールからE_DLTエラーが返る【NGKI1998】.
9513
9514 【使用上の注意】
9515
9516 ini_mbxにより複数のタスクが待ち解除される場合,サービスコールの処理時間
9517 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
9518 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
9519 み禁止時間が長くなるため,注意が必要である.
9520
9521 メールボックスを再初期化した場合に,アプリケーションとの整合性を保つのは,
9522 アプリケーションの責任である.
9523
9524 【μITRON4.0仕様との関係】
9525
9526 μITRON4.0仕様に定義されていないサービスコールである.
9527 ----------------------------------------------------------------------
9528 ref_mbx メールボックスの状態参照〔Tp〕【NGKI1999】
9529
9530 【C言語API】
9531 ER ercd = ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
9532
9533 【パラメータ】
9534 ID mbxid 対象メールボックスのID番号
9535 T_RMBX * pk_rmbx メールボックスの現在状態を入れるパケットへ
9536 のポインタ
9537
9538 【リターンパラメータ】
9539 ER ercd 正常終了(E_OK)またはエラーコード
9540
9541 *メールボックスの現在状態(パケットの内容)
9542 ID wtskid メールボックスの待ち行列の先頭のタスクのID
9543 番号
9544 T_MSG * pk_msg メッセージキューの先頭につながれたメッセー
9545 ジの先頭番地
9546
9547 【エラーコード】
9548 E_CTX コンテキストエラー
9549 ・非タスクコンテキストからの呼出し【NGKI2000】
9550 ・CPUロック状態からの呼出し【NGKI2001】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
192
9551 E_ID 不正ID番号
9552 ・mbxidが有効範囲外【NGKI2002】
9553 E_NOEXS オブジェクト未登録
9554 ・対象メールボックスが未登録〔D〕【NGKI2003】
9555
9556 【機能】
9557
9558 mbxidで指定したメールボックス(対象メールボックス)の現在状態を参照する.
9559 参照した現在状態は,pk_rmbxで指定したパケットに返される【NGKI2004】.
9560
9561 対象メールボックスの待ち行列にタスクが存在しない場合,wtskidには
9562 TSK_NONE(=0)が返る【NGKI2005】.また,メッセージキューにメッセージが
9563 つながれていない場合,pk_msgにはNULLが返る【NGKI2006】.
9564
9565 【使用上の注意】
9566
9567 ref_mbxはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
9568 ない.これは,ref_mbxを呼び出し,対象メールボックスの現在状態を参照した
9569 直後に割込みが発生した場合,ref_mbxから戻ってきた時には対象メールボック
9570 スの状態が変化している可能性があるためである.
9571 ----------------------------------------------------------------------
9572
9573 4.4.6 ミューテックス
9574
9575 ミューテックスは,タスク間の排他制御を行うための同期・通信オブジェクト
9576 である.タスクは,排他制御区間に入る時にミューテックスをロックし,排他
9577 制御区間を出る時にロック解除する.ミューテックスは,ミューテックスIDと
9578 呼ぶID番号によって識別する【NGKI2007】.
9579
9580 ミューテックスは,排他制御に伴う優先度逆転の時間を最小限に抑えるための
9581 優先度上限プロトコル(priority ceiling protocol)をサポートする.ミュー
9582 テックス属性により優先度上限ミューテックスであると指定することで,その
9583 ミューテックスの操作時に,優先度上限プロトコルに従った現在優先度の制御
9584 が行われる.
9585
9586 各ミューテックスが持つ情報は次の通り【NGKI2008】.
9587
9588 ・ミューテックス属性
9589 ・ロック状態(ロックされている状態とロック解除されている状態)
9590 ・ミューテックスをロックしているタスク
9591 ・待ち行列(ミューテックスのロック待ち状態のタスクのキュー)
9592 ・上限優先度(優先度上限ミューテックスの場合)
9593 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
9594 ・属する保護ドメイン(保護機能対応カーネルの場合)
9595 ・属するクラス(マルチプロセッサ対応カーネルの場合)
9596
9597 待ち行列は,ミューテックスをロックできるまで待っている状態(ミューテッ
9598 クスのロック待ち状態)のタスクが,ミューテックスをロックできる順序でつ
9599 ながれているキューである.
9600
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
193
9601 上限優先度は,優先度上限ミューテックスに対してのみ有効で,ミューテック
9602 スの生成時に,そのミューテックスをロックする可能性のあるタスクのベース
9603 優先度の中で最も高い優先度(または,それより高い優先度)に設定する
9604 【NGKI2009】.
9605
9606 ミューテックス属性には,次の属性を指定することができる【NGKI2010】.
9607
9608 TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
9609 TA_CEILI NG 0x03U 優先度上限ミューテックスとする.待ち行列をタス
9610 クの優先度順にする
9611
9612 TA_TPRI,TA_CEILINGのいずれも指定しない場合,待ち行列はFIFO順になる
9613 【NGKI2011】.
9614
9615 ミューテックス機能に関連して,各タスクが持つ情報は次の通り【NGKI2012】.
9616
9617 ・ロックしているミューテックスのリスト
9618
9619 ロックしているミューテックスのリストは,タスクの起動時に空に初期化され
9620 る【NGKI2013】.
9621
9622 タスクの現在優先度は,そのタスクのベース優先度と,そのタスクがロックし
9623 ている優先度上限ミューテックスの優先度上限の中で,最も高い優先度に設定
9624 される【NGKI2014】.
9625
9626 ミューテックス機能によりタスクの現在優先度が変化する場合には,次の処理
9627 が行われる.現在優先度を変化させるサービスコールの前後とも,当該タスク
9628 が実行できる状態である場合には,同じ優先度のタスクの中で最高優先順位と
9629 なる【NGKI2015】.そのサービスコールにより,当該タスクが実行できる状態
9630 に遷移する場合には,同じ優先度のタスクの中で最低優先順位となる
9631 【NGKI2016】.そのサービスコールの後で,当該タスクが待ち状態で,タスク
9632 の優先度順の待ち行列につながれている場合には,当該タスクの変更後の現在
9633 優先度に従って,その待ち行列中での順序が変更される【NGKI2017】.待ち行
9634 列中に同じ現在優先度のタスクがある場合には,当該タスクの順序はそれらの
9635 中で最後になる【NGKI2018】.
9636
9637 ミューテックス機能に関連して,タスクの終了時に行うべき処理として,タス
9638 クがロックしているミューテックスのロック解除がある.タスクの終了時にロッ
9639 クしているミューテックスが残っている場合,それらのミューテックスは,ロッ
9640 クしたのと逆の順序でロック解除される【NGKI2019】.
9641
9642 ミューテックス機能に関連するカーネル構成マクロは次の通り.
9643
9644 TNUM_MTXID 登録できるミューテックスの数(動的生成対応でないカー
9645 ネルでは,静的APIによって登録されたミューテックスの
9646 数に一致)【NGKI2020】
9647
9648 【使用上の注意】
9649
9650 優先度上限プロトコルには,(a) 優先度の低いタスクの排他制御区間に最大1回
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
194
9651 しかブロックされない,(b) タスクの実行が開始された以降は優先度の低いタ
9652 スクにブロックされないという利点があるが,これは,タスク間の同期に優先
9653 度上限ミューテックスのみを用い,他の方法でタスクのスケジューリングに関
9654 与しない場合に得られる利点である.
9655
9656 これらの利点を得るためには,タスクの優先順位の回転やディスパッチの禁止
9657 を行ってはならないことに加えて,優先度上限ミューテックスをロックしたタ
9658 スクを待ち状態にしてはならない.特に,優先度上限ミューテックスに対して,
9659 タスクがロック待ち状態になる状況に注意が必要である(優先度上限プロトコ
9660 ルでは,タスクがミューテックスのロック待ち状態になることはない).
9661
9662 例えば,着目するタスクAと,タスクAよりベース優先度の低いタスクBとタスク
9663 C,タスクAよりも高い上限優先度を持った優先度上限ミューテックスがある場
9664 合を考える.タスクAがミューテックスをロックし,タスクBとタスクCがミュー
9665 テックスを待っている状況で,タスクAがミューテックスをロック解除すると,
9666 タスクBがミューテックスをロックして優先度が上がり,タスクBに切り換わる.
9667 さらにタスクBがミューテックスをロック解除すると,タスクCがミューテック
9668 スをロックして優先度が上がり,タスクCに切り換わる.タスクAが実行される
9669 のは,タスクCがミューテックスをロック解除した後である.この例では,タス
9670 クAが実行開始後に,タスクBとタスクCの排他制御区間にブロックされることに
9671 なる.
9672
9673 優先度上限ミューテックスに対してタスクがロック待ち状態になる状況を回避
9674 するためには,優先度上限ミューテックスをロックする場合に,待ち状態にな
9675 らないploc_mtxを用いるのが安全である.
9676
9677 【補足説明】
9678
9679 この仕様で優先度上限プロトコルと呼んでいる方式は,オリジナルのpriority
9680 ceiling protocolとは異なるものである.この仕様の方式は,OSEK/VDX OS仕様
9681 でもpriority ceiling protocolと呼ばれているが,学術論文や他のOSでは,
9682 immediate ceiling priority protocol ,priority protection protocol,
9683 priority ceiling emulation ,highest locker protocolなどと呼ばれている.
9684
9685 【TOPPERS/ASPカーネルにおける規定】
9686
9687 ASPカーネルでは,ミューテックス機能をサポートしない【ASPS0158】.ただし,
9688 ミューテックス機能拡張パッケージを用いると,ミューテックス機能を追加す
9689 ることができる【ASPS0159】.
9690
9691 【TOPPERS/FMPカーネルにおける規定】
9692
9693 FMPカーネルでは,ミューテックス機能をサポートしない【FMPS0137】.
9694
9695 【TOPPERS/HRP2カーネルにおける規定】
9696
9697 HRP2カーネルでは,ミューテックス機能をサポートする【HRPS0131】.
9698
9699 【未決定事項】
9700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
195
9701 マルチプロセッサにおいては,タスク間の同期に優先度上限ミューテックスの
9702 みを用い,他の方法でタスクのスケジューリングに関与しない場合でも,優先
9703 度上限ミューテックスに対してタスクがロック待ち状態になる.マルチプロセッ
9704 サ対応カーネルにおける優先度上限ミューテックスの扱いについては,今後の
9705 課題である.
9706
9707 【μITRON4.0仕様との関係】
9708
9709 μITRON4.0仕様の厳密な優先度制御規則を採用し,簡略化した優先度制御規則
9710 はサポートしていない.また,μITRON4.0仕様でサポートしている優先度継承
9711 プロトコル(priority inheritance protocol)は,現時点ではサポートしてい
9712 ない.
9713
9714 ミューテックス機能によりタスクの現在優先度が変化する場合の振舞いは,
9715 μITRON4.0仕様では実装依存となっているが,この仕様では規定している.
9716
9717 TNUM_MTXIDは,μITRON4.0仕様に規定されていないカーネル構成マクロであ
9718 る.
9719 ----------------------------------------------------------------------
9720 CRE_MTX ミューテックスの生成〔S〕【NGKI2021】
9721 acre_mtx ミューテックスの生成〔TD〕【NGKI2022】
9722
9723 【静的API】
9724 CRE_MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })
9725
9726 【C言語API】
9727 ER_ID mtxid = acre_mtx(const T_CMTX *pk_cmtx)
9728
9729 【パラメータ】
9730 ID mtxid 生成するミューテックスのID番号(CRE_MTXの
9731 場合)
9732 T_CMTX * pk_cmtx ミューテックスの生成情報を入れたパケット
9733 へのポインタ(静的APIを除く)
9734
9735 *ミューテックスの生成情報(パケットの内容)
9736 ATR mtxatr ミューテックス属性
9737 PRI ceilpri ミューテックスの上限優先度
9738
9739 【リターンパラメータ】
9740 ER_ID mtxid 生成されたミューテックスのID番号(正の値)
9741 またはエラーコード
9742
9743 【エラーコード】
9744 E_CTX コンテキストエラー
9745 ・非タスクコンテキストからの呼出し〔s〕【NGKI2023】
9746 ・CPUロック状態からの呼出し〔s〕【NGKI2024】
9747 E_RSATR 予約属性
9748 ・mtxatrが無効【NGKI2025】
9749 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI2026】
9750 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2027】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
196
9751 ・クラスの囲みの中に記述されていない〔SM〕【NGKI2028】
9752 E_PAR パラメータエラー
9753 ・条件については機能の項を参照
9754 E_OACV オブジェクトアクセス違反
9755 ・システム状態に対する管理操作が許可されていない〔sP〕
9756 【NGKI2029】
9757 E_MACV メモリアクセス違反
9758 ・pk_cmtxが指すメモリ領域への読出しアクセスが許可されて
9759 いない〔sP〕【NGKI2030】
9760 E_NOID ID番号不足
9761 ・割り付けられるミューテックスIDがない〔sD〕【NGKI2031】
9762 E_OBJ オブジェクト状態エラー
9763 ・mtxidで指定したセマフォが登録済み(CRE_MTXの場合)【NGKI2032】
9764
9765 【機能】
9766
9767 各パラメータで指定したミューテックス生成情報に従って,ミューテックスを
9768 生成する.生成されたミューテックスのロック状態はロックされていない状態
9769 に,待ち行列は空の状態に初期化される【NGKI2033】.
9770
9771 静的APIにおいては,mtxidはオブジェクト識別名,mtxatrとceilpriは整数定数
9772 式パラメータである【NGKI2034】.優先度上限ミューテックス以外の場合には,
9773 ceilpriの指定を省略することができる【NGKI2035】.
9774
9775 優先度上限ミューテックスを生成する場合,ceilpriは,TMIN_TPRI以上,
9776 TMAX_TPRI以下でなければならない.そうでない場合には,E_PARエラーとなる
9777 【NGKI2037】.
9778
9779 【TOPPERS/ASPカーネルにおける規定】
9780
9781 ASPカーネルのミューテックス機能拡張パッケージでは,CRE_MTXのみをサポー
9782 トする【ASPS0160】.
9783
9784 【TOPPERS/HRP2カーネルにおける規定】
9785
9786 HRP2カーネルでは,CRE_MTXのみをサポートする【HRPS0132】.
9787 ----------------------------------------------------------------------
9788 AID_MTX 割付け可能なミューテックスIDの数の指定〔SD〕【NGKI2038】
9789
9790 【静的API】
9791 AID_MTX(uint_t nomtx)
9792
9793 【パラメータ】
9794 uint_t nomtx 割付け可能なミューテックスIDの数
9795
9796 【エラーコード】
9797 E_RSATR 予約属性
9798 ・クラスの囲みの中に記述されていない〔M〕【NGKI2039】
9799 E_PAR パラメータエラー
9800 ・nomtxが負の値【NGKI3282】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
197
9801
9802 【機能】
9803
9804 nomtxで指定した数のミューテックスIDを,ミューテックスを生成するサービス
9805 コールによって割付け可能なミューテックスIDとして確保する【NGKI2040】.
9806
9807 nomtxは整数定数式パラメータである【NGKI2041】.
9808 ----------------------------------------------------------------------
9809 SAC_MTX ミューテックスのアクセス許可ベクタの設定〔SP〕【NGKI2042】
9810 sac_mtx ミューテックスのアクセス許可ベクタの設定〔TPD〕【NGKI2043】
9811
9812 【静的API】
9813 SAC_MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2,
9814 ACPTN acptn3, ACPTN acptn4 })
9815
9816 【C言語API】
9817 ER ercd = sac_mtx(ID mtxid, const ACVCT *p_acvct)
9818
9819 【パラメータ】
9820 ID mtxid 対象ミューテックスのID番号
9821 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
9822 インタ(静的APIを除く)
9823
9824 *アクセス許可ベクタ(パケットの内容)
9825 ACPTN acptn1 通常操作1のアクセス許可パターン
9826 ACPTN acptn2 通常操作2のアクセス許可パターン
9827 ACPTN acptn3 管理操作のアクセス許可パターン
9828 ACPTN acptn4 参照操作のアクセス許可パターン
9829
9830 【リターンパラメータ】
9831 ER ercd 正常終了(E_OK)またはエラーコード
9832
9833 【エラーコード】
9834 E_CTX コンテキストエラー
9835 ・非タスクコンテキストからの呼出し〔s〕【NGKI2044】
9836 ・CPUロック状態からの呼出し〔s〕【NGKI2045】
9837 E_ID 不正ID番号
9838 ・mtxidが有効範囲外〔s〕【NGKI2046】
9839 E_RSATR 予約属性
9840 ・対象ミューテックスが属する保護ドメインの囲みの中に記
9841 述されていない〔S〕【NGKI2047】
9842 ・対象ミューテックスが属するクラスの囲みの中に記述され
9843 ていない〔SM〕【NGKI2048】
9844 E_NOEXS オブジェクト未登録
9845 ・対象ミューテックスが未登録【NGKI2049】
9846 E_OACV オブジェクトアクセス違反
9847 ・対象ミューテックスに対する管理操作が許可されていない〔s〕
9848 【NGKI2050】
9849 E_MACV メモリアクセス違反
9850 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
198
9851 いない〔s〕【NGKI2051】
9852 E_OBJ オブジェクト状態エラー
9853 ・対象ミューテックスは静的APIで生成された〔s〕【NGKI2052】
9854 ・対象ミューテックスに対してアクセス許可ベクタが設定済
9855 み〔S〕【NGKI2053】
9856
9857 【機能】
9858
9859 mtxidで指定したミューテックス(対象ミューテックス)のアクセス許可ベクタ
9860 (4つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する
9861 【NGKI2054】.
9862
9863 静的APIにおいては,mtxidはオブジェクト識別名,acptn1~acptn4は整数定数
9864 式パラメータである【NGKI2055】.
9865
9866 【TOPPERS/ASPカーネルにおける規定】
9867
9868 ASPカーネルのミューテックス機能拡張パッケージでは,SAC_MTX,sac_mtxをサ
9869 ポートしない【ASPS0161】.
9870
9871 【TOPPERS/HRP2カーネルにおける規定】
9872
9873 HRP2カーネルでは,SAC_MTXのみをサポートする【HRPS0133】.
9874 ----------------------------------------------------------------------
9875 del_mtx ミューテックスの削除〔TD〕【NGKI2056】
9876
9877 【C言語API】
9878 ER ercd = del_mtx(ID mtxid)
9879
9880 【パラメータ】
9881 ID mtxid 対象ミューテックスのID番号
9882
9883 【リターンパラメータ】
9884 ER ercd 正常終了(E_OK)またはエラーコード
9885
9886 【エラーコード】
9887 E_CTX コンテキストエラー
9888 ・非タスクコンテキストからの呼出し【NGKI2057】
9889 ・CPUロック状態からの呼出し【NGKI2058】
9890 E_ID 不正ID番号
9891 ・mtxidが有効範囲外【NGKI2059】
9892 E_NOEXS オブジェクト未登録
9893 ・対象ミューテックスが未登録【NGKI2060】
9894 E_OACV オブジェクトアクセス違反
9895 ・対象ミューテックスに対する管理操作が許可されていない〔P〕
9896 【NGKI2061】
9897 E_OBJ オブジェクト状態エラー
9898 ・対象ミューテックスは静的APIで生成された【NGKI2062】
9899
9900 【機能】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
199
9901
9902 mtxidで指定したミューテックス(対象ミューテックス)を削除する.具体的な
9903 振舞いは以下の通り.
9904
9905 対象ミューテックスの登録が解除され,そのミューテックスIDが未使用の状態
9906 に戻される【NGKI2063】.対象ミューテックスをロックしているタスクがある
9907 場合には,そのタスクがロックしているミューテックスのリストから対象ミュー
9908 テックスが削除され,必要な場合にはそのタスクの現在優先度が変更される
9909 【NGKI2064】.また,対象ミューテックスの待ち行列につながれたタスクは,
9910 待ち行列の先頭のタスクから順に待ち解除される【NGKI2065】.待ち解除され
9911 たタスクには,待ち状態となったサービスコールからE_DLTエラーが返る
9912 【NGKI2066】.
9913
9914 【使用上の注意】
9915
9916 対象ミューテックスをロックしているタスクには,ミューテックスが削除され
9917 たことが通知されず,そのミューテックスをロック解除する時点でエラーとな
9918 る.これが不都合な場合には,ミューテックスをロックした状態で,ミューテッ
9919 クスを削除すればよい.
9920
9921 del_mtxにより複数のタスクが待ち解除される場合,サービスコールの処理時間
9922 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
9923 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
9924 み禁止時間が長くなるため,注意が必要である.
9925
9926 【TOPPERS/ASPカーネルにおける規定】
9927
9928 ASPカーネルのミューテックス機能拡張パッケージでは,del_mtxをサポートし
9929 ない【ASPS0162】.
9930
9931 【TOPPERS/HRP2カーネルにおける規定】
9932
9933 HRP2カーネルでは,del_mtxをサポートしない【HRPS0134】.
9934 ----------------------------------------------------------------------
9935 loc_mtx ミューテックスのロック〔T〕【NGKI2067】
9936 ploc_mtx ミューテックスのロック(ポーリング)〔T〕【NGKI2068】
9937 tloc_mtx ミューテックスのロック(タイムアウト付き)〔T〕【NGKI2069】
9938
9939 【C言語API】
9940 ER ercd = loc_mtx(ID mtxid)
9941 ER ercd = ploc_mtx(ID mtxid)
9942 ER ercd = tloc_mtx(ID mtxid, TMO tmout)
9943
9944 【パラメータ】
9945 ID mtxid 対象ミューテックスのID番号
9946 TMO tmout タイムアウト時間(twai_mtxの場合)
9947
9948 【リターンパラメータ】
9949 ER ercd 正常終了(E_OK)またはエラーコード
9950
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
200
9951 【エラーコード】
9952 E_CTX コンテキストエラー
9953 ・非タスクコンテキストからの呼出し【NGKI2070】
9954 ・CPUロック状態からの呼出し【NGKI2071】
9955 ・ディスパッチ保留状態からの呼出し(ploc_mtxを除く)【NGKI2072】
9956 E_NOSPT 未サポート機能
9957 ・制約タスクからの呼出し(ploc_mtxを除く)【NGKI2073】
9958 E_ID 不正ID番号
9959 ・mtxidが有効範囲外【NGKI2074】
9960 E_PAR パラメータエラー
9961 ・tmoutが無効(tloc_mtxの場合)【NGKI2075】
9962 E_NOEXS オブジェクト未登録
9963 ・対象ミューテックスが未登録〔D〕【NGKI2076】
9964 E_OACV オブジェクトアクセス違反
9965 ・対象ミューテックスに対する通常操作1が許可されていない〔P〕
9966 【NGKI2077】
9967 E_ILUSE サービスコール不正使用
9968 ・条件については機能の項を参照
9969 E_TMOUT ポーリング失敗またはタイムアウト(loc_mtxを除く)【NGKI2078】
9970 E_RLWAI 待ち禁止状態または待ち状態の強制解除(ploc_mtxを除く)
9971 【NGKI2079】
9972 E_DLT 待ちオブジェクトの削除または再初期化(ploc_mtxを除く)
9973 【NGKI2080】
9974
9975 【機能】
9976
9977 mtxidで指定したミューテックス(対象ミューテックス)をロックする.具体的
9978 な振舞いは以下の通り.
9979
9980 対象ミューテックスがロックされていない場合には,自タスクによってロック
9981 されている状態になる【NGKI2081】.自タスクがロックしているミューテック
9982 スのリストに対象ミューテックスが追加され,必要な場合には自タスクの現在
9983 優先度が変更される【NGKI2082】.
9984
9985 対象ミューテックスが自タスク以外のタスクによってロックされている場合に
9986 は,自タスクはミューテックスのロック待ち状態となり,対象ミューテックス
9987 の待ち行列につながれる【NGKI2083】.
9988
9989 対象ミューテックスが自タスクによってロックされている場合には,E_ILUSEエ
9990 ラーとなる【NGKI2084】.また,対象ミューテックスが優先度上限ミューテッ
9991 クスで,その上限優先度より自タスクのベース優先度が高い場合にも,
9992 E_ILUSEエラーとなる【NGKI2085】.
9993 ----------------------------------------------------------------------
9994 unl_mtx ミューテックスのロック解除〔T〕【NGKI2086】
9995
9996 【C言語API】
9997 ER ercd = unl_mtx(ID mtxid)
9998
9999 【パラメータ】
10000 ID mt xid 対象ミューテックスのID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
201
10001
10002 【リターンパラメータ】
10003 ER ercd 正常終了(E_OK)またはエラーコード
10004
10005 【エラーコード】
10006 E_CTX コンテキストエラー
10007 ・非タスクコンテキストからの呼出し【NGKI2087】
10008 ・CPUロック状態からの呼出し【NGKI2088】
10009 E_ID 不正ID番号
10010 ・mtxidが有効範囲外【NGKI2089】
10011 E_NOEXS オブジェクト未登録
10012 ・対象ミューテックスが未登録〔D〕【NGKI2090】
10013 E_OACV オブジェクトアクセス違反
10014 ・対象ミューテックスに対する通常操作1が許可されていない〔P〕
10015 【NGKI3273】
10016 E_ILUSE サービスコール不正使用
10017 ・条件については機能の項を参照
10018
10019 【機能】
10020
10021 mtxidで指定したミューテックス(対象ミューテックス)をロック解除する.具
10022 体的な振舞いは以下の通り.
10023
10024 まず,自タスクがロックしているミューテックスのリストから対象ミューテッ
10025 クスが削除され,必要な場合には自タスクの現在優先度が変更される
10026 【NGKI2091】.
10027
10028 対象ミューテックスの待ち行列にタスクが存在する場合には,待ち行列の先頭
10029 のタスクが待ち解除される【NGKI2092】.対象ミューテックスは,待ち解除さ
10030 れたタスクによってロックされている状態になる【NGKI2093】.待ち解除され
10031 たタスクがロックしているミューテックスのリストに対象ミューテックスが追
10032 加され,必要な場合にはそのタスクの現在優先度が変更される【NGKI2094】.
10033 待ち解除されたタスクには,待ち状態となったサービスコールからE_OKが返る
10034 【NGKI2095】.
10035
10036 待ち行列にタスクが存在しない場合には,対象ミューテックスはロックされて
10037 いない状態になる【NGKI2096】.
10038
10039 対象ミューテックスが自タスクによってロックされていない場合には,
10040 E_ILUSEエラーとなる【NGKI2097】.
10041 ----------------------------------------------------------------------
10042 ini_mtx ミューテックスの再初期化〔T〕【NGKI2098】
10043
10044 【C言語API】
10045 ER ercd = ini_mtx(ID mtxid)
10046
10047 【パラメータ】
10048 ID mtxid 対象ミューテックスのID番号
10049
10050 【リターンパラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
202
10051 ER ercd 正常終了(E_OK)またはエラーコード
10052
10053 【エラーコード】
10054 E_CTX コンテキストエラー
10055 ・非タスクコンテキストからの呼出し【NGKI2099】
10056 ・CPUロック状態からの呼出し【NGKI2100】
10057 E_ID 不正ID番号
10058 ・mtxidが有効範囲外【NGKI2101】
10059 E_NOEXS オブジェクト未登録
10060 ・対象ミューテックスが未登録〔D〕【NGKI2102】
10061 E_OACV オブジェクトアクセス違反
10062 ・対象ミューテックスに対する管理操作が許可されていない〔P〕
10063 【NGKI2103】
10064
10065 【機能】
10066
10067 mtxidで指定したミューテックス(対象ミューテックス)を再初期化する.具体
10068 的な振舞いは以下の通り.
10069
10070 対象ミューテックスのロック状態は,ロックされていない状態に初期化される
10071 【NGKI2104】.対象ミューテックスをロックしているタスクがある場合には,
10072 そのタスクがロックしているミューテックスのリストから対象ミューテックス
10073 が削除され,必要な場合にはそのタスクの現在優先度が変更される
10074 【NGKI2105】.また,対象ミューテックスの待ち行列につながれたタスクは,
10075 待ち行列の先頭のタスクから順に待ち解除される【NGKI2106】.待ち解除され
10076 たタスクには,待ち状態となったサービスコールからE_DLTエラーが返る
10077 【NGKI2107】.
10078
10079 【使用上の注意】
10080
10081 対象ミューテックスをロックしているタスクには,ミューテックスが再初期化
10082 されたことが通知されず,そのミューテックスをロック解除する時点でエラー
10083 となる.これが不都合な場合には,ミューテックスをロックした状態で,ミュー
10084 テックスを再初期化すればよい.
10085
10086 ini_mtxにより複数のタスクが待ち解除される場合,サービスコールの処理時間
10087 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
10088 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
10089 み禁止時間が長くなるため,注意が必要である.
10090
10091 ミューテックスを再初期化した場合に,アプリケーションとの整合性を保つの
10092 は,アプリケーションの責任である.
10093
10094 【μITRON4.0仕様との関係】
10095
10096 μITRON4.0仕様に定義されていないサービスコールである.
10097 ----------------------------------------------------------------------
10098 ref_mtx ミューテックスの状態参照〔T〕【NGKI2108】
10099
10100 【C言語API】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
203
10101 ER ercd = ref_mtx(ID mtxid, T_RMTX *pk_rmtx)
10102
10103 【パラメータ】
10104 ID mtxid 対象ミューテックスのID番号
10105 T_RMTX * pk_rmtx ミューテックスの現在状態を入れるパケットへ
10106 のポインタ
10107
10108 【リターンパラメータ】
10109 ER ercd 正常終了(E_OK)またはエラーコード
10110
10111 *ミューテックスの現在状態(パケットの内容)
10112 ID htskid ミューテックスをロックしているタスクのID番号
10113 ID wtskid ミューテックスの待ち行列の先頭のタスクのID
10114 番号
10115
10116 【エラーコード】
10117 E_CTX コンテキストエラー
10118 ・非タスクコンテキストからの呼出し【NGKI2109】
10119 ・CPUロック状態からの呼出し【NGKI2110】
10120 E_ID 不正ID番号
10121 ・mtxidが有効範囲外【NGKI2111】
10122 E_NOEXS オブジェクト未登録
10123 ・対象ミューテックスが未登録〔D〕【NGKI2112】
10124 E_OACV オブジェクトアクセス違反
10125 ・対象ミューテックスに対する参照操作が許可されていない〔P〕
10126 【NGKI2113】
10127 E_MACV メモリアクセス違反
10128 ・pk_rmtxが指すメモリ領域への書込みアクセスが許可されて
10129 いない〔P〕【NGKI2114】
10130
10131 【機能】
10132
10133 mtxidで指定したミューテックス(対象ミューテックス)の現在状態を参照する.
10134 参照した現在状態は,pk_rmtxで指定したパケットに返される.
10135
10136 対象ミューテックスがロックされていない場合,htskidにはTSK_NONE(=0)が
10137 返る【NGKI2115】.
10138
10139 対象ミューテックスの待ち行列にタスクが存在しない場合,wtskidには
10140 TSK_NONE(=0)が返る【NGKI2116】.
10141
10142 【使用上の注意】
10143
10144 ref_mtxはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
10145 ない.これは,ref_mtxを呼び出し,対象ミューテックスの現在状態を参照した
10146 直後に割込みが発生した場合,ref_mtxから戻ってきた時には対象ミューテック
10147 スの状態が変化している可能性があるためである.
10148 ----------------------------------------------------------------------
10149
10150 4.4.7 メッセージバッファ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
204
10151
10152 メッセージバッファは,指定した長さのバイト列をメッセージとして,FIFO順
10153 で送受信するための同期・通信オブジェクトである.メッセージバッファは,
10154 メッセージバッファIDと呼ぶID番号によって識別する【NGKI3291】.
10155
10156 各メッセージバッファが持つ情報は次の通り【NGKI3292】.
10157
10158 ・メッセージバッファ属性
10159 ・最大メッセージサイズ
10160 ・メッセージバッファ管理領域
10161 ・送信待ち行列(メッセージバッファへの送信待ち状態のタスクのキュー)
10162 ・受信待ち行列(メッセージバッファからの受信待ち状態のタスクのキュー)
10163 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
10164 ・属する保護ドメイン(保護機能対応カーネルの場合)
10165 ・属するクラス(マルチプロセッサ対応カーネルの場合)
10166
10167 メッセージバッファ管理領域は,メッセージバッファに送信されたメッセージ
10168 を,送信された順に格納しておくためのメモリ領域である.メッセージバッファ
10169 生成時の指定により,メッセージバッファ管理領域のサイズを0とすることがで
10170 きる【NGKI3293】.
10171
10172 保護機能対応カーネルにおいて,メッセージバッファ管理領域は,カーネルの
10173 用いるオブジェクト管理領域として扱われる【NGKI3294】.
10174
10175 送信待ち行列は,メッセージバッファに対してメッセージが送信できるまで待っ
10176 ている状態(メッセージバッファへの送信待ち状態)のタスクが,メッセージ
10177 を送信できる順序でつながれているキューである.また,受信待ち行列は,メッ
10178 セージバッファからメッセージが受信できるまで待っている状態(メッセージ
10179 バッファからの受信待ち状態)のタスクが,メッセージを受信できる順序でつ
10180 ながれているキューである.
10181
10182 メッセージバッファ属性には,次の属性を指定することができる【NGKI3295】.
10183
10184 TA_TPRI 0x01U 送信待ち行列をタスクの優先度順にする
10185
10186 TA_TPRIを指定しない場合,送信待ち行列はFIFO順になる【NGKI3296】.受信待
10187 ち行列は,FIFO順に固定されている【NGKI3297】.
10188
10189 メッセージバッファ機能に関連するカーネル構成マクロは次の通り.
10190
10191 TNUM_MBFID 登録できるメッセージバッファの数(動的生成対応でな
10192 いカーネルでは,静的APIによって登録されたメッセー
10193 ジバッファの数に一致)【NGKI3298】
10194
10195 【TOPPERS/ASPカーネルにおける規定】
10196
10197 ASPカーネルでは,メッセージバッファ機能をサポートしない【ASPS0202】.た
10198 だし,メッセージバッファ機能拡張パッケージを用いると,メッセージバッファ
10199 機能を追加することができる【ASPS0203】.
10200
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
205
10201 【TOPPERS/FMPカーネルにおける規定】
10202
10203 FMPカーネルでは,メッセージバッファ機能をサポートしない【FMPS0167】.
10204
10205 【TOPPERS/HRP2カーネルにおける規定】
10206
10207 HRP2カーネルでは,メッセージバッファ機能をサポートしない【HRPS0168】.
10208 ただし,メッセージバッファ機能拡張パッケージを用いると,メッセージバッ
10209 ファ機能を追加することができる【HRPS0169】.
10210
10211 【μITRON4.0仕様との関係】
10212
10213 TNUM_MBFIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
10214 ----------------------------------------------------------------------
10215 CRE_MBF メッセージバッファの生成〔S〕【NGKI3299】
10216 acre_mbf メッセージバッファの生成〔TD〕【NGKI3300】
10217
10218 【静的API】
10219 CRE_MBF(ID mbfid, { ATR mbfatr, uint_t maxmsz, SIZE mbfsz , void *mbfmb })
10220
10221 【C言語API】
10222 ER_ID mbfid = acre_mbf(const T_CMBF *pk_cmbf)
10223
10224 【パラメータ】
10225 ID mbfid 生成するメッセージバッファのID番号(CRE_MBF
10226 の場合)
10227 T_CMBF * pk_cmbf メッセージバッファの生成情報を入れたパケッ
10228 トへのポインタ(静的APIを除く)
10229
10230 *メッセージバッファの生成情報(パケットの内容)
10231 ATR mbfatr メッセージバッファ属性
10232 uint_t maxmsz メッセージバッファの最大メッセージサイズ(バ
10233 イト数)
10234 SIZE mbfsz メッセージバッファ管理領域のサイズ(バイト数)
10235 void * mbfmb メッセージバッファ管理領域の先頭番地
10236
10237 【リターンパラメータ】
10238 ER_ID mbfid 生成されたメッセージバッファのID番号(正の
10239 値)またはエラーコード
10240
10241 【エラーコード】
10242 E_CTX コンテキストエラー
10243 ・非タスクコンテキストからの呼出し〔s〕【NGKI3301】
10244 ・CPUロック状態からの呼出し〔s〕【NGKI3302】
10245 E_RSATR 予約属性
10246 ・mbfatrが無効【NGKI3303】
10247 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI3304】
10248 ・属するクラスの指定が有効範囲外〔sM〕【NGKI3305】
10249 ・クラスの囲みの中に記述されていない〔SM〕【NGKI3306】
10250 E_NOSPT 未サポート機能
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
206
10251 ・条件については各カーネルにおける規定の項を参照
10252 E_PAR パラメータエラー
10253 ・maxmszが0以下【NGKI3307】
10254 ・mbfszが負の値〔S〕【NGKI3308】
10255 ・その他の条件については機能の項を参照
10256 E_OACV オブジェクトアクセス違反
10257 ・システム状態に対する管理操作が許可されていない〔sP〕
10258 【NGKI3309】
10259 E_MACV メモリアクセス違反
10260 ・pk_cmbfが指すメモリ領域への読出しアクセスが許可されて
10261 いない〔sP〕【NGKI3310】
10262 E_NOID ID番号不足
10263 ・割り付けられるメッセージバッファIDがない〔sD〕【NGKI3311】
10264 E_NOMEM メモリ不足
10265 ・メッセージバッファ管理領域が確保できない【NGKI3312】
10266 E_OBJ オブジェクト状態エラー
10267 ・mbfidで指定したメッセージバッファが登録済み(CRE_MBF
10268 の場合)【NGKI3313】
10269 ・その他の条件については機能の項を参照
10270
10271 【機能】
10272
10273 各パラメータで指定したメッセージバッファ生成情報に従って,メッセージバッ
10274 ファを生成する.mbfszとmbfmbからメッセージバッファ管理領域が設定され,
10275 格納されているメッセージがない状態に初期化される【NGKI3314】.また,送
10276 信待ち行列と受信待ち行列は,空の状態に初期化される【NGKI3315】.
10277
10278 静的APIにおいては,mbfidはオブジェクト識別名,mbfatr,maxmsz,mbfszは整
10279 数定数式パラメータ,mbfmbは一般定数式パラメータである【NGKI3316】.コン
10280 フィギュレータは,静的APIのメモリ不足(E_NOMEM)エラーを検出することが
10281 できない【NGKI3317】.
10282
10283 mbfmbをNULLとした場合,mbfszで指定したサイズのメッセージバッファ管理領
10284 域が,コンフィギュレータまたはカーネルにより確保される【NGKI3318】.
10285 mbfszにターゲット定義の制約に合致しないサイズを指定した時には,ターゲッ
10286 ト定義の制約に合致するように大きい方に丸めたサイズで確保される
10287 【NGKI3319】.
10288
10289 〔mbfmbにNULL以外を指定した場合〕
10290
10291 mbfmbにNULL以外を指定した場合,mbfmbとmbfszで指定したメッセージバッファ
10292 管理領域は,アプリケーションで確保しておく必要がある【NGKI3320】.メッ
10293 セージバッファ管理領域をアプリケーションで確保するために,次のマクロを
10294 用意している【NGKI3321】.
10295
10296 TSZ_MBFMB(msgcnt, msgsz) msgsz で指定したサイズのメッセージを,
10297 msgcnt で指定した数だけ格納できるメッセー
10298 ジバッファ管理領域のサイズ(バイト数)
10299 TCNT_MBFMB( msgcnt, msgsz) msgszで指定したサイズのメッセージを,
10300 msgcnt で指定した数だけ格納できるメッセー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
207
10301 ジバッファ管理領域を確保するために必要
10302 なMB_T型の配列の要素数
10303
10304 これらを用いてメッセージバッファ管理領域を確保する方法は次の通り
10305 【NGKI3322】.
10306
10307 MB_T <メッセージバッファ管理領域の変数名>[TCNT_MBFMB(msgcnt, msgsz)];
10308
10309 この時,mbfszにはTSZ_MBFMB(msgcnt, msgsz)を,mbfmbには<メッセージバッファ
10310 管理領域の変数名>を指定する【NGKI3323】.
10311
10312 この方法に従わず,mbfmbとmbfszにターゲット定義の制約に合致しない先頭番
10313 地やサイズを指定した時には,E_PARエラーとなる【NGKI3324】.また,保護機
10314 能対応カーネルにおいて,mbfmbとmbfszで指定したメッセージバッファ管理領
10315 域がカーネル専用のメモリオブジェクトに含まれない場合,E_OBJエラーとなる
10316 【NGKI3325】.
10317
10318 なお,TSZ_MBFMBは,mbfmbにNULLを指定した場合にも,メッセージバッファ管
10319 理領域のサイズを決めるために用いることができる.
10320
10321 【TOPPERS/ASPカーネルにおける規定】
10322
10323 ASPカーネルのメッセージバッファ機能拡張パッケージでは,CRE_MBFのみをサ
10324 ポートする【ASPS0204】.また,mbfmbにはNULLのみを指定することができる.
10325 NULL以外を指定した場合には,E_NOSPTエラーとなる【ASPS0205】.
10326
10327 【TOPPERS/HRP2カーネルにおける規定】
10328
10329 HRP2カーネルのメッセージバッファ機能拡張パッケージでは,CRE_MBFのみをサ
10330 ポートする【HRPS0170】.また,mbfmbにはNULLのみを指定することができる.
10331 NULL以外を指定した場合には,E_NOSPTエラーとなる【HRPS0171】.
10332
10333 【μITRON4.0仕様との関係】
10334
10335 μITRON4.0/PX仕様にあわせて,メッセージバッファ生成情報の最後のパラメー
10336 タを,mbf(メッセージバッファ領域の先頭番地)から,mbfmb(メッセージバッ
10337 ファ管理領域の先頭番地)に改名した.また,TSZ_MBFをTSZ_MBFMBに改名した.
10338
10339 TCNT_MBFMBを新設し,メッセージバッファ管理領域をアプリケーションで確保
10340 する方法を規定した.
10341 ----------------------------------------------------------------------
10342 AID_MBF 割付け可能なメッセージバッファIDの数の指定〔SD〕【NGKI3326】
10343
10344 【静的API】
10345 AID_MBF(uint_t nombf)
10346
10347 【パラメータ】
10348 uint_t nombf 割付け可能なメッセージバッファIDの数
10349
10350 【エラーコード】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
208
10351 E_RSATR 予約属性
10352 ・クラスの囲みの中に記述されていない〔M〕【NGKI3327】
10353 E_PAR パラメータエラー
10354 ・nombfが負の値【NGKI3328】
10355
10356 【機能】
10357
10358 nombfで指定した数のメッセージバッファIDを,メッセージバッファを生成する
10359 サービスコールによって割付け可能なメッセージバッファIDとして確保する
10360 【NGKI3329】.
10361
10362 nombfは整数定数式パラメータである【NGKI3330】.
10363 ----------------------------------------------------------------------
10364 SAC_MBF メッセージバッファのアクセス許可ベクタの設定〔SP〕【NGKI3331】
10365 sac_mbf メッセージバッファのアクセス許可ベクタの設定〔TPD〕【NGKI3332】
10366
10367 【静的API】
10368 SAC_MBF(ID mbfid, { ACPTN acptn1, ACPTN acptn2,
10369 ACPTN acptn3, ACPTN acptn4 })
10370
10371 【C言語API】
10372 ER ercd = sac_mbf(ID mbfid, const ACVCT *p_acvct)
10373
10374 【パラメータ】
10375 ID mbfid 対象メッセージバッファのID番号
10376 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
10377 インタ(静的APIを除く)
10378
10379 *アクセス許可ベクタ(パケットの内容)
10380 ACPTN acptn1 通常操作1のアクセス許可パターン
10381 ACPTN acptn2 通常操作2のアクセス許可パターン
10382 ACPTN acptn3 管理操作のアクセス許可パターン
10383 ACPTN acptn4 参照操作のアクセス許可パターン
10384
10385 【リターンパラメータ】
10386 ER ercd 正常終了(E_OK)またはエラーコード
10387
10388 【エラーコード】
10389 E_CTX コンテキストエラー
10390 ・非タスクコンテキストからの呼出し〔s〕【NGKI3333】
10391 ・CPUロック状態からの呼出し〔s〕【NGKI3334】
10392 E_ID 不正ID番号
10393 ・mbfidが有効範囲外〔s〕【NGKI3335】
10394 E_RSATR 予約属性
10395 ・対象メッセージバッファが属する保護ドメインの囲みの中
10396 に記述されていない〔S〕【NGKI3336】
10397 ・対象メッセージバッファが属するクラスの囲みの中に記述
10398 されていない〔SM〕【NGKI3337】
10399 E_NOEXS オブジェクト未登録
10400 ・対象メッセージバッファが未登録【NGKI3338】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
209
10401 E_OACV オブジェクトアクセス違反
10402 ・対象メッセージバッファに対する管理操作が許可されてい
10403 ない〔s〕【NGKI3339】
10404 E_MACV メモリアクセス違反
10405 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
10406 いない〔s〕【NGKI3340】
10407 E_OBJ オブジェクト状態エラー
10408 ・対象メッセージバッファは静的APIで生成された〔s〕【NGKI3341】
10409 ・対象メッセージバッファに対してアクセス許可ベクタが設
10410 定済み〔S〕【NGKI3342】
10411
10412 【機能】
10413
10414 mbfidで指定したメッセージバッファ(対象メッセージバッファ)のアクセス許
10415 可ベクタ(4つのアクセス許可パターンの組)を,各パラメータで指定した値に
10416 設定する【NGKI3343】.
10417
10418 静的APIにおいては,mbfidはオブジェクト識別名,acptn1~acptn4は整数定数
10419 式パラメータである【NGKI3344】.
10420
10421 【TOPPERS/ASPカーネルにおける規定】
10422
10423 ASPカーネルのメッセージバッファ機能拡張パッケージでは,SAC_MBF,
10424 sac_mbfをサポートしない【ASPS0206】.
10425
10426 【TOPPERS/HRP2カーネルにおける規定】
10427
10428 HRP2カーネルのメッセージバッファ機能拡張パッケージでは,SAC_MBFのみをサ
10429 ポートする【HRPS0172】.
10430 ----------------------------------------------------------------------
10431 del_mbf メッセージバッファの削除〔TD〕【NGKI3345】
10432
10433 【C言語API】
10434 ER ercd = del_mbf(ID mbfid)
10435
10436 【パラメータ】
10437 ID mbfid 対象メッセージバッファのID番号
10438
10439 【リターンパラメータ】
10440 ER ercd 正常終了(E_OK)またはエラーコード
10441
10442 【エラーコード】
10443 E_CTX コンテキストエラー
10444 ・非タスクコンテキストからの呼出し【NGKI3346】
10445 ・CPUロック状態からの呼出し【NGKI3347】
10446 E_ID 不正ID番号
10447 ・mbfidが有効範囲外【NGKI3348】
10448 E_NOEXS オブジェクト未登録
10449 ・対象メッセージバッファが未登録【NGKI3349】
10450 E_OACV オブジェクトアクセス違反
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
210
10451 ・対象メッセージバッファに対する管理操作が許可されてい
10452 ない〔P〕【NGKI3350】
10453 E_OBJ オブジェクト状態エラー
10454 ・対象メッセージバッファは静的APIで生成された【NGKI3351】
10455
10456 【機能】
10457
10458 mbfidで指定したメッセージバッファ(対象メッセージバッファ)を削除する.
10459 具体的な振舞いは以下の通り.
10460
10461 対象メッセージバッファの登録が解除され,そのメッセージバッファIDが未使
10462 用の状態に戻される【NGKI3352】.また,対象メッセージバッファの送信待ち
10463 行列と受信待ち行列につながれたタスクは,それぞれの待ち行列の先頭のタス
10464 クから順に待ち解除される【NGKI3353】.待ち解除されたタスクには,待ち状
10465 態となったサービスコールからE_DLTエラーが返る【NGKI3354】.
10466
10467 メッセージバッファの生成時に,メッセージバッファ管理領域がカーネルによっ
10468 て確保された場合は,そのメモリ領域が解放される【NGKI3355】.
10469
10470 【補足説明】
10471
10472 送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため,
10473 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな
10474 い.
10475
10476 【使用上の注意】
10477
10478 del_mbfにより複数のタスクが待ち解除される場合,サービスコールの処理時間
10479 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
10480 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
10481 み禁止時間が長くなるため,注意が必要である.
10482
10483 【TOPPERS/ASPカーネルにおける規定】
10484
10485 ASPカーネルのメッセージバッファ機能拡張パッケージでは,del_mbfをサポー
10486 トしない【ASPS0207】.
10487
10488 【TOPPERS/HRP2カーネルにおける規定】
10489
10490 HRP2カーネルのメッセージバッファ機能拡張パッケージでは,del_mbfをサポー
10491 トしない【HRPS0173】.
10492 ----------------------------------------------------------------------
10493 snd_mbf メッセージバッファへの送信〔T〕【NGKI3356】
10494 psnd_mbf メッセージバッファへの送信(ポーリング)〔T〕【NGKI3357】
10495 tsnd_mbf メッセージバッファへの送信(タイムアウト付き)〔T〕【NGKI3358】
10496
10497 【C言語API】
10498 ER ercd = snd_mbf(ID mbfid, const void *msg, uint_t msgsz)
10499 ER ercd = psnd_mbf(ID mbfid, const void *msg, uint_t msgsz)
10500 ER ercd = tsnd_mbf(ID mbfid, const void *msg, uint _t msgsz, TMO tmout)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
211
10501
10502 【パラメータ】
10503 ID mbfid 対象メッセージバッファのID番号
10504 void * msg 送信メッセージの先頭番地
10505 uint_t msgsz 送信メッセージのサイズ(バイト数)
10506 TMO tmout タイムアウト時間(tsnd_mbfの場合)
10507
10508 【リターンパラメータ】
10509 ER ercd 正常終了(E_OK)またはエラーコード
10510
10511 【エラーコード】
10512 E_CTX コンテキストエラー
10513 ・非タスクコンテキストからの呼出し【NGKI3359】
10514 ・CPUロック状態からの呼出し【NGKI3360】
10515 ・ディスパッチ保留状態からの呼出し(psnd_mbfを除く)
10516 【NGKI3361】
10517 E_NOSPT 未サポート機能
10518 ・制約タスクからの呼出し(psnd_mbfを除く)【NGKI3362】
10519 E_ID 不正ID番号
10520 ・mbfidが有効範囲外【NGKI3363】
10521 E_PAR パラメータエラー
10522 ・msgszが有効範囲(0より大きく対象メッセージバッファの
10523 最大メッセージサイズ以下)外【NGKI3364】
10524 ・tmoutが無効(tsnd_mbfの場合)【NGKI3365】
10525 E_NOEXS オブジェクト未登録
10526 ・対象メッセージバッファが未登録〔D〕【NGKI3366】
10527 E_OACV オブジェクトアクセス違反
10528 ・対象メッセージバッファに対する通常操作1が許可されて
10529 いない〔P〕【NGKI3367】
10530 E_MACV メモリアクセス違反
10531 ・msgとmsgszが指すメモリ領域への読出しアクセスが許可さ
10532 れていない〔P〕【NGKI3368】
10533 E_TMOUT ポーリング失敗またはタイムアウト(snd_mbfを除く)【NGKI3369】
10534 E_RLWAI 待ち禁止状態または待ち状態の強制解除(psnd_mbfを除く)
10535 【NGKI3370】
10536 E_DLT 待ちオブジェクトの削除または再初期化(psnd_mbfを除く)
10537 【NGKI3371】
10538
10539 【機能】
10540
10541 mbfidで指定したメッセージバッファ(対象メッセージバッファ)に,msgと
10542 msgszで指定したメッセージ(送信メッセージ)を送信する.具体的な振舞いは
10543 以下の通り.
10544
10545 対象メッセージバッファの受信待ち行列にタスクが存在する場合には,受信待
10546 ち行列の先頭のタスクが,送信メッセージを受信し,待ち解除される
10547 【NGKI3372】.待ち解除されたタスクには,待ち状態となったサービスコール
10548 から,受信したメッセージのサイズが返る【NGKI3373】.
10549
10550 対象メッセージバッファの受信待ち行列にタスクが存在しない場合で,送信待
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
212
10551 ち行列に自タスクより優先してメッセージを送信できるタスクが存在せず,メッ
10552 セージバッファ管理領域に送信メッセージを格納するスペースがある場合には,
10553 送信メッセージが,FIFO順でメッセージバッファ管理領域に格納される
10554 【NGKI3374】.ここで,送信待ち行列に自タスクより優先してメッセージを送
10555 信できるタスクが存在するとは,送信待ち行列がFIFO順の場合には送信待ち行
10556 列に何らかのタスクが存在すること,タスクの優先度順の場合には自タスクと
10557 優先度が同じかより高いタスクが存在することを意味する.
10558
10559 対象メッセージバッファの受信待ち行列にタスクが存在しない場合で,送信待
10560 ち行列に自タスクより優先してメッセージを送信できるタスクが存在するか,
10561 メッセージバッファ管理領域に送信メッセージを格納するスペースがない場合
10562 には,自タスクはメッセージバッファへの送信待ち状態となり,対象メッセー
10563 ジバッファの送信待ち行列につながれる【NGKI3375】.
10564
10565 メッセージバッファの送信待ち行列の先頭につながれているタスクが,
10566 ter_tskにより強制終了した場合や,rel_wai/irel_waiやタイムアウトにより
10567 待ち解除された場合,新たに送信待ち行列の先頭になったタスクの送信メッセー
10568 ジを,メッセージバッファ管理領域に格納できる可能性がある.そのため,こ
10569 れらの場合には,メッセージバッファからの受信によりメッセージバッファ管
10570 理領域に空きができた時の処理[NGKI3393][NGKI3394][NGKI3395]と同じ
10571 処理が行われる【NGKI3419】.さらに,送信待ち行列がタスクの優先度順の時
10572 には,chg_priやミューテックスの操作によりタスクの優先度が変化し,送信待
10573 ち行列の先頭につながれているタスクが変わった場合にも,同じ処理が行われ
10574 る【NGKI3420】.
10575
10576 【使用上の注意】
10577
10578 送信待ち行列の先頭につながれているタスクの強制終了,待ち解除,優先度変
10579 更に伴う処理で,送信待ち行列につながれていたタスクが複数待ち解除される
10580 場合がある.この時,サービスコールの処理時間およびカーネル内での割込み
10581 禁止時間が,待ち解除されるタスクの数に比例して長くなる.特に,多くのタ
10582 スクが待ち解除される場合,カーネル内での割込み禁止時間が長くなるため,
10583 注意が必要である.
10584 ----------------------------------------------------------------------
10585 rcv_mbf メッセージバッファからの受信〔T〕【NGKI3376】
10586 prcv_mbf メッセージバッファからの受信(ポーリング)〔T〕【NGKI3377】
10587 trcv_mbf メッセージバッファからの受信(タイムアウト付き)〔T〕【NGKI3378】
10588
10589 【C言語API】
10590 ER_UINT msgsz = rcv_mbf(ID mbfid, void *msg)
10591 ER_UINT msgsz = prcv_mbf(ID mbfid, void *msg)
10592 ER_UINT msgsz = trcv_mbf(ID mbfid, void *msg, TMO tmout)
10593
10594 【パラメータ】
10595 ID mbfid 対象メッセージバッファのID番号
10596 void * msg 受信メッセージを入れるメモリ領域の先頭番地
10597 TMO tmout タイムアウト時間(trcv_mbfの場合)
10598
10599 【リターンパラメータ】
10600 ER_UINT msgsz 受信メッセージサイズ(正の値)またはエラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
213
10601 コード
10602
10603 【エラーコード】
10604 E_CTX コンテキストエラー
10605 ・非タスクコンテキストからの呼出し【NGKI3379】
10606 ・CPUロック状態からの呼出し【NGKI3380】
10607 ・ディスパッチ保留状態からの呼出し(prcv_mbfを除く)
10608 【NGKI3381】
10609 E_NOSPT 未サポート機能
10610 ・制約タスクからの呼出し(prcv_mbfを除く)【NGKI3382】
10611 E_ID 不正ID番号
10612 ・mbfidが有効範囲外【NGKI3383】
10613 E_PAR パラメータエラー
10614 ・tmoutが無効(trcv_mbfの場合)【NGKI3384】
10615 E_NOEXS オブジェクト未登録
10616 ・対象メッセージバッファが未登録〔D〕【NGKI3385】
10617 E_OACV オブジェクトアクセス違反
10618 ・対象メッセージバッファに対する通常操作2が許可されてい
10619 ない〔P〕【NGKI3386】
10620 E_MACV メモリアクセス違反
10621 ・msgを先頭番地とし,対象メッセージバッファの最大メッセー
10622 ジサイズ分のメモリ領域への書込みアクセスが許可されて
10623 いない〔P〕【NGKI3387】
10624 E_TMOUT ポーリング失敗またはタイムアウト(rcv_mbfを除く)【NGKI3388】
10625 E_RLWAI 待ち禁止状態または待ち状態の強制解除(prcv_mbfを除く)
10626 【NGKI3389】
10627 E_DLT 待ちオブジェクトの削除または再初期化(prcv_mbfを除く)
10628 【NGKI3390】
10629
10630 【機能】
10631
10632 mbfidで指定したメッセージバッファ(対象メッセージバッファ)からメッセー
10633 ジを受信する.メッセージの受信に成功した場合,受信したメッセージはmsgを
10634 先頭番地とするメモリ領域に格納され,そのサイズはサービスコールの返値と
10635 して返される【NGKI3391】.具体的な振舞いは以下の通り.
10636
10637 対象メッセージバッファのメッセージバッファ管理領域にメッセージが格納さ
10638 れている場合には,メッセージバッファ管理領域の先頭に格納されたメッセー
10639 ジを受信する【NGKI3392】.また,送信待ち行列にタスクが存在し,メッセー
10640 ジバッファ管理領域に送信待ち行列の先頭のタスクの送信メッセージを格納す
10641 るスペースがある場合には,送信メッセージがFIFO順でデータキュー管理領域
10642 に格納され,そのタスクは待ち解除される【NGKI3393】.待ち解除されたタス
10643 クには,待ち状態となったサービスコールからE_OKが返る【NGKI3394】.この
10644 処理を,送信待ち行列にタスクが存在しなくなるか,メッセージバッファ管理
10645 領域に送信待ち行列の先頭のタスクの送信メッセージを格納するスペースがな
10646 くなるまで繰り返す【NGKI3395】.
10647
10648 対象メッセージバッファのメッセージバッファ管理領域にメッセージが格納さ
10649 れておらず,送信待ち行列にタスクが存在する場合には,送信待ち行列の先頭
10650 のタスクの送信メッセージを受信する【NGKI3396】.送信待ち行列の先頭のタ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
214
10651 スクは,待ち解除される【NGKI3397】.待ち解除されたタスクには,待ち状態
10652 となったサービスコールからE_OKが返る【NGKI3398】.
10653
10654 対象メッセージバッファのメッセージバッファ管理領域にメッセージが格納さ
10655 れておらず,送信待ち行列にタスクが存在しない場合には,自タスクはメッセー
10656 ジバッファからの受信待ち状態となり,対象メッセージバッファの受信待ち行
10657 列につながれる【NGKI3399】.
10658
10659 【使用上の注意】
10660
10661 メッセージバッファ管理領域に格納されたメッセージを受信した結果,送信待
10662 ち行列につながれていたタスクが複数待ち解除される場合がある.この時,サー
10663 ビスコールの処理時間およびカーネル内での割込み禁止時間が,待ち解除され
10664 るタスクの数に比例して長くなる.特に,多くのタスクが待ち解除される場合,
10665 カーネル内での割込み禁止時間が長くなるため,注意が必要である.
10666 ----------------------------------------------------------------------
10667 ini_mbf メッセージバッファの再初期化〔T〕【NGKI3400】
10668
10669 【C言語API】
10670 ER ercd = ini_mbf(ID mbfid)
10671
10672 【パラメータ】
10673 ID mbfid 対象メッセージバッファのID番号
10674
10675 【リターンパラメータ】
10676 ER ercd 正常終了(E_OK)またはエラーコード
10677
10678 【エラーコード】
10679 E_CTX コンテキストエラー
10680 ・非タスクコンテキストからの呼出し【NGKI3401】
10681 ・CPUロック状態からの呼出し【NGKI3402】
10682 E_ID 不正ID番号
10683 ・mbfidが有効範囲外【NGKI3403】
10684 E_NOEXS オブジェクト未登録
10685 ・対象メッセージバッファが未登録〔D〕【NGKI3404】
10686 E_OACV オブジェクトアクセス違反
10687 ・対象メッセージバッファに対する管理操作が許可されてい
10688 ない〔P〕【NGKI3405】
10689
10690 【機能】
10691
10692 mbfidで指定したメッセージバッファ(対象メッセージバッファ)を再初期化す
10693 る.具体的な振舞いは以下の通り.
10694
10695 対象メッセージバッファのメッセージバッファ管理領域は,格納されているメッ
10696 セージがない状態に初期化される【NGKI3406】.また,対象メッセージバッファ
10697 の送信待ち行列と受信待ち行列につながれたタスクは,それぞれの待ち行列の
10698 先頭のタスクから順に待ち解除される【NGKI3407】.待ち解除されたタスクに
10699 は,待ち状態となったサービスコールからE_DLTエラーが返る【NGKI3408】.
10700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
215
10701 【補足説明】
10702
10703 送信待ち行列と受信待ち行列の両方にタスクがつながれていることはないため,
10704 別の待ち行列で待っていたタスクの間の待ち解除の順序は,規定する必要がな
10705 い.
10706
10707 【使用上の注意】
10708
10709 ini_mbfにより複数のタスクが待ち解除される場合,サービスコールの処理時間
10710 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
10711 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
10712 み禁止時間が長くなるため,注意が必要である.
10713
10714 メッセージバッファを再初期化した場合に,アプリケーションとの整合性を保
10715 つのは,アプリケーションの責任である.
10716
10717 【μITRON4.0仕様との関係】
10718
10719 μITRON4.0仕様に定義されていないサービスコールである.
10720 ----------------------------------------------------------------------
10721 ref_mbf メッセージバッファの状態参照〔T〕【NGKI3409】
10722
10723 【C言語API】
10724 ER ercd = ref_mbf(ID mbfid, T_RMBF *pk_rmbf)
10725
10726 【パラメータ】
10727 ID mbfid 対象メッセージバッファのID番号
10728 T_RMBF * pk_rmbf メッセージバッファの現在状態を入れるパケッ
10729 トへのポインタ
10730
10731 【リターンパラメータ】
10732 ER ercd 正常終了(E_OK)またはエラーコード
10733
10734 *メッセージバッファの現在状態(パケットの内容)
10735 ID stskid メッセージバッファの送信待ち行列の先頭のタ
10736 スクのID番号
10737 ID rtskid メッセージバッファの受信待ち行列の先頭のタ
10738 スクのID番号
10739 uint_t smbfcnt メッセージバッファ管理領域に格納されている
10740 メッセージの数
10741 SIZE fmbfsz メッセージバッファ管理領域中の空き領域のサ
10742 イズ
10743
10744 【エラーコード】
10745 E_CTX コンテキストエラー
10746 ・非タスクコンテキストからの呼出し【NGKI3410】
10747 ・CPUロック状態からの呼出し【NGKI3411】
10748 E_ID 不正ID番号
10749 ・mbfidが有効範囲外【NGKI3412】
10750 E_NOEXS オブジェクト未登録
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
216
10751 ・対象メッセージバッファが未登録〔D〕【NGKI3413】
10752 E_OACV オブジェクトアクセス違反
10753 ・対象メッセージバッファに対する参照操作が許可されてい
10754 ない〔P〕【NGKI3414】
10755 E_MACV メモリアクセス違反
10756 ・pk_rmbfが指すメモリ領域への書込みアクセスが許可されて
10757 いない〔P〕【NGKI3415】
10758
10759 【機能】
10760
10761 mbfidで指定したメッセージバッファ(対象メッセージバッファ)の現在状態を
10762 参照する.参照した現在状態は,pk_rmbfで指定したパケットに返される
10763 【NGKI3416】.
10764
10765 対象メッセージバッファの送信待ち行列にタスクが存在しない場合,stskidには
10766 TSK_NONE(=0)が返る【NGKI3417】.また,受信待ち行列にタスクが存在しな
10767 い場合,rtskidにはTSK_NONE(=0)が返る【NGKI3418】.
10768
10769 【使用上の注意】
10770
10771 ref_mbfはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
10772 ない.これは,ref_mbfを呼び出し,対象メッセージバッファの現在状態を参照
10773 した直後に割込みが発生した場合,ref_mbfから戻ってきた時には対象メッセー
10774 ジバッファの状態が変化している可能性があるためである.
10775 ----------------------------------------------------------------------
10776
10777 4.4.8 スピンロック
10778
10779 スピンロックは,マルチプロセッサ対応カーネルにおいて,割込みのマスクと
10780 プロセッサ間ロックの取得により,排他制御を行うための同期・通信オブジェ
10781 クトである.スピンロックは,スピンロックIDと呼ぶID番号によって識別する
10782 【NGKI2117】.
10783
10784 プロセッサ間ロックを取得している間は,CPUロック状態にすることですべての
10785 カーネル管理の割込みがマスクされ,ディスパッチが保留される【NGKI2118】.
10786 ロックが他のプロセッサに取得されている場合には,ロックが取得できるまで
10787 ループによって待つ【NGKI2119】.ロックの取得を待つ間は,CPUロック解除状
10788 態であり,割込みはマスクされない【NGKI2120】.プロセッサ間ロックを取得
10789 し,CPUロック状態に遷移することを,スピンロックを取得するという.また,
10790 プロセッサ間ロックを返却し,CPUロック状態を解除することを,スピンロック
10791 を返却するという.
10792
10793 タスクが取得したスピンロックを返却せずに終了した場合や,タスク例外処理
10794 ルーチン,割込みハンドラ,割込みサービスルーチン,タイムイベントハンド
10795 ラが取得したスピンロックを返却せずにリターンした場合には,カーネルによっ
10796 てスピンロックが返却される【NGKI2121】.また,スピンロックを取得してい
10797 ない状態で発生したCPU例外によって呼び出されたCPU例外ハンドラが,取得し
10798 たスピンロックを返却せずにリターンした場合には,カーネルによってスピン
10799 ロックが返却される【NGKI2122】.一方,拡張サービスコールからのリターン
10800 では,スピンロックは返却されない【NGKI2123】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
217
10801
10802 各スピンロックが持つ情報は次の通り【NGKI2124】.
10803
10804 ・スピンロック属性
10805 ・ロック状態(取得されている状態と取得されていない状態)
10806 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
10807 ・属する保護ドメイン(保護機能対応カーネルの場合)
10808 ・属するクラス
10809
10810 スピンロック属性に指定できる属性はない【NGKI2125】.そのためスピンロッ
10811 ク属性には,TA_NULLを指定しなければならない【NGKI2126】.
10812
10813 スピンロック機能に関連するカーネル構成マクロは次の通り.
10814
10815 TNUM_SPNID 登録できるスピンロックの数(動的生成対応でないカー
10816 ネルでは,静的APIによって登録されたスピンロックの数
10817 に一致)【NGKI2127】
10818
10819 【補足説明】
10820
10821 CPUロック状態では,スピンロックを取得するサービスコールを呼び出すことが
10822 できないため,スピンロックを取得しているプロセッサが,さらにスピンロッ
10823 クを取得することはできない.そのため,1つの処理単位が,複数のスピンロッ
10824 クを取得した状態になることはできない.
10825
10826 スピンロックを取得した状態でCPU例外が発生した場合,起動されるCPU例外ハ
10827 ンドラはカーネル管理外のCPU例外ハンドラであり(xsns_dpn,xsns_xpnとも
10828 trueを返す),CPU例外ハンドラ中でiunl_spnを呼び出してスピンロックを返却
10829 しようとした場合の動作は保証されない.保証されないにも関わらずiunl_spn
10830 を呼び出した場合には,CPU例外ハンドラからのリターン時に元の状態に戻らな
10831 い.これは,CPUロック状態の扱いと一貫していないため,注意が必要である.
10832
10833 【TOPPERS/ASPカーネルにおける規定】
10834
10835 ASPカーネルでは,スピンロック機能をサポートしない【ASPS0163】.
10836
10837 【TOPPERS/FMPカーネルにおける規定】
10838
10839 FMPカーネルでは,スピンロック機能をサポートする【FMPS0138】.
10840
10841 【TOPPERS/HRP2カーネルにおける規定】
10842
10843 HRP2カーネルでは,スピンロック機能をサポートしない【HRPS0135】.
10844
10845 【μITRON4.0仕様との関係】
10846
10847 スピンロック機能は,μITRON4.0仕様に定義されていない機能である.
10848 ----------------------------------------------------------------------
10849 CRE_SPN スピンロックの生成〔SM〕【NGKI2128】
10850 acre_spn スピンロックの生成〔TMD〕【NGKI2129】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
218
10851
10852 【静的API】
10853 CRE_SPN(ID spnid, { ATR spnatr })
10854
10855 【C言語API】
10856 ER_ID spnid = acre_spn(const T_CSPN *pk_cspn)
10857
10858 【パラメータ】
10859 ID spnid 生成するスピンロックのID番号(CRE_SPNの場合)
10860 T_CSPN * pk_cspn スピンロックの生成情報を入れたパケットへの
10861 ポインタ(静的APIを除く)
10862
10863 *スピンロックの生成情報(パケットの内容)
10864 ATR spnatr スピンロック属性
10865
10866 【リターンパラメータ】
10867 ER_ID spnid 生成されたスピンロックのID番号(正の値)ま
10868 たはエラーコード
10869
10870 【エラーコード】
10871 E_CTX コンテキストエラー
10872 ・非タスクコンテキストからの呼出し〔s〕【NGKI2130】
10873 ・CPUロック状態からの呼出し〔s〕【NGKI2131】
10874 E_RSATR 予約属性
10875 ・spnatrが無効【NGKI2132】
10876 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI2133】
10877 ・属するクラスの指定が有効範囲外〔s〕【NGKI2134】
10878 ・クラスの囲みの中に記述されていない〔S〕【NGKI2135】
10879 E_OACV オブジェクトアクセス違反
10880 ・システム状態に対する管理操作が許可されていない〔sP〕
10881 【NGKI2136】
10882 E_MACV メモリアクセス違反
10883 ・pk_cspnが指すメモリ領域への読出しアクセスが許可されて
10884 いない〔sP〕【NGKI2137】
10885 E_NOID ID番号不足
10886 ・割り付けられるスピンロックIDがない〔sD〕【NGKI2138】
10887 E_NORES 資源不足
10888 ・条件については機能の項を参照
10889 E_OBJ オブジェクト状態エラー
10890 ・spnidで指定したスピンロックが登録済み(CRE_SPNの場合)
10891 【NGKI2139】
10892
10893 【機能】
10894
10895 各パラメータで指定したスピンロック生成情報に従って,スピンロックを生成
10896 する.生成されたスピンロックのロック状態は,取得されていない状態に初期
10897 化される【NGKI2140】.
10898
10899 静的APIにおいては,spnidはオブジェクト識別名,spnatrは整数定数式パラメー
10900 タである【NGKI2141】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
219
10901
10902 スピンロックをハードウェアによって実現している場合には,ターゲット定義
10903 で,生成できるスピンロックの数に上限がある【NGKI2142】.この上限を超え
10904 てスピンロックを生成しようとした場合には,E_NORESエラーとなる
10905 【NGKI2143】.
10906
10907 【補足説明】
10908
10909 スピンロックを動的に生成する場合に,生成できるスピンロックの数の上限は
10910 AID_SPNによってチェックされるため,acre_spnでE_NORESエラーが返ることは
10911 ない.
10912
10913 【TOPPERS/FMPカーネルにおける規定】
10914
10915 FMPカーネルでは,CRE_SPNのみをサポートする【FMPS0139】.
10916 ----------------------------------------------------------------------
10917 AID_SPN 割付け可能なスピンロックIDの数の指定〔SMD〕【NGKI2144】
10918
10919 【静的API】
10920 AID_SPN(uint_t nospn)
10921
10922 【パラメータ】
10923 uint_t nospn 割付け可能なスピンロックIDの数
10924
10925 【エラーコード】
10926 E_RSATR 予約属性
10927 ・クラスの囲みの中に記述されていない【NGKI2145】
10928 E_PAR パラメータエラー
10929 ・nospnが負の値【NGKI3283】
10930
10931 【機能】
10932
10933 nospnで指定した数のスピンロックIDを,スピンロックを生成するサービスコー
10934 ルによって割付け可能なスピンロックIDとして確保する【NGKI2146】.
10935
10936 nospnは整数定数式パラメータである【NGKI2147】.
10937 ----------------------------------------------------------------------
10938 SAC_SPN スピンロックのアクセス許可ベクタの設定〔SPM〕【NGKI2148】
10939 sac_spn スピンロックのアクセス許可ベクタの設定〔TPMD〕【NGKI2149】
10940
10941 【静的API】
10942 SAC_SPN(ID spnid, { ACPTN acptn1, ACPTN acptn2,
10943 ACPTN acptn3, ACPTN acptn4 })
10944
10945 【C言語API】
10946 ER ercd = s ac_spn(ID spnid, const ACVCT *p_acvct)
10947
10948 【パラメータ】
10949 ID spnid 対象スピンロックのID番号
10950 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
220
10951 インタ(静的APIを除く)
10952
10953 *アクセス許可ベクタ(パケットの内容)
10954 ACPTN acptn1 通常操作1のアクセス許可パターン
10955 ACPTN acptn2 通常操作2のアクセス許可パターン
10956 ACPTN acptn3 管理操作のアクセス許可パターン
10957 ACPTN acptn4 参照操作のアクセス許可パターン
10958
10959 【リターンパラメータ】
10960 ER ercd 正常終了(E_OK)またはエラーコード
10961
10962 【エラーコード】
10963 E_CTX コンテキストエラー
10964 ・非タスクコンテキストからの呼出し〔s〕【NGKI2150】
10965 ・CPUロック状態からの呼出し〔s〕【NGKI2151】
10966 E_ID 不正ID番号
10967 ・spnidが有効範囲外〔s〕【NGKI2152】
10968 E_RSATR 予約属性
10969 ・対象スピンロックが属する保護ドメインの囲みの中に記述
10970 されていない〔S〕【NGKI2153】
10971 ・対象スピンロックが属するクラスの囲みの中に記述されて
10972 いない〔S〕【NGKI2154】
10973 E_NOEXS オブジェクト未登録
10974 ・対象スピンロックが未登録【NGKI2155】
10975 E_OACV オブジェクトアクセス違反
10976 ・対象スピンロックに対する管理操作が許可されていない〔s〕
10977 【NGKI2156】
10978 E_MACV メモリアクセス違反
10979 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
10980 いない〔s〕【NGKI2157】
10981 E_OBJ オブジェクト状態エラー
10982 ・対象スピンロックは静的APIで生成された〔s〕【NGKI2158】
10983 ・対象スピンロックに対してアクセス許可ベクタが設定済み〔S〕
10984 【NGKI2159】
10985
10986 【機能】
10987
10988 spnidで指定したスピンロック(対象スピンロック)のアクセス許可ベクタ(4
10989 つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する
10990 【NGKI2160】.
10991
10992 静的APIにおいては,spnidはオブジェクト識別名,acptn1~acptn4は整数定数
10993 式パラメータである【NGKI2161】.
10994
10995 【TOPPERS/FMPカーネルにおける規定】
10996
10997 FMPカーネルでは,SAC_SPN,sac_spnをサポートしない【FMPS0140】.
10998 ----------------------------------------------------------------------
10999 del_spn スピンロックの削除〔TMD〕【NGKI2162】
11000
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
221
11001 【C言語API】
11002 ER ercd = del_spn(ID spnid)
11003
11004 【パラメータ】
11005 ID spnid 対象スピンロックのID番号
11006
11007 【リターンパラメータ】
11008 ER ercd 正常終了(E_OK)またはエラーコード
11009
11010 【エラーコード】
11011 E_CTX コンテキストエラー
11012 ・非タスクコンテキストからの呼出し【NGKI2163】
11013 ・CPUロック状態からの呼出し【NGKI2164】
11014 E_ID 不正ID番号
11015 ・spnidが有効範囲外【NGKI2165】
11016 E_NOEXS オブジェクト未登録
11017 ・対象スピンロックが未登録【NGKI2166】
11018 E_OACV オブジェクトアクセス違反
11019 ・対象スピンロックに対する管理操作が許可されていない〔P〕
11020 【NGKI2167】
11021 E_OBJ オブジェクト状態エラー
11022 ・対象スピンロックは静的APIで生成された【NGKI2168】
11023
11024 【機能】
11025
11026 spnidで指定したスピンロック(対象スピンロック)を削除する.具体的な振舞
11027 いは以下の通り.
11028
11029 対象スピンロックの登録が解除され,そのスピンロックIDが未使用の状態に戻
11030 される【NGKI2169】.
11031
11032 【TOPPERS/FMPカーネルにおける規定】
11033
11034 FMPカーネルでは,del_spnをサポートしない【FMPS0141】.
11035
11036 【未決定事項】
11037
11038 対象スピンロックが取得されている状態の場合の振舞いは,今後の課題である.
11039 ----------------------------------------------------------------------
11040 loc_spn スピンロックの取得〔TM〕【NGKI2170】
11041 iloc_spn スピンロックの取得〔IM〕【NGKI2171】
11042
11043 【C言語API】
11044 ER ercd = loc_spn(ID spnid)
11045 ER ercd = iloc_spn(ID spnid)
11046
11047 【パラメータ】
11048 ID spnid 対象スピンロックのID番号
11049
11050 【リターンパラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
222
11051 ER ercd 正常終了(E_OK)またはエラーコード
11052
11053 【エラーコード】
11054 E_CTX コンテキストエラー
11055 ・非タスクコンテキストからの呼出し(loc_spnの場合)【NGKI2172】
11056 ・タスクコンテキストからの呼出し(iloc_spnの場合)【NGKI2173】
11057 ・CPUロック状態からの呼出し【NGKI2174】
11058 E_ID 不正ID番号
11059 ・spnidが有効範囲外【NGKI2175】
11060 E_NOEXS オブジェクト未登録
11061 ・対象スピンロックが未登録〔D〕【NGKI2176】
11062 E_OACV オブジェクトアクセス違反
11063 ・対象スピンロックに対する通常操作1が許可されていない
11064 (loc_spnの場合)〔P〕【NGKI2177】
11065
11066 【機能】
11067
11068 spnidで指定したスピンロック(対象スピンロック)を取得する.具体的な振舞
11069 いは以下の通り.
11070
11071 対象スピンロックが取得されていない状態である場合には,プロセッサ間ロッ
11072 クの取得を試みる【NGKI2178】.ロックが他のプロセッサによって取得されて
11073 いる状態である場合や,他のプロセッサがロックの取得に成功した場合には,
11074 ロックが返却されるまでループによって待ち,返却されたらロックの取得を試
11075 みる【NGKI2179】.これを,ロックの取得に成功するまで繰り返す
11076 【NGKI2180】.
11077
11078 ロックの取得に成功した場合には,スピンロックは取得されている状態になる
11079 【NGKI2181】.また,CPUロックフラグをセットしてCPUロック状態へ遷移し,
11080 サービスコールからリターンする【NGKI2182】.
11081
11082 なお,複数のプロセッサがロックの取得を待っている時に,どのプロセッサが
11083 最初にロックを取得できるかは,現時点ではターゲット定義とする【NGKI2183】.
11084
11085 【補足説明】
11086
11087 対象スピンロックが,loc_spn/iloc_spnを呼び出したプロセッサによって取得
11088 されている状態である場合には,スピンロックの取得によりCPUロック状態になっ
11089 ているため,loc_spn/iloc_spnはE_CTXエラーとなる.
11090
11091 プロセッサがロックを取得できる順序を,現時点ではターゲット定義としたが,
11092 リアルタイム性保証のためには,(ロックの取得待ちの間に割込みが発生しな
11093 い限りは)loc_spn/iloc_spnを呼び出した順序でロックを取得できるとするの
11094 が望ましい.ただし,ターゲットハードウェアの制限で,そのような実装がで
11095 きるとは限らないため,現時点ではターゲット定義としている.
11096 ----------------------------------------------------------------------
11097 try_spn スピンロックの取得(ポーリング)〔TM〕【NGKI2184】
11098 itry_spn スピンロックの取得(ポーリング)〔IM〕【NGKI2185】
11099
11100 【C言語API】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
223
11101 ER ercd = try_spn(ID spnid)
11102 ER ercd = itry_spn(ID spnid)
11103
11104 【パラメータ】
11105 ID spnid 対象スピンロックのID番号
11106
11107 【リターンパラメータ】
11108 ER e rcd 正常終了(E_OK)またはエラーコード
11109
11110 【エラーコード】
11111 E_CTX コンテキストエラー
11112 ・非タスクコンテキストからの呼出し(try_spnの場合)【NGKI2186】
11113 ・タスクコンテキストからの呼出し(itry_spnの場合)【NGKI2187】
11114 ・CPUロック状態からの呼出し【NGKI2188】
11115 E_ID 不正ID番号
11116 ・spnidが有効範囲外【NGKI2189】
11117 E_NOEXS オブジェクト未登録
11118 ・対象スピンロックが未登録〔D〕【NGKI2190】
11119 E_OACV オブジェクトアクセス違反
11120 ・対象スピンロックに対する通常操作1が許可されていない
11121 (try_spnの場合)〔P〕【NGKI2191】
11122 E_OBJ オブジェクト状態エラー
11123 ・条件については機能の項を参照
11124
11125 【機能】
11126
11127 spnidで指定したスピンロック(対象スピンロック)の取得を試みる.具体的な
11128 振舞いは以下の通り.
11129
11130 対象スピンロックが取得されていない状態である場合には,プロセッサ間ロッ
11131 クの取得を試みる【NGKI2192】.ロックの取得に成功した場合には,スピンロッ
11132 クは取得されている状態になる【NGKI2193】.また,CPUロックフラグをセット
11133 してCPUロック状態へ遷移し,サービスコールからリターンする【NGKI2194】.
11134
11135 対象スピンロックが他のプロセッサによって取得されている状態である場合や,
11136 ロックの取得に失敗した場合(他のプロセッサがロックの取得に成功した場合)
11137 には,E_OBJエラーとする【NGKI2195】.
11138
11139 【使用上の注意】
11140
11141 try_spn/itry_spnを,ロックの取得に成功するまで繰り返し呼び出すことによ
11142 りスピンロックを取得する方法は,loc_spn/iloc_spnによりスピンロックを取
11143 得する方法と,プロセッサがロックを取得できる順序が異なる可能性ある.
11144 ----------------------------------------------------------------------
11145 unl_spn スピンロックの返却〔TM〕【NGKI2196】
11146 iunl_spn スピンロックの返却〔IM〕【NGKI2197】
11147
11148 【C言語API】
11149 ER ercd = unl_spn(ID spnid)
11150 ER ercd = iunl_spn(ID spnid)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
224
11151
11152 【パラメータ】
11153 ID spnid 対象スピンロックのID番号
11154
11155 【リターンパラメータ】
11156 ER ercd 正常終了(E_OK)またはエラーコード
11157
11158 【エラーコード】
11159 E_CTX コンテキストエラー
11160 ・非タスクコンテキストからの呼出し(unl_spnの場合)【NGKI2198】
11161 ・タスクコンテキストからの呼出し(iunl_spnの場合)【NGKI2199】
11162 E_ID 不正ID番号
11163 ・spnidが有効範囲外【NGKI2200】
11164 E_NOEXS オブジェクト未登録
11165 ・対象スピンロックが未登録〔D〕【NGKI2201】
11166 E_OACV オブジェクトアクセス違反
11167 ・対象スピンロックに対する通常操作1が許可されていない
11168 (unl_spnの場合)〔P〕【NGKI2202】
11169 E_ILUSE サービスコール不正使用
11170 ・条件については機能の項を参照
11171
11172 【機能】
11173
11174 spnidで指定したスピンロック(対象スピンロック)を返却する.具体的な振舞
11175 いは以下の通り.
11176
11177 対象スピンロックが,unl_spn/iunl_spnを呼び出したプロセッサによって取得
11178 されている状態である場合には,ロックを返却し,スピンロックを取得されて
11179 いない状態とする【NGKI2203】.また,CPUロックフラグをクリアし,CPUロッ
11180 ク解除状態へ遷移する【NGKI2204】.
11181
11182 対象スピンロックが,取得されていない状態である場合や,他のプロセッサに
11183 よって取得されている状態である場合には,E_ILUSEエラーとなる【NGKI2205】.
11184 ----------------------------------------------------------------------
11185 ref_spn スピンロックの状態参照〔TM〕【NGKI2206】
11186
11187 【C言語API】
11188 ER ercd = ref_spn(ID spnid, T_RSPN *pk _rspn)
11189
11190 【パラメータ】
11191 ID spnid 対象スピンロックのID番号
11192 T_RSPN * pk_rspn スピンロックの現在状態を入れるパケットへの
11193 ポインタ
11194
11195 【リターンパラメータ】
11196 ER ercd 正常終了(E_OK)またはエラーコード
11197
11198 *スピンロックの現在状態(パケットの内容)
11199 STAT spnstat ロック状態
11200
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
225
11201 【エラーコード】
11202 E_CTX コンテキストエラー
11203 ・非タスクコンテキストからの呼出し【NGKI2207】
11204 ・CPUロック状態からの呼出し【NGKI2208】
11205 E_ID 不正ID番号
11206 ・spnidが有効範囲外【NGKI2209】
11207 E_NOEXS オブジェクト未登録
11208 ・対象スピンロックが未登録〔D〕【NGKI2210】
11209 E_OACV オブジェクトアクセス違反
11210 ・対象スピンロックに対する参照操作が許可されていない〔P〕
11211 【NGKI2211】
11212 E_MACV メモリアクセス違反
11213 ・pk_rspnが指すメモリ領域への書込みアクセスが許可されて
11214 いない)〔P〕【NGKI2212】
11215
11216 【機能】
11217
11218 spnidで指定したスピンロック(対象スピンロック)の現在状態を参照する.参
11219 照した現在状態は,pk_rspnで指定したパケットに返される【NGKI2213】.
11220
11221 spnstatには,対象スピンロックの現在のロック状態を表す次のいずれかの値が
11222 返される【NGKI2214】.
11223
11224 TSPN_UNL 0x01U 取得されていない状態
11225 TSPN_LOC 0x02U 取得されている状態
11226
11227 【使用上の注意】
11228
11229 ref_spnはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
11230 ない.これは,ref_spnを呼び出し,対象スピンロックの現在状態を参照した直
11231 後に割込みが発生した場合,ref_spnから戻ってきた時には対象スピンロックの
11232 状態が変化している可能性があるためである.
11233 ----------------------------------------------------------------------
11234
11235 4.5 メモリプール管理機能
11236
11237 【TOPPERS/SSPカーネルにおける規定】
11238
11239 SSPカーネルでは,メモリプール管理機能をサポートしない【SSPS0128】.
11240
11241 【μITRON4.0仕様との関係】
11242
11243 この仕様では,可変長メモリプール機能はサポートしないこととした.
11244
11245 【仕様決定の理由】
11246
11247 可変長メモリプール機能をサポートしないこととしたのは,メモリ割付けの処
11248 理時間とフラグメンテーションの発生を考えると,最適なメモリ管理アルゴリ
11249 ズムはアプリケーション依存となるため,カーネル内で実現するより,ライブ
11250 ラリとして実現する方が適切と考えたためである.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
226
11251
11252 4.5.1 固定長メモリプール
11253
11254 固定長メモリプールは,生成時に決めたサイズのメモリブロック(固定長メモ
11255 リブロック)を動的に獲得・返却するための同期・通信オブジェクトである.
11256 固定長メモリプールは,固定長メモリプールIDと呼ぶID番号で識別する
11257 【NGKI2215】.
11258
11259 各固定長メモリプールが持つ情報は次の通り【NGKI2216】.
11260
11261 ・固定長メモリプール属性
11262 ・待ち行列(固定長メモリブロックの獲得待ち状態のタスクのキュー)
11263 ・固定長メモリプール領域
11264 ・固定長メモリプール管理領域
11265 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
11266 ・属する保護ドメイン(保護機能対応カーネルの場合)
11267 ・属するクラス(マルチプロセッサ対応カーネルの場合)
11268
11269 待ち行列は,固定長メモリブロックが獲得できるまで待っている状態(固定長
11270 メモリブロックの獲得待ち状態)のタスクが,固定長メモリブロックを獲得で
11271 きる順序でつながれているキューである.
11272
11273 固定長メモリプール領域は,その中から固定長メモリブロックを割り付けるた
11274 めのメモリ領域である.
11275
11276 固定長メモリプール管理領域は,固定長メモリプール領域中の割当て済みの固
11277 定長メモリブロックと未割当てのメモリ領域に関する情報を格納しておくため
11278 のメモリ領域である.
11279
11280 保護機能対応カーネルにおいて,固定長メモリプール管理領域は,カーネルの
11281 用いるオブジェクト管理領域として扱われる【NGKI2217】.
11282
11283 固定長メモリプール属性には,次の属性を指定することができる【NGKI2218】.
11284
11285 TA_TPRI 0x01U 待ち行列をタスクの優先度順にする
11286
11287 TA_TPRIを指定しない場合,待ち行列はFIFO順になる【NGKI2219】.
11288
11289 固定長メモリプール機能に関連するカーネル構成マクロは次の通り.
11290
11291 TNUM_MPFID 登録できる固定長メモリプールの数(動的生成対応でない
11292 カーネルでは,静的APIによって登録された固定長メモリ
11293 プールの数に一致)【NGKI2220】
11294
11295 【μITRON4.0仕様との関係】
11296
11297 固定長メモリプール領域として確保すべき領域のサイズを返すカーネル構成マ
11298 クロ(TSZ_MPF)は廃止した.これは,固定長メモリプール領域をアプリケーショ
11299 ンで確保する方法を定めた結果,そのサイズは(blkcnt * ROUND_MPF_T(blksz))
11300 で求めることができるようになったためである.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
227
11301
11302 TNUM_MPFIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
11303 ----------------------------------------------------------------------
11304 CRE_MPF 固定長メモリプールの生成〔S〕【NGKI2221】
11305 acre_mpf 固定長メモリプールの生成〔TD〕【NGKI2222】
11306
11307 【静的API】
11308 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
11309 MPF_T *mpf, void * mpfmb })
11310
11311 【C言語API】
11312 ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf)
11313
11314 【パラメータ】
11315 ID mpfid 生成する固定長メモリプールのID番号(CRE_MPF
11316 の場合)
11317 T_CMPF * pk_cmpf 固定長メモリプールの生成情報を入れたパケッ
11318 トへのポインタ(静的APIを除く)
11319
11320 *固定長メモリプールの生成情報(パケットの内容)
11321 ATR mpfatr 固定長メモリプール属性
11322 uint_t blkcnt 獲得できる固定長メモリブロックの数
11323 uint_t blksz 固定長メモリブロックのサイズ(バイト数)
11324 MPF_T * mpf 固定長メモリプール領域の先頭番地
11325 void * mpfmb 固定長メモリプール管理領域の先頭番地
11326
11327 【リターンパラメータ】
11328 ER_ID mpfid 生成された固定長メモリプールのID番号(正の
11329 値)またはエラーコード
11330
11331 【エラーコード】
11332 E_CTX コンテキストエラー
11333 ・非タスクコンテキストからの呼出し〔s〕【NGKI2223】
11334 ・CPUロック状態からの呼出し〔s〕【NGKI2224】
11335 E_RSATR 予約属性
11336 ・mpfatrが無効【NGKI2225】
11337 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI2226】
11338 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2227】
11339 ・クラスの囲みの中に記述されていない〔SM〕【NGKI2228】
11340 E_NOSPT 未サポート機能
11341 ・条件については各カーネルにおける規定の項を参照
11342 E_PAR パラメータエラー
11343 ・blkcntが0以下【NGKI2229】
11344 ・blkszが0以下【NGKI2230】
11345 ・その他の条件については機能の項を参照
11346 E_OACV オブジェクトアクセス違反
11347 ・システム状態に対する管理操作が許可されていない〔sP〕
11348 【NGKI2231】
11349 E_MACV メモリアクセス違反
11350 ・pk_cmpfが指すメモリ領域への読出しアクセスが許可されて
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
228
11351 いない〔sP〕【NGKI2232】
11352 E_NOID ID番号不足
11353 ・割り付けられる固定長メモリプールIDがない〔sD〕【NGKI2233】
11354 E_NOMEM メモリ不足
11355 ・固定長メモリプール領域が確保できない【NGKI2234】
11356 ・固定長メモリプール管理領域が確保できない【NGKI2235】
11357 E_OBJ オブジェクト状態エラー
11358 ・mpfidで指定した固定長メモリプールが登録済み(CRE_MPF
11359 の場合)【NGKI2236】
11360 ・その他の条件については機能の項を参照
11361
11362 【機能】
11363
11364 各パラメータで指定した固定長メモリプール生成情報に従って,固定長メモリ
11365 プールを生成する.mpf,blkcnt,blkszから固定長メモリプール領域が,
11366 mpfmbとblkcntから固定長メモリプール管理領域がそれぞれ設定され,メモリプー
11367 ル領域全体が未割当ての状態に初期化される【NGKI2237】.また,待ち行列は
11368 空の状態に初期化される【NGKI2238】.
11369
11370 静的APIにおいては,mpfidはオブジェクト識別名,mpfatr,blkcnt,blkszは整
11371 数定数式パラメータ,mpfとmpfmbは一般定数式パラメータである【NGKI2239】.
11372 コンフィギュレータは,静的APIのメモリ不足(E_NOMEM)エラーを検出するこ
11373 とができない【NGKI2240】.
11374
11375 mpfをNULLとした場合,blkcntとblkszから決まるサイズの固定長メモリプール
11376 領域が,コンフィギュレータまたはカーネルにより確保される【NGKI2241】.
11377
11378 保護機能対応カーネルでは,コンフィギュレータまたはカーネルにより確保さ
11379 れる固定長メモリプール領域は,固定長メモリプールと同じ保護ドメインに属
11380 し,固定長メモリプールと同じアクセス許可ベクタを持ったメモリオブジェク
11381 ト中に確保される【NGKI2242】.
11382
11383 mpfmbをNULLとした場合,blkcntから決まるサイズの固定長メモリプール管理領
11384 域が,コンフィギュレータまたはカーネルにより確保される【NGKI2243】.
11385
11386 〔mpfにNULL以外を指定した場合〕
11387
11388 mpfにNULL以外を指定した場合,mpfを先頭番地とする固定長メモリプール領域
11389 は,アプリケーションで確保しておく必要がある【NGKI2244】.固定長メモリ
11390 プール領域をアプリケーションで確保するために,次のデータ型とマクロを用
11391 意している【NGKI2245】.
11392
11393 MPF_T 固定長メモリプール領域を確保するためのデータ型
11394
11395 COUNT_MPF_T(blksz) 固定長メモリブロックのサイズがblkszの固定長メモ
11396 リプール領域を確保するために,固定長メモリブロッ
11397 ク1つあたりに必要なMPF_T型の配列の要素数
11398 ROUND_MPF_T(blksz) 要素数COUNT_MPF_T(blksz)のMPF_T型の配列のサイズ
11399 (blkszを,MPF_T型のサイズの倍数になるように大き
11400 い方に丸めた値)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
229
11401
11402 これらを用いて固定長メモリプール領域を確保する方法は次の通り【NGKI2246】.
11403
11404 MPF_T <固定長メモリプール領域の変数名>[(blkcnt) * COUNT_MPF_T(blksz)];
11405
11406 この時,mpfには<固定長メモリプール領域の変数名>を指定する【NGKI2247】.
11407
11408 これ以外の方法で固定長メモリプール領域を確保する場合には,上記の配列と
11409 同じサイズのメモリ領域を確保しなければならない【NGKI2248】.また,その
11410 先頭番地がターゲット定義の制約に合致していなければならない.mpfにターゲッ
11411 ト定義の制約に合致しない先頭番地を指定した時には,E_PARエラーとなる
11412 【NGKI2249】.
11413
11414 保護機能対応カーネルでは,アプリケーションで確保する固定長メモリプール
11415 領域は,カーネルに登録されたメモリオブジェクトに含まれていなければなら
11416 ない.指定した固定長メモリプール領域が,カーネルに登録されたメモリオブ
11417 ジェクトに含まれていない場合,E_OBJエラーとなる【NGKI2251】.
11418
11419 〔mpfmbにNULL以外を指定した場合〕
11420
11421 mpfmbにNULL以外を指定した場合,mpfmbを先頭番地とする固定長メモリプール
11422 管理領域は,アプリケーションで確保しておく必要がある【NGKI2252】.固定
11423 長メモリプール管理領域をアプリケーションで確保するために,次のマクロを
11424 用意している【NGKI2253】.
11425
11426 TSZ_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理
11427 することができる固定長メモリプール管理領域のサ
11428 イズ(バイト数)
11429 TCNT_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理
11430 することができる固定長メモリプール管理領域を確
11431 保するために必要なMB_T型の配列の要素数
11432
11433 これらを用いて固定長メモリプール管理領域を確保する方法は次の通り
11434 【NGKI2254】.
11435
11436 MB_T <固定長メモリプール管理領域の変数名>[TCNT_MPFMB(blkcnt)];
11437
11438 この時,mpfmbには<固定長メモリプール管理領域の変数名>を指定する
11439 【NGKI2255】.
11440
11441 この方法に従わず,mpfmbにターゲット定義の制約に合致しない先頭番地を指定
11442 した時には,E_PARエラーとなる【NGKI2256】.また,保護機能対応カーネルに
11443 おいて,mpfmbで指定した固定長メモリプール管理領域がカーネル専用のメモリ
11444 オブジェクトに含まれない場合,E_OBJエラーとなる【NGKI2257】.
11445
11446 【補足説明】
11447
11448 保護機能対応カーネルにおいて,固定長メモリプール領域をアプリケーション
11449 で確保する場合には,固定長メモリプール領域が属する保護ドメインとアクセ
11450 ス権の設定は変更されない.これらを適切に設定することは,アプリケーショ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
230
11451 ンの責任である.
11452
11453 【TOPPERS/ASPカーネルにおける規定】
11454
11455 ASPカーネルでは,CRE_MPFのみをサポートする【ASPS0164】.また,mpfmbには
11456 NULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエラー
11457 となる【ASPS0166】.ただし,動的生成機能拡張パッケージでは,acre_mpfも
11458 サポートする【ASPS0167】.acre_mpfに対しては,mpfmbにNULL以外を指定でき
11459 ないという制限はない【ASPS0168】.
11460
11461 【TOPPERS/FMPカーネルにおける規定】
11462
11463 FMPカーネルでは,CRE_MPFのみをサポートする【FMPS0142】.また,mpfmbには
11464 NULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエラー
11465 となる【FMPS0144】.
11466
11467 【TOPPERS/HRP2カーネルにおける規定】
11468
11469 HRP2カーネルでは,CRE_MPFのみをサポートする【HRPS0136】.また,mpfmbに
11470 はNULLのみを指定することができる.NULL以外を指定した場合には,E_NOSPTエ
11471 ラーとなる【HRPS0138】.
11472
11473 【μITRON4.0仕様との関係】
11474
11475 mpfのデータ型をMPF_T *に変更した.COUNT_MPF_TとROUND_MPF_Tを新設し,固
11476 定長メモリプール領域をアプリケーションで確保する方法を規定した.また,
11477 μITRON4.0/PX仕様にあわせて,固定長メモリプール生成情報に,mpfmbを追加
11478 した.
11479
11480 【μITRON4.0/PX仕様との関係】
11481
11482 TCNT_MPFMBを新設し,固定長メモリプール管理領域をアプリケーションで確保
11483 する方法を規定した.
11484 ----------------------------------------------------------------------
11485 AID_MPF 割付け可能な固定長メモリプールIDの数の指定〔SD〕【NGKI2258】
11486
11487 【静的API】
11488 AID_MPF(uint_t nompf)
11489
11490 【パラメータ】
11491 uint_t nompf 割付け可能な固定長メモリプールIDの数
11492
11493 【エラーコード】
11494 E_RSATR 予約属性
11495 ・クラスの囲みの中に記述されていない〔M〕【NGKI2259】
11496 E_PAR パラメータエラー
11497 ・nompfが負の値【NGKI3284】
11498
11499 【機能】
11500
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
231
11501 nompfで指定した数の固定長メモリプールIDを,固定長メモリプールを生成する
11502 サービスコールによって割付け可能な固定長メモリプールIDとして確保する
11503 【NGKI2260】.
11504
11505 nompfは整数定数式パラメータである【NGKI2261】.
11506 ----------------------------------------------------------------------
11507 SAC_MPF 固定長メモリプールのアクセス許可ベクタの設定〔SP〕【NGKI2262】
11508 sac_mpf 固定長メモリプールのアクセス許可ベクタの設定〔TPD〕【NGKI2263】
11509
11510 【静的API】
11511 SAC_MPF(ID mpfid, { ACPTN acptn1, ACPTN a cptn2,
11512 ACPTN acptn3, ACPTN acptn4 })
11513
11514 【C言語API】
11515 ER ercd = sac_mpf(ID mpfid, const ACVCT *p_acvct)
11516
11517 【パラメータ】
11518 ID mpfid 対象固定長メモリプールのID番号
11519 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
11520 インタ(静的APIを除く)
11521
11522 *アクセス許可ベクタ(パケットの内容)
11523 ACPTN acptn1 通常操作1のアクセス許可パターン
11524 ACPTN acptn2 通常操作2のアクセス許可パターン
11525 ACPTN acptn3 管理操作のアクセス許可パターン
11526 ACPTN acptn4 参照操作のアクセス許可パターン
11527
11528 【リターンパラメータ】
11529 ER ercd 正常終了(E_OK)またはエラーコード
11530
11531 【エラーコード】
11532 E_CTX コンテキストエラー
11533 ・非タスクコンテキストからの呼出し〔s〕【NGKI2264】
11534 ・CPUロック状態からの呼出し〔s〕【NGKI2265】
11535 E_ID 不正ID番号
11536 ・mpfidが有効範囲外〔s〕【NGKI2266】
11537 E_RSATR 予約属性
11538 ・対象固定長メモリプールが属する保護ドメインの囲みの中
11539 に記述されていない〔S〕【NGKI2267】
11540 ・対象固定長メモリプールが属するクラスの囲みの中に記述
11541 されていない〔SM〕【NGKI2268】
11542 E_NOEXS オブジェクト未登録
11543 ・対象固定長メモリプールが未登録【NGKI2269】
11544 E_OACV オブジェクトアクセス違反
11545 ・対象固定長メモリプールに対する管理操作が許可されてい
11546 ない〔s〕【NGKI2270】
11547 E_MACV メモリアクセス違反
11548 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
11549 いない〔s〕【NGKI2271】
11550 E_OBJ オブジェクト状態エラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
232
11551 ・対象固定長メモリプールは静的APIで生成された〔s〕【NGKI2272】
11552 ・対象固定長メモリプールに対してアクセス許可ベクタが設
11553 定済み〔S〕【NGKI2273】
11554
11555 【機能】
11556
11557 mpfidで指定した固定長メモリプール(対象固定長メモリプール)のアクセス許
11558 可ベクタ(4つのアクセス許可パターンの組)を,各パラメータで指定した値に
11559 設定する【NGKI2274】.対象固定長メモリプールの固定長メモリプール領域が
11560 コンフィギュレータまたはカーネルにより確保されたものである場合には,固
11561 定長メモリプール領域のアクセス許可ベクタも,各パラメータで指定した値に
11562 設定する【NGKI2275】.
11563
11564 静的APIにおいては,mpfidはオブジェクト識別名,acptn1~acptn4は整数定数
11565 式パラメータである【NGKI2276】.
11566
11567 【TOPPERS/ASPカーネルにおける規定】
11568
11569 ASPカーネルでは,SAC_MPF,sac_mpfをサポートしない【ASPS0169】.
11570
11571 【TOPPERS/FMPカーネルにおける規定】
11572
11573 FMPカーネルでは,SAC_MPF,sac_mpfをサポートしない【FMPS0145】.
11574
11575 【TOPPERS/HRP2カーネルにおける規定】
11576
11577 HRP2カーネルでは,SAC_MPFのみをサポートする【HRPS0139】.
11578 ----------------------------------------------------------------------
11579 del_mpf 固定長メモリプールの削除〔TD〕【NGKI2277】
11580
11581 【C言語API】
11582 ER ercd = del_mpf(ID mpfid)
11583
11584 【パラメータ】
11585 ID mpfid 対象固定長メモリプールのID番号
11586
11587 【リターンパラメータ】
11588 ER ercd 正常終了(E_OK)またはエラーコード
11589
11590 【エラーコード】
11591 E_CTX コンテキストエラー
11592 ・非タスクコンテキストからの呼出し【NGKI2278】
11593 ・CPUロック状態からの呼出し【NGKI2279】
11594 E_ID 不正ID番号
11595 ・mpfidが有効範囲外【NGKI2280】
11596 E_NOEXS オブジェクト未登録
11597 ・対象固定長メモリプールが未登録【NGKI2281】
11598 E_OACV オブジェクトアクセス違反
11599 ・対象固定長メモリプールに対する管理操作が許可されてい
11600 ない〔P〕【NGKI2282】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
233
11601 E_OBJ オブジェクト状態エラー
11602 ・対象固定長メモリプールは静的APIで生成された【NGKI2283】
11603
11604 【機能】
11605
11606 mpfidで指定した固定長メモリプール(対象固定長メモリプール)を削除する.
11607 具体的な振舞いは以下の通り.
11608
11609 対象固定長メモリプールの登録が解除され,その固定長メモリプールIDが未使
11610 用の状態に戻される【NGKI2284】.また,対象固定長メモリプールの待ち行列
11611 につながれたタスクは,待ち行列の先頭のタスクから順に待ち解除される
11612 【NGKI2285】.待ち解除されたタスクには,待ち状態となったサービスコール
11613 からE_DLTエラーが返る【NGKI2286】.
11614
11615 【使用上の注意】
11616
11617 del_mpfにより複数のタスクが待ち解除される場合,サービスコールの処理時間
11618 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
11619 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
11620 み禁止時間が長くなるため,注意が必要である.
11621
11622 【TOPPERS/ASPカーネルにおける規定】
11623
11624 ASPカーネルでは,del_mpfをサポートしない【ASPS0170】.ただし,動的生成
11625 機能拡張パッケージでは,del_mpfをサポートする【ASPS0171】.
11626
11627 【TOPPERS/FMPカーネルにおける規定】
11628
11629 FMPカーネルでは,del_mpfをサポートしない【FMPS0146】.
11630
11631 【TOPPERS/HRP2カーネルにおける規定】
11632
11633 HRP2カーネルでは,del_mpfをサポートしない【HRPS0140】.
11634 ----------------------------------------------------------------------
11635 get_mpf 固定長メモリブロックの獲得〔T〕【NGKI2287】
11636 pget_mpf 固定長メモリブロックの獲得(ポーリング)〔T〕【NGKI2288】
11637 tget_mpf 固定長メモリブロックの獲得(タイムアウト付き)〔T〕【NGKI2289】
11638
11639 【C言語API】
11640 ER ercd = get_mpf(ID mpfid, void **p_blk)
11641 ER ercd = pget_mpf(ID mpfid, void **p_blk)
11642 ER ercd = tget_mpf(ID mpfid, void **p_blk, TMO tmout)
11643
11644 【パラメータ】
11645 ID mpfid 対象固定長メモリプールのID番号
11646 void ** p_blk 獲得した固定長メモリブロックの先頭番地を入
11647 れるメモリ領域へのポインタ
11648 TMO tmout タイムアウト時間(twai_mpfの場合)
11649
11650 【リターンパラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
234
11651 ER ercd 正常終了(E_OK)またはエラーコード
11652 void * blk 獲得した固定長メモリブロックの先頭番地
11653
11654 【エラーコード】
11655 E_CTX コンテキストエラー
11656 ・非タスクコンテキストからの呼出し【NGKI2290】
11657 ・CPUロック状態からの呼出し【NGKI2291】
11658 ・ディスパッチ保留状態からの呼出し(pget_mpfを除く)
11659 【NGKI2292】
11660 E_NOSPT 未サポート機能
11661 ・制約タスクからの呼出し(pget_mpfを除く)【NGKI2293】
11662 E_ID 不正ID番号
11663 ・mpfidが有効範囲外【NGKI2294】
11664 E_PAR パラメータエラー
11665 ・tmoutが無効(tget_mpfの場合)【NGKI2295】
11666 E_NOEXS オブジェクト未登録
11667 ・対象固定長メモリプールが未登録〔D〕【NGKI2296】
11668 E_OACV オブジェクトアクセス違反
11669 ・対象固定長メモリプールに対する通常操作1が許可されてい
11670 ない〔P〕【NGKI2297】
11671 E_MACV メモリアクセス違反
11672 ・p_blkが指すメモリ領域への書込みアクセスが許可されてい
11673 ない)〔P〕【NGKI2298】
11674 E_TMOUT ポーリング失敗またはタイムアウト(get_mpfを除く)【NGKI2299】
11675 E_RLWAI 待ち禁止状態または待ち状態の強制解除(pget_mpfを除く)
11676 【NGKI2300】
11677 E_DLT 待ちオブジェクトの削除または再初期化(pget_mpfを除く)
11678 【NGKI2301】
11679
11680 【機能】
11681
11682 mpfidで指定した固定長メモリプール(対象固定長メモリプール)から固定長メ
11683 モリブロックを獲得し,その先頭番地をp_blkが指すメモリ領域に返す.具体的
11684 な振舞いは以下の通り.
11685
11686 対象固定長メモリプールの固定長メモリプール領域の中に,固定長メモリブロッ
11687 クを割り付けることのできる未割当てのメモリ領域がある場合には,固定長メ
11688 モリブロックが1つ割り付けられ,その先頭番地がblkに返される【NGKI2302】.
11689
11690 未割当てのメモリ領域がない場合には,自タスクは固定長メモリプールの獲得
11691 待ち状態となり,対象固定長メモリプールの待ち行列につながれる【NGKI2303】.
11692 ----------------------------------------------------------------------
11693 rel_mpf 固定長メモリブロックの返却〔T〕【NGKI2304】
11694
11695 【C言語API】
11696 ER ercd = rel_mpf(ID mpfid, void *blk)
11697
11698 【パラメータ】
11699 ID mpfid 対象固定長メモリプールのID番号
11700 void * blk 返却する固定長メモリブロックの先頭番地
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
235
11701
11702 【リターンパラメータ】
11703 ER ercd 正常終了(E_OK)またはエラーコード
11704
11705 【エラーコード】
11706 E_CTX コンテキストエラー
11707 ・非タスクコンテキストからの呼出し【NGKI2305】
11708 ・CPUロック状態からの呼出し【NGKI2306】
11709 E_ID 不正ID番号
11710 ・mpfidが有効範囲外【NGKI2307】
11711 E_PAR パラメータエラー
11712 ・条件については機能の項を参照
11713 E_NOEXS オブジェクト未登録
11714 ・対象固定長メモリプールが未登録〔D〕【NGKI2308】
11715 E_OACV オブジェクトアクセス違反
11716 ・対象固定長メモリプールに対する通常操作2が許可されてい
11717 ない〔P〕【NGKI2309】
11718
11719 【機能】
11720
11721 mpfidで指定した固定長メモリプール(対象固定長メモリプール)に,blkで指
11722 定した固定長メモリブロックを返却する.具体的な振舞いは以下の通り.
11723
11724 対象固定長メモリプールの待ち行列にタスクが存在する場合には,待ち行列の
11725 先頭のタスクが,blkで指定した固定長メモリブロックを獲得し,待ち解除され
11726 る【NGKI2310】.待ち解除されたタスクには,待ち状態となったサービスコー
11727 ルからE_OKが返る【NGKI2311】.
11728
11729 待ち行列にタスクが存在しない場合には,blkで指定した固定長メモリブロック
11730 は,対象固定長メモリプールのメモリプール領域に返却される【NGKI2312】.
11731
11732 blkが,対象固定長メモリプールから獲得した固定長メモリブロックの先頭番地
11733 でない場合には,E_PARエラーとなる【NGKI2313】.
11734 ----------------------------------------------------------------------
11735 ini_mpf 固定長メモリプールの再初期化〔T〕【NGKI2314】
11736
11737 【C言語API】
11738 ER ercd = ini_mpf(ID mpfid)
11739
11740 【パラメータ】
11741 ID mpfid 対象固定長メモリプールのID番号
11742
11743 【リターンパラメータ】
11744 ER ercd 正常終了(E_OK)またはエラーコード
11745
11746 【エラーコード】
11747 E_CTX コンテキストエラー
11748 ・非タスクコンテキストからの呼出し【NGKI2315】
11749 ・CPUロック状態からの呼出し【NGKI2316】
11750 E_ID 不正ID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
236
11751 ・mpfidが有効範囲外【NGKI2317】
11752 E_NOEXS オブジェクト未登録
11753 ・対象固定長メモリプールが未登録〔D〕【NGKI2318】
11754 E_OACV オブジェクトアクセス違反
11755 ・対象固定長メモリプールに対する管理操作が許可されてい
11756 ない〔P〕【NGKI2319】
11757
11758 【機能】
11759
11760 mpfidで指定した固定長メモリプール(対象固定長メモリプール)を再初期化す
11761 る.具体的な振舞いは以下の通り.
11762
11763 対象固定長メモリプールのメモリプール領域全体が未割当ての状態に初期化さ
11764 れる【NGKI2320】.また,対象固定長メモリプールの待ち行列につながれたタ
11765 スクは,待ち行列の先頭のタスクから順に待ち解除される【NGKI2321】.待ち
11766 解除されたタスクには,待ち状態となったサービスコールからE_DLTエラーが返
11767 る【NGKI2322】.
11768
11769 【使用上の注意】
11770
11771 ini_mpfにより複数のタスクが待ち解除される場合,サービスコールの処理時間
11772 およびカーネル内での割込み禁止時間が,待ち解除されるタスクの数に比例し
11773 て長くなる.特に,多くのタスクが待ち解除される場合,カーネル内での割込
11774 み禁止時間が長くなるため,注意が必要である.
11775
11776 固定長メモリプールを再初期化した場合に,アプリケーションとの整合性を保
11777 つのは,アプリケーションの責任である.
11778
11779 【μITRON4.0仕様との関係】
11780
11781 μITRON4.0仕様に定義されていないサービスコールである.
11782 ----------------------------------------------------------------------
11783 ref_mpf 固定長メモリプールの状態参照〔T〕【NGKI2323】
11784
11785 【C言語API】
11786 ER ercd = ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
11787
11788 【パラメータ】
11789 ID mpfid 対象固定長メモリプールのID番号
11790 T_RMPF * pk_rmpf 固定長メモリプールの現在状態を入れるパケッ
11791 トへのポインタ
11792
11793 【リターンパラメータ】
11794 ER ercd 正常終了(E_OK)またはエラーコード
11795
11796 *固定長メモリプールの現在状態(パケットの内容)
11797 ID wtskid 固定長メモリプールの待ち行列の先頭のタスク
11798 のID番号
11799 uint_t fblkcnt 固定長メモリプール領域の空きメモリ領域に割
11800 り付けることができる固定長メモリブロックの
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
237
11801 数
11802
11803 【エラーコード】
11804 E_CTX コンテキストエラー
11805 ・非タスクコンテキストからの呼出し【NGKI2324】
11806 ・CPUロック状態からの呼出し【NGKI2325】
11807 E_ID 不正ID番号
11808 ・mpfidが有効範囲外【NGKI2326】
11809 E_NOEXS オブジェクト未登録
11810 ・対象固定長メモリプールが未登録〔D〕【NGKI2327】
11811 E_OACV オブジェクトアクセス違反
11812 ・対象固定長メモリプールに対する参照操作が許可されてい
11813 ない〔P〕【NGKI2328】
11814 E_MACV メモリアクセス違反
11815 ・pk_rmpfが指すメモリ領域への書込みアクセスが許可されて
11816 いない)〔P〕【NGKI2329】
11817
11818 【機能】
11819
11820 mpfidで指定した固定長メモリプール(対象固定長メモリプール)の現在状態を
11821 参照する.参照した現在状態は,pk_rmpfで指定したパケットに返される
11822 【NGKI2330】.
11823
11824 対象固定長メモリプールの待ち行列にタスクが存在しない場合,wtskidには
11825 TSK_NONE(=0)が返る【NGKI2331】.
11826
11827 【使用上の注意】
11828
11829 ref_mpfはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
11830 ない.これは,ref_mpfを呼び出し,対象固定長メモリプールの現在状態を参照
11831 した直後に割込みが発生した場合,ref_mpfから戻ってきた時には対象固定長メ
11832 モリプールの状態が変化している可能性があるためである.
11833 ----------------------------------------------------------------------
11834
11835 4.6 時間管理機能
11836
11837 4.6.1 システム時刻管理
11838
11839 システム時刻は,カーネルによって管理され,タイムアウト処理,タスクの遅
11840 延,周期ハンドラの起動,アラームハンドラの起動に使用される時刻を管理す
11841 るカーネルオブジェクトである.システム時刻は,符号無しの整数型である
11842 SYSTIM型で表され,単位はミリ秒である【NGKI2332】.
11843
11844 システム時刻は,カーネルの初期化時に0に初期化される【NGKI2333】.タイム
11845 ティックを通知するためのタイマ割込みが発生する毎にカーネルによって更新
11846 され,SYSTIM型で表せる最大値(ULONG_MAX)を超えると0に戻される
11847 【NGKI2334】.タイムティックの周期は,ターゲット定義である【NGKI2335】.
11848 また,システム時刻の精度はターゲットに依存する【NGKI2336】.
11849
11850 マルチプロセッサ対応でないカーネルと,マルチプロセッサ対応カーネルでグ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
238
11851 ローバルタイマ方式を用いている場合には,システム時刻は,システムに1つの
11852 み存在する【NGKI2337】.マルチプロセッサ対応カーネルでローカルタイマ方
11853 式を用いている場合には,システム時刻は,プロセッサ毎に存在する
11854 【NGKI2338】.ローカルタイマ方式とグローバルタイマ方式については,
11855 「2.3.4 マルチプロセッサ対応」の節を参照すること.
11856
11857 マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には,
11858 タイムアウト処理とタスクの遅延処理には,待ち解除されるタスクが割り付け
11859 られているプロセッサのシステム時刻が用いられる【NGKI2339】.また,周期
11860 ハンドラとアラームハンドラの起動には,それが割り付けられているプロセッ
11861 サのシステム時刻が用いられる【NGKI2340】.これらの処理単位がマイグレー
11862 ションする場合には,用いられるシステム時刻も変更される【NGKI2341】.こ
11863 の場合にも,イベントの処理が行われるのは,基準時刻から相対時間によって
11864 指定した以上の時間が経過した後となるという規則は維持される【NGKI2342】.
11865
11866 1回のタイムティックの発生により,複数のイベントの処理を行うべき状況になっ
11867 た場合,それらの処理の間の処理順序は規定されない【NGKI2343】.
11868
11869 性能評価用システム時刻は,性能評価に使用することを目的とした,システム
11870 時刻よりも精度の高い時刻である.性能評価用システム時刻は,符号無しの整
11871 数型であるSYSUTM型で表され,単位はマイクロ秒である【NGKI2344】.ただし,
11872 実際の精度はターゲットに依存する【NGKI2345】.
11873
11874 マルチプロセッサ対応カーネルにおける性能評価用システム時刻の扱いは,ター
11875 ゲット定義とする【NGKI2346】.
11876
11877 システム時刻管理機能に関連するカーネル構成マクロは次の通り.
11878
11879 TIC_NUME タイムティックの周期(単位はミリ秒)の分子 【NGKI2347】
11880 TIC_DENO タイムティックの周期(単位はミリ秒)の分母
11881
11882 TOPPERS_SUPPORT_GET_UTM get_utm がサポートされている【NGKI2348】
11883
11884 【TOPPERS/SSPカーネルにおける規定】
11885
11886 SSPカーネルでは,時間管理機能をサポートしない【SSPS0129】.
11887
11888 【使用上の注意】
11889
11890 タイムティックを通知するためのタイマ割込みが長時間マスクされた場合(タ
11891 イマ割込みより優先して実行される割込み処理が長時間続けて実行された場合
11892 を含む)や,シミュレーション環境においてシミュレータのプロセスが長時間
11893 スケジュールされなかった場合には,システム時刻が正しく更新されない可能
11894 性があるため,注意が必要である.
11895
11896 【μITRON4.0仕様との関係】
11897
11898 システム時刻を設定するサービスコール(set_tim)を廃止した.また,タイム
11899 ティックを供給する機能は,カーネル内に実現することとし,そのためのサー
11900 ビスコール(isig_tim)は廃止した.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
239
11901
11902 【μITRON4.0/PX仕様との関係】
11903
11904 システム時刻のアクセス許可ベクタは廃止し,システム状態のアクセス許可ベ
11905 クタで代替することとした.そのため,システム時刻のアクセス許可ベクタを
11906 設定する静的API(SAC_TIM)は廃止した.
11907 ----------------------------------------------------------------------
11908 get_tim システム時刻の参照〔T〕【NGKI2349】
11909
11910 【C言語API】
11911 ER ercd = get_tim(SYSTIM *p_systim)
11912
11913 【パラメータ】
11914 SYSTIM * p_systim システム時刻を入れるメモリ領域へのポインタ
11915
11916 【リターンパラメータ】
11917 ER ercd 正常終了(E_OK)またはエラーコード
11918 SYSTIM systim システム時刻の現在値
11919
11920 【エラーコード】
11921 E_CTX コンテキストエラー
11922 ・非タスクコンテキストからの呼出し【NGKI2350】
11923 ・CPUロック状態からの呼出し【NGKI2351】
11924 E_OACV オブジェクトアクセス違反
11925 ・システム状態に対する参照操作が許可されていない〔P〕
11926 【NGKI2352】
11927 E_MACV メモリアクセス違反
11928 ・p_systimが指すメモリ領域への書込みアクセスが許可され
11929 ていない)〔P〕【NGKI2353】
11930
11931 【機能】
11932
11933 システム時刻の現在値を参照する.参照したシステム時刻は,p_systimが指す
11934 メモリ領域に返される【NGKI2354】.
11935
11936 マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合には,
11937 自タスクが割り付けられているプロセッサのシステム時刻の現在値を参照する
11938 【NGKI2355】.
11939
11940 【補足説明】
11941
11942 マルチプロセッサ対応カーネルでローカルタイマ方式を用いている場合に,他
11943 のプロセッサのシステム時刻の現在値を参照する機能は用意していない.
11944 ----------------------------------------------------------------------
11945 get_utm 性能評価用システム時刻の参照〔TI〕【NGKI2356】
11946
11947 【C言語API】
11948 ER ercd = get_utm(SYSUTM *p_sysutm)
11949
11950 【パラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
240
11951 SYSUTM * p_sysutm 性能評価用システム時刻を入れるメモリ領域へ
11952 のポインタ
11953
11954 【リターンパラメータ】
11955 ER ercd 正常終了(E_OK)またはエラーコード
11956 SYSUTM sysutm 性能評価用システム時刻の現在値
11957
11958 【エラーコード】
11959 E_NOSPT 未サポート機能
11960 ・条件については機能の項を参照
11961 E_MACV メモリアクセス違反
11962 ・p_sysutmが指すメモリ領域へ書込みアクセスが許可されて
11963 いない)〔P〕【NGKI2357】
11964
11965 【機能】
11966
11967 性能評価用システム時刻の現在値を参照する.参照した性能評価用システム時
11968 刻は,p_sysutmが指すメモリ領域に返される【NGKI2358】.
11969
11970 get_utmは,任意の状態から呼び出すことができる【NGKI2359】.タスクコンテ
11971 キストからも非タスクコンテキストからも呼び出すことができるし,CPUロック
11972 状態であっても呼び出すことができる.
11973
11974 ターゲット定義で,get_utmがサポートされていない場合がある【NGKI2360】.
11975 get_utmがサポートされている場合には,TOPPERS_SUPPORT_GET_UTMがマクロ定
11976 義される【NGKI2361】.サポートされていない場合にget_utmを呼び出すと,
11977 E_NOSPTエラーが返るか,リンク時にエラーとなる【NGKI2362】.
11978
11979 【使用方法】
11980
11981 get_utmを使用してプログラムの処理時間を計測する場合には,次の手順を取る.
11982 処理時間を計測したいプログラムの実行直前と実行直後に,get_utmを用いて性
11983 能評価用システム時刻を読み出す.その差を求めることで,対象プログラムの
11984 処理時間に,get_utm自身の処理時間を加えたものが得られる.
11985
11986 マルチプロセッサ対応カーネルにおいては,異なるプロセッサで読み出した性
11987 能評価用システム時刻の差を求めることで,処理時間が正しく計測できるとは
11988 限らない.
11989
11990 【使用上の注意】
11991
11992 get_utmは性能評価のための機能であり,その他の目的に使用することは推奨し
11993 ない.
11994
11995 get_utmは,任意の状態から呼び出すことができるように,全割込みロック状態
11996 を用いて実装されている.そのため,get_utmを用いると,カーネル管理外の割
11997 込みの応答性が低下する.
11998
11999 システム時刻が正しく更新されない状況では,get_utmは誤った性能評価用シス
12000 テム時刻を返す可能性がある.システム時刻の更新が確実に行われることを保
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
241
12001 証できない場合には,get_utmが誤った性能評価用システム時刻を返す可能性を
12002 考慮に入れて使用しなければならない.
12003
12004 【μITRON4.0仕様との関係】
12005
12006 μITRON4.0仕様に定義されていないサービスコールである.
12007 ----------------------------------------------------------------------
12008
12009 4.6.2 周期ハンドラ
12010
12011 周期ハンドラは,指定した周期で起動されるタイムイベントハンドラである.
12012 周期ハンドラは,周期ハンドラIDと呼ぶID番号によって識別する【NGKI2363】.
12013
12014 各周期ハンドラが持つ情報は次の通り【NGKI2364】.
12015
12016 ・周期ハンドラ属性
12017 ・周期ハンドラの動作状態
12018 ・次に周期ハンドラを起動する時刻
12019 ・拡張情報
12020 ・周期ハンドラの先頭番地
12021 ・起動周期
12022 ・起動位相
12023 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
12024 ・属する保護ドメイン(保護機能対応カーネルの場合)
12025 ・属するクラス(マルチプロセッサ対応カーネルの場合)
12026
12027 周期ハンドラの起動時刻は,後述する基準時刻から,以下の式で求められる相
12028 対時間後である【NGKI2365】.
12029
12030 起動位相+起動周期×(n-1) n=1,2,…
12031
12032 周期ハンドラの動作状態は,動作している状態と動作していない状態のいずれ
12033 かをとる【NGKI2366】.周期ハンドラを動作している状態にすることを動作開
12034 始,動作していない状態にすることを動作停止という.
12035
12036 周期ハンドラが動作している状態の場合には,周期ハンドラを起動する時刻に
12037 なると,周期ハンドラの起動処理が行われる【NGKI2367】.具体的には,拡張
12038 情報をパラメータとして,周期ハンドラが呼び出される【NGKI2368】.
12039
12040 保護機能対応カーネルにおいて,周期ハンドラが属することのできる保護ドメ
12041 インは,カーネルドメインに限られる【NGKI2369】.
12042
12043 周期ハンドラ属性には,次の属性を指定することができる【NGKI2370】.
12044
12045 TA_STA 0x02U 周期ハンドラの生成時に周期ハンドラを動作開始する
12046 TA_PHS 0x04U 周期ハンドラを生成した時刻を基準時刻とする
12047
12048 TA_STAを指定しない場合,周期ハンドラの生成直後には,周期ハンドラは動作
12049 していない状態となる【NGKI2371】.
12050
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
242
12051 TA_PHSを指定しない場合には,周期ハンドラを動作開始した時刻が,周期ハン
12052 ドラを起動する時刻の基準時刻となる【NGKI2372】.TA_PHSを指定した場合に
12053 は,周期ハンドラを生成した時刻(静的APIで生成した場合にはカーネルの起動
12054 時刻)が,基準時刻となる【NGKI2373】.
12055
12056 次に周期ハンドラを起動する時刻は,周期ハンドラが動作している状態でのみ
12057 有効で,必要に応じて,カーネルの起動時,周期ハンドラの動作開始時,周期
12058 ハンドラの起動処理時に設定される【NGKI2374】.
12059
12060 マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には,
12061 周期ハンドラは,システム時刻管理プロセッサのみが割付け可能プロセッサで
12062 あるクラスにのみ属することができる【NGKI2375】.すなわち,周期ハンドラ
12063 は,システム時刻管理プロセッサによって実行される.
12064
12065 C言語による周期ハンドラの記述形式は次の通り【NGKI2376】.
12066
12067 void cyclic_handler(intptr_t exinf)
12068 {
12069 周期ハンドラ本体
12070 }
12071
12072 exinfには,周期ハンドラの拡張情報が渡される【NGKI2377】.
12073
12074 周期ハンドラ機能に関連するカーネル構成マクロは次の通り.
12075
12076 TNUM_CYCID 登録できる周期ハンドラの数(動的生成対応でないカー
12077 ネルでは,静的APIによって登録された周期ハンドラの数
12078 に一致)【NGKI2378】
12079
12080 【TOPPERS/ASPカーネルにおける規定】
12081
12082 ASPカーネルでは,TA_PHS属性の周期ハンドラをサポートしない【ASPS0172】.
12083
12084 【TOPPERS/FMPカーネルにおける規定】
12085
12086 FMPカーネルでは,TA_PHS属性の周期ハンドラをサポートしない【FMPS0147】.
12087
12088 【TOPPERS/HRP2カーネルにおける規定】
12089
12090 HRP2カーネルでは,TA_PHS属性の周期ハンドラをサポートしない【HRPS0141】.
12091
12092 【μITRON4.0仕様との関係】
12093
12094 TNUM_CYCIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
12095 ----------------------------------------------------------------------
12096 CRE_CYC 周期ハンドラの生成〔S〕【NGKI2379】
12097 acre_cyc 周期ハンドラの生成〔TD〕【NGKI2380】
12098
12099 【静的API】
12100 CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
243
12101 RELTIM cyctim, RELTIM cycphs })
12102
12103 【C言語API】
12104 ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc)
12105
12106 【パラメータ】
12107 ID cycid 生成する周期ハンドラのID番号(CRE_CYCの場合)
12108 T_CCYC * pk_ccyc 周期ハンドラの生成情報を入れたパケットへの
12109 ポインタ(静的APIを除く)
12110
12111 *周期ハンドラの生成情報(パケットの内容)
12112 ATR cycatr 周期ハンドラ属性
12113 intptr_t exinf 周期ハンドラの拡張情報
12114 CYCHDR c ychdr 周期ハンドラの先頭番地
12115 RELTIM cyctim 周期ハンドラの起動周期
12116 RELTIM cycphs 周期ハンドラの起動位相
12117
12118 【リターンパラメータ】
12119 ER_ID cycid 生成された周期ハンドラのID番号(正の値)また
12120 はエラーコード
12121
12122 【エラーコード】
12123 E_CTX コンテキストエラー
12124 ・非タスクコンテキストからの呼出し〔s〕【NGKI2381】
12125 ・CPUロック状態からの呼出し〔s〕【NGKI2382】
12126 E_RSATR 予約属性
12127 ・cycatrが無効【NGKI2383】
12128 ・属する保護ドメインの指定が有効範囲外またはカーネルド
12129 メイン以外〔sP〕【NGKI2384】
12130 ・カーネルドメインの囲みの中に記述されていない〔SP〕
12131 【NGKI2385】
12132 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2386】
12133 ・クラスの囲みの中に記述されていない〔SM〕【NGKI2387】
12134 ・その他の条件については機能の項を参照
12135 E_PAR パラメータエラー
12136 ・cychdrがプログラムの先頭番地として正しくない【NGKI2388】
12137 ・cyctimが有効範囲(0より大きくTMAX_RELTIM以下)外【NGKI2397】
12138 ・cycphsが有効範囲(0以上TMAX_RELTIM以下)外【NGKI2399】
12139 E_OACV オブジェクトアクセス違反
12140 ・システム状態に対する管理操作が許可されていない〔sP〕
12141 【NGKI2389】
12142 E_MACV メモリアクセス違反
12143 ・pk_ccycが指すメモリ領域への読出しアクセスが許可されて
12144 いない〔sP〕【NGKI2390】
12145 E_NOID ID番号不足
12146 ・割り付けられる周期ハンドラIDがない〔sD〕【NGKI2391】
12147 E_OBJ オブジェクト状態エラー
12148 ・cycidで指定した周期ハンドラが登録済み(CRE_CYCの場合)
12149 【NGKI2392】
12150
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
244
12151 【機能】
12152
12153 各パラメータで指定した周期ハンドラ生成情報に従って,周期ハンドラを生成
12154 する.具体的な振舞いは以下の通り.
12155
12156 cycatrにTA_STAを指定した場合,対象周期ハンドラは動作している状態となる
12157 【NGKI2393】.次に周期ハンドラを起動する時刻は,サービスコールを呼び出
12158 した時刻(静的APIの場合はカーネルの起動時刻)から,cycphsで指定した相対
12159 時間後に設定される【NGKI2394】.cycphsにcyctimより大きい値を指定しても
12160 よい【NGKI2400】.
12161
12162 cycatrにTA_STAを指定しない場合,対象周期ハンドラは動作していない状態に
12163 初期化される【NGKI2395】.
12164
12165 静的APIにおいては,cycidはオブジェクト識別名,cycatr,cyctim,cycphsは
12166 整数定数式パラメータ,exinfとcychdrは一般定数式パラメータである
12167 【NGKI2396】.
12168
12169 マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で,
12170 生成する周期ハンドラの属するクラスの割付け可能プロセッサが,システム時
12171 刻管理プロセッサのみでない場合には,E_RSATRエラーとなる【NGKI2401】.
12172
12173 【補足説明】
12174
12175 静的APIにおいて,cycatrにTA_STAを,cycphsに0を指定した場合,周期ハンド
12176 ラが最初に呼び出されるのは,カーネル起動後最初のタイムティックになる.
12177 cycphsに1を指定した場合も同じ振舞いとなるため,静的APIでcycatrにTA_STA
12178 が指定されている場合には,cycphsに0を指定することは推奨されず,コンフィ
12179 ギュレータが警告メッセージを出力する.
12180
12181 【TOPPERS/ASPカーネルにおける規定】
12182
12183 ASPカーネルでは,CRE_CYCのみをサポートする【ASPS0173】.ただし,TA_PHS
12184 属性の周期ハンドラはサポートしない【ASPS0174】.動的生成機能拡張パッケー
12185 ジでは,acre_cycもサポートする【ASPS0175】.
12186
12187 【TOPPERS/FMPカーネルにおける規定】
12188
12189 FMPカーネルでは,CRE_CYCのみをサポートする【FMPS0148】.ただし,TA_PHS
12190 属性の周期ハンドラはサポートしない【FMPS0149】.
12191
12192 【TOPPERS/HRP2カーネルにおける規定】
12193
12194 HRP2カーネルでは,CRE_CYCのみをサポートする【HRPS0142】.ただし,
12195 TA_PHS属性の周期ハンドラはサポートしない【HRPS0143】.
12196
12197 【μITRON4.0仕様との関係】
12198
12199 cychdrのデータ型をCYCHDRに変更した.また,cycphsにcyctimより大きい値を
12200 指定した場合の振舞いと,静的APIでcycphsに0を指定した場合の振舞いを規定
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
245
12201 した.
12202 ----------------------------------------------------------------------
12203 AID_CYC 割付け可能な周期ハンドラIDの数の指定〔SD〕【NGKI2402】
12204
12205 【静的API】
12206 AID_CYC(uint_t nocyc)
12207
12208 【パラメータ】
12209 uint_t nocyc 割付け可能な周期ハンドラIDの数
12210
12211 【エラーコード】
12212 E_RSATR 予約属性
12213 ・カーネルドメインの囲みの中に記述されていない〔P〕【NGKI2403】
12214 ・クラスの囲みの中に記述されていない〔M〕【NGKI2404】
12215 ・その他の条件については機能の項を参照
12216 E_PAR パラメータエラー
12217 ・nocycが負の値【NGKI3285】
12218
12219 【機能】
12220
12221 nocycで指定した数の周期ハンドラIDを,周期ハンドラを生成するサービスコー
12222 ルによって割付け可能な周期ハンドラIDとして確保する【NGKI2405】.
12223
12224 nocycは整数定数式パラメータである【NGKI2406】.
12225
12226 マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で,
12227 AID_CYCが属するクラスの割付け可能プロセッサが,システム時刻管理プロセッ
12228 サのみでない場合には,E_RSATRエラーとなる【NGKI2407】.
12229 ----------------------------------------------------------------------
12230 SAC_CYC 周期ハンドラのアクセス許可ベクタの設定〔SP〕【NGKI2408】
12231 sac_cyc 周期ハンドラのアクセス許可ベクタの設定〔TPD〕【NGKI2409】
12232
12233 【静的API】
12234 SAC_CYC(ID cycid, { ACPTN acptn1 , ACPTN acptn2,
12235 ACPTN acptn3, ACPTN acptn4 })
12236
12237 【C言語API】
12238 ER ercd = sac_cyc(ID cycid, const ACVCT *p_acvct)
12239
12240 【パラメータ】
12241 ID cycid 対象周期ハンドラのID番号
12242 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
12243 インタ(静的APIを除く)
12244
12245 *アクセス許可ベクタ(パケットの内容)
12246 ACPTN acptn1 通常操作1のアクセス許可パターン
12247 ACPTN acptn2 通常操作2のアクセス許可パターン
12248 ACPTN acptn3 管理操作のアクセス許可パターン
12249 ACPTN acptn4 参照操作のアクセス許可パターン
12250
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
246
12251 【リターンパラメータ】
12252 ER ercd 正常終了(E_OK)またはエラーコード
12253
12254 【エラーコード】
12255 E_CTX コンテキストエラー
12256 ・非タスクコンテキストからの呼出し〔s〕【NGKI2410】
12257 ・CPUロック状態からの呼出し〔s〕【NGKI2411】
12258 E_ID 不正ID番号
12259 ・cycidが有効範囲外〔s〕【NGKI2412】
12260 E_RSATR 予約属性
12261 ・対象周期ハンドラが属する保護ドメインの囲みの中に記述
12262 されていない〔S〕【NGKI2413】
12263 ・対象周期ハンドラが属するクラスの囲みの中に記述されて
12264 いない〔SM〕【NGKI2414】
12265 E_NOEXS オブジェクト未登録
12266 ・対象周期ハンドラが未登録【NGKI2415】
12267 E_OACV オブジェクトアクセス違反
12268 ・対象周期ハンドラに対する管理操作が許可されていない〔s〕
12269 【NGKI2416】
12270 E_MACV メモリアクセス違反
12271 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
12272 いない〔s〕【NGKI2417】
12273 E_OBJ オブジェクト状態エラー
12274 ・対象周期ハンドラは静的APIで生成された〔s〕【NGKI2418】
12275 ・対象周期ハンドラに対してアクセス許可ベクタが設定済み
12276 〔S〕【NGKI2419】
12277
12278 【機能】
12279
12280 cycidで指定した周期ハンドラ(対象周期ハンドラ)のアクセス許可ベクタ(4
12281 つのアクセス許可パターンの組)を,各パラメータで指定した値に設定する
12282 【NGKI2420】.
12283
12284 静的APIにおいては,cycidはオブジェクト識別名,acptn1~acptn4は整数定数
12285 式パラメータである【NGKI2421】.
12286
12287 【TOPPERS/ASPカーネルにおける規定】
12288
12289 ASPカーネルでは,SAC_CYC,sac_cycをサポートしない【ASPS0176】.
12290
12291 【TOPPERS/FMPカーネルにおける規定】
12292
12293 FMPカーネルでは,SAC_CYC,sac_cycをサポートしない【FMPS0150】.
12294
12295 【TOPPERS/HRP2カーネルにおける規定】
12296
12297 HRP2カーネルでは,SAC_CYCのみをサポートする【HRPS0144】.
12298 ----------------------------------------------------------------------
12299 del_cyc 周期ハンドラの削除〔TD〕【NGKI2422】
12300
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
247
12301 【C言語API】
12302 ER ercd = del_cyc(ID cycid)
12303
12304 【パラメータ】
12305 ID cycid 対象周期ハンドラのID番号
12306
12307 【リターンパラメータ】
12308 ER ercd 正常終了(E_OK)またはエラーコード
12309
12310 【エラーコード】
12311 E_CTX コンテキストエラー
12312 ・非タスクコンテキストからの呼出し【NGKI2423】
12313 ・CPUロック状態からの呼出し【NGKI2424】
12314 E_ID 不正ID番号
12315 ・cycidが有効範囲外【NGKI2425】
12316 E_NOEXS オブジェクト未登録
12317 ・対象周期ハンドラが未登録【NGKI2426】
12318 E_OACV オブジェクトアクセス違反
12319 ・対象周期ハンドラに対する管理操作が許可されていない〔P〕
12320 【NGKI2427】
12321 E_OBJ オブジェクト状態エラー
12322 ・対象周期ハンドラは静的APIで生成された【NGKI2428】
12323
12324 【機能】
12325
12326 cycidで指定した周期ハンドラ(対象周期ハンドラ)を削除する.具体的な振舞
12327 いは以下の通り.
12328
12329 対象周期ハンドラの登録が解除され,その周期ハンドラIDが未使用の状態に戻
12330 される【NGKI2429】.対象周期ハンドラが動作している状態であった場合には,
12331 動作していない状態にされた後に,登録が解除される【NGKI2430】.
12332
12333 【TOPPERS/ASPカーネルにおける規定】
12334
12335 ASPカーネルでは,del_cycをサポートしない【ASPS0177】.ただし,動的生成
12336 機能拡張パッケージでは,del_cycをサポートする【ASPS0178】.
12337
12338 【TOPPERS/FMPカーネルにおける規定】
12339
12340 FMPカーネルでは,del_cycをサポートしない【FMPS0151】.
12341
12342 【TOPPERS/HRP2カーネルにおける規定】
12343
12344 HRP2カーネルでは,del_cycをサポートしない【HRPS0145】.
12345 ----------------------------------------------------------------------
12346 sta_cyc 周期ハンドラの動作開始〔T〕【NGKI2431】
12347
12348 【C言語API】
12349 ER ercd = sta_cyc(ID cycid)
12350
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
248
12351 【パラメータ】
12352 ID cycid 対象周期ハンドラのID番号
12353
12354 【リターンパラメータ】
12355 ER ercd 正常終了(E_OK)またはエラーコード
12356
12357 【エラーコード】
12358 E_CTX コンテキストエラー
12359 ・非タスクコンテキストからの呼出し【NGKI2432】
12360 ・CPUロック状態からの呼出し【NGKI2433】
12361 E_ID 不正ID番号
12362 ・cycidが有効範囲外【NGKI2434】
12363 E_NOEXS オブジェクト未登録
12364 ・対象周期ハンドラが未登録〔D〕【NGKI2435】
12365 E_OACV オブジェクトアクセス違反
12366 ・対象周期ハンドラに対する通常操作1が許可されていない〔P〕
12367 【NGKI2436】
12368
12369 【機能】
12370
12371 cycidで指定した周期ハンドラ(対象周期ハンドラ)を動作開始する.具体的な
12372 振舞いは以下の通り.
12373
12374 対象周期ハンドラが動作していない状態であれば,対象周期ハンドラは動作し
12375 ている状態となる【NGKI2437】.次に周期ハンドラを起動する時刻は,
12376 sta_cycを呼び出して以降の最初の起動時刻に設定される【NGKI2438】.
12377
12378 対象周期ハンドラが動作している状態であれば,次に周期ハンドラを起動する
12379 時刻の再設定のみが行われる【NGKI2439】.
12380
12381 【補足説明】
12382
12383 TA_PHS属性でない周期ハンドラの場合,次に周期ハンドラを起動する時刻は,
12384 sta_cycを呼び出してから,対象周期ハンドラの起動位相で指定した相対時間後
12385 に設定される.
12386
12387 対象周期ハンドラがTA_PHS属性で,動作している状態であれば,次に周期ハン
12388 ドラを起動する時刻は変化しない.
12389
12390 【μITRON4.0仕様との関係】
12391
12392 TA_PHS属性でない周期ハンドラにおいて,sta_cycを呼び出した後,最初に周期
12393 ハンドラが起動される時刻を変更した.μITRON4.0仕様では,sta_cycを呼び出
12394 してから周期ハンドラの起動周期で指定した相対時間後となっているが,この
12395 仕様では,起動位相で指定した相対時間後とした.
12396 ----------------------------------------------------------------------
12397 msta_cyc 割付けプロセッサ指定での周期ハンドラの動作開始〔TM〕【NGKI2440】
12398
12399 【C言語API】
12400 ER ercd = msta_cyc(ID cycid, ID prcid)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
249
12401
12402 【パラメータ】
12403 ID cycid 対象周期ハンドラのID番号
12404 ID prcid 周期ハンドラの割付け対象のプロセッサのID番号
12405
12406 【リターンパラメータ】
12407 ER ercd 正常終了(E_OK)またはエラーコード
12408
12409 【エラーコード】
12410 E_CTX コンテキストエラー
12411 ・非タスクコンテキストからの呼出し【NGKI2441】
12412 ・CPUロック状態からの呼出し【NGKI2442】
12413 E_NOSPT 未サポート機能
12414 ・条件については機能の項を参照
12415 E_ID 不正ID番号
12416 ・cycidが有効範囲外【NGKI2443】
12417 ・prcidが有効範囲外【NGKI2444】
12418 E_PAR パラメータエラー
12419 ・条件については機能の項を参照
12420 E_NOEXS オブジェクト未登録
12421 ・対象周期ハンドラが未登録〔D〕【NGKI2445】
12422 E_OACV オブジェクトアクセス違反
12423 ・対象周期ハンドラに対する通常操作1が許可されていない〔P〕
12424 【NGKI2446】
12425
12426 【機能】
12427
12428 prcidで指定したプロセッサを割付けプロセッサとして,cycidで指定した周期
12429 ハンドラ(対象周期ハンドラ)を動作開始する.具体的な振舞いは以下の通り.
12430
12431 対象周期ハンドラが動作していない状態であれば,対象周期ハンドラの割付け
12432 プロセッサがprcidで指定したプロセッサに変更された後,対象周期ハンドラは
12433 動作している状態となる【NGKI2447】.次に周期ハンドラを起動する時刻は,
12434 msta_cycを呼び出して以降の最初の起動時刻に設定される【NGKI2448】.
12435
12436 対象周期ハンドラが動作している状態であれば,対象周期ハンドラの割付けプ
12437 ロセッサがprcidで指定したプロセッサに変更された後,次に周期ハンドラを起
12438 動する時刻の再設定が行われる【NGKI2449】.
12439
12440 対象周期ハンドラが実行中である場合には,割付けプロセッサを変更しても,
12441 実行中の周期ハンドラを実行するプロセッサは変更されない【NGKI2450】.対
12442 象周期ハンドラが変更後の割付けプロセッサで実行されるのは,次に起動され
12443 る時からである【NGKI2451】.
12444
12445 対象周期ハンドラの属するクラスの割付け可能プロセッサが,prcidで指定した
12446 プロセッサを含んでいない場合には,E_PARエラーとなる【NGKI2452】.
12447
12448 prcidにTPRC_INI(=0)を指定すると,対象周期ハンドラの割付けプロセッサ
12449 を,それが属するクラスの初期割付けプロセッサとする【NGKI2453】.
12450
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
250
12451 グローバルタイマ方式を用いている場合,msta_cycはE_NOSPTを返す
12452 【NGKI2454】.
12453
12454 【補足説明】
12455
12456 TA_PHS属性でない周期ハンドラの場合,次に周期ハンドラを起動する時刻は,
12457 msta_cycを呼び出してから,対象周期ハンドラの起動位相で指定した相対時間
12458 後に設定される.
12459
12460 【使用上の注意】
12461
12462 msta_cycで実行中の周期ハンドラの割付けプロセッサを変更した場合,同じ周
12463 期ハンドラが異なるプロセッサで同時に実行される可能性がある.特に,対象
12464 周期ハンドラの起動位相が0の場合に,注意が必要である.
12465
12466 【μITRON4.0仕様との関係】
12467
12468 μITRON4.0仕様に定義されていないサービスコールである.
12469 ----------------------------------------------------------------------
12470 stp_cyc 周期ハンドラの動作停止〔T〕【NGKI2455】
12471
12472 【C言語API】
12473 ER ercd = stp_cyc(ID cycid)
12474
12475 【パラメータ】
12476 ID cycid 対象周期ハンドラのID番号
12477
12478 【リターンパラメータ】
12479 ER ercd 正常終了(E_OK)またはエラーコード
12480
12481 【エラーコード】
12482 E_CTX コンテキストエラー
12483 ・非タスクコンテキストからの呼出し【NGKI2456】
12484 ・CPUロック状態からの呼出し【NGKI2457】
12485 E_ID 不正ID番号
12486 ・cycidが有効範囲外【NGKI2458】
12487 E_NOEXS オブジェクト未登録
12488 ・対象周期ハンドラが未登録〔D〕【NGKI2459】
12489 E_OACV オブジェクトアクセス違反
12490 ・対象周期ハンドラに対する通常操作2が許可されていない〔P〕
12491 【NGKI2460】
12492
12493 【機能】
12494
12495 cycidで指定した周期ハンドラ(対象周期ハンドラ)を動作停止する.具体的な
12496 振舞いは以下の通り.
12497
12498 対象周期ハンドラが動作している状態であれば,動作していない状態になる
12499 【NGKI2461】.対象周期ハンドラが動作していない状態であれば,何も行われ
12500 ずに正常終了する【NGKI2462】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
251
12501 ----------------------------------------------------------------------
12502 ref_cyc 周期ハンドラの状態参照〔T〕【NGKI2463】
12503
12504 【C言語API】
12505 ER ercd = ref_cyc(ID cycid, T_RCYC *pk_rcyc)
12506
12507 【パラメータ】
12508 ID cycid 対象周期ハンドラのID番号
12509 T_RCYC * pk_rcyc 周期ハンドラの現在状態を入れるパケットへの
12510 ポインタ
12511
12512 【リターンパラメータ】
12513 ER ercd 正常終了(E_OK)またはエラーコード
12514
12515 *周期ハンドラの現在状態(パケットの内容)
12516 STAT cycstat 周期ハンドラの動作状態
12517 RELTIM lefttim 次に周期ハンドラを起動する時刻までの相対時間
12518 ID prcid 周期ハンドラの割付けプロセッサのID(マルチプ
12519 ロセッサ対応カーネルの場合)
12520
12521 【エラーコード】
12522 E_CTX コンテキストエラー
12523 ・非タスクコンテキストからの呼出し【NGKI2464】
12524 ・CPUロック状態からの呼出し【NGKI2465】
12525 E_ID 不正ID番号
12526 ・cycidが有効範囲外【NGKI2466】
12527 E_NOEXS オブジェクト未登録
12528 ・対象周期ハンドラが未登録〔D〕【NGKI2467】
12529 E_OACV オブジェクトアクセス違反
12530 ・対象周期ハンドラに対する参照操作が許可されていない〔P〕
12531 【NGKI2468】
12532 E_MACV メモリアクセス違反
12533 ・pk_rcycが指すメモリ領域への書込みアクセスが許可されて
12534 いない)〔P〕【NGKI2469】
12535
12536 【機能】
12537
12538 cycidで指定した周期ハンドラ(対象周期ハンドラ)の現在状態を参照する.参
12539 照した現在状態は,pk_rcycで指定したパケットに返される【NGKI2470】.
12540
12541 cycstatには,対象周期ハンドラの現在の動作状態を表す次のいずれかの値が返
12542 される【NGKI2471】.
12543
12544 TCYC_STP 0x01U 周期ハンドラが動作していない状態
12545 TCYC_STA 0x02U 周期ハンドラが動作している状態
12546
12547 対象周期ハンドラが動作している状態である場合には,lefttimに,次に周期ハ
12548 ンドラ起動する時刻までの相対時間が返される【NGKI2472】.対象周期ハンド
12549 ラが動作していない状態である場合には,lefttimの値は保証されない
12550 【NGKI2473】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
252
12551
12552 マルチプロセッサ対応カーネルでは,prcidに,対象周期ハンドラの割付けプロ
12553 セッサのID番号が返される【NGKI2474】.
12554
12555 【使用上の注意】
12556
12557 ref_cycはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
12558 ない.これは,ref_cycを呼び出し,対象周期ハンドラの現在状態を参照した直
12559 後に割込みが発生した場合,ref_cycから戻ってきた時には対象周期ハンドラの
12560 状態が変化している可能性があるためである.
12561
12562 【μITRON4.0仕様との関係】
12563
12564 TCYC_STPとTCYC_STAを値を変更した.
12565 ----------------------------------------------------------------------
12566
12567 4.6.3 アラームハンドラ
12568
12569 アラームハンドラは,指定した相対時間後に起動されるタイムイベントハンド
12570 ラである.アラームハンドラは,アラームハンドラIDと呼ぶID番号によって識
12571 別する【NGKI2475】.
12572
12573 各アラームハンドラが持つ情報は次の通り【NGKI2476】.
12574
12575 ・アラームハンドラ属性
12576 ・アラームハンドラの動作状態
12577 ・アラームハンドラを起動する時刻
12578 ・拡張情報
12579 ・アラームハンドラの先頭番地
12580 ・アクセス許可ベクタ(保護機能対応カーネルの場合)
12581 ・属する保護ドメイン(保護機能対応カーネルの場合)
12582 ・属するクラス(マルチプロセッサ対応カーネルの場合)
12583
12584 アラームハンドラの動作状態は,動作している状態と動作していない状態のい
12585 ずれかをとる【NGKI2477】.アラームハンドラを動作している状態にすること
12586 を動作開始,動作していない状態にすることを動作停止という.
12587
12588 アラームハンドラを起動する時刻は,アラームハンドラを動作開始する時に設
12589 定される【NGKI2478】.
12590
12591 アラームハンドラが動作している状態の場合には,アラームハンドラを起動す
12592 る時刻になると,アラームハンドラの起動処理が行われる【NGKI2479】.具体
12593 的には,まず,アラームハンドラが動作していない状態にされる【NGKI2480】.
12594 その後に,拡張情報をパラメータとして,アラームハンドラが呼び出される
12595 【NGKI2481】.
12596
12597 保護機能対応カーネルにおいて,アラームハンドラが属することのできる保護
12598 ドメインは,カーネルドメインに限られる【NGKI2482】.
12599
12600 マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合には,
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
253
12601 アラームハンドラは,割付け可能プロセッサがシステム時刻管理プロセッサの
12602 みであるクラスにのみ属することができる【NGKI2483】.すなわち,アラーム
12603 ハンドラは,システム時刻管理プロセッサによって実行される.
12604
12605 C言語によるアラームハンドラの記述形式は次の通り【NGKI2484】.
12606
12607 void alarm_handler(intptr_t exinf)
12608 {
12609 アラームハンドラ本体
12610 }
12611
12612 exinfには,アラームハンドラの拡張情報が渡される【NGKI2485】.
12613
12614 アラームハンドラ機能に関連するカーネル構成マクロは次の通り.
12615
12616 TNUM_ALMID 登録できるアラームハンドラの数(動的生成対応でない
12617 カーネルでは,静的APIによって登録されたアラームハン
12618 ドラの数に一致)【NGKI2486】
12619
12620 【μITRON4.0仕様との関係】
12621
12622 TNUM_ALMIDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
12623 ----------------------------------------------------------------------
12624 CRE_ALM アラームハンドラの生成〔S〕【NGKI2487】
12625 acre_alm アラームハンドラの生成〔TD〕【NGKI2488】
12626
12627 【静的API】
12628 CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
12629
12630 【C言語API】
12631 ER_ID almid = acre_alm(const T_CALM *pk _calm)
12632
12633 【パラメータ】
12634 ID almid 生成するアラームハンドラのID番号(CRE_ALM
12635 の場合)
12636 T_CALM * pk_calm アラームハンドラの生成情報を入れたパケット
12637 へのポインタ(静的APIを除く)
12638
12639 *アラームハンドラの生成情報(パケットの内容)
12640 ATR almatr アラームハンドラ属性
12641 intptr_t exinf アラームハンドラの拡張情報
12642 ALMHDR almhdr アラームハンドラの先頭番地
12643
12644 【リターンパラメータ】
12645 ER_ID almid 生成されたアラームハンドラのID番号(正の値)
12646 またはエラーコード
12647
12648 【エラーコード】
12649 E_CTX コンテキストエラー
12650 ・非タスクコンテキストからの呼出し〔s〕【NGKI2489】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
254
12651 ・CPUロック状態からの呼出し〔s〕【NGKI2490】
12652 E_RSATR 予約属性
12653 ・almatrが無効【NGKI2491】
12654 ・属する保護ドメインの指定が有効範囲外またはカーネルド
12655 メイン以外〔sP〕【NGKI2492】
12656 ・カーネルドメインの囲みの中に記述されていない〔SP〕
12657 【NGKI2493】
12658 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2494】
12659 ・クラスの囲みの中に記述されていない〔SM〕【NGKI2495】
12660 ・その他の条件については機能の項を参照
12661 E_PAR パラメータエラー
12662 ・almhdrがプログラムの先頭番地として正しくない【NGKI2496】
12663 E_OACV オブジェクトアクセス違反
12664 ・システム状態に対する管理操作が許可されていない〔sP〕
12665 【NGKI2497】
12666 E_MACV メモリアクセス違反
12667 ・pk_calmが指すメモリ領域への読出しアクセスが許可されて
12668 いない〔sP〕【NGKI2498】
12669 E_NOID ID番号不足
12670 ・割り付けられるアラームハンドラIDがない〔sD〕【NGKI2499】
12671 E_OBJ オブジェクト状態エラー
12672 ・almidで指定したアラームハンドラが登録済み(CRE_ALMの
12673 場合)【NGKI2500】
12674
12675 【機能】
12676
12677 各パラメータで指定したアラームハンドラ生成情報に従って,アラームハンド
12678 ラを生成する.対象アラームハンドラは,動作していない状態に初期化される
12679 【NGKI2501】.
12680
12681 静的APIにおいては,almidはオブジェクト識別名,almatrは整数定数式パラメー
12682 タ,exinfとalmhdrは一般定数式パラメータである【NGKI2502】.
12683
12684 マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で,
12685 生成するアラームハンドラの属するクラスの割付け可能プロセッサが,システ
12686 ム時刻管理プロセッサのみでない場合には,E_RSATRエラーとなる【NGKI2503】.
12687
12688 【TOPPERS/ASPカーネルにおける規定】
12689
12690 ASPカーネルでは,CRE_ALMのみをサポートする【ASPS0179】.ただし,動的生
12691 成機能拡張パッケージでは,acre_almもサポートする【ASPS0180】.
12692
12693 【TOPPERS/FMPカーネルにおける規定】
12694
12695 FMPカーネルでは,CRE_ALMのみをサポートする【FMPS0152】.
12696
12697 【TOPPERS/HRP2カーネルにおける規定】
12698
12699 HRP2カーネルでは,CRE_ALMのみをサポートする【HRPS0146】.
12700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
255
12701 【μITRON4.0仕様との関係】
12702
12703 almhdrのデータ型をALMHDRに変更した.
12704 ----------------------------------------------------------------------
12705 AID_ALM 割付け可能なアラームハンドラIDの数の指定〔SD〕【NGKI2504】
12706
12707 【静的API】
12708 AID_ALM(uint_t noalm)
12709
12710 【パラメータ】
12711 uint_t noalm 割付け可能なアラームハンドラIDの数
12712
12713 【エラーコード】
12714 E_RSATR 予約属性
12715 ・カーネルドメインの囲みの中に記述されていない〔P〕【NGKI2505】
12716 ・クラスの囲みの中に記述されていない〔M〕【NGKI2506】
12717 ・その他の条件については機能の項を参照
12718 E_PAR パラメータエラー
12719 ・noalmが負の値【NGKI3286】
12720
12721 【機能】
12722
12723 noalmで指定した数のアラームハンドラIDを,アラームハンドラを生成するサー
12724 ビスコールによって割付け可能なアラームハンドラIDとして確保する
12725 【NGKI2507】.
12726
12727 noalmは整数定数式パラメータである【NGKI2508】.
12728
12729 マルチプロセッサ対応カーネルでグローバルタイマ方式を用いている場合で,
12730 AID_ALMが属するクラスの割付け可能プロセッサが,システム時刻管理プロセッ
12731 サのみでない場合には,E_RSATRエラーとなる【NGKI2509】.
12732 ----------------------------------------------------------------------
12733 SAC_ALM アラームハンドラのアクセス許可ベクタの設定〔SP〕【NGKI2510】
12734 sac_alm アラームハンドラのアクセス許可ベクタの設定〔TPD〕【NGKI2511】
12735
12736 【静的API】
12737 SAC_ALM(ID almid, { ACPTN acptn1, ACPTN acptn2,
12738 ACPTN acptn3, ACPTN acptn4 })
12739
12740 【C言語API】
12741 ER ercd = sac_alm(ID almid, const ACVCT *p_acvct)
12742
12743 【パラメータ】
12744 ID almid 対象アラームハンドラのID番号
12745 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
12746 インタ(静的APIを除く)
12747
12748 *アクセス許可ベクタ(パケットの内容)
12749 ACPTN acptn1 通常操作1のアクセス許可パターン
12750 ACPTN acptn2 通常操作2のアクセス許可パターン
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
256
12751 ACPTN acptn3 管理操作のアクセス許可パターン
12752 ACPTN acptn4 参照操作のアクセス許可パターン
12753
12754 【リターンパラメータ】
12755 ER ercd 正常終了(E_OK)またはエラーコード
12756
12757 【エラーコード】
12758 E_CTX コンテキストエラー
12759 ・非タスクコンテキストからの呼出し〔s〕【NGKI2512】
12760 ・CPUロック状態からの呼出し〔s〕【NGKI2513】
12761 E_ID 不正ID番号
12762 ・almidが有効範囲外〔s〕【NGKI2514】
12763 E_RSATR 予約属性
12764 ・対象アラームハンドラが属する保護ドメインの囲みの中に
12765 記述されていない〔S〕【NGKI2515】
12766 ・対象アラームハンドラが属するクラスの囲みの中に記述さ
12767 れていない〔SM〕【NGKI2516】
12768 E_NOEXS オブジェクト未登録
12769 ・対象アラームハンドラが未登録【NGKI2517】
12770 E_OACV オブジェクトアクセス違反
12771 ・対象アラームハンドラに対する管理操作が許可されていな
12772 い〔s〕【NGKI2518】
12773 E_MACV メモリアクセス違反
12774 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
12775 いない〔s〕【NGKI2519】
12776 E_OBJ オブジェクト状態エラー
12777 ・対象アラームハンドラは静的APIで生成された〔s〕【NGKI2520】
12778 ・対象アラームハンドラに対してアクセス許可ベクタが設定
12779 済み〔S〕【NGKI2521】
12780
12781 【機能】
12782
12783 almidで指定したアラームハンドラ(対象アラームハンドラ)のアクセス許可ベ
12784 クタ(4つのアクセス許可パターンの組)を,各パラメータで指定した値に設定
12785 する【NGKI2522】.
12786
12787 静的APIにおいては,almidはオブジェクト識別名,acptn1~acptn4は整数定数
12788 式パラメータである【NGKI2523】.
12789
12790 【TOPPERS/ASPカーネルにおける規定】
12791
12792 ASPカーネルでは,SAC_ALM,sac_almをサポートしない【ASPS0181】.
12793
12794 【TOPPERS/FMPカーネルにおける規定】
12795
12796 FMPカーネルでは,SAC_ALM,sac_almをサポートしない【FMPS0153】.
12797
12798 【TOPPERS/HRP2カーネルにおける規定】
12799
12800 HRP2カーネルでは,SAC_ALMのみをサポートする【HRPS0147】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
257
12801 ----------------------------------------------------------------------
12802 del_alm アラームハンドラの削除〔TD〕【NGKI2524】
12803
12804 【C言語API】
12805 ER ercd = del_alm(ID almid)
12806
12807 【パラメータ】
12808 ID almid 対象アラームハンドラのID番号
12809
12810 【リターンパラメータ】
12811 ER ercd 正常終了(E_OK)またはエラーコード
12812
12813 【エラーコード】
12814 E_CTX コンテキストエラー
12815 ・非タスクコンテキストからの呼出し【NGKI2525】
12816 ・CPUロック状態からの呼出し【NGKI2526】
12817 E_ID 不正ID番号
12818 ・almidが有効範囲外【NGKI2527】
12819 E_NOEXS オブジェクト未登録
12820 ・対象アラームハンドラが未登録【NGKI2528】
12821 E_OACV オブジェクトアクセス違反
12822 ・対象アラームハンドラに対する管理操作が許可されていな
12823 い〔P〕【NGKI2529】
12824 E_OBJ オブジェクト状態エラー
12825 ・対象アラームハンドラは静的APIで生成された【NGKI2530】
12826
12827 【機能】
12828
12829 almidで指定したアラームハンドラ(対象アラームハンドラ)を削除する.具体
12830 的な振舞いは以下の通り.
12831
12832 対象アラームハンドラの登録が解除され,そのアラームハンドラIDが未使用の
12833 状態に戻される【NGKI2531】.対象アラームハンドラが動作している状態であっ
12834 た場合には,登録解除の前に,アラームハンドラが動作していない状態となる
12835 【NGKI2532】.
12836
12837 【TOPPERS/ASPカーネルにおける規定】
12838
12839 ASPカーネルでは,del_almをサポートしない【ASPS0182】.ただし,動的生成
12840 機能拡張パッケージでは,del_almをサポートする【ASPS0183】.
12841
12842 【TOPPERS/FMPカーネルにおける規定】
12843
12844 FMPカーネルでは,del_almをサポートしない【FMPS0154】.
12845
12846 【TOPPERS/HRP2カーネルにおける規定】
12847
12848 HRP2カーネルでは,del_almをサポートしない【HRPS0148】.
12849 ----------------------------------------------------------------------
12850 sta_alm アラームハンドラの動作開始〔T〕【NGKI2533】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
258
12851 ista_alm アラームハンドラの動作開始〔I〕【NGKI2534】
12852
12853 【C言語API】
12854 ER ercd = sta_alm(ID almid, RELTIM almtim)
12855 ER ercd = ista_alm(ID almid, RELTIM almtim)
12856
12857 【パラメータ】
12858 ID almid 対象アラームハンドラのID番号
12859 RELTIM almtim アラームハンドラの起動時刻(相対時間)
12860
12861 【リターンパラメータ】
12862 ER ercd 正常終了(E_OK)またはエラーコード
12863
12864 【エラーコード】
12865 E_CTX コンテキストエラー
12866 ・非タスクコンテキストからの呼出し(sta_almの場合)【NGKI2535】
12867 ・タスクコンテキストからの呼出し(ista_almの場合)【NGKI2536】
12868 ・CPUロック状態からの呼出し
12869 E_ID 不正ID番号
12870 ・almidが有効範囲外【NGKI2537】
12871 E_PAR パラメータエラー
12872 ・almtimがTMAX_RELTIMより大きい【NGKI2538】
12873 E_NOEXS オブジェクト未登録
12874 ・対象アラームハンドラが未登録〔D〕【NGKI2539】
12875 E_OACV オブジェクトアクセス違反
12876 ・対象アラームハンドラに対する通常操作1が許可されていな
12877 い(sta_almの場合)〔P〕【NGKI2540】
12878
12879 【機能】
12880
12881 almidで指定したアラームハンドラ(対象アラームハンドラ)を動作開始する.
12882 具体的な振舞いは以下の通り.
12883
12884 対象アラームハンドラが動作していない状態であれば,対象アラームハンドラ
12885 は動作している状態となる【NGKI2541】.アラームハンドラを起動する時刻は,
12886 sta_almを呼び出してから,almtimで指定した相対時間後に設定される
12887 【NGKI2542】.
12888
12889 対象アラームハンドラが動作している状態であれば,アラームハンドラを起動
12890 する時刻の再設定のみが行われる【NGKI2543】.
12891 ----------------------------------------------------------------------
12892 msta_alm 割付けプロセッサ指定でのアラームハンドラの動作開始〔TM〕【NGKI2544】
12893 imsta_alm 割付けプロセッサ指定でのアラームハンドラの動作開始〔IM〕【NGKI2545】
12894
12895 【C言語API】
12896 ER ercd = msta_alm(ID almid, RELTIM almtim, ID prcid)
12897 ER ercd = imsta_alm(ID almid, RELTIM almti m, ID prcid)
12898
12899 【パラメータ】
12900 ID almid 対象アラームハンドラのID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
259
12901 RELTIM almtim アラームハンドラの起動時刻(相対時間)
12902 ID prcid アラームハンドラの割付け対象のプロセッサの
12903 ID 番号
12904
12905 【リターンパラメータ】
12906 ER ercd 正常終了(E_OK)またはエラーコード
12907
12908 【エラーコード】
12909 E_CTX コンテキストエラー
12910 ・非タスクコンテキストからの呼出し(msta_almの場合)
12911 【NGKI2546】
12912 ・タスクコンテキストからの呼出し(imsta_almの場合)【NGKI2547】
12913 ・CPUロック状態からの呼出し【NGKI2548】
12914 E_NOSPT 未サポート機能
12915 ・条件については機能の項を参照
12916 E_ID 不正ID番号
12917 ・almidが有効範囲外【NGKI2549】
12918 ・prcidが有効範囲外【NGKI2550】
12919 E_PAR パラメータエラー
12920 ・almtimがTMAX_RELTIMより大きい【NGKI2551】
12921 ・その他の条件については機能の項を参照
12922 E_NOEXS オブジェクト未登録
12923 ・対象アラームハンドラが未登録〔D〕【NGKI2552】
12924 E_OACV オブジェクトアクセス違反
12925 ・対象アラームハンドラに対する通常操作1が許可されていな
12926 い(msta_almの場合)〔P〕【NGKI2553】
12927
12928 【機能】
12929
12930 prcidで指定したプロセッサを割付けプロセッサとして,almidで指定したアラー
12931 ムハンドラ(対象アラームハンドラ)を動作開始する.具体的な振舞いは以下
12932 の通り.
12933
12934 対象アラームハンドラが動作していない状態であれば,対象アラームハンドラ
12935 の割付けプロセッサがprcidで指定したプロセッサに変更された後,対象アラー
12936 ムハンドラは動作している状態となる【NGKI2554】.アラームハンドラを起動
12937 する時刻は,msta_almを呼び出してから,almtimで指定した相対時間後に設定
12938 される【NGKI2555】.
12939
12940 対象アラームハンドラが動作している状態であれば,対象アラームハンドラの
12941 割付けプロセッサがprcidで指定したプロセッサに変更された後,アラームハン
12942 ドラを起動する時刻の再設定が行われる【NGKI2556】.
12943
12944 対象アラームハンドラが実行中である場合には,割付けプロセッサを変更して
12945 も,実行中のアラームハンドラを実行するプロセッサは変更されない
12946 【NGKI2557】.対象アラームハンドラが変更後の割付けプロセッサで実行され
12947 るのは,次に起動される時からである【NGKI2558】.
12948
12949 対象アラームハンドラの属するクラスの割付け可能プロセッサが,prcidで指定
12950 したプロセッサを含んでいない場合には,E_PARエラーとなる【NGKI2559】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
260
12951
12952 prcidにTPRC_INI(=0)を指定すると,対象アラームハンドラの割付けプロセッ
12953 サを,それが属するクラスの初期割付けプロセッサとする【NGKI2560】.
12954
12955 グローバルタイマ方式を用いている場合,msta_alm/imsta_almはE_NOSPTを返
12956 す【NGKI2561】.
12957
12958 【使用上の注意】
12959
12960 msta_alm/imsta_almで実行中のアラームハンドラの割付けプロセッサを変更し
12961 た場合,同じアラームハンドラが異なるプロセッサで同時に実行される可能性
12962 がある.特に,almtimに0を指定する場合に,注意が必要である.
12963
12964 【μITRON4.0仕様との関係】
12965
12966 μITRON4.0仕様に定義されていないサービスコールである.
12967 ----------------------------------------------------------------------
12968 stp_alm アラームハンドラの動作停止〔T〕【NGKI2562】
12969 istp_alm アラームハンドラの動作停止〔I〕【NGKI2563】
12970
12971 【C言語API】
12972 ER ercd = stp_alm(ID almid)
12973 ER ercd = istp_alm(ID almid)
12974
12975 【パラメータ】
12976 ID almid 対象アラームハンドラのID番号
12977
12978 【リターンパラメータ】
12979 ER ercd 正常終了(E_OK)またはエラーコード
12980
12981 【エラーコード】
12982 E_CTX コンテキストエラー
12983 ・非タスクコンテキストからの呼出し(stp_almの場合)【NGKI2564】
12984 ・タスクコンテキストからの呼出し(istp_almの場合)【NGKI2565】
12985 ・CPUロック状態からの呼出し【NGKI2566】
12986 E_ID 不正ID番号
12987 ・almidが有効範囲外【NGKI2567】
12988 E_NOEXS オブジェクト未登録
12989 ・対象アラームハンドラが未登録〔D〕【NGKI2568】
12990 E_OACV オブジェクトアクセス違反
12991 ・対象アラームハンドラに対する通常操作2が許可されていな
12992 い(stp_almの場合)〔P〕【NGKI2569】
12993
12994 【機能】
12995
12996 almidで指定したアラームハンドラ(対象アラームハンドラ)を動作停止する.
12997 具体的な振舞いは以下の通り.
12998
12999 対象アラームハンドラが動作している状態であれば,動作していない状態とな
13000 る【NGKI2570】.対象アラームハンドラが動作していない状態であれば,何も
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
261
13001 行われずに正常終了する【NGKI2571】.
13002 ----------------------------------------------------------------------
13003 ref_alm アラームハンドラの状態参照〔T〕【NGKI2572】
13004
13005 【C言語API】
13006 ER ercd = ref_alm(ID almid, T_RALM *pk_ralm)
13007
13008 【パラメータ】
13009 ID almid 対象アラームハンドラのID番号
13010 T_RALM * pk_ralm アラームハンドラの現在状態を入れるパケット
13011 へのポインタ
13012
13013 【リターンパラメータ】
13014 ER ercd 正常終了(E_OK)またはエラーコード
13015
13016 *アラームハンドラの現在状態(パケットの内容)
13017 STAT almstat アラームハンドラの動作状態
13018 RELTIM lefttim アラームハンドラを起動する時刻までの相対時間
13019 ID prcid アラームハンドラの割付けプロセッサのID(マル
13020 チプロセッサ対応カーネルの場合)
13021
13022 【エラーコード】
13023 E_CTX コンテキストエラー
13024 ・非タスクコンテキストからの呼出し【NGKI2573】
13025 ・CPUロック状態からの呼出し【NGKI2574】
13026 E_ID 不正ID番号
13027 ・almidが有効範囲外【NGKI2575】
13028 E_NOEXS オブジェクト未登録
13029 ・対象アラームハンドラが未登録〔D〕【NGKI2576】
13030 E_OACV オブジェクトアクセス違反
13031 ・対象アラームハンドラに対する参照操作が許可されていな
13032 い〔P〕【NGKI2577】
13033 E_MACV メモリアクセス違反
13034 ・pk_ralmが指すメモリ領域への書込みアクセスが許可されて
13035 いない〔P〕【NGKI2578】
13036
13037 【機能】
13038
13039 almidで指定したアラームハンドラ(対象アラームハンドラ)の現在状態を参照
13040 する.参照した現在状態は,pk_ralmで指定したパケットに返される【NGKI2579】.
13041
13042 almstatには,対象アラームハンドラの現在の動作状態を表す次のいずれかの値
13043 が返される【NGKI2580】.
13044
13045 TALM_STP 0x01U アラームハンドラが動作していない状態
13046 TALM_STA 0x02U アラームハンドラが動作している状態
13047
13048 対象アラームハンドラが動作している状態である場合には,lefttimに,アラー
13049 ムハンドラ起動する時刻までの相対時間が返される【NGKI2581】.対象アラー
13050 ムハンドラが動作していない状態である場合には,lefttimの値は保証されない
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
262
13051 【NGKI2582】.
13052
13053 マルチプロセッサ対応カーネルでは,prcidに,対象アラームハンドラの割付け
13054 プロセッサのID番号が返される【NGKI2583】.
13055
13056 【使用上の注意】
13057
13058 ref_almはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
13059 ない.これは,ref_almを呼び出し,対象アラームハンドラの現在状態を参照し
13060 た直後に割込みが発生した場合,ref_almから戻ってきた時には対象アラームハ
13061 ンドラの状態が変化している可能性があるためである.
13062
13063 【μITRON4.0仕様との関係】
13064
13065 TALM_STPとTALM_STAを値を変更した.
13066 ----------------------------------------------------------------------
13067
13068 4.6.4 オーバランハンドラ
13069
13070 オーバランハンドラは,タスクが使用したプロセッサ時間が,指定した時間を
13071 超えた場合に起動されるタイムイベントハンドラである.オーバランハンドラ
13072 は,システムで1つのみ登録することができる【NGKI2584】.
13073
13074 オーバランハンドラ機能に関連して,各タスクが持つ情報は次の通り
13075 【NGKI2585】.
13076
13077 ・オーバランハンドラの動作状態
13078 ・残りプロセッサ時間
13079
13080 オーバランハンドラの動作状態は,タスク毎に,動作している状態と動作して
13081 いない状態のいずれかをとる【NGKI2586】.残りプロセッサ時間は,オーバラ
13082 ンハンドラが動作している状態の時に,タスクが使用できる残りのプロセッサ
13083 時間を表す.
13084
13085 オーバランハンドラの動作状態は,タスクの起動時に,動作していない状態に
13086 初期化される【NGKI2587】.
13087
13088 残りプロセッサ時間は,オーバランハンドラが動作している状態でタスクが実
13089 行している間,タスクが使用したプロセッサ時間の分だけ減少する【NGKI2588】.
13090 残りプロセッサ時間が0になると(これをオーバランと呼ぶ),オーバランハン
13091 ドラが起動される【NGKI2589】.
13092
13093 タスクが使用したプロセッサ時間には,そのタスク自身とタスク例外処理ルー
13094 チン,それらから呼び出したサービルコール(拡張サービスコールを含む)の
13095 実行時間を含む【NGKI2590】.一方,タスクの実行中に起動されたカーネル管
13096 理の割込みハンドラ(割込みサービスルーチン,周期ハンドラ,アラームハン
13097 ドラ,オーバランハンドラの実行時間を含む)とカーネル管理のCPU例外ハンド
13098 ラの実行時間は含まないが,割込みハンドラおよびCPU例外ハンドラの呼出し/
13099 復帰にかかる時間と,それらの入口処理と出口処理の一部の実行時間は含んで
13100 しまう【NGKI2591】.また,タスクの実行中に起動されたカーネル管理外の割
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
263
13101 込みハンドラとカーネル管理外のCPU例外ハンドラの実行時間も含む
13102 【NGKI2592】.
13103
13104 プロセッサ時間は,符号無しの整数型であるOVRTIM型で表し,単位はマイクロ
13105 秒とする【NGKI2593】.ただし,プロセッサ時間には,OVRTIM型に格納できる
13106 任意の値を指定できるとは限らず,指定できる値にターゲット定義の上限があ
13107 る場合がある【NGKI2594】.プロセッサ時間に指定できる最大値は,構成マク
13108 ロTMAX_OVRTIMに定義されている【NGKI2595】.また,タスクが使用したプロセッ
13109 サ時間の計測精度はターゲットに依存する【NGKI2596】.
13110
13111 保護機能対応カーネルにおいて,オーバランハンドラは,カーネルドメインに
13112 属する【NGKI2597】.
13113
13114 ターゲット定義で,オーバランハンドラ機能がサポートされていない場合があ
13115 る【NGKI2598】.オーバランハンドラ機能がサポートされている場合には,
13116 TOPPERS_SUPPORT_OVRHDRがマクロ定義される【NGKI2599】.サポートされてい
13117 ない場合にオーバランハンドラ機能のサービスコールを呼び出すと,E_NOSPTエ
13118 ラーが返るか,リンク時にエラーとなる【NGKI2600】.
13119
13120 オーバランハンドラ機能に用いるデータ型は次の通り.
13121
13122 OVRTIM プロセッサ時間(符号無し整数,単位はマイクロ秒,ulong_t
13123 に定義)【NGKI2601】
13124
13125 オーバランハンドラ属性に指定できる属性はない【NGKI2602】.そのためオー
13126 バランハンドラ属性には,TA_NULLを指定しなければならない【NGKI2603】.
13127
13128 C言語によるオーバランハンドラの記述形式は次の通り【NGKI2604】.
13129
13130 void overrun_handler(ID tskid, intptr_t exinf)
13131 {
13132 オーバランハンドラ本体
13133 }
13134
13135 tskidにはオーバランを起こしたタスクのID番号が,exinfにはそのタスクの拡
13136 張情報が,それぞれ渡される【NGKI2605】.
13137
13138 オーバランハンドラ機能に関連するカーネル構成マクロは次の通り.
13139
13140 TMAX_OVRTIM プロセッサ時間に指定できる最大値【NGKI2606】
13141
13142 TOPPERS_SUPPORT_OVRHDR オーバランハンドラ機能がサポートされて
13143 いる【NGKI2607】
13144
13145 【使用上の注意】
13146
13147 マルチプロセッサ対応カーネルでは,オーバランハンドラが異なるプロセッサ
13148 で同時に実行される可能性があるので,注意が必要である.
13149
13150 【TOPPERS/ASPカーネルにおける規定】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
264
13151
13152 ASPカーネルでは,オーバランハンドラをサポートしない【ASPS0184】.ただし,
13153 オーバランハンドラ機能拡張パッケージを用いると,オーバランハンドラ機能
13154 を追加することができる【ASPS0185】.
13155
13156 【TOPPERS/FMPカーネルにおける規定】
13157
13158 FMPカーネルでは,オーバランハンドラをサポートしない【FMPS0155】.
13159
13160 【TOPPERS/HRP2カーネルにおける規定】
13161
13162 HRP2カーネルでは,オーバランハンドラをサポートする【HRPS0149】.
13163
13164 【μITRON4.0仕様との関係】
13165
13166 OVRTIMの時間単位は,μITRON4.0仕様では実装定義としていたが,この仕様で
13167 はマイクロ秒と規定した.
13168
13169 TMAX_OVRTIMは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
13170 ----------------------------------------------------------------------
13171 DEF_OVR オーバランハンドラの定義〔S〕【NGKI2608】
13172 def_ovr オーバランハンドラの定義〔TD〕【NGKI2609】
13173
13174 【静的API】
13175 DEF_OVR({ ATR ovratr, OVRHDR ovrhdr })
13176
13177 【C言語API】
13178 ER ercd = def_ovr(const T_DOVR *pk_dovr)
13179
13180 【パラメータ】
13181 T_DOVR * pk_dovr オーバランハンドラの定義情報を入れたパケッ
13182 トへのポインタ(静的APIを除く)
13183
13184 *オーバランハンドラの定義情報(パケットの内容)
13185 ATR ovratr オーバランハンドラ属性
13186 OVRHDR ovrhdr オーバランハンドラの先頭番地
13187
13188 【リターンパラメータ】
13189 ER ercd 正常終了(E_OK)またはエラーコード
13190
13191 【エラーコード】
13192 E_CTX コンテキストエラー
13193 ・非タスクコンテキストからの呼出し〔s〕【NGKI2610】
13194 ・CPUロック状態からの呼出し〔s〕【NGKI2611】
13195 E_RSATR 予約属性
13196 ・ovratrが無効【NGKI2612】
13197 ・その他の条件については機能の項を参照
13198 E_PAR パラメータエラー
13199 ・ovrhdrがプログラムの先頭番地として正しくない【NGKI2613】
13200 E_OACV オブジェクトアクセス違反
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
265
13201 ・システム状態に対する管理操作が許可されていない〔sP〕
13202 【NGKI2614】
13203 E_MACV メモリアクセス違反
13204 ・pk_dovrが指すメモリ領域への読出しアクセスが許可されて
13205 いない〔sP〕【NGKI2615】
13206 E_OBJ オブジェクト状態エラー
13207 ・条件については機能の項を参照
13208
13209 【機能】
13210
13211 各パラメータで指定したオーバランハンドラ定義情報に従って,オーバランハ
13212 ンドラを定義する【NGKI2616】.ただし,def_ovrにおいてpk_dovrをNULLにし
13213 た場合には,オーバランハンドラの定義を解除する【NGKI2617】.
13214
13215 静的APIにおいては,ovratrは整数定数式パラメータ,ovrhdrは一般定数式パラ
13216 メータである【NGKI2618】.
13217
13218 オーバランハンドラを定義する場合(DEF_OVRの場合およびdef_ovrにおいて
13219 pk_dovrをNULL以外にした場合)で,すでにオーバランハンドラが定義されてい
13220 る場合には,E_OBJエラーとなる【NGKI2619】.
13221
13222 保護機能対応カーネルにおいて,DEF_OVRは,カーネルドメインの囲みの中に記
13223 述しなければならない.そうでない場合には,E_RSATRエラーとなる
13224 【NGKI2621】.また,def_ovrでオーバランハンドラを定義する場合には,オー
13225 バランハンドラの属する保護ドメインを設定する必要はなく,オーバランハン
13226 ドラ属性にTA_DOM(domid)を指定した場合にはE_RSATRエラーとなる【NGKI2622】.
13227 ただし,TA_DOM(TDOM_SELF)を指定した場合には,指定が無視され,E_RSATRエ
13228 ラーは検出されない【NGKI2623】.
13229
13230 マルチプロセッサ対応カーネルでは,DEF_OVRは,クラスの囲みの外に記述しな
13231 ければならない.そうでない場合には,E_RSATRエラーとなる【NGKI2625】.ま
13232 た,def_ovrオーバランハンドラを定義する場合には,オーバランハンドラの属
13233 するクラスを設定する必要はなく,オーバランハンドラ属性にTA_CLS(clsid)を
13234 指定した場合にはE_RSATRエラーとなる【NGKI2626】.ただし,
13235 TA_CLS(TCLS_SELF)を指定した場合には,指定が無視され,E_RSATRエラーは検
13236 出されない【NGKI2627】.
13237
13238 オーバランハンドラの定義を解除する場合(def_ovrにおいてpk_dovrをNULLに
13239 した場合)で,オーバランハンドラが定義されていない場合には,E_OBJエラー
13240 となる【NGKI2628】.
13241
13242 オーバランハンドラの定義を解除すると,オーバランハンドラの動作状態は,
13243 すべてのタスクに対して動作していない状態となる【NGKI2629】.
13244
13245 【使用上の注意】
13246
13247 def_ovrによりオーバランハンドラの定義を解除する場合,サービスコールの処
13248 理時間およびカーネル内での割込み禁止時間が,タスクの総数に比例して長く
13249 なる.特に,タスクの総数が多い場合,カーネル内での割込み禁止時間が長く
13250 なるため,注意が必要である.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
266
13251
13252 【TOPPERS/ASPカーネルにおける規定】
13253
13254 ASPカーネルのオーバランハンドラ機能拡張パッケージでは,DEF_OVRのみをサ
13255 ポートする【ASPS0186】.
13256
13257 【TOPPERS/HRP2カーネルにおける規定】
13258
13259 HRP2カーネルでは,DEF_OVRのみをサポートする【HRPS0150】.
13260
13261 【μITRON4.0仕様との関係】
13262
13263 ovrhdrのデータ型をOVRHDRに変更した.
13264
13265 def_ovrによって定義済みのオーバランハンドラを再定義しようとした場合に,
13266 E_OBJエラーとすることにした.オーバランハンドラの定義を変更するには,一
13267 度定義を解除してから,再度定義する必要がある.
13268 ----------------------------------------------------------------------
13269 sta_ovr オーバランハンドラの動作開始〔T〕【NGKI2630】
13270 ista_ovr オーバランハンドラの動作開始〔I〕【NGKI2631】
13271
13272 【C言語API】
13273 ER ercd = sta_ovr(I D tskid, OVRTIM ovrtim)
13274 ER ercd = ista_ovr(ID tskid, OVRTIM ovrtim)
13275
13276 【パラメータ】
13277 ID tskid 対象タスクのID番号
13278 OVRTIM ovrtim 対象タスクの残りプロセッサ時間
13279
13280 【リターンパラメータ】
13281 ER ercd 正常終了(E_OK)またはエラーコード
13282
13283 【エラーコード】
13284 E_CTX コンテキストエラー
13285 ・非タスクコンテキストからの呼出し(sta_ovrの場合)【NGKI2632】
13286 ・タスクコンテキストからの呼出し(ista_ovrの場合)【NGKI2633】
13287 ・CPUロック状態からの呼出し【NGKI2634】
13288 E_ID 不正ID番号
13289 ・tskidが有効範囲外【NGKI2635】
13290 E_NOEXS オブジェクト未登録
13291 ・対象タスクが未登録〔D〕【NGKI2636】
13292 E_OACV オブジェクトアクセス違反
13293 ・対象タスクに対する通常操作2が許可されていない(sta_ovr
13294 の場合)〔P〕【NGKI2637】
13295 E_PAR パラメータエラー
13296 ・ovrtimが0,またはTMAX_OVRTIMより大きい【NGKI2643】
13297 E_OBJ オブジェクト状態エラー
13298 ・オーバランハンドラが定義されていない【NGKI2638】
13299
13300 【機能】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
267
13301
13302 tskidで指定したタスク(対象タスク)に対して,オーバランハンドラの動作を
13303 開始する.具体的な振舞いは以下の通り.
13304
13305 対象タスクに対するオーバランハンドラの動作状態は,動作している状態とな
13306 り,残りプロセッサ時間は,ovrtimに指定した時間に設定される【NGKI2639】.
13307 対象タスクに対してオーバランハンドラが動作している状態であれば,残りプ
13308 ロセッサ時間の設定のみが行われる【NGKI2640】.
13309
13310 sta_ovrにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
13311 となる【NGKI2641】.
13312
13313 【μITRON4.0仕様との関係】
13314
13315 ista_ovrは,μITRON4.0仕様に定義されていないサービスコールである.
13316 ----------------------------------------------------------------------
13317 stp_ovr オーバランハンドラの動作停止〔T〕【NGKI2644】
13318 istp_ovr オーバランハンドラの動作停止〔I〕【NGKI2645】
13319
13320 【C言語API】
13321 ER ercd = stp_ovr(ID tskid)
13322 ER ercd = istp_ovr(ID tskid)
13323
13324 【パラメータ】
13325 ID tskid 対象タスクのID番号
13326
13327 【リターンパラメータ】
13328 ER ercd 正常終了(E_OK)またはエラーコード
13329
13330 【エラーコード】
13331 E_CTX コンテキストエラー
13332 ・非タスクコンテキストからの呼出し(stp_ovrの場合)【NGKI2646】
13333 ・タスクコンテキストからの呼出し(istp_ovrの場合)【NGKI2647】
13334 ・CPUロック状態からの呼出し【NGKI2648】
13335 E_ID 不正ID番号
13336 ・tskidが有効範囲外【NGKI2649】
13337 E_NOEXS オブジェクト未登録
13338 ・対象タスクが未登録〔D〕【NGKI2650】
13339 E_OACV オブジェクトアクセス違反
13340 ・対象タスクに対する通常操作2が許可されていない(stp_ovr
13341 の場合)〔P〕【NGKI2651】
13342 E_OBJ オブジェクト状態エラー
13343 ・オーバランハンドラが定義されていない【NGKI2652】
13344
13345 【機能】
13346
13347 tskidで指定したタスク(対象タスク)に対して,オーバランハンドラの動作を
13348 停止する.具体的な振舞いは以下の通り.
13349
13350 対象タスクに対するオーバランハンドラの動作状態は,動作していない状態と
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
268
13351 なる【NGKI2653】.対象タスクに対してオーバランハンドラが動作していない
13352 状態であれば,何も行われずに正常終了する【NGKI2654】.
13353
13354 stp_ovrにおいてtskidにTSK_SELF(=0)を指定すると,自タスクが対象タスク
13355 となる【NGKI2655】.
13356
13357 【μITRON4.0仕様との関係】
13358
13359 istp_ovrは,μITRON4.0仕様に定義されていないサービスコールである.
13360 ----------------------------------------------------------------------
13361 ref_ovr オーバランハンドラの状態参照〔T〕【NGKI2656】
13362
13363 【C言語API】
13364 ER ercd = ref_ovr(ID tskid, T_ROVR *pk_rovr)
13365
13366 【パラメータ】
13367 ID tskid 対象タスクのID番号
13368 T_ROVR * pk_rovr オーバランハンドラの現在状態を入れるパケッ
13369 トへのポインタ
13370
13371 【リターンパラメータ】
13372 ER ercd 正常終了(E_OK)またはエラーコード
13373
13374 *タスクの現在状態(パケットの内容)
13375 STAT ovrstat オーバランハンドラの動作状態
13376 OVRTIM leftotm 残りプロセッサ時間
13377
13378 【エラーコード】
13379 E_CTX コンテキストエラー
13380 ・非タスクコンテキストからの呼出し【NGKI2657】
13381 ・CPUロック状態からの呼出し【NGKI2658】
13382 E_ID 不正ID番号
13383 ・tskidが有効範囲外【NGKI2659】
13384 E_NOEXS オブジェクト未登録
13385 ・対象タスクが未登録〔D〕【NGKI2660】
13386 E_OACV オブジェクトアクセス違反
13387 ・対象タスクに対する参照操作が許可されていない〔P〕【NGKI2661】
13388 E_MACV メモリアクセス違反
13389 ・pk_rovrが指すメモリ領域への書込みアクセスが許可されて
13390 いない〔P〕【NGKI2662】
13391 E_OBJ オブジェクト状態エラー
13392 ・オーバランハンドラが定義されていない【NGKI2663】
13393
13394 【機能】
13395
13396 tskidで指定したタスク(対象タスク)に対するオーバランハンドラの現在状態
13397 を参照する.参照した現在状態は,pk_rovrで指定したメモリ領域に返される
13398 【NGKI2664】.
13399
13400 ovrstatには,対象タスクに対するオーバランハンドラの動作状態を表す次のい
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
269
13401 ずれかの値が返される【NGKI2665】.
13402
13403 TOVR_STP 0x01U オーバランハンドラが動作していない状態
13404 TOVR_STA 0x02U オーバランハンドラが動作している状態
13405
13406 対象タスクに対してオーバランハンドラが動作している状態の場合には,
13407 leftotmに,オーバランハンドラが起動されるまでの残りプロセッサ時間が返さ
13408 れる【NGKI2666】.オーバランハンドラが起動される直前には,leftotmに0が
13409 返される可能性がある【NGKI2667】.オーバランハンドラが動作していない状
13410 態の場合には,leftotmの値は保証されない【NGKI2668】.
13411
13412 tskidにTSK_SELF(=0)を指定すると,自タスクが対象タスクとなる
13413 【NGKI2669】.
13414
13415 【使用上の注意】
13416
13417 ref_ovrはデバッグ時向けの機能であり,その他の目的に使用することは推奨し
13418 ない.これは,ref_ovrを呼び出し,対象オーバランハンドラの現在状態を参照
13419 した直後に割込みが発生した場合,ref_ovrから戻ってきた時には対象オーバラ
13420 ンハンドラの状態が変化している可能性があるためである.
13421
13422 【未決定事項】
13423
13424 マルチプロセッサ対応カーネルにおいて,対象タスクが,自タスクが割付けら
13425 れたプロセッサと異なるプロセッサに割り付けられている場合に,leftotmを参
13426 照できるとするかどうかは,今後の課題である.
13427
13428 【μITRON4.0仕様との関係】
13429
13430 TOVR_STPとTOVR_STAを値を変更した.
13431 ----------------------------------------------------------------------
13432
13433 4.7 システム状態管理機能
13434
13435 システム状態管理機能は,特定のオブジェクトに関連しないシステムの状態を
13436 変更/参照するための機能である.
13437
13438 ----------------------------------------------------------------------
13439 SAC_SYS システム状態のアクセス許可ベクタの設定〔SP〕【NGKI2670】
13440 sac_sys システム状態のアクセス許可ベクタの設定〔TPD〕【NGKI2671】
13441
13442 【静的API】
13443 SAC_SYS({ ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
13444
13445 【C言語API】
13446 ER ercd = sac_sys(const ACVCT *p_acvct)
13447
13448 【パラメータ】
13449 ACVCT * p _acvct アクセス許可ベクタを入れたパケットへのポ
13450 インタ(静的APIを除く)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
270
13451
13452 *アクセス許可ベクタ(パケットの内容)
13453 ACPTN acptn1 通常操作1のアクセス許可パターン
13454 ACPTN acptn2 通常操作2のアクセス許可パターン
13455 ACPTN acptn3 管理操作のアクセス許可パターン
13456 ACPTN acptn4 参照操作のアクセス許可パターン
13457
13458 【リターンパラメータ】
13459 ER ercd 正常終了(E_OK)またはエラーコード
13460
13461 【エラーコード】
13462 E_CTX コンテキストエラー
13463 ・非タスクコンテキストからの呼出し〔s〕【NGKI2672】
13464 ・CPUロック状態からの呼出し〔s〕【NGKI2673】
13465 E_RSATR 予約属性
13466 ・カーネルドメインの囲みの中に記述されていない〔S〕【NGKI2674】
13467 ・クラスの囲みの中に記述されている〔SM〕【NGKI2675】
13468 E_OACV オブジェクトアクセス違反
13469 ・カーネルドメイン以外からの呼出し〔s〕【NGKI2676】
13470 E_OBJ オブジェクト状態エラー
13471 ・システム状態のアクセス許可ベクタが設定済み〔S〕【NGKI2677】
13472
13473 【機能】
13474
13475 システム状態のアクセス許可ベクタ(4つのアクセス許可パターンの組)を,各
13476 パラメータで指定した値に設定する【NGKI2678】.
13477
13478 静的APIにおいては,acptn1~acptn4は整数定数式パラメータである【NGKI2679】.
13479
13480 【TOPPERS/ASPカーネルにおける規定】
13481
13482 ASPカーネルでは,SAC_SYS,sac_sysをサポートしない【ASPS0187】.
13483
13484 【TOPPERS/FMPカーネルにおける規定】
13485
13486 FMPカーネルでは,SAC_SYS,sac_sysをサポートしない【FMPS0156】.
13487
13488 【TOPPERS/HRP2カーネルにおける規定】
13489
13490 HRP2カーネルでは,SAC_SYSのみをサポートする【HRPS0151】.
13491
13492 【TOPPERS/SSPカーネルにおける規定】
13493
13494 SSPカーネルでは,SAC_SYS,sac_sysをサポートしない【SSPS0130】.
13495 ----------------------------------------------------------------------
13496 rot_rdq タスクの優先順位の回転〔T〕【NGKI2680】
13497 irot_rdq タスクの優先順位の回転〔I〕【NGKI2681】
13498
13499 【C言語API】
13500 ER ercd = rot_rdq(PRI tskpri)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
271
13501 ER ercd = irot_rdq(PRI tskpri)
13502
13503 【パラメータ】
13504 PRI tskpri 回転対象の優先度(対象優先度)
13505
13506 【リターンパラメータ】
13507 ER ercd 正常終了(E_OK)またはエラーコード
13508
13509 【エラーコード】
13510 E_CTX コンテキストエラー
13511 ・非タスクコンテキストからの呼出し(rot_rdqの場合)【NGKI2682】
13512 ・タスクコンテキストからの呼出し(irot_rdqの場合)【NGKI2683】
13513 ・CPUロック状態からの呼出し【NGKI2684】
13514 E_NOSPT 未サポート機能
13515 ・条件については機能の項を参照
13516 E_PAR パラメータエラー
13517 ・tskpriが有効範囲外【NGKI2685】
13518 E_OACV オブジェクトアクセス違反
13519 ・システム状態に対する通常操作1が許可されていない〔P〕
13520 【NGKI2686】
13521
13522 【機能】
13523
13524 tskpriで指定した優先度(対象優先度)を持つ実行できる状態のタスクの中で,
13525 最も優先順位が高いタスクを,同じ優先度のタスクの中で最も優先順位が低い
13526 状態にする【NGKI2687】.対象優先度を持つ実行できる状態のタスクが無いか
13527 1つのみの場合には,何も行われずに正常終了する【NGKI2688】.
13528
13529 rot_rdqにおいて,tskpriにTPRI_SELF(=0)を指定すると,自タスクのベース
13530 優先度が対象優先度となる【NGKI2689】.
13531
13532 対象優先度を持つ実行できる状態のタスクの中で,最も優先順位が高いタスク
13533 が制約タスクの場合には,E_NOSPTエラーとなる【NGKI2690】.
13534
13535 【TOPPERS/SSPカーネルにおける規定】
13536
13537 SSPカーネルでは,rot_rdq,irot_rdqをサポートしない【SSPS0131】.
13538 ----------------------------------------------------------------------
13539 mrot_rdq プロセッサ指定でのタスクの優先順位の回転〔TM〕【NGKI2691】
13540 imrot_rdq プロセッサ指定でのタスクの優先順位の回転〔IM〕【NGKI2692】
13541
13542 【C言語API】
13543 ER ercd = mrot_rdq(PRI tskpri, ID prcid)
13544 ER ercd = imrot_rdq(PRI tskpri, ID prcid)
13545
13546 【パラメータ】
13547 PRI tskpri 回転対象の優先度(対象優先度)
13548 ID prcid 優先順位の回転対象とするプロセッサのID番号
13549
13550 【リターンパラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
272
13551 ER ercd 正常終了(E_OK)またはエラーコード
13552
13553 【エラーコード】
13554 E_CTX コンテキストエラー
13555 ・非タスクコンテキストからの呼出し(mrot_rdqの場合)
13556 【NGKI2693】
13557 ・タスクコンテキストからの呼出し(imrot_rdqの場合)【NGKI2694】
13558 ・CPUロック状態からの呼出し【NGKI2695】
13559 E_NOSPT 未サポート機能
13560 ・条件については機能の項を参照
13561 E_ID 不正ID番号
13562 ・prcidが有効範囲外【NGKI2696】
13563 E_PAR パラメータエラー
13564 ・tskpriが有効範囲外【NGKI2697】
13565 E_OACV オブジェクトアクセス違反
13566 ・システム状態に対する通常操作1が許可されていない〔P〕
13567 【NGKI2698】
13568
13569 【機能】
13570
13571 prcidで指定したプロセッサに割り付けられており,tskpriで指定した優先度
13572 (対象優先度)を持つ実行できる状態のタスクの中で,最も優先順位が高いタ
13573 スクを,同じ優先度のタスクの中で最も優先順位が低い状態にする【NGKI2699】.
13574 対象優先度を持つ実行できる状態のタスクが無いか1つのみの場合には,何も行
13575 われずに正常終了する【NGKI2700】.
13576
13577 mrot_rdqにおいて,tskpriにTPRI_SELF(=0)を指定すると,自タスクのベー
13578 ス優先度が対象優先度となる【NGKI2701】.
13579
13580 prcidで指定したプロセッサに割り付けられており,対象優先度を持つ実行でき
13581 る状態のタスクの中で,最も優先順位が高いタスクが制約タスクの場合には,
13582 E_NOSPTエラーとなる【NGKI2702】.
13583
13584 【TOPPERS/ASPカーネルにおける規定】
13585
13586 ASPカーネルでは,mrot_rdq,imrot_rdqをサポートしない【ASPS0188】.
13587
13588 【TOPPERS/HRP2カーネルにおける規定】
13589
13590 HRP2カーネルでは,mrot_rdq,imrot_rdqをサポートしない【HRPS0152】.
13591
13592 【TOPPERS/SSPカーネルにおける規定】
13593
13594 SSPカーネルでは,mrot_rdq,imrot_rdqをサポートしない【SSPS0132】.
13595
13596 【μITRON4.0仕様との関係】
13597
13598 μITRON4.0仕様に定義されていないサービスコールである.
13599 ----------------------------------------------------------------------
13600 get_tid 実行状態のタスクIDの参照〔T〕【NGKI2703】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
273
13601 iget_tid 実行状態のタスクIDの参照〔I〕【NGKI2704】
13602
13603 【C言語API】
13604 ER ercd = get_tid(ID *p_tskid)
13605 ER ercd = iget_tid(ID *p_tskid)
13606
13607 【パラメータ】
13608 ID * p_tskid タスクIDを入れるメモリ領域へのポインタ
13609
13610 【リターンパラメータ】
13611 ER ercd 正常終了(E_OK)またはエラーコード
13612 ID tskid タスクID
13613
13614 【エラーコード】
13615 E_CTX コンテキストエラー
13616 ・非タスクコンテキストからの呼出し(get_tidの場合)【NGKI2705】
13617 ・タスクコンテキストからの呼出し(iget_tidの場合)【NGKI2706】
13618 ・CPUロック状態からの呼出し【NGKI2707】
13619 E_MACV メモリアクセス違反
13620 ・p_tskidが指すメモリ領域への書込みアクセスが許可されて
13621 いない〔P〕【NGKI2708】
13622
13623 【機能】
13624
13625 実行状態のタスク(get_tidの場合には自タスク)のID番号を参照する.参照し
13626 たタスクIDは,p_tskidが指すメモリ領域に返される【NGKI2709】.
13627
13628 iget_tidにおいて,実行状態のタスクがない場合には,TSK_NONE(=0)が返さ
13629 れる【NGKI2710】.
13630
13631 マルチプロセッサ対応カーネルにおいては,サービスコールを呼び出した処理
13632 単位を実行しているプロセッサにおいて実行状態のタスクのID番号を参照する
13633 【NGKI2711】.
13634
13635 【TOPPERS/SSPカーネルにおける規定】
13636
13637 SSPカーネルでは,get_tidをサポートしない【SSPS0133】.
13638 ----------------------------------------------------------------------
13639 get_did 実行状態のタスクが属する保護ドメインIDの参照〔TP〕【NGKI2712】
13640
13641 【C言語API】
13642 ER ercd = get_did(ID *p_domid)
13643
13644 【パラメータ】
13645 ID * p_domid 保護ドメインIDを入れるメモリ領域へのポインタ
13646
13647 【リターンパラメータ】
13648 ER ercd 正常終了(E_OK)またはエラーコード
13649 ID domid 保護ドメインID
13650
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
274
13651 【エラーコード】
13652 E_CTX コンテキストエラー
13653 ・非タスクコンテキストからの呼出し【NGKI2713】
13654 ・CPUロック状態からの呼出し【NGKI2714】
13655 E_MACV メモリアクセス違反
13656 ・p_domidが指すメモリ領域への書込みアクセスが許可されて
13657 いない【NGKI2715】
13658
13659 【機能】
13660
13661 実行状態のタスク(自タスク)が属する保護ドメインのID番号を参照する.参
13662 照した保護ドメインIDは,p_domidが指すメモリ領域に返される【NGKI2716】.
13663
13664 マルチプロセッサ対応カーネルにおいては,サービスコールを呼び出した処理
13665 単位を実行しているプロセッサにおいて実行状態のタスクが属する保護ドメイ
13666 ンのID番号を参照する【NGKI2717】.
13667
13668 【TOPPERS/ASPカーネルにおける規定】
13669
13670 ASPカーネルでは,get_didをサポートしない【ASPS0189】.
13671
13672 【TOPPERS/FMPカーネルにおける規定】
13673
13674 FMPカーネルでは,get_didをサポートしない【FMPS0157】.
13675
13676 【TOPPERS/SSPカーネルにおける規定】
13677
13678 SSPカーネルでは,get_didをサポートしない【SSPS0134】.
13679 ----------------------------------------------------------------------
13680 get_pid 割付けプロセッサのID番号の参照〔TM〕【NGKI2718】
13681 iget_pid 割付けプロセッサのID番号の参照〔IM〕【NGKI2719】
13682
13683 【C言語API】
13684 ER ercd = get_pid(ID *p_prcid)
13685 ER ercd = iget_pid(ID *p_prcid)
13686
13687 【パラメータ】
13688 ID * p_prcid プロセッサIDを入れるメモリ領域へのポインタ
13689
13690 【リターンパラメータ】
13691 ER ercd 正常終了(E_OK)またはエラーコード
13692 ID prcid プロセッサID
13693
13694 【エラーコード】
13695 E_CTX コンテキストエラー
13696 ・非タスクコンテキストからの呼出し(get_pidの場合)【NGKI2720】
13697 ・タスクコンテキストからの呼出し(iget_pidの場合)【NGKI2721】
13698 ・CPUロック状態からの呼出し【NGKI2722】
13699 E_MACV メモリアクセス違反
13700 ・p_prcidが指すメモリ領域への書込みアクセスが許可されて
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
275
13701 いない〔P〕【NGKI2723】
13702
13703 【機能】
13704
13705 サービスコールを呼び出した処理単位の割付けプロセッサのID番号を参照する.
13706 参照したプロセッサIDは,p_prcidが指すメモリ領域に返される
13707 【NGKI2724】.
13708
13709 【使用上の注意】
13710
13711 タスクは,get_pidを用いて,自タスクの割付けプロセッサを正しく参照できる
13712 とは限らない.これは,get_pidを呼び出し,自タスクの割付けプロセッサの
13713 ID番号を参照した直後に割込みが発生した場合,get_pidから戻ってきた時には
13714 割付けプロセッサが変化している可能性があるためである.
13715
13716 【TOPPERS/ASPカーネルにおける規定】
13717
13718 ASPカーネルでは,get_pid,iget_pidをサポートしない【ASPS0190】.
13719
13720 【TOPPERS/HRP2カーネルにおける規定】
13721
13722 HRP2カーネルでは,get_pid,iget_pidをサポートしない【HRPS0153】.
13723
13724 【TOPPERS/SSPカーネルにおける規定】
13725
13726 SSPカーネルでは,get_pid,iget_pidをサポートしない【SSPS0135】.
13727
13728 【μITRON4.0仕様との関係】
13729
13730 μITRON4.0仕様に定義されていないサービスコールである.
13731 ----------------------------------------------------------------------
13732 loc_cpu CPUロック状態への遷移〔T〕【NGKI2725】
13733 iloc_cpu CPUロック状態への遷移〔I〕【NGKI2726】
13734
13735 【C言語API】
13736 ER ercd = loc_cpu()
13737 ER ercd = iloc_cpu()
13738
13739 【パラメータ】
13740 なし
13741
13742 【リターンパラメータ】
13743 ER ercd 正常終了(E_OK)またはエラーコード
13744
13745 【エラーコード】
13746 E_CTX コンテキストエラー
13747 ・非タスクコンテキストからの呼出し(loc_cpuの場合)【NGKI2727】
13748 ・タスクコンテキストからの呼出し(iloc_cpuの場合)【NGKI2728】
13749 E_OACV オブジェクトアクセス違反
13750 ・システム状態に対する通常操作2が許可されていない
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
276
13751 (loc_cpuの場合)〔P〕【NGKI2729】
13752
13753 【機能】
13754
13755 CPUロックフラグをセットし,CPUロック状態へ遷移する【NGKI2730】.CPUロッ
13756 ク状態で呼び出した場合には,何も行われずに正常終了する【NGKI2731】.
13757 ----------------------------------------------------------------------
13758 unl_cpu CPUロック状態の解除〔T〕【NGKI2732】
13759 iunl_cpu CPUロック状態の解除〔I〕【NGKI2733】
13760
13761 【C言語API】
13762 ER ercd = unl_cpu()
13763 ER ercd = iunl_cpu()
13764
13765 【パラメータ】
13766 なし
13767
13768 【リターンパラメータ】
13769 ER ercd 正常終了(E_OK)またはエラーコード
13770
13771 【エラーコード】
13772 E_CTX コンテキストエラー
13773 ・非タスクコンテキストからの呼出し(unl_cpuの場合)【NGKI2734】
13774 ・タスクコンテキストからの呼出し(iunl_cpuの場合)【NGKI2735】
13775 E_OACV オブジェクトアクセス違反
13776 ・システム状態に対する通常操作2が許可されていない
13777 (unl_cpuの場合)〔P〕【NGKI2736】
13778
13779 【機能】
13780
13781 CPUロックフラグをクリアし,CPUロック解除状態へ遷移する【NGKI2737】.
13782 CPUロック解除状態で呼び出した場合には,何も行われずに正常終了する
13783 【NGKI2738】.
13784
13785 マルチプロセッサ対応カーネルにおいて,unl_cpu/iunl_cpuを呼び出したプロ
13786 セッサによって取得されている状態となっているスピンロックがある場合には,
13787 unl_cpu/iunl_cpuによってCPUロック解除状態に遷移しない(何も行われずに
13788 正常終了する)【NGKI2739】.
13789
13790 【補足説明】
13791
13792 マルチプロセッサ対応カーネルでは,CPUロック解除状態へ遷移した結果,ディ
13793 スパッチ保留状態が解除され,ディスパッチが起こる可能性がある.また,保
13794 護機能対応カーネルとマルチプロセッサ対応カーネルでは,タスク例外処理ルー
13795 チンの実行が開始される可能性がある.
13796 ----------------------------------------------------------------------
13797 dis_dsp ディスパッチの禁止〔T〕【NGKI2740】
13798
13799 【C言語API】
13800 ER ercd = dis_dsp()
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
277
13801
13802 【パラメータ】
13803 なし
13804
13805 【リターンパラメータ】
13806 ER ercd 正常終了(E_OK)またはエラーコード
13807
13808 【エラーコード】
13809 E_CTX コンテキストエラー
13810 ・非タスクコンテキストからの呼出し【NGKI2741】
13811 ・CPUロック状態からの呼出し【NGKI2742】
13812 E_OACV オブジェクトアクセス違反
13813 ・システム状態に対する通常操作1が許可されていない〔P〕
13814 【NGKI2743】
13815
13816 【機能】
13817
13818 ディスパッチ禁止フラグをセットし,ディスパッチ禁止状態へ遷移する
13819 【NGKI2744】.ディスパッチ禁止状態で呼び出した場合には,何も行われずに
13820 正常終了する【NGKI2745】.
13821 ----------------------------------------------------------------------
13822 ena_dsp ディスパッチの許可〔T〕【NGKI2746】
13823
13824 【C言語API】
13825 ER ercd = ena_dsp( )
13826
13827 【パラメータ】
13828 なし
13829
13830 【リターンパラメータ】
13831 ER ercd 正常終了(E_OK)またはエラーコード
13832
13833 【エラーコード】
13834 E_CTX コンテキストエラー
13835 ・非タスクコンテキストからの呼出し【NGKI2747】
13836 ・CPUロック状態からの呼出し【NGKI2748】
13837 E_OACV オブジェクトアクセス違反
13838 ・システム状態に対する通常操作1が許可されていない〔P〕
13839 【NGKI2749】
13840
13841 【機能】
13842
13843 ディスパッチ禁止フラグをクリアし,ディスパッチ許可状態へ遷移する
13844 【NGKI2750】.ディスパッチ許可状態で呼び出した場合には,何も行われずに
13845 正常終了する【NGKI2751】.
13846
13847 【補足説明】
13848
13849 ディスパッチ許可状態へ遷移した結果,ディスパッチ保留状態が解除され,ディ
13850 スパッチが起こる可能性がある.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
278
13851 ----------------------------------------------------------------------
13852 sns_ctx コンテキストの参照〔TI〕【NGKI2752】
13853
13854 【C言語API】
13855 bool_t state = sns_ctx()
13856
13857 【パラメータ】
13858 なし
13859
13860 【リターンパラメータ】
13861 bool_t state コンテキスト
13862
13863 【機能】
13864
13865 実行中のコンテキストを参照する.具体的な振舞いは以下の通り.
13866
13867 sns_ctxを非タスクコンテキストから呼び出した場合にはtrue,タスクコンテキ
13868 ストから呼び出した場合にはfalseが返る【NGKI2753】.
13869 ----------------------------------------------------------------------
13870 sns_loc CPUロック状態の参照〔TI〕【NGKI2754】
13871
13872 【C言語API】
13873 bool_t state = sns_loc()
13874
13875 【パラメータ】
13876 なし
13877
13878 【リターンパラメータ】
13879 bool_t state CPUロックフラグ
13880
13881 【機能】
13882
13883 CPUロックフラグを参照する.具体的な振舞いは以下の通り.
13884
13885 sns_locをCPUロック状態で呼び出した場合にはtrue,CPUロック解除状態で呼び
13886 出した場合にはfalseが返る【NGKI2755】.
13887 ----------------------------------------------------------------------
13888 sns_dsp ディスパッチ禁止状態の参照〔TI〕【NGKI2756】
13889
13890 【C言語API】
13891 bool_t state = sns_dsp()
13892
13893 【パラメータ】
13894 なし
13895
13896 【リターンパラメータ】
13897 bool_t state ディスパッチ禁止フラグ
13898
13899 【機能】
13900
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
279
13901 ディスパッチ禁止フラグを参照する.具体的な振舞いは以下の通り.
13902
13903 sns_dspをディスパッチ禁止状態で呼び出した場合にはtrue,ディスパッチ許可
13904 状態で呼び出した場合にはfalseが返る【NGKI2757】.
13905 ----------------------------------------------------------------------
13906 sns_dpn ディスパッチ保留状態の参照〔TI〕【NGKI2758】
13907
13908 【C言語API】
13909 bool_t state = sns_dpn()
13910
13911 【パラメータ】
13912 なし
13913
13914 【リターンパラメータ】
13915 bool_t state ディスパッチ保留状態
13916
13917 【機能】
13918
13919 ディスパッチ保留状態であるか否かを参照する.具体的な振舞いは以下の通り.
13920
13921 sns_dpnをディスパッチ保留状態で呼び出した場合にはtrue,ディスパッチ保留
13922 状態でない状態で呼び出した場合にはfalseが返る【NGKI2759】.
13923 ----------------------------------------------------------------------
13924 sns_ker カーネル非動作状態の参照〔TI〕【NGKI2760】
13925
13926 【C言語API】
13927 bool_t state = sns_ker()
13928
13929 【パラメータ】
13930 なし
13931
13932 【リターンパラメータ】
13933 bool_t state カーネル非動作状態
13934
13935 【機能】
13936
13937 カーネルが動作中であるか否かを参照する.具体的な振舞いは以下の通り.
13938
13939 sns_kerをカーネルの初期化完了前(初期化ルーチン実行中を含む)または終了
13940 処理開始後(終了処理ルーチン実行中を含む)に呼び出した場合にはtrue,カー
13941 ネルの動作中に呼び出した場合にはfalseが返る【NGKI2761】.
13942
13943 【使用方法】
13944
13945 sns_kerは,カーネルが動作している時とそうでない時で,処理内容を変えたい
13946 場合に使用する.sns_kerがtrueを返した場合,他のサービスコールを呼び出す
13947 ことはできない.sns_kerがtrueを返す時に他のサービスコールを呼び出した場
13948 合の動作は保証されない.
13949
13950 【使用上の注意】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
280
13951
13952 どちらの条件でtrueが返るか間違いやすいので注意すること.
13953
13954 【μITRON4.0仕様との関係】
13955
13956 μITRON4.0仕様に定義されていないサービスコールである.
13957 ----------------------------------------------------------------------
13958 ext_ker カーネルの終了〔TI〕【NGKI2762】
13959
13960 【C言語API】
13961 ER ercd = ext_ker()
13962
13963 【パラメータ】
13964 なし
13965
13966 【リターンパラメータ】
13967 ER ercd エラーコード
13968
13969 【エラーコード】
13970 E_SYS システムエラー
13971 ・カーネルの誤動作【NGKI2763】
13972 E_OACV オブジェクトアクセス違反
13973 ・カーネルドメイン以外からの呼出し〔P〕【NGKI2764】
13974
13975 【機能】
13976
13977 カーネルを終了する.具体的な振舞いについては,「2.9.2 システム終了手順」
13978 の節を参照すること.
13979
13980 ext_kerが正常に処理された場合,ext_kerからはリターンしない【NGKI2765】.
13981
13982 【μITRON4.0仕様との関係】
13983
13984 μITRON4.0仕様に定義されていないサービスコールである.
13985 ----------------------------------------------------------------------
13986 ref_sys システムの状態参照〔T〕
13987
13988 【C言語API】
13989 ER ercd = ref_sys(T_RSYS *pk_rsys)
13990
13991 ☆未完成
13992
13993 【TOPPERS/ASPカーネルにおける規定】
13994
13995 ASPカーネルでは,ref_sysをサポートしない.
13996
13997 【TOPPERS/FMPカーネルにおける規定】
13998
13999 FMPカーネルでは,ref_sysをサポートしない.
14000
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
281
14001 【TOPPERS/HRP2カーネルにおける規定】
14002
14003 HRP2カーネルでは,ref_sysをサポートしない.
14004
14005 【TOPPERS/SSPカーネルにおける規定】
14006
14007 SSPカーネルでは,ref_sysをサポートしない.
14008 ----------------------------------------------------------------------
14009
14010 4.8 メモリオブジェクト管理機能
14011
14012 メモリオブジェクト管理機能は,保護機能対応カーネルでのみサポートされる
14013 機能である.保護機能対応でないカーネルでは,メモリオブジェクト管理機能
14014 をサポートしない.
14015
14016 〔メモリリージョン〕
14017
14018 メモリリージョンは,オブジェクトモジュールに含まれるセクションの配置対
14019 象となる同じ性質を持った連続したメモリ領域である.メモリリージョンは,
14020 メモリリージョン名によって識別する【NGKI2766】.
14021
14022 各メモリリージョンが持つ情報は次の通り【NGKI2767】.
14023
14024 ・先頭番地
14025 ・サイズ
14026 ・メモリリージョン属性
14027
14028 メモリリージョンの先頭番地とサイズには,ターゲット定義の制約が課せられ
14029 る場合がある【NGKI2768】.
14030
14031 メモリリージョン属性には,次の属性を指定することができる【NGKI3256】.
14032
14033 TA_NOWRITE 0x01U 書込みアクセス禁止
14034
14035 ターゲットによっては,ターゲット定義のメモリリージョン属性を指定できる
14036 場合がある【NGKI2771】.
14037
14038 標準メモリリージョンとは,ATT_MOD/ATA_MODによって,オブジェクトモジュー
14039 ルに含まれる標準のセクションが配置されるメモリリージョンである.標準メ
14040 モリリージョンには,標準のセクションの中で,書込みアクセスを行わないも
14041 のが配置される標準ROMリージョンと,書込みアクセスを行うものが配置される
14042 標準RAMリージョンが含まれる.
14043
14044 マルチプロセッサ対応カーネルでは,ATT_MOD/ATA_MODがクラスの囲みの外に
14045 記述された場合に適用される共通の標準メモリリージョンに加えて,クラス毎
14046 の標準メモリリージョンを定義することができる【NGKI3257】.
14047
14048 標準メモリリージョン(マルチプロセッサ対応カーネルでは,共通の標準メモ
14049 リリージョン)は,必ず定義しなければならない.定義しない場合には,コン
14050 フィギュレータがエラーを報告する【NGKI3259】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
282
14051
14052 〔メモリオブジェクト〕
14053
14054 メモリオブジェクトは,保護機能対応カーネルにおいてアクセス保護の対象と
14055 する連続したメモリ領域である.メモリオブジェクトは,その先頭番地によっ
14056 て識別する【NGKI2772】.
14057
14058 各メモリオブジェクトが持つ情報は次の通り【NGKI2773】.
14059
14060 ・先頭番地
14061 ・サイズ
14062 ・メモリオブジェクト属性
14063 ・アクセス許可ベクタ
14064 ・属する保護ドメイン
14065 ・属するクラス(マルチプロセッサ対応カーネルの場合)
14066
14067 メモリオブジェクトの先頭番地とサイズには,ターゲット定義の制約が課せら
14068 れる【NGKI2774】.
14069
14070 メモリオブジェクト属性には,次の属性を指定することができる【NGKI2775】.
14071
14072 TA_NOWRITE 0x01U 書込みアクセス禁止
14073 TA_NOREAD 0x02U 読出しアクセス禁止
14074 TA_EXEC 0x04U 実行アクセス許可
14075 TA_MEMINI 0x08U メモリの初期化を行う
14076 TA_MEMPRSV 0x10U メモリの初期化を行わない
14077 TA_SDATA 0x20U ショートデータ領域に配置
14078 TA_UNCACHE 0x40U キャッシュ禁止
14079 TA_IODEV 0x80U 周辺デバイスの領域
14080
14081 メモリオブジェクトに対して書込みアクセスできるのは,メモリオブジェクト
14082 属性に書込みアクセス禁止(TA_NOWRITE属性)が指定されておらず,アクセス
14083 許可ベクタにより書込みアクセスが許可されている場合である【NGKI2776】.
14084 また,読出しアクセスできるのは,メモリオブジェクト属性に読出しアクセス
14085 禁止(TA_NOREAD属性)が指定されておらず,アクセス許可ベクタにより読出し・
14086 実行アクセスが許可されている場合である【NGKI2777】.実行アクセスできる
14087 のは,メモリオブジェクト属性に実行アクセス許可(TA_EXEC属性)が指定され
14088 ており,アクセス許可ベクタにより読出し・実行アクセスが許可されている場
14089 合である【NGKI2778】.
14090
14091 ただし,ターゲットハードウェアの制約によってこれらの属性を実現できない
14092 場合には,次のように扱われる.書込みアクセス禁止が実現できない場合には,
14093 TA_NOWRITEを指定しても無視される【NGKI2779】.また,読出しアクセス禁止
14094 が実現できない場合には,TA_NOREADを指定しても無視される【NGKI2780】.実
14095 行アクセス禁止が実現できない場合には,TA_EXECを指定しなくても実行アクセ
14096 ス許可となり,TA_EXECは無視される【NGKI2781】.どのような場合にどの属性
14097 の指定が無視されるかは,ターゲット定義である【NGKI2782】.
14098
14099 TA_MEMINI属性は,システム初期化時に初期化するメモリオブジェクトであるこ
14100 とを,TA_MEMPRSV属性は,システム初期化時に初期化を行わないメモリオブジェ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
283
14101 クトであることを示す【NGKI2783】.いずれの属性も指定しない場合,そのメ
14102 モリオブジェクトは,システム初期化時にクリア(言い換えると,0に初期化)
14103 される【NGKI2784】.TA_MEMINIとTA_MEMPRSVの両方を指定した場合には,
14104 E_RSATRエラーとなる【NGKI2785】.
14105
14106 TA_NOWRITEが指定されている場合には,TA_MEMINIとTA_MEMPRSVは無視される
14107 (指定しても指定しなくても,同じ振舞いとなる)【NGKI2786】.
14108
14109 TA_MEMINI属性を設定したメモリオブジェクトを初期化に用いる初期化データは,
14110 標準ROMリージョン(マルチプロセッサ対応カーネルでは,共通の標準ROMリー
14111 ジョン)に配置され,メモリオブジェクトとしては登録されない【NGKI2787】.
14112
14113 TA_SDATA属性は,メモリオブジェクトをショートデータ領域に配置することを
14114 示す【NGKI2788】.具体的な扱いはターゲット定義であるが,ショートデータ
14115 領域がサポートされていないターゲットでは,この属性は無視される
14116 【NGKI2789】.また,ターゲットによっては,TA_NOWRITEを指定した場合に,
14117 TA_SDATAが無視される場合がある【NGKI2790】.
14118
14119 TA_UNCACHE属性は,メモリオブジェクトをキャッシュ禁止に設定することを,
14120 TA_IODEV属性は,メモリオブジェクトを周辺デバイスの領域として扱うことを
14121 示す【NGKI2791】.具体的な扱いはターゲット定義であるが,これらの属性を
14122 指定しても意味がないターゲット(例えば,キャッシュを持たないターゲット
14123 プロセッサでのTA_UNCACHE)では,これらの属性は無視される【NGKI2792】.
14124 逆に,キャッシュ禁止にできないメモリオブジェクトに対してTA_UNCACHEを指
14125 定した場合や,周辺デバイスの領域として扱うことができないメモリオブジェ
14126 クトに対してTA_IODEVを指定した場合には,E_RSATRエラーとなる【NGKI2793】.
14127
14128 ターゲットによっては,ターゲット定義のメモリオブジェクト属性を指定でき
14129 る場合がある【NGKI2794】.ターゲット定義のメモリオブジェクト属性として,
14130 次の属性を予約している【NGKI2795】.
14131
14132 TA_WTHROUGH ライトスルーキャッシュを用いる
14133
14134 〔カーネル構成マクロ〕
14135
14136 メモリオブジェクト管理機能に関連するカーネル構成マクロは次の通り.
14137
14138 TOPPERS_SUPPORT_ATT_MOD ATT_MOD /ATA_MODがサポートされている
14139 【NGKI2796】
14140 TOPPERS_SUPPORT_ATT_PMA ATT_PMA /ATA_PMA/att_pmaがサポートさ
14141 れている【NGKI2797】
14142
14143 ただし,att_pmaは,動的生成対応カーネルのみでサポートされるAPIであるた
14144 め,サポートされているかを判定するには,TOPPERS_SUPPORT_DYNAMIC_CREと
14145 TOPPERS_SUPPORT_ATT_PMA の両方が定義されていることをチェックする必要があ
14146 る【NGKI2798】.
14147
14148 【補足説明】
14149
14150 メモリオブジェクトが属するクラスは,ATT_MOD/ATA_MODにおいて,標準のセ
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
284
14151 クションが配置されるメモリリージョンを決定するためのみに使用される.
14152
14153 【TOPPERS/ASPカーネルにおける規定】
14154
14155 ASPカーネルでは,メモリオブジェクト管理機能をサポートしない【ASPS0191】.
14156
14157 【TOPPERS/FMPカーネルにおける規定】
14158
14159 FMPカーネルでは,メモリオブジェクト管理機能をサポートしない【FMPS0158】.
14160
14161 【TOPPERS/HRP2カーネルにおける規定】
14162
14163 HRP2カーネルでは,メモリオブジェクト管理機能をサポートする【HRPS0154】.
14164
14165 【TOPPERS/SSPカーネルにおける規定】
14166
14167 SSPカーネルでは,メモリオブジェクト管理機能をサポートしない【SSPS0136】.
14168
14169 【μITRON4.0/PX仕様との関係】
14170
14171 値が0のメモリオブジェクト属性(TA_RW,TA_CACHE)は,デフォルトの扱いに
14172 して廃止した.TA_ROはTA_NOWRITEに改名し,TA_NOREAD,TA_EXEC,TA_MEMINI,
14173 TA_MEMPRSV,TA_IODEVを追加した.また,TA_UNCACHEの値を変更し,ターゲッ
14174 ト定義のメモリオブジェクト属性としてTA_WTHROUGHを予約した.
14175
14176 メモリリージョンは,μITRON4.0/PX仕様にはない概念である.
14177
14178 【仕様決定の理由】
14179
14180 TA_IODEV属性を導入したのは,ターゲットプロセッサによっては,周辺デバイ
14181 スの領域として扱うためには,キャッシュ禁止に加えて,メモリのアクセス順
14182 序を変更しないことを指定しなければならないためである.メモリのアクセス
14183 順序を変更しないことを指定するメモリオブジェクト属性を,ターゲット定義
14184 で用意してもよいが,それを使うとアプリケーションのポータビリティが下が
14185 るため,TA_IODEV属性を用意することにした.
14186 ----------------------------------------------------------------------
14187 ATT_REG メモリリージョンの登録〔SP〕【NGKI2799】
14188
14189 【静的API】
14190 ATT_REG("メモリリージョン名", { ATR regatr, void *base, SIZE size })
14191
14192 【パラメータ】
14193 "メモリリージョン名" 登録するメモリリージョンを指定する文字列
14194 ATR regatr メモリリージョン属性
14195 void * base 登録するメモリリージョンの先頭番地
14196 SIZE size 登録するメモリリージョンのサイズ(バイト数)
14197
14198 【エラーコード】
14199 E_RSATR 予約属性
14200 ・regatrが無効【NGKI2800】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
285
14201 ・保護ドメインの囲みの中に記述されている【NGKI2814】
14202 ・クラスの囲みの中に記述されている〔M〕【NGKI3260】
14203 E_PAR パラメータエラー
14204 ・sizeが0以下【NGKI2816】
14205 ・その他の条件については機能の項を参照
14206 E_OBJ オブジェクト状態エラー
14207 ・登録済みのメモリリージョンの再登録【NGKI2801】
14208 ・その他の条件については機能の項を参照
14209
14210 【機能】
14211
14212 各パラメータで指定したメモリリージョン登録情報に従って,指定したメモリ
14213 リージョンを登録する.具体的な振舞いは以下の通り.
14214
14215 baseとsizeで指定したメモリ領域が,メモリリージョンとして登録される
14216 【NGKI2802】.登録されるメモリリージョンには,regatrで指定したメモリリー
14217 ジョン属性が設定される【NGKI2803】.
14218
14219 メモリリージョン名は文字列パラメータ,regatr,base,sizeは整数定数式パ
14220 ラメータである【NGKI2804】.
14221
14222 baseやsizeに,ターゲット定義の制約に合致しない先頭番地やサイズを指定し
14223 た時には,E_PARエラーとなる【NGKI2815】.登録しようとしたメモリリージョ
14224 ンが,登録済みのメモリリージョンとメモリ領域が重なる場合には,E_OBJエラー
14225 となる【NGKI2817】.
14226
14227 【μITRON4.0/PX仕様との関係】
14228
14229 μITRON4.0/PX仕様に定義されていない静的APIである.
14230 ----------------------------------------------------------------------
14231 DEF_SRG 標準メモリリージョンの定義〔SP〕【NGKI3261】
14232
14233 【静的API】
14234 DEF_SRG("標準ROMリージョン名", "標準RAMリージョン名")
14235
14236 【パラメータ】
14237 "標準ROMリージョン名" 標準ROMリージョンとするメモリリージョンを
14238 指定する文字列
14239 "標準RAMリージョン名" 標準RAMリージョンとするメモリリージョンを
14240 指定する文字列
14241
14242 【エラーコード】
14243 E_RSATR 予約属性
14244 ・保護ドメインの囲みの中に記述されている【NGKI3262】
14245 E_OBJ オブジェクト状態エラー
14246 ・標準メモリリージョンが定義済み【NGKI3263】
14247 ・標準ROMリージョンに指定したメモリリージョンが未登録
14248 【NGKI3264】
14249 ・標準RAMリージョンに指定したメモリリージョンが未登録
14250 【NGKI3272】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
286
14251 ・その他の条件については機能の項を参照
14252
14253 【機能】
14254
14255 各パラメータに従って,標準ROMリージョンと標準RAMリージョンを定義する
14256 【NGKI3265】.
14257
14258 マルチプロセッサ対応カーネルでは,DEF_SRGをクラスの囲みの外に記述すると,
14259 共通の標準ROMリージョンと標準RAMリージョンを定義し,クラスの囲みの中に
14260 記述すると,そのクラスの標準ROMリージョンと標準RAMリージョンを定義する
14261 【NGKI3266】.
14262
14263 標準ROMリージョンは,TA_NOWRITE属性のメモリリージョンでなければならない.
14264 標準ROMリージョンとして指定したメモリリージョンが,TA_NOWRITE属性でない
14265 場合には,E_OBJエラーとなる【NGKI3268】.また,標準RAMリージョンは,
14266 TA_NOWRITE属性でないメモリリージョンでなければならない.標準RAMリージョ
14267 ンとして指定したメモリリージョンが,TA_NOWRITE属性である場合には,
14268 E_OBJエラーとなる【NGKI3270】.
14269
14270 【μITRON4.0/PX仕様との関係】
14271
14272 μITRON4.0/PX仕様に定義されていない静的APIである.
14273 ----------------------------------------------------------------------
14274 ATT_SEC セクションの登録〔SP〕【NGKI2818】
14275 ATA_SEC セクションの登録(アクセス許可ベクタ付き)〔SP〕【NGKI2819】
14276
14277 【静的API】
14278 ATT_SEC("セクション名", { ATR mematr, "メモリリージョン名" })
14279 ATA_SEC("セクション名", { ATR mematr, "メモリリージョン名" },
14280 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
14281
14282 【パラメータ】
14283 "セクション名" 登録するセクションを指定する文字列
14284 ATR mematr メモリオブジェクト属性
14285 "メモリリージョン名" セクションを配置するメモリリージョンを指定
14286 する文字列
14287
14288 *アクセス許可ベクタ(パケットの内容)
14289 ACPTN acptn1 通常操作1のアクセス許可パターン
14290 ACPTN acptn2 通常操作2のアクセス許可パターン
14291 ACPTN acptn3 管理操作のアクセス許可パターン
14292 ACPTN acptn4 参照操作のアクセス許可パターン
14293
14294 【エラーコード】
14295 E_RSATR 予約属性
14296 ・mematrが無効【NGKI2820】
14297 ・その他の条件については機能の項を参照
14298 E_NOSPT 未サポート機能
14299 ・条件については機能の項を参照
14300 E_PAR パラメータエラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
287
14301 ・条件については機能の項を参照
14302 E_OBJ オブジェクト状態エラー
14303 ・登録済みのセクションの再登録【NGKI2821】
14304 ・指定したメモリリージョンが未登録【NGKI2822】
14305
14306 【機能】
14307
14308 各パラメータで指定した情報に従って,指定したセクションをカーネルに登録
14309 する.具体的な振舞いは以下の通り.
14310
14311 各オブジェクトモジュールに含まれるセクション名で指定したセクションが,
14312 メモリリージョン名で指定したメモリリージョンに配置され,メモリオブジェ
14313 クトとして登録される【NGKI2823】.登録されるメモリオブジェクトには,
14314 mematrで指定したメモリオブジェクト属性が設定される【NGKI2824】.
14315 ATA_SECの場合には,登録されるメモリオブジェクトのアクセス許可ベクタ(4
14316 つのアクセス許可パターンの組)が,acptn1~acptn4で指定した値に設定され
14317 る【NGKI2825】.
14318
14319 指定したメモリリージョンがTA_NOWRITE属性である場合には,メモリオブジェ
14320 クト属性にTA_NOWRITE属性を指定したことになる(TA_NOWRITE属性を指定して
14321 も指定しなくても,同じ振舞いとなる)【NGKI2826】.
14322
14323 mematrに,TA_MEMINIとTA_MEMPRSVを同時に指定することはできない.指定した
14324 場合には,E_RSATRエラーとなる【NGKI2828】.
14325
14326 登録されるメモリオブジェクトと同じ保護ドメインに属し,メモリオブジェク
14327 ト属性とアクセス許可ベクタがすべて一致するメモリオブジェクトがある場合
14328 には,1つのメモリオブジェクトにまとめて登録される場合がある【NGKI2829】.
14329
14330 セクション名とメモリリージョン名は文字列パラメータ,mematr,acptn1~
14331 acptn4は整数定数式パラメータである【NGKI2830】.
14332
14333 ターゲット定義で,ATA_SECにより登録できるセクションが属する保護ドメイン
14334 や登録できる数に制限がある場合がある【NGKI2831】.この制限に違反した場
14335 合には,E_NOSPTエラーとなる【NGKI2832】.
14336
14337 ATT_MOD/ATA_MODがサポートされているターゲットでは,セクション名として,
14338 標準のセクションを指定することはできない.指定した場合には,E_PARエラー
14339 となる【NGKI2834】.
14340
14341 保護ドメイン毎の標準セクションは,コンフィギュレータによってカーネルに
14342 登録されるため,ATT_SEC/ATA_SECで登録することはできない.セクション名
14343 として指定した場合には,E_PARエラーとなる【NGKI2836】.
14344
14345 マルチプロセッサ対応カーネルにおいて,指定したメモリリージョンがあるク
14346 ラス専用のメモリリージョンの場合で,ATT_SEC/ATA_SECをクラスの囲みの外
14347 に記述するか,他のクラスの囲みの中に記述した場合には,E_RSATRエラーとな
14348 る【NGKI2837】.
14349
14350 【μITRON4.0/PX仕様との関係】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
288
14351
14352 μITRON4.0/PX仕様に定義されていない静的APIである.
14353 ----------------------------------------------------------------------
14354 LNK_SEC セクションの配置〔SP〕【NGKI2838】
14355
14356 【静的API】
14357 LNK_SEC("セクション名", { "メモリリージョン名" })
14358
14359 【パラメータ】
14360 "セクション名" 配置するセクションを指定する文字列
14361 "メモリリージョン名" セクションを配置するメモリリージョンを指定
14362 する文字列
14363
14364 【エラーコード】
14365 E_RSATR 予約属性
14366 ・条件については機能の項を参照
14367 E_PAR パラメータエラー
14368 ・条件については機能の項を参照
14369 E_OBJ オブジェクト状態エラー
14370 ・登録済みのセクションの再登録【NGKI2839】
14371 ・指定したメモリリージョンが未登録【NGKI2840】
14372
14373 【機能】
14374
14375 各オブジェクトモジュールに含まれるセクション名で指定したセクションを,
14376 メモリリージョン名で指定したメモリリージョンに配置する【NGKI2841】.
14377
14378 セクション名として,標準のセクションや保護ドメイン毎の標準セクションを
14379 指定することはできない.指定した場合には,E_PARエラーとなる【NGKI2843】.
14380
14381 マルチプロセッサ対応カーネルにおいて,指定したメモリリージョンがあるク
14382 ラス専用のメモリリージョンの場合で,LNK_SECをクラスの囲みの外に記述する
14383 か,他のクラスの囲みの中に記述した場合には,E_RSATRエラーとなる
14384 【NGKI2844】.
14385
14386 【使用上の注意】
14387
14388 LNK_SECにより配置されたセクションは,メモリオブジェクトとしてカーネルに
14389 登録されず,メモリ保護が実現できる先頭番地とサイズになるとは限らない.
14390
14391 【μITRON4.0/PX仕様との関係】
14392
14393 μITRON4.0/PX仕様に定義されていない静的APIである.
14394 ----------------------------------------------------------------------
14395 ATT_MOD オブジェクトモジュールの登録〔SP〕【NGKI2845】
14396 ATA_MOD オブジェクトモジュールの登録(アクセス許可ベクタ付き)〔SP〕
14397 【NGKI2846】
14398
14399 【静的API】
14400 ATT_MOD("オブジェクトモジュール名")
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
289
14401 ATA_MOD("オブジェクトモジュール名",
14402 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
14403
14404 【パラメータ】
14405 "オブジェクトモジュール名" 登録するオブジェクトモジュールを指
14406 定する文字列
14407
14408 *アクセス許可ベクタ(パケットの内容)
14409 ACPTN acptn1 通常操作1のアクセス許可パターン
14410 ACPTN acptn2 通常操作2のアクセス許可パターン
14411 ACPTN acptn3 管理操作のアクセス許可パターン
14412 ACPTN acptn4 参照操作のアクセス許可パターン
14413
14414 【エラーコード】
14415 E_RSATR 予約属性
14416 ・mematrが無効【NGKI2847】
14417 E_NOSPT 未サポート機能
14418 ・条件については機能の項を参照
14419 E_OBJ オブジェクト状態エラー
14420 ・登録済みのオブジェクトモジュールの再登録【NGKI2848】
14421
14422 【機能】
14423
14424 各パラメータで指定した情報に従って,指定したオブジェクトモジュールをカー
14425 ネルに登録する.具体的な振舞いは以下の通り.
14426
14427 オブジェクトモジュール名で指定したオブジェクトモジュールに含まれる標準
14428 のセクションの内,書込みアクセスを行わないセクションは標準ROMリージョン
14429 に,書込みアクセスを行うセクションは標準RAMリージョンに配置され,メモリ
14430 オブジェクトとして登録される【NGKI2849】.登録されるメモリオブジェクト
14431 には,ターゲット定義でセクション毎に定まるメモリオブジェクト属性が設定
14432 される【NGKI2850】.ATA_MODの場合には,登録されるメモリオブジェクトのア
14433 クセス許可ベクタ(4つのアクセス許可パターンの組)が,acptn1~acptn4で指
14434 定した値に設定される【NGKI2851】.
14435
14436 マルチプロセッサ対応カーネルでは,ATT_MOD/ATA_MODを,クラスの囲みの外
14437 に記述することも,クラスの囲みの中に記述することもできる【NGKI2852】.
14438 ATT_MOD/ATA_MODをクラスの囲みの外に記述した場合,標準のセクションは,
14439 共通の標準メモリリージョンに配置される【NGKI2853】.クラスの囲みの中に
14440 記述した場合,そのクラスの標準メモリリージョンが定義されていればそれら
14441 のメモリリージョン,定義されていなければ共通の標準メモリリージョンに配
14442 置される【NGKI2854】.ただし,セクションによっては,ターゲット定義で,
14443 クラスの標準メモリリージョンが定義されている場合でも,共通の標準メモリ
14444 リージョンに配置される場合がある【NGKI3271】.
14445
14446 登録されるメモリオブジェクトと同じ保護ドメインに属し,メモリオブジェク
14447 ト属性とアクセス許可ベクタがすべて一致するメモリオブジェクトがある場合
14448 には,1つのメモリオブジェクトにまとめて登録される場合がある【NGKI2855】.
14449
14450 オブジェクトモジュール名は文字列パラメータ,acptn1~acptn4は整数定数式
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
290
14451 パラメータである【NGKI2856】.
14452
14453 ターゲット定義で,ATA_MODにより登録できるオブジェクトモジュールが属する
14454 保護ドメインや登録できる数に制限がある場合がある【NGKI2857】.この制限
14455 に違反した場合には,E_NOSPTエラーとなる【NGKI2858】.
14456
14457 ターゲット定義で,ATT_MOD/ATA_MODがサポートされていない場合がある
14458 【NGKI2859】.ATT_MOD/ATA_MODがサポートされている場合には,
14459 TOPPERS_SUPPORT_ATT_MOD がマクロ定義される【NGKI2860】.サポートされてい
14460 ない場合にATT_MOD/ATA_MODを使用すると,コンフィギュレータがE_NOSPTエラー
14461 を報告する【NGKI2861】.
14462
14463 【補足説明】
14464
14465 ATT_MOD/ATA_MODでは,標準のセクション以外は配置・登録されない.標準の
14466 セクション以外のセクションを配置・登録するためには,ATT_SEC/ATA_SECを用
14467 いる必要がある.
14468
14469 【μITRON4.0/PX仕様との関係】
14470
14471 オブジェクトモジュールに含まれるセクションの配置場所が,標準ROMリージョ
14472 ンと標準RAMリージョンであることを明確化した.
14473 ----------------------------------------------------------------------
14474 ATT_MEM メモリオブジェクトの登録〔SP〕【NGKI2862】
14475 ATA_MEM メモリオブジェクトの登録(アクセス許可ベクタ付き)〔SP〕【NGKI2863】
14476 att_mem メモリオブジェクトの登録〔TPD〕【NGKI2864】
14477
14478 【静的API】
14479 ATT_MEM({ ATR mematr, void *base, SIZE size })
14480 ATA_MEM({ ATR mematr, void *base, SIZE size },
14481 { ACPTN acptn1, ACPTN acptn 2, ACPTN acptn3, ACPTN acptn4 })
14482
14483 【C言語API】
14484 ER ercd = att_mem(const T_AMEM *pk_amem)
14485
14486 【パラメータ】
14487 T_AMEM * pk_amem メモリオブジェクトの登録情報を入れたパケッ
14488 トへのポインタ(静的APIを除く)
14489
14490 *メモリオブジェクトの登録情報(パケットの内容)
14491 ATR mematr メモリオブジェクト属性
14492 void * base 登録するメモリ領域の先頭番地
14493 SIZE size 登録するメモリ領域のサイズ(バイト数)
14494
14495 *アクセス許可ベクタ(パケットの内容)
14496 ACPTN acptn1 通常操作1のアクセス許可パターン
14497 ACPTN acptn2 通常操作2のアクセス許可パターン
14498 ACPTN acptn3 管理操作のアクセス許可パターン
14499 ACPTN acptn4 参照操作のアクセス許可パターン
14500
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
291
14501 【リターンパラメータ】
14502 ER ercd 正常終了(E_OK)またはエラーコード
14503
14504 【エラーコード】
14505 E_CTX コンテキストエラー
14506 ・非タスクコンテキストからの呼出し〔s〕【NGKI2865】
14507 ・CPUロック状態からの呼出し〔s〕【NGKI2866】
14508 E_RSATR 予約属性
14509 ・mematrが無効【NGKI2867】
14510 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI2868】
14511 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2869】
14512 ・その他の条件については機能の項を参照
14513 E_NOSPT 未サポート機能
14514 ・条件については機能の項を参照
14515 E_PAR パラメータエラー
14516 ・sizeが0以下【NGKI2881】
14517 ・その他の条件については機能の項を参照
14518 E_OACV オブジェクトアクセス違反
14519 ・システム状態に対する管理操作が許可されていない〔sP〕
14520 【NGKI2870】
14521 E_MACV メモリアクセス違反
14522 ・pk_amemが指すメモリ領域への読出しアクセスが許可されて
14523 いない〔sP〕【NGKI2871】
14524 E_OBJ オブジェクト状態エラー
14525 ・条件については機能の項を参照
14526
14527 【機能】
14528
14529 各パラメータで指定したメモリオブジェクト登録情報に従って,メモリオブジェ
14530 クトを登録する.具体的な振舞いは以下の通り.
14531
14532 baseとsizeで指定したメモリ領域が,メモリオブジェクトとして登録される
14533 【NGKI2872】.登録されるメモリオブジェクトには,mematrで指定したメモリ
14534 オブジェクト属性が設定される【NGKI2873】.ATA_MEMの場合には,登録される
14535 メモリオブジェクトのアクセス許可ベクタ(4つのアクセス許可パターンの組)
14536 が,acptn1~acptn4で指定した値に設定される【NGKI2874】.
14537
14538 mematrには,TA_MEMPRSVを指定しなければならず,TA_MEMINIを指定することは
14539 できない.TA_MEMPRSVを指定しない場合や,TA_MEMINIを指定した場合には,
14540 E_RSATRエラーとなる【NGKI2876】.また,mematrにTA_SDATAを指定することは
14541 できない.TA_SDATAを指定した場合には,E_RSATRエラーとなる【NGKI3274】.
14542
14543 静的APIにおいては,mematr,size,acptn1~acptn4は整数定数式パラメータ,
14544 baseは一般定数式パラメータである【NGKI2877】.
14545
14546 ターゲット定義で,ATT_MEM/ATA_MEMにより登録できるメモリオブジェクトが
14547 属する保護ドメインや登録できる数に制限がある場合がある【NGKI2878】.こ
14548 の制限に違反した場合には,E_NOSPTエラーとなる【NGKI2879】.
14549
14550 baseやsizeに,ターゲット定義の制約に合致しない先頭番地やサイズを指定し
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
292
14551 た時には,E_PARエラーとなる【NGKI2880】.登録しようとしたメモリオブジェ
14552 クトが,登録済みのメモリオブジェクトとメモリ領域が重なる場合には,
14553 E_OBJエラーとなる【NGKI2882】.
14554
14555 【使用上の注意】
14556
14557 ATT_MEM/ATA_MEMは,メモリ空間にマッピングされたI/O領域にアクセスできる
14558 ようにするために使用することを想定した静的APIである.メモリ領域に対して
14559 は,ATT_SEC/ATA_SECかATT_MOD/ATA_MODを使用することを推奨する.
14560
14561 ATT_MEM/ATA_MEMで登録したメモリオブジェクトのメモリ領域が,ATT_REGで登
14562 録したメモリリージョンと重なっても,直ちにエラーとはならない.ただし,
14563 メモリリージョン内に配置されたメモリオブジェクトと,ATT_MEM/ATA_MEMで
14564 登録したメモリオブジェクトのメモリ領域が重なった場合には,E_OBJエラーと
14565 なる.
14566
14567 【TOPPERS/HRP2カーネルにおける規定】
14568
14569 HRP2カーネルでは,ATT_MEMとATA_MEMのみをサポートする【HRPS0155】.
14570
14571 【μITRON4.0/PX仕様との関係】
14572
14573 アクセス許可ベクタを指定してメモリオブジェクトを登録するサービスコール
14574 (ata_mem)は廃止した.
14575
14576 baseやsizeがターゲット定義の制約に合致しない場合,μITRON4.0/PX仕様では
14577 ターゲット定義の制約に合致するようにメモり領域を広げることとしていたが,
14578 この仕様ではE_PARエラーとなることとした.
14579 ----------------------------------------------------------------------
14580 ATT_PMA 物理メモリ領域の登録〔SP〕【NGKI2883】
14581 ATA_PMA 物理メモリ領域の登録(アクセス許可ベクタ付き)〔SP〕【NGKI2884】
14582 att_pma 物理メモリ領域の登録〔TPD〕【NGKI2885】
14583
14584 【静的API】
14585 ATT_PMA({ ATR mematr, void *base, SIZE size, void *paddr })
14586 ATA_PMA({ A TR mematr, void *base, SIZE size, void *paddr },
14587 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
14588
14589 【C言語API】
14590 ER ercd = att_pma(const T_APMA *pk_apma)
14591
14592 【パラメータ】
14593 T_APMA * pk_apma 物理メモリ領域の登録情報を入れたパケットへ
14594 のポインタ(静的APIを除く)
14595
14596 *物理メモリ領域の登録情報(パケットの内容)
14597 ATR mematr メモリオブジェクト属性
14598 void * base 登録するメモリ領域の先頭番地
14599 SIZE size 登録するメモリ領域のサイズ(バイト数)
14600 void * paddr 登録するメモリ領域の物理アドレス空間における
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
293
14601 先頭番地
14602
14603 *アクセス許可ベクタ(パケットの内容)
14604 ACPTN acptn1 通常操作1のアクセス許可パターン
14605 ACPTN acptn2 通常操作2のアクセス許可パターン
14606 ACPTN acptn3 管理操作のアクセス許可パターン
14607 ACPTN acptn4 参照操作のアクセス許可パターン
14608
14609 【リターンパラメータ】
14610 ER ercd 正常終了(E_OK)またはエラーコード
14611
14612 【エラーコード】
14613 E_CTX コンテキストエラー
14614 ・非タスクコンテキストからの呼出し〔s〕【NGKI2886】
14615 ・CPUロック状態からの呼出し〔s〕【NGKI2887】
14616 E_RSATR 予約属性
14617 ・mematrが無効
14618 ・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI2888】
14619 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2889】
14620 ・その他の条件については機能の項を参照
14621 E_NOSPT 未サポート機能
14622 ・条件については機能の項を参照
14623 E_PAR パラメータエラー
14624 ・sizeが0以下【NGKI2901】
14625 ・その他の条件については機能の項を参照
14626 E_OACV オブジェクトアクセス違反
14627 ・システム状態に対する管理操作が許可されていない〔sP〕
14628 【NGKI2890】
14629 E_MACV メモリアクセス違反
14630 ・pk_apmaが指すメモリ領域への読出しアクセスが許可されて
14631 いない〔sP〕【NGKI2891】
14632 E_OBJ オブジェクト状態エラー
14633 ・条件については機能の項を参照
14634
14635 【機能】
14636
14637 各パラメータで指定した物理メモリ領域の登録情報に従って,メモリオブジェ
14638 クトを登録する.具体的な振舞いは以下の通り.
14639
14640 物理アドレス空間において先頭番地がpaddr,サイズがsizeのメモリ領域が,論
14641 理アドレス空間においてbaseで指定した番地からアクセスできるように,メモ
14642 リオブジェクトとして登録される【NGKI2892】.登録されるメモリオブジェク
14643 トには,mematrで指定したメモリオブジェクト属性が設定される【NGKI2893】.
14644 ATA_PMAの場合には,登録されるメモリオブジェクトのアクセス許可ベクタ(4
14645 つのアクセス許可パターンの組)が,acptn1~acptn4で指定した値に設定され
14646 る【NGKI2894】.
14647
14648 mematrには,TA_MEMPRSVを指定しなければならず,TA_MEMINIを指定することは
14649 できない.TA_MEMPRSVを指定しない場合や,TA_MEMINIを指定した場合には,
14650 E_RSATRエラーとなる【NGKI2896】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
294
14651
14652 静的APIにおいては,mematr,size,paddr,acptn1~acptn4は整数定数式パラ
14653 メータ,baseは一般定数式パラメータである【NGKI2897】.
14654
14655 ターゲット定義で,ATT_PMA/ATA_PMAにより登録できるメモリオブジェクトが
14656 属する保護ドメインや登録できる数に制限がある場合がある【NGKI2898】.こ
14657 の制限に違反した場合には,E_NOSPTエラーとなる【NGKI2899】.
14658
14659 base,size,paddrに,ターゲット定義の制約に合致しない先頭番地やサイズを
14660 指定した時には,E_PARエラーとなる【NGKI2900】.登録しようとしたメモリオ
14661 ブジェクトが,登録済みのメモリオブジェクトと論理アドレス空間においてメ
14662 モリ領域が重なる場合には,E_OBJエラーとなる【NGKI2902】.
14663
14664 ATT_PMA/ATA_PMA/att_pmaは,MMU(Memory Management Unit)を持つターゲッ
14665 トシステムにおいて,ターゲット定義でサポートされる機能である【NGKI2903】.
14666 ATT_PMA/ATA_PMA/att_pmaがサポートされている場合には,
14667 TOPPERS_SUPPORT_ATT_PMA がマクロ定義される【NGKI2904】.ATT_PMA/ATA_PMA
14668 がサポートされていない場合にこれらの静的APIを使用すると,コンフィギュレー
14669 タがE_NOSPTエラーを報告する【NGKI2905】.また,att_pmaがサポートされて
14670 いない場合にatt_pmaを呼び出すと,E_NOSPTエラーが返るか,リンク時にエラー
14671 となる【NGKI2906】.
14672
14673 【TOPPERS/HRP2カーネルにおける規定】
14674
14675 HRP2カーネルでは,ターゲット定義で,ATT_PMAとATA_PMAのみをサポートする
14676 【HRPS0156】.
14677
14678 【μITRON4.0/PX仕様との関係】
14679
14680 μITRON4.0/PX仕様に定義されていない静的APIおよびサービスコールである.
14681 ----------------------------------------------------------------------
14682 sac_mem メモリオブジェクトのアクセス許可ベクタの設定〔TPD〕【NGKI2907】
14683
14684 【C言語API】
14685 ER ercd = sac_mem(const void *base, const ACVCT *p_acvct)
14686
14687 【パラメータ】
14688 void * base メモリオブジェクトの先頭番地
14689 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
14690 インタ
14691
14692 *アクセス許可ベクタ(パケットの内容)
14693 ACPTN acptn1 通常操作1のアクセス許可パターン
14694 ACPTN acptn2 通常操作2のアクセス許可パターン
14695 ACPTN acptn3 管理操作のアクセス許可パターン
14696 ACPTN acptn4 参照操作のアクセス許可パターン
14697
14698 【リターンパラメータ】
14699 ER ercd 正常終了(E_OK)またはエラーコード
14700
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
295
14701 【エラーコード】
14702 E_CTX コンテキストエラー
14703 ・非タスクコンテキストからの呼出し【NGKI2908】
14704 ・CPUロック状態からの呼出し【NGKI2909】
14705 E_PAR パラメータエラー
14706 ・baseがメモリオブジェクトの先頭番地でない【NGKI2910】
14707 E_NOEXS オブジェクト未登録
14708 ・baseで指定した番地を含むメモリオブジェクトが登録され
14709 ていない【NGKI2911】
14710 E_OACV オブジェクトアクセス違反
14711 ・対象メモリオブジェクトに対する管理操作が許可されてい
14712 ない【NGKI2912】
14713 E_MACV メモリアクセス違反
14714 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
14715 いない【NGKI2913】
14716 E_OBJ オブジェクト状態エラー
14717 ・対象メモリオブジェクトは静的APIで登録された【NGKI2914】
14718
14719 【機能】
14720
14721 baseで指定したメモリオブジェクト(対象メモリオブジェクト)のアクセス許
14722 可ベクタ(4つのアクセス許可パターンの組)を,各パラメータで指定した値に
14723 設定する【NGKI2915】.
14724
14725 【TOPPERS/HRP2カーネルにおける規定】
14726
14727 HRP2カーネルでは,sac_memをサポートしない【HRPS0157】.
14728
14729 【μITRON4.0/PX仕様との関係】
14730
14731 静的APIによって登録したメモリオブジェクトは,アクセス許可ベクタを設定す
14732 ることができないこととした.
14733
14734 μITRON4.0/PX仕様では,baseはメモリオブジェクトに含まれる番地を指定する
14735 ものとしていたが,この仕様では,メモリオブジェクトの先頭番地でなければ
14736 ならないものとした.
14737 ----------------------------------------------------------------------
14738 det_mem メモリオブジェクトの登録解除〔TPD〕【NGKI2916】
14739
14740 【C言語API】
14741 ER ercd = det_mem(const void *base)
14742
14743 【パラメータ】
14744 void * base メモリオブジェクトの先頭番地
14745
14746 【リターンパラメータ】
14747 ER ercd 正常終了(E_OK)またはエラーコード
14748
14749 【エラーコード】
14750 E_CTX コンテキストエラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
296
14751 ・非タスクコンテキストからの呼出し【NGKI2917】
14752 ・CPUロック状態からの呼出し【NGKI2918】
14753 E_PAR パラメータエラー
14754 ・baseがメモリオブジェクトの先頭番地でない【NGKI2919】
14755 E_NOEXS オブジェクト未登録
14756 ・baseで指定した番地を含むメモリオブジェクトが登録され
14757 ていない【NGKI2920】
14758 E_OACV オブジェクトアクセス違反
14759 ・対象メモリオブジェクトに対する管理操作が許可されてい
14760 ない【NGKI2921】
14761 E_OBJ オブジェクト状態エラー
14762 ・対象メモリオブジェクトは静的APIで登録された【NGKI2922】
14763
14764 【機能】
14765
14766 baseで指定したメモリオブジェクト(対象メモリオブジェクト)を登録解除す
14767 る【NGKI2923】.
14768
14769 【TOPPERS/HRP2カーネルにおける規定】
14770
14771 HRP2カーネルでは,det_memをサポートしない【HRPS0158】.
14772
14773 【μITRON4.0/PX仕様との関係】
14774
14775 静的APIによって登録したメモリオブジェクトは,登録を解除することができな
14776 いこととした.
14777
14778 μITRON4.0/PX仕様では,baseはメモリオブジェクトに含まれる番地を指定する
14779 ものとしていたが,この仕様では,メモリオブジェクトの先頭番地でなければ
14780 ならないものとした.
14781 ----------------------------------------------------------------------
14782 prb_mem メモリ領域に対するアクセス権のチェック〔TP〕【NGKI2924】
14783
14784 【C言語API】
14785 ER ercd = prb_mem(const void *base, SIZE size, ID tskid, MODE pmmode)
14786
14787 【パラメータ】
14788 void * base メモリ領域の先頭番地
14789 SIZE size メモリ領域のサイズ(バイト数)
14790 ID tskid アクセス元のタスクのID番号
14791 MODE pmmode アクセスモード
14792
14793 【リターンパラメータ】
14794 ER ercd 正常終了(E_OK)またはエラーコード
14795
14796 【エラーコード】
14797 E_CTX コンテキストエラー
14798 ・非タスクコンテキストからの呼出し【NGKI2925】
14799 E_ID 不正ID番号
14800 ・tskidが有効範囲外【NGKI2927】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
297
14801 E_PAR パラメータエラー
14802 ・sizeが0【NGKI2929】
14803 ・その他の条件については機能の項を参照
14804 E_NOEXS オブジェクト未登録
14805 ・baseで指定した番地を含むメモリオブジェクトが登録され
14806 ていない【NGKI2930】
14807 E_OACV オブジェクトアクセス違反
14808 ・対象メモリ領域を含むメモリオブジェクトに対する参照操
14809 作が許可されていない【NGKI2931】
14810 E_MACV メモリアクセス違反
14811 ・条件については機能の項を参照
14812 E_OBJ オブジェクト状態エラー
14813 ・対象メモリ領域がメモリオブジェクトの境界を越えている
14814 【NGKI2932】
14815
14816 【機能】
14817
14818 tskidで指定したタスクから,baseとsizeで指定したメモリ領域(対象メモリ領
14819 域)に対して,pmmodeで指定した種別のアクセスが許可されているかをチェッ
14820 クする.アクセスが許可されている場合にE_OK,そうでない場合にE_MACVが返
14821 る【NGKI2933】.tskidで指定したタスクがカーネルドメインに属する場合,
14822 E_MACVが返ることはない【NGKI2934】.
14823
14824 pmmodeには,TPM_WRITE(=0x01U),TPM_READ(=0x02U),TPM_EXEC(=
14825 0x04U)のいずれか,またはそれらの内のいくつかのビット毎論理和(C言語の
14826 "¦")を指定することができる【NGKI2935】.TPM_WRITE,TPM_READ,TPM_EXEC
14827 を指定した場合には,それぞれ,読出しアクセス,書込みアクセス,実行アク
14828 セスが許可されているかをチェックする【NGKI2936】.また,いくつかのビッ
14829 ト毎論理和を指定した場合には,それらに対応した種別のアクセスがすべて許
14830 可されているかをチェックする【NGKI2937】.pmmodeにそれ以外の値を指定し
14831 た場合には,E_PARエラーとなる【NGKI2938】.
14832
14833 tskidにTSK_SELF(=0)を指定すると,自タスクから対象メモリ領域に対して
14834 アクセスが許可されているかをチェックする【NGKI2939】.
14835
14836 【μITRON4.0/PX仕様との関係】
14837
14838 アクセスする主体の指定方法を,保護ドメインによる指定(domid)から,タス
14839 クによる指定(tskid)に変更した.また,pmmodeに指定できるアクセス種別に
14840 TPM_EXECを追加し,TPM_WRITEとTPM_READの値を入れ換えた.CPUロック状態か
14841 らも呼び出せるものとした.
14842
14843 【仕様決定の理由】
14844
14845 prb_memを,CPUロック状態からも呼び出せるものとしたのは,次の理由による.
14846 prb_memは,拡張サービスコールの中で,タスクから渡されたポインタが,その
14847 タスクからアクセスできる領域であるかを調べるために用いることを想定して
14848 いる.拡張サービスコールの中には,CPUロック状態でも呼び出せるものがあり,
14849 そのような拡張サービスコールを実現するには,prb_memがCPUロック状態から
14850 呼び出せることが必要である.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
298
14851
14852 なお,prb_memを非タスクコンテキストから呼び出すことはできないが,非タス
14853 クコンテキストで実行される処理単位は必ずカーネルドメインに属するために,
14854 prb_memを使ってアクセス権を調べる必要がないことから,支障がない.
14855 ----------------------------------------------------------------------
14856 ref_mem メモリオブジェクトの状態参照〔TP〕
14857
14858 【C言語API】
14859 ER ercd = ref_mem(const void *base, T_RMEM *pk_rmem)
14860
14861 ☆未完成
14862
14863 【TOPPERS/HRP2カーネルにおける規定】
14864
14865 HRP2カーネルでは,ref_memをサポートしない.
14866 ----------------------------------------------------------------------
14867
14868 4.9 割込み管理機能
14869
14870 割込み処理のプログラムは,割込みサービスルーチン(ISR)として実現するこ
14871 とを推奨する.割込みサービスルーチンをカーネルに登録する場合には,まず,
14872 割込みサービスルーチンの登録対象となる割込み要求ラインの属性を設定して
14873 おく必要がある【NGKI2940】.割込みサービスルーチンは,カーネル内の割込
14874 みハンドラを経由して呼び出される【NGKI2941】.
14875
14876 ただし,カーネルが用意する割込みハンドラで対応できないケースに対応する
14877 ために,アプリケーションで割込みハンドラを用意することも可能である
14878 【NGKI2942】.この場合にも,割込みハンドラをカーネルに登録する前に,割
14879 込みハンドラの登録対象となる割込みハンドラ番号に対応する割込み要求ライ
14880 ンの属性を設定しておく必要がある【NGKI2943】.
14881
14882 割込み要求ラインの属性を設定する際に指定する割込み要求ライン属性には,
14883 次の属性を指定することができる【NGKI2944】.
14884
14885 TA_ENAINT 0x01U 割込み要求禁止フラグをクリア
14886 TA_EDGE 0x02U エッジトリガ
14887
14888 ターゲットによっては,ターゲット定義の割込み要求ライン属性を指定できる
14889 場合がある【NGKI2945】.ターゲット定義の割込み要求ライン属性として,次
14890 の属性を予約している【NGKI2946】.
14891
14892 TA_POSEDGE ポジティブエッジトリガ
14893 TA_NEGEDGE ネガティブエッジトリガ
14894 TA_BOTHEDGE 両エッジトリガ
14895 TA_LOWLEVEL ローレベルトリガ
14896 TA_HIGHLEVEL ハイレベルトリガ
14897 TA_BROADCAST すべてのプロセッサで割込みを処理(マルチプロセッ
14898 サ対応カーネルの場合)
14899
14900 割込みサービスルーチンは,カーネルが実行を制御する処理単位である.割込
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
299
14901 みサービスルーチンは,割込みサービスルーチンIDと呼ぶID番号によって識別
14902 する【NGKI2947】.
14903
14904 1つの割込み要求ラインに対して複数の割込みサービスルーチンを登録した場合,
14905 それらの割込みサービスルーチンは,割込みサービスルーチン優先度の高い順
14906 にすべて呼び出される【NGKI2948】.割込みサービスルーチン優先度が同じ場
14907 合には,登録した順(静的APIにより登録した場合には,割込みサービスルーチ
14908 ンを生成するAPIをコンフィギュレーションファイル中に記述した順)で呼び出
14909 される【NGKI2949】.
14910
14911 保護機能対応カーネルにおいて,割込みサービスルーチンが属することのでき
14912 る保護ドメインは,カーネルドメインに限られる【NGKI2950】.
14913
14914 割込みサービスルーチン属性に指定できる属性はない【NGKI2951】.そのため
14915 割込みサービスルーチン属性には,TA_NULLを指定しなければならない
14916 【NGKI2952】.
14917
14918 C言語による割込みサービスルーチンの記述形式は次の通り【NGKI2953】.
14919
14920 void interrupt_service_routine(intptr_t exinf)
14921 {
14922 割込みサービスルーチン本体
14923 }
14924
14925 exinfには,割込みサービスルーチンの拡張情報が渡される【NGKI2954】.
14926
14927 割込みハンドラは,カーネルが実行を制御する処理単位である.割込みハンド
14928 ラは,割込みハンドラ番号と呼ぶオブジェクト番号によって識別する
14929 【NGKI2955】.
14930
14931 保護機能対応カーネルにおいて,割込みハンドラは,カーネルドメインに属す
14932 る【NGKI2956】.
14933
14934 割込みハンドラを登録する際に指定する割込みハンドラ属性には,ターゲット
14935 定義で,次の属性を指定することができる【NGKI2957】.
14936
14937 TA_NONKERNEL 0x02U カーネル管理外の割込み
14938
14939 TA_NONKERNELを指定しない場合,カーネル管理の割込みとなる【NGKI2958】.
14940 また,ターゲットによっては,その他のターゲット定義の割込みハンドラ属性
14941 を指定できる場合がある【NGKI2959】.
14942
14943 C言語による割込みハンドラの記述形式は次の通り【NGKI2960】.
14944
14945 void interrupt_handler(void)
14946 {
14947 割込みハンドラ本体
14948 }
14949
14950 割込み管理機能に関連するカーネル構成マクロは次の通り.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
300
14951
14952 TMIN_INTPRI 割込み優先度の最小値(最高値) 【NGKI2961】
14953 TMAX_INTPRI 割込み優先度の最大値(最低値,=-1)
14954
14955 TMIN_ISRPRI 割込みサービスルーチン優先度の最小値(=1)【NGKI2962】
14956 TMAX_ISRPRI 割込みサービスルーチン優先度の最大値
14957
14958 TOPPERS_SUPPORT_DIS_INT dis_intがサポートされている【NGKI2963】
14959 TOPPERS_SUPPORT_ENA_INT ena_int がサポートされている【NGKI2964】
14960
14961 【使用上の注意】
14962
14963 1つの割込み要求ラインに複数のデバイスからの割込み要求が接続されている場
14964 合に対応するために,割込みサービスルーチンは,それが処理する割込み要求
14965 が発生しているかをチェックし,割込み要求が発生していない場合には何もせ
14966 ずにリターンするように実装すべきである.
14967
14968 【TOPPERS/ASPカーネルにおける規定】
14969
14970 ASPカーネルでは,割込みサービスルーチン優先度の最大値(=TMAX_ISRPRI)
14971 は16に固定されている【ASPS0192】.ただし,タスク優先度拡張パッケージで
14972 は,TMAX_ISRPRIを256に拡張する【ASPS0193】.
14973
14974 【TOPPERS/FMPカーネルにおける規定】
14975
14976 FMPカーネルでは,割込みサービスルーチン優先度の最大値(=TMAX_ISRPRI)
14977 は16に固定されている【FMPS0159】.
14978
14979 【TOPPERS/HRP2カーネルにおける規定】
14980
14981 HRP2カーネルでは,割込みサービスルーチン優先度の最大値(=TMAX_ISRPRI)
14982 は16に固定されている【HRPS0159】.
14983
14984 【TOPPERS/SSPカーネルにおける規定】
14985
14986 SSPカーネルでは,割込みサービスルーチン優先度の最大値(=TMAX_ISRPRI)
14987 は16に固定されている【SSPS0137】.
14988
14989 【μITRON4.0仕様との関係】
14990
14991 割込み要求ラインの属性,割込み優先度,割込みサービスルーチン優先度は,
14992 μITRON4.0仕様にない概念であり,TMIN_INTPRI,TMAX_INTPRI,TMIN_ISRPRI,
14993 TMAX_ISRPRIは,μITRON4.0仕様に定義のないカーネル構成マクロである.また,
14994 TA_NONKERNELは,μITRON4.0仕様に定義のない割込みハンドラ属性である.
14995 ----------------------------------------------------------------------
14996 CFG_INT 割込み要求ラインの属性の設定〔S〕【NGKI2965】
14997 cfg_int 割込み要求ラインの属性の設定〔TD〕【NGKI2966】
14998
14999 【静的API】
15000 CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
301
15001
15002 【C言語API】
15003 ER ercd = cfg_int(INTNO intno, const T_CINT *pk_cint)
15004
15005 【パラメータ】
15006 INTNO intno 割込み番号
15007 T_CINT * pk_cint 割込み要求ラインの属性の設定情報を入れたパ
15008 ケットへのポインタ(静的APIを除く)
15009
15010 *割込み要求ラインの属性の設定情報(パケットの内容)
15011 ATR intatr 割込み要求ライン属性
15012 PRI intpri 割込み優先度
15013
15014 【リターンパラメータ】
15015 ER ercd 正常終了(E_OK)またはエラーコード
15016
15017 【エラーコード】
15018 E_CTX コンテキストエラー
15019 ・非タスクコンテキストからの呼出し〔s〕【NGKI2967】
15020 ・CPUロック状態からの呼出し〔s〕【NGKI2968】
15021 E_RSATR 予約属性
15022 ・intatrが無効【NGKI2969】
15023 ・属するクラスの指定が有効範囲外〔sM〕【NGKI2970】
15024 ・クラスの囲みの中に記述されていない〔SM〕【NGKI2971】
15025 ・その他の条件については機能の項を参照
15026 E_PAR パラメータエラー
15027 ・intnoが有効範囲外【NGKI2972】
15028 ・intpriが有効範囲外【NGKI2973】
15029 ・その他の条件については機能の項を参照
15030 E_OACV オブジェクトアクセス違反
15031 ・システム状態に対する管理操作が許可されていない〔sP〕
15032 【NGKI2974】
15033 E_MACV メモリアクセス違反
15034 ・pk_cintが指すメモリ領域への読出しアクセスが許可されて
15035 いない〔sP〕【NGKI2975】
15036 E_OBJ オブジェクト状態エラー
15037 ・対象割込み要求ラインに対して属性が設定済み〔S〕【NGKI2976】
15038 ・その他の条件については機能の項を参照
15039
15040 【機能】
15041
15042 intnoで指定した割込み要求ライン(対象割込み要求ライン)に対して,各パラ
15043 メータで指定した属性を設定する【NGKI2977】.
15044
15045 対象割込み要求ラインの割込み要求禁止フラグは,intatrにTA_ENAINTを指定し
15046 た場合にクリアされ,指定しない場合にセットされる【NGKI2978】.
15047
15048 静的APIにおいては,intno,intatr,intpriは整数定数式パラメータである
15049 【NGKI2979】.
15050
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
302
15051 cfg_intにおいて,ターゲット定義で,複数の割込み要求ラインの割込み優先度
15052 が連動して設定される場合がある【NGKI2980】.
15053
15054 intpriに指定できる値は,基本的には,TMIN_INTPRI以上,TMAX_INTPRI以下の
15055 値である【NGKI2981】.ターゲット定義の拡張で,カーネル管理外の割込み要
15056 求ラインに対しても属性を設定できる場合には,TMIN_INTPRIよりも小さい値を
15057 指定することができる【NGKI2982】.このように拡張されている場合,カーネ
15058 ル管理外の割込み要求ラインを対象として,intpriにTMIN_INTPRI以上の値を指
15059 定した場合には,E_OBJエラーとなる【NGKI2983】.逆に,カーネル管理の割込
15060 み要求ラインを対象として,intpriがTMIN_INTPRIよりも小さい値である場合に
15061 も,E_OBJエラーとなる【NGKI2984】.
15062
15063 対象割込み要求ラインに対して,設定できない割込み要求ライン属性をintatr
15064 に指定した場合にはE_RSATRエラー,設定できない割込み優先度をintpriに指定
15065 した場合にはE_PARエラーとなる【NGKI2985】.ここで,設定できない割込み要
15066 求ライン属性/割込み優先度には,ターゲット定義の制限によって設定できな
15067 い値も含む【NGKI2986】.また,マルチプロセッサ対応カーネルにおいて,
15068 cfg_intを呼び出したタスクが割り付けられているプロセッサから,対象割込み
15069 要求ラインの属性を設定できない場合も,これに該当する【NGKI2987】.
15070
15071 保護機能対応カーネルにおいて,CFG_INTは,カーネルドメインの囲みの中に記
15072 述しなければならない.そうでない場合には,E_RSATRエラーとなる
15073 【NGKI2989】.また,cfg_intはカーネルオブジェクトを登録するサービスコー
15074 ルではないため,割込み要求ライン属性にTA_DOM(domid)を指定した場合には
15075 E_RSATRエラーとなる【NGKI2990】.ただし,TA_DOM(TDOM_SELF)を指定した場
15076 合には,指定が無視され,E_RSATRエラーは検出されない【NGKI2991】.
15077
15078 マルチプロセッサ対応カーネルで,CFG_INTの記述が,対象割込み要求ラインに
15079 対して登録された割込みサービスルーチン(または対象割込み番号に対応する
15080 割込みハンドラ番号に対して登録された割込みハンドラ)と異なるクラスの囲
15081 み中にある場合には,E_RSATRエラーとなる【NGKI2992】.
15082
15083 【補足説明】
15084
15085 ターゲット定義の制限によって設定できない割込み要求ライン属性/割込み優
15086 先度は,主にターゲットハードウェアの制限から来るものである.例えば,対
15087 象割込み要求ラインに対して,トリガモードや割込み優先度が固定されていて,
15088 変更できないケースが考えられる.
15089
15090 cfg_intにおいて,ターゲット定義で,複数の割込み要求ラインの割込み優先度
15091 が連動して設定されるのは,ターゲットハードウェアの制限により,異なる割
15092 込み要求ラインに対して,同一の割込み優先度しか設定できないケースに対応
15093 するための仕様である.この場合,CFG_INTにおいては,同一の割込み優先度し
15094 か設定できない割込み要求ラインに対して異なる割込み優先度を設定した場合
15095 には,E_PARエラーとなる.
15096
15097 【TOPPERS/ASPカーネルにおける規定】
15098
15099 ASPカーネルでは,CFG_INTのみをサポートする【ASPS0194】.
15100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
303
15101 【TOPPERS/FMPカーネルにおける規定】
15102
15103 FMPカーネルでは,CFG_INTのみをサポートする【FMPS0160】.
15104
15105 【TOPPERS/HRP2カーネルにおける規定】
15106
15107 HRP2カーネルでは,CFG_INTのみをサポートする【HRPS0160】.
15108
15109 【TOPPERS/SSPカーネルにおける規定】
15110
15111 SSPカーネルでは,CFG_INTのみをサポートする【SSPS0138】.
15112
15113 【μITRON4.0仕様との関係】
15114
15115 μITRON4.0仕様に定義されていない静的APIおよびサービスコールである.
15116 ----------------------------------------------------------------------
15117 CRE_ISR 割込みサービスルーチンの生成〔S〕【NGKI2993】
15118 ATT_ISR 割込みサービスルーチンの追加〔S〕【NGKI2994】
15119 acre_isr 割込みサービスルーチンの生成〔TD〕【NGKI2995】
15120
15121 【静的API】
15122 CRE_ISR(ID isrid, { ATR isratr, intptr_t exinf,
15123 INTNO intno, ISR isr, PRI isrpri })
15124 ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
15125
15126 【C言語API】
15127 ER_ID isrid = acre_isr(const T_CISR *pk_cisr )
15128
15129 【パラメータ】
15130 ID isrid 対象割込みサービスルーチンのID番号(CRE_ISR
15131 の場合)
15132 T_CISR * pk_cisr 割込みサービスルーチンの生成情報を入れたパ
15133 ケットへのポインタ(静的APIを除く)
15134
15135 *割込みサービスルーチンの生成情報(パケットの内容)
15136 ATR isratr 割込みサービスルーチン属性
15137 intptr_t exinf 割込みサービスルーチンの拡張情報
15138 INTNO intno 割込みサービスルーチンを登録する割込み番号
15139 ISR isr 割込みサービスルーチンの先頭番地
15140 PRI isrpri 割込みサービスルーチン優先度
15141
15142 【リターンパラメータ】
15143 ER_ID isrid 生成された割込みサービスルーチンのID番号(正
15144 の値)またはエラーコード
15145
15146 【エラーコード】
15147 E_CTX コンテキストエラー
15148 ・非タスクコンテキストからの呼出し〔s〕【NGKI2996】
15149 ・CPUロック状態からの呼出し〔s〕【NGKI2997】
15150 E_RSATR 予約属性
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
304
15151 ・isratrが無効【NGKI2998】
15152 ・属する保護ドメインの指定が有効範囲外またはカーネルド
15153 メイン以外〔sP〕【NGKI2999】
15154 ・カーネルドメインの囲みの中に記述されていない〔SP〕
15155 【NGKI3000】
15156 ・属するクラスの指定が有効範囲外〔sM〕【NGKI3001】
15157 ・クラスの囲みの中に記述されていない〔SM〕【NGKI3002】
15158 ・その他の条件については機能の項を参照
15159 E_PAR パラメータエラー
15160 ・intnoが有効範囲外【NGKI3003】
15161 ・isrがプログラムの先頭番地として正しくない【NGKI3004】
15162 ・isrpriが有効範囲外【NGKI3005】
15163 E_OACV オブジェクトアクセス違反
15164 ・システム状態に対する管理操作が許可されていない〔sP〕
15165 【NGKI3006】
15166 E_MACV メモリアクセス違反
15167 ・pk_cisrが指すメモリ領域への読出しアクセスが許可されて
15168 いない〔sP〕【NGKI3007】
15169 E_NOID ID番号不足
15170 ・割り付けられる割込みサービスルーチンIDがない〔sD〕
15171 【NGKI3008】
15172 E_OBJ オブジェクト状態エラー
15173 ・isridで指定した割込みサービスルーチンが登録済み
15174 (CRE_ISRの場合)【NGKI3009】
15175 ・その他の条件については機能の項を参照
15176
15177 【機能】
15178
15179 各パラメータで指定した割込みサービスルーチン生成情報に従って,割込みサー
15180 ビスルーチンを生成する【NGKI3010】.
15181
15182 ATT_ISRによって生成された割込みサービスルーチンは,ID番号を持たない
15183 【NGKI3011】.
15184
15185 intnoで指定した割込み要求ラインの属性が設定されていない場合には,E_OBJ
15186 エラーとなる【NGKI3012】.また,intnoで指定した割込み番号に対応する割込
15187 みハンドラ番号に対して,割込みハンドラを定義する機能(DEF_INH,def_inh)
15188 によって割込みハンドラが定義されている場合にも,E_OBJエラーとなる
15189 【NGKI3013】.さらに,intno でカーネル管理外の割込みを指定した場合にも,
15190 E_OBJエラーとなる【NGKI3014】.
15191
15192 静的APIにおいては,isridはオブジェクト識別名,isratr,intno,isrpriは整
15193 数定数式パラメータ,exinfとisrは一般定数式パラメータである【NGKI3015】.
15194
15195 マルチプロセッサ対応カーネルで,生成する割込みサービスルーチンの属する
15196 クラスの割付け可能プロセッサが,intnoで指定した割込み要求ラインが接続さ
15197 れたプロセッサの集合に含まれていない場合には,E_RSATRエラーとなる
15198 【NGKI3016】.また,intnoで指定した割込み要求ラインに対して登録済みの割
15199 込みサービスルーチンがある場合に,生成する割込みサービスルーチンがそれ
15200 と異なるクラスに属する場合にも,E_RSATRエラーとなる【NGKI3017】.さらに,
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
305
15201 ターゲット定義で,割込みサービスルーチンが属することができるクラスに制
15202 限がある場合がある【NGKI3018】.生成する割込みサービスルーチンの属する
15203 クラスが,ターゲット定義の制限に合致しない場合にも,E_RSATRエラーとなる
15204 【NGKI3019】.
15205
15206 静的APIにおいて,isrが不正である場合にE_PARエラーが検出されるか否かは,
15207 ターゲット定義である【NGKI3020】.
15208
15209 【TOPPERS/ASPカーネルにおける規定】
15210
15211 ASPカーネルでは,ATT_ISRのみをサポートする.ただし,動的生成機能拡張パッ
15212 ケージでは,acre_isrもサポートする【ASPS0195】.
15213
15214 【TOPPERS/FMPカーネルにおける規定】
15215
15216 FMPカーネルでは,ATT_ISRのみをサポートする【FMPS0161】.
15217
15218 【TOPPERS/HRP2カーネルにおける規定】
15219
15220 HRP2カーネルでは,ATT_ISRのみをサポートする【HRPS0161】.
15221
15222 【TOPPERS/SSPカーネルにおける規定】
15223
15224 SSPカーネルでは,ATT_ISRのみをサポートする【SSPS0139】.
15225
15226 【μITRON4.0仕様との関係】
15227
15228 割込みサービスルーチンの生成情報に,isrpri(割込みサービスルーチンの割
15229 込み優先度)を追加した.CRE_ISRは,μITRON4.0仕様に定義されていない静的
15230 APIである.
15231 ----------------------------------------------------------------------
15232 AID_ISR 割付け可能な割込みサービスルーチンIDの数の指定〔SD〕【NGKI3021】
15233
15234 【静的API】
15235 AID_ISR(uint_t noisr)
15236
15237 【パラメータ】
15238 uint_t noisr 割付け可能な割込みサービスルーチンIDの数
15239
15240 【エラーコード】
15241 E_RSATR 予約属性
15242 ・クラスの囲みの中に記述されていない〔M〕【NGKI3022】
15243 ・カーネルドメインの囲みの中に記述されていない〔P〕【NGKI3023】
15244 E_PAR パラメータエラー
15245 ・noisrが負の値【NGKI3287】
15246
15247 【機能】
15248
15249 noisrで指定した数の割込みサービスルーチンIDを,割込みサービスルーチンを
15250 生成するサービスコールによって割付け可能な割込みサービスルーチンIDとし
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
306
15251 て確保する【NGKI3024】.
15252
15253 noisrは整数定数式パラメータである【NGKI3025】.
15254 ----------------------------------------------------------------------
15255 SAC_ISR 割込みサービスルーチンのアクセス許可ベクタの設定〔SP〕【NGKI3026】
15256 sac_isr 割込みサービスルーチンのアクセス許可ベクタの設定〔TPD〕【NGKI3027】
15257
15258 【静的API】
15259 SAC_ISR(ID isrid, { ACPTN acptn1, ACPTN acptn2,
15260 ACPTN acptn3, ACPTN acptn4 })
15261
15262 【C言語API】
15263 ER ercd = sac_isr(ID isrid, const ACVCT *p_acvct)
15264
15265
15266 【パラメータ】
15267 ID isrid 対象割込みサービスルーチンのID番号
15268 ACVCT * p_acvct アクセス許可ベクタを入れたパケットへのポ
15269 インタ(静的APIを除く)
15270
15271 *アクセス許可ベクタ(パケットの内容)
15272 ACPTN acptn1 通常操作1のアクセス許可パターン
15273 ACPTN acptn2 通常操作2のアクセス許可パターン
15274 ACPTN acptn3 管理操作のアクセス許可パターン
15275 ACPTN acptn4 参照操作のアクセス許可パターン
15276
15277 【リターンパラメータ】
15278 ER ercd 正常終了(E_OK)またはエラーコード
15279
15280 【エラーコード】
15281 E_CTX コンテキストエラー
15282 ・非タスクコンテキストからの呼出し〔s〕【NGKI3028】
15283 ・CPUロック状態からの呼出し〔s〕【NGKI3029】
15284 E_ID 不正ID番号
15285 ・isridが有効範囲外〔s〕【NGKI3030】
15286 E_RSATR 予約属性
15287 ・対象割込みサービスルーチンが属する保護ドメインの囲み
15288 の中に記述されていない〔S〕【NGKI3031】
15289 ・対象割込みサービスルーチンが属するクラスの囲みの中に
15290 記述されていない〔SM〕【NGKI3032】
15291 E_NOEXS オブジェクト未登録
15292 ・対象割込みサービスルーチンが未登録【NGKI3033】
15293 E_OACV オブジェクトアクセス違反
15294 ・対象割込みサービスルーチンに対する管理操作が許可され
15295 ていない)〔s〕【NGKI3034】
15296 E_MACV メモリアクセス違反
15297 ・p_acvctが指すメモリ領域への読出しアクセスが許可されて
15298 いない)〔s〕【NGKI3035】
15299 E_OBJ オブジェクト状態エラー
15300 ・対象割込みサービスルーチンは静的APIで生成された〔s〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
307
15301 【NGKI3036】
15302 ・対象割込みサービスルーチンに対してアクセス許可ベクタ
15303 が設定済み〔S〕【NGKI3037】
15304
15305 【機能】
15306
15307 isridで指定した割込みサービスルーチン(対象割込みサービスルーチン)のア
15308 クセス許可ベクタ(4つのアクセス許可パターンの組)を,各パラメータで指定
15309 した値に設定する【NGKI3038】.
15310
15311 静的APIにおいては,isridはオブジェクト識別名,acptn1~acptn4は整数定数
15312 式パラメータである【NGKI3039】.
15313
15314 【TOPPERS/ASPカーネルにおける規定】
15315
15316 ASPカーネルでは,SAC_ISR,sac_isrをサポートしない【ASPS0196】.
15317
15318 【TOPPERS/FMPカーネルにおける規定】
15319
15320 FMPカーネルでは,SAC_ISR,sac_isrをサポートしない【FMPS0162】.
15321
15322 【TOPPERS/HRP2カーネルにおける規定】
15323
15324 HRP2カーネルでは,SAC_ISR,sac_isrをサポートしない【HRPS0162】.
15325
15326 【TOPPERS/SSPカーネルにおける規定】
15327
15328 SSPカーネルでは,SAC_ISR,sac_isrをサポートしない【SSPS0140】.
15329
15330 【未決定事項】
15331
15332 割込みサービスルーチンのアクセス許可ベクタを設けず,システム状態のアク
15333 セス許可ベクタでアクセス保護する方法も考えられる.
15334 ----------------------------------------------------------------------
15335 del_isr 割込みサービスルーチンの削除〔TD〕【NGKI3040】
15336
15337 【C言語API】
15338 ER ercd = del_isr(ID isrid)
15339
15340 【パラメータ】
15341 ID isrid 対象割込みサービスルーチンのID番号
15342
15343 【リターンパラメータ】
15344 ER ercd 正常終了(E_OK)またはエラーコード
15345
15346 【エラーコード】
15347 E_CTX コンテキストエラー
15348 ・非タスクコンテキストからの呼出し【NGKI3041】
15349 ・CPUロック状態からの呼出し【NGKI3042】
15350 E_ID 不正ID番号
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
308
15351 ・isridが有効範囲外【NGKI3043】
15352 E_NOEXS オブジェクト未登録
15353 ・対象割込みサービスルーチンが未登録【NGKI3044】
15354 E_OACV オブジェクトアクセス違反
15355 ・対象割込みサービスルーチンに対する管理操作が許可され
15356 ていない〔P〕【NGKI3045】
15357 E_OBJ オブジェクト状態エラー
15358 ・対象割込みサービスルーチンは静的APIで生成された【NGKI3046】
15359
15360 【機能】
15361
15362 isridで指定した割込みサービスルーチン(対象割込みサービスルーチン)を削
15363 除する.具体的な振舞いは以下の通り.
15364
15365 対象割込みサービスルーチンの登録が解除され,その割込みサービスルーチン
15366 IDが未使用の状態に戻される【NGKI3047】.
15367
15368 【TOPPERS/ASPカーネルにおける規定】
15369
15370 ASPカーネルでは,del_isrをサポートしない【ASPS0197】.ただし,動的生成
15371 機能拡張パッケージでは,del_isrをサポートする【ASPS0198】.
15372
15373 【TOPPERS/FMPカーネルにおける規定】
15374
15375 FMPカーネルでは,del_isrをサポートしない【FMPS0163】.
15376
15377 【TOPPERS/HRP2カーネルにおける規定】
15378
15379 HRP2カーネルでは,del_isrをサポートしない【HRPS0163】.
15380
15381 【TOPPERS/SSPカーネルにおける規定】
15382
15383 SSPカーネルでは,del_isrをサポートしない【SSPS0141】.
15384 ----------------------------------------------------------------------
15385 ref_isr 割込みサービスルーチンの状態参照〔T〕
15386
15387 【C言語API】
15388 ER ercd = ref_isr(ID isrid, T_RISR *pk_risr)
15389
15390 ☆未完成
15391
15392 【TOPPERS/ASPカーネルにおける規定】
15393
15394 ASPカーネルでは,ref_isrをサポートしない.
15395
15396 【TOPPERS/FMPカーネルにおける規定】
15397
15398 FMPカーネルでは,ref_isrをサポートしない.
15399
15400 【TOPPERS/HRP2カーネルにおける規定】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
309
15401
15402 HRP2カーネルでは,ref_isrをサポートしない.
15403
15404 【TOPPERS/SSPカーネルにおける規定】
15405
15406 SSPカーネルでは,ref_isrをサポートしない.
15407 ----------------------------------------------------------------------
15408 DEF_INH 割込みハンドラの定義〔S〕【NGKI3048】
15409 def_inh 割込みハンドラの定義〔TD〕【NGKI3049】
15410
15411 【静的API】
15412 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
15413
15414 【C言語API】
15415 ER ercd = def_inh(INHNO inhno, const T_DINH *pk_dinh)
15416
15417 【パラメータ】
15418 INHNO inhno 割込みハンドラ番号
15419 T_DINH * pk_dinh 割込みハンドラの定義情報を入れたパケットへ
15420 のポインタ(静的APIを除く)
15421
15422 *割込みハンドラの定義情報(パケットの内容)
15423 ATR inhatr 割込みハンドラ属性
15424 INTHDR i nthdr 割込みハンドラの先頭番地
15425
15426 【リターンパラメータ】
15427 ER ercd 正常終了(E_OK)またはエラーコード
15428
15429 【エラーコード】
15430 E_CTX コンテキストエラー
15431 ・非タスクコンテキストからの呼出し〔s〕【NGKI3050】
15432 ・CPUロック状態からの呼出し〔s〕【NGKI3051】
15433 E_RSATR 予約属性
15434 ・inhatrが無効【NGKI3052】
15435 ・属するクラスの指定が有効範囲外〔sM〕【NGKI3053】
15436 ・クラスの囲みの中に記述されていない〔SM〕【NGKI3054】
15437 ・その他の条件については機能の項を参照
15438 E_PAR パラメータエラー
15439 ・inhnoが有効範囲外【NGKI3055】
15440 ・inthdrがプログラムの先頭番地として正しくない【NGKI3056】
15441 ・その他の条件については機能の項を参照
15442 E_OACV オブジェクトアクセス違反
15443 ・システム状態に対する管理操作が許可されていない〔sP〕
15444 【NGKI3057】
15445 E_MACV メモリアクセス違反
15446 ・pk_dinhが指すメモリ領域への読出しアクセスが許可されて
15447 いない〔sP〕【NGKI3058】
15448 E_OBJ オブジェクト状態エラー
15449 ・条件については機能の項を参照
15450
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
310
15451 【機能】
15452
15453 inhnoで指定した割込みハンドラ番号(対象割込みハンドラ番号)に対して,各
15454 パラメータで指定した割込みハンドラ定義情報に従って,割込みハンドラを定
15455 義する【NGKI3059】.ただし,def_inhにおいてpk_dinhをNULLにした場合には,
15456 対象割込みハンドラ番号に対する割込みハンドラの定義を解除する【NGKI3060】.
15457
15458 静的APIにおいては,inhnoとinhatrは整数定数式パラメータ,inthdrは一般定
15459 数式パラメータである【NGKI3061】.
15460
15461 割込みハンドラを定義する場合(DEF_INHの場合およびdef_inhにおいて
15462 pk_dinhをNULL以外にした場合)には,次のエラーが検出される.
15463
15464 対象割込みハンドラ番号に対応する割込み要求ラインの属性が設定されていな
15465 い場合には,E_OBJエラーとなる【NGKI3062】.また,対象割込みハンドラ番号
15466 に対してすでに割込みハンドラが定義されている場合と,対象割込みハンドラ
15467 番号に対応する割込み番号を対象に割込みサービスルーチンが登録されている
15468 場合にも,E_OBJエラーとなる【NGKI3063】.
15469
15470 ターゲット定義の拡張で,カーネル管理外の割込みに対しても割込みハンドラ
15471 を定義できる場合には,次のエラーが検出される【NGKI3064】.カーネル管理
15472 外の割込みハンドラを対象として,inhatrにTA_NONKERNELを指定しない場合に
15473 は,E_OBJエラーとなる【NGKI3065】.逆に,カーネル管理の割込みハンドラを
15474 対象として,inhatrにTA_NONKERNELを指定した場合にも,E_OBJエラーとなる
15475 【NGKI3066】.また,ターゲット定義でカーネル管理外に固定されている割込
15476 みハンドラがある場合には,それを対象割込みハンドラに指定して,inhatrに
15477 TA_NONKERNELを指定しない場合には,E_RSATRエラーとなる【NGKI3067】.逆に,
15478 ターゲット定義でカーネル管理に固定されている割込みハンドラがある場合に
15479 は,それを対象割込みハンドラに指定して,inhatrにTA_NONKERNELを指定した
15480 場合には,E_RSATRエラーとなる【NGKI3068】.
15481
15482 保護機能対応カーネルにおいて,DEF_INHは,カーネルドメインの囲みの中に記
15483 述しなければならない.そうでない場合には,E_RSATRエラーとなる
15484 【NGKI3070】.また,def_inhで割込みハンドラを定義する場合には,割込みハ
15485 ンドラの属する保護ドメインを設定する必要はなく,割込みハンドラ属性に
15486 TA_DOM(domid)を指定した場合にはE_RSATRエラーとなる【NGKI3071】.ただし,
15487 TA_DOM(TDOM_SELF)を指定した場合には,指定が無視され,E_RSATRエラーは検
15488 出されない【NGKI3072】.
15489
15490 マルチプロセッサ対応カーネルで,登録する割込みハンドラの属するクラスの
15491 初期割付けプロセッサが,その割込みが要求されるプロセッサでない場合には,
15492 E_RSATRエラーとなる【NGKI3073】.また,ターゲット定義で,割込みハンドラ
15493 が属することができるクラスに制限がある場合がある【NGKI3074】.登録する
15494 割込みハンドラの属するクラスが,ターゲット定義の制限に合致しない場合に
15495 も,E_RSATRエラーとなる【NGKI3075】.
15496
15497 割込みハンドラの定義を解除する場合(def_inhにおいてpk_dinhをNULLにした
15498 場合)で,対象割込みハンドラ番号に対して割込みハンドラが定義されていな
15499 い場合には,E_OBJエラーとなる【NGKI3076】.また,対象割込みハンドラ番号
15500 に対して定義された割込みハンドラが,静的APIで定義されたものである場合に
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
311
15501 は,ターゲット定義でE_OBJエラーとなる場合がある【NGKI3077】.
15502
15503 ターゲット定義で,対象割込みハンドラを定義(または定義解除)できない場
15504 合には,E_PARエラーとなる【NGKI3078】.具体的には,マルチプロセッサ対応
15505 カーネルにおいて,def_inhを呼び出したタスクが割り付けられているプロセッ
15506 サから,対象割込みハンドラを定義(または定義解除)できない場合が,これ
15507 に該当する【NGKI3079】.
15508
15509 静的APIにおいて,inthdrが不正である場合にE_PARエラーが検出されるか否か
15510 は,ターゲット定義である【NGKI3080】.
15511
15512 【TOPPERS/ASPカーネルにおける規定】
15513
15514 ASPカーネルでは,DEF_INHのみをサポートする【ASPS0199】.
15515
15516 【TOPPERS/FMPカーネルにおける規定】
15517
15518 FMPカーネルでは,DEF_INHのみをサポートする【FMPS0164】.
15519
15520 【TOPPERS/HRP2カーネルにおける規定】
15521
15522 HRP2カーネルでは,DEF_INHのみをサポートする【HRPS0164】.
15523
15524 【TOPPERS/SSPカーネルにおける規定】
15525
15526 SSPカーネルでは,DEF_INHのみをサポートする【SSPS0142】.
15527
15528 【μITRON4.0仕様との関係】
15529
15530 inthdrのデータ型をINTHDRに変更した.
15531
15532 def_inhによって定義済みの割込みハンドラを再定義しようとした場合に,
15533 E_OBJエラーとすることにした.割込みハンドラの定義を変更するには,一度定
15534 義を解除してから,再度定義する必要がある.
15535 ----------------------------------------------------------------------
15536 dis_int 割込みの禁止〔T〕【NGKI3081】
15537
15538 【C言語API】
15539 ER ercd = dis_int(INTNO intno)
15540
15541 【パラメータ】
15542 INTNO intno 割込み番号
15543
15544 【リターンパラメータ】
15545 ER ercd 正常終了(E_OK)またはエラーコード
15546
15547 【エラーコード】
15548 E_CTX コンテキストエラー
15549 ・非タスクコンテキストからの呼出し【NGKI3082】
15550 E_NOSPT 未サポートエラー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
312
15551 ・条件については機能の項を参照
15552 E_PAR パラメータエラー
15553 ・intnoが有効範囲外【NGKI3083】
15554 ・その他の条件については機能の項を参照
15555 E_OACV オブジェクトアクセス違反
15556 ・システム状態に対する通常操作2が許可されていない〔P〕
15557 【NGKI3084】
15558 E_OBJ オブジェクト状態エラー
15559 ・対象割込み要求ラインに対して割込み要求ライン属性が設
15560 定されていない【NGKI3085】
15561
15562 【機能】
15563
15564 intnoで指定した割込み要求ライン(対象割込み要求ライン)の割込み要求禁止
15565 フラグをセットする【NGKI3086】.
15566
15567 ターゲット定義で,対象割込み要求ラインの割込み要求禁止フラグをセットで
15568 きない場合には,E_PARエラーとなる【NGKI3087】.具体的には,対象割込み要
15569 求ラインに対して割込み要求禁止フラグがサポートされていない場合や,マル
15570 チプロセッサ対応カーネルにおいて,dis_intを呼び出したタスクが割り付けら
15571 れているプロセッサから,対象割込み要求ラインの割込み要求禁止フラグが操
15572 作できない場合が,これに該当する【NGKI3088】.
15573
15574 ターゲット定義で,割込み要求禁止フラグの振舞いが,この仕様の規定と異な
15575 る場合がある【NGKI3089】.特にマルチプロセッサ対応カーネルでは,あるプ
15576 ロセッサからdis_intを呼び出して割込み要求禁止フラグをセットしても,他の
15577 プロセッサに対しては割込みがマスクされない場合がある【NGKI3090】.
15578
15579 ターゲット定義で,dis_intがサポートされていない場合がある【NGKI3091】.
15580 dis_intがサポートされている場合には,TOPPERS_SUPPORT_DIS_INTがマクロ定
15581 義される【NGKI3092】.サポートされていない場合にdis_intを呼び出すと,
15582 E_NOSPTエラーが返るか,リンク時にエラーとなる【NGKI3093】.
15583
15584 【μITRON4.0仕様との関係】
15585
15586 μITRON4.0仕様で実装定義としていたintnoの意味を標準化した.
15587
15588 CPUロック状態でも呼び出せるものとした.
15589 ----------------------------------------------------------------------
15590 ena_int 割込みの許可〔T〕【NGKI3094】
15591
15592 【C言語API】
15593 ER ercd = ena_int(INTNO intno)
15594
15595 【パラメータ】
15596 INTNO intno 割込み番号
15597
15598 【リターンパラメータ】
15599 ER ercd 正常終了(E_OK)またはエラーコード
15600
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
313
15601 【エラーコード】
15602 E_CTX コンテキストエラー
15603 ・非タスクコンテキストからの呼出し【NGKI3095】
15604 E_NOSPT 未サポートエラー
15605 ・条件については機能の項を参照
15606 E_PAR パラメータエラー
15607 ・intnoが有効範囲外【NGKI3096】
15608 ・その他の条件については機能の項を参照
15609 E_OACV オブジェクトアクセス違反
15610 ・システム状態に対する通常操作2が許可されていない〔P〕
15611 【NGKI3097】
15612 E_OBJ オブジェクト状態エラー
15613 ・対象割込み要求ラインに対して割込み要求ライン属性が設
15614 定されていない【NGKI3098】
15615
15616 【機能】
15617
15618 intnoで指定した割込み要求ライン(対象割込み要求ライン)の割込み要求禁止
15619 フラグをクリアする【NGKI3099】.
15620
15621 ターゲット定義で,対象割込み要求ラインの割込み要求禁止フラグをクリアで
15622 きない場合には,E_PARエラーとなる【NGKI3100】.具体的には,対象割込み要
15623 求ラインに対して割込み要求禁止フラグがサポートされていない場合や,マル
15624 チプロセッサ対応カーネルにおいて,ena_intを呼び出したタスクが割り付けら
15625 れているプロセッサから,対象割込み要求ラインの割込み要求禁止フラグが操
15626 作できない場合が,これに該当する【NGKI3101】.
15627
15628 ターゲット定義で,割込み要求禁止フラグの振舞いが,この仕様の規定と異な
15629 る場合がある【NGKI3102】.特にマルチプロセッサ対応カーネルでは,あるプ
15630 ロセッサからena_intを呼び出して割込み要求禁止フラグをクリアしても,他の
15631 プロセッサに対しては割込みがマスク解除されない場合がある【NGKI3103】.
15632
15633 ターゲット定義で,ena_intがサポートされていない場合がある【NGKI3104】.
15634 ena_intがサポートされている場合には,TOPPERS_SUPPORT_ENA_INTがマクロ定
15635 義される【NGKI3105】.サポートされていない場合にena_intを呼び出すと,
15636 E_NOSPTエラーが返るか,リンク時にエラーとなる【NGKI3106】.
15637
15638 【μITRON4.0仕様との関係】
15639
15640 μITRON4.0仕様で実装定義としていたintnoの意味を標準化した.
15641
15642 CPUロック状態でも呼び出せるものとした.
15643 ----------------------------------------------------------------------
15644 ref_int 割込み要求ラインの参照〔T〕
15645
15646 【C言語API】
15647 ER ercd = ref_int(INTNO intno, T_RINT *pk_rint)
15648
15649 ☆未完成
15650
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
314
15651 【TOPPERS/ASPカーネルにおける規定】
15652
15653 ASPカーネルでは,ref_intをサポートしない.
15654
15655 【TOPPERS/FMPカーネルにおける規定】
15656
15657 FMPカーネルでは,ref_intをサポートしない.
15658
15659 【TOPPERS/HRP2カーネルにおける規定】
15660
15661 HRP2カーネルでは,ref_intをサポートしない.
15662
15663 【TOPPERS/SSPカーネルにおける規定】
15664
15665 SSPカーネルでは,ref_intをサポートしない.
15666
15667 【μITRON4.0仕様との関係】
15668
15669 μITRON4.0仕様に定義されていないサービスコールである.
15670 ----------------------------------------------------------------------
15671 chg_ipm 割込み優先度マスクの変更〔T〕【NGKI3107】
15672
15673 【C言語API】
15674 ER ercd = chg_ipm(PRI intpri)
15675
15676 【パラメータ】
15677 PRI intpri 割込み優先度マスク
15678
15679 【リターンパラメータ】
15680 ER ercd 正常終了(E_OK)またはエラーコード
15681
15682 【エラーコード】
15683 E_CTX コンテキストエラー
15684 ・非タスクコンテキストからの呼出し【NGKI3108】
15685 ・CPUロック状態からの呼出し【NGKI3109】
15686 E_PAR パラメータエラー
15687 ・条件については機能の項を参照
15688 E_OACV オブジェクトアクセス違反
15689 ・システム状態に対する通常操作2が許可されていない〔P〕
15690 【NGKI3110】
15691
15692 【機能】
15693
15694 割込み優先度マスクを,intpriで指定した値に変更する【NGKI3111】.
15695
15696 intpriは,TMIN_INTPRI以上,TIPM_ENAALL以下でなければならない.そうでな
15697 い場合には,E_PARエラーとなる【NGKI3113】.ただし,ターゲット定義の拡張
15698 として,TMIN_INTPRIよりも小さい値を指定できる場合がある【NGKI3114】.
15699
15700 【補足説明】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
315
15701
15702 割込み優先度マスクをTIPM_ENAALLに変更した場合,ディスパッチ保留状態が解
15703 除され,ディスパッチが起こる可能性がある.また,タスク例外処理ルーチン
15704 の実行が開始される可能性がある.
15705
15706 【TOPPERS/SSPカーネルにおける規定】
15707
15708 SSPカーネルでは,chg_ipmをサポートしない【SSPS0143】.
15709
15710 【μITRON4.0仕様との関係】
15711
15712 μITRON4.0仕様では,サービスコールの名称およびパラメータの名称が実装定
15713 義となっているサービスコールである.
15714 ----------------------------------------------------------------------
15715 get_ipm 割込み優先度マスクの参照〔T〕【NGKI3115】
15716
15717 【C言語API】
15718 ER ercd = get_ipm(PRI *p_intpri)
15719
15720 【パラメータ】
15721 PRI * p_intpri 割込み優先度マスクを入れるメモリ領域へのポ
15722 インタ
15723
15724 【リターンパラメータ】
15725 ER ercd エラーコード
15726 PRI intpri 割込み優先度マスク
15727
15728 【エラーコード】
15729 E_CTX コンテキストエラー
15730 ・非タスクコンテキストからの呼出し【NGKI3116】
15731 ・CPUロック状態からの呼出し【NGKI3117】
15732 E_OACV オブジェクトアクセス違反
15733 ・システム状態に対する参照操作が許可されていない〔P〕
15734 【NGKI3118】
15735 E_MACV メモリアクセス違反
15736 ・p_intpriが指すメモリ領域への書込みアクセスが許可され
15737 ていない〔P〕【NGKI3119】
15738
15739 【機能】
15740
15741 割込み優先度マスクの現在値を参照する.参照した割込み優先度マスクは,
15742 p_intpriが指すメモリ領域に返される【NGKI3120】.
15743
15744 【TOPPERS/SSPカーネルにおける規定】
15745
15746 SSPカーネルでは,get_ipmをサポートしない【SSPS0144】.
15747
15748 【μITRON4.0仕様との関係】
15749
15750 μITRON4.0仕様では,サービスコールの名称およびパラメータの名称が実装定
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
316
15751 義となっているサービスコールである.
15752 ----------------------------------------------------------------------
15753
15754 4.10 CPU例外管理機能
15755
15756 CPU例外ハンドラは,カーネルが実行を制御する処理単位である.CPU例外ハン
15757 ドラは,CPU例外ハンドラ番号と呼ぶオブジェクト番号によって識別する
15758 【NGKI3121】.
15759
15760 保護機能対応カーネルにおいて,CPU例外ハンドラは,カーネルドメインに属す
15761 る【NGKI3122】.
15762
15763 CPU例外ハンドラ属性に標準で指定できる属性はないが,ターゲットによっては,
15764 ターゲット定義のCPU例外ハンドラ属性を指定できる場合がある【NGKI3123】.
15765 ターゲット定義のCPU例外ハンドラ属性として,次の属性を予約している
15766 【NGKI3124】.
15767
15768 TA_DIRECT CPU 例外ハンドラを直接呼び出す
15769
15770 C言語によるCPU例外ハンドラの記述形式は次の通り【NGKI3125】.
15771
15772 void cpu_exception_handler(void *p_excinf)
15773 {
15774 CPU例外ハンドラ本体
15775 }
15776
15777 p_excinfには,CPU例外の情報を記憶しているメモリ領域の先頭番地が渡される
15778 【NGKI3126】.これは,CPU例外ハンドラ内で,CPU例外発生時の状態を参照す
15779 る際に必要となる.
15780 ----------------------------------------------------------------------
15781 DEF_EXC CPU例外ハンドラの定義〔S〕【NGKI3127】
15782 def_exc CPU例外ハンドラの定義〔TD〕【NGKI3128】
15783
15784 【静的API】
15785 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exc hdr })
15786
15787 【C言語API】
15788 ER ercd = def_exc(EXCNO excno, const T_DEXC *pk_dexc)
15789
15790 【パラメータ】
15791 EXCNO excno CPU 例外ハンドラ番号
15792 T_DEXC * pk_dexc CPU 例外ハンドラの定義情報を入れたパケットへ
15793 のポインタ(静的APIを除く)
15794
15795 *CPU例外ハンドラの定義情報(パケットの内容)
15796 ATR excatr CPU 例外ハンドラ属性
15797 EXCHDR exchdr CPU 例外ハンドラの先頭番地
15798
15799 【リターンパラメータ】
15800 ER erc d 正常終了(E_OK)またはエラーコード
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
317
15801
15802 【エラーコード】
15803 E_CTX コンテキストエラー
15804 ・非タスクコンテキストからの呼出し〔s〕【NGKI3129】
15805 ・CPUロック状態からの呼出し〔s〕【NGKI3130】
15806 E_RSATR 予約属性
15807 ・excatrが無効【NGKI3131】
15808 ・属するクラスの指定が有効範囲外〔sM〕【NGKI3132】
15809 ・クラスの囲みの中に記述されていない〔SM〕【NGKI3133】
15810 ・その他の条件については機能の項を参照
15811 E_PAR パラメータエラー
15812 ・excnoが有効範囲外【NGKI3134】
15813 ・exchdrがプログラムの先頭番地として正しくない【NGKI3135】
15814 E_OACV オブジェクトアクセス違反
15815 ・システム状態に対する管理操作が許可されていない〔sP〕
15816 【NGKI3136】
15817 E_MACV メモリアクセス違反
15818 ・pk_dexcが指すメモリ領域への読出しアクセスが許可されて
15819 いない〔sP〕【NGKI3137】
15820 E_OBJ オブジェクト状態エラー
15821 ・条件については機能の項を参照
15822
15823 【機能】
15824
15825 excnoで指定したCPU例外ハンドラ番号(対象CPU例外ハンドラ番号)に対して,
15826 各パラメータで指定したCPU例外ハンドラ定義情報に従って,CPU例外ハンドラ
15827 を定義する【NGKI3138】.ただし,def_excにおいてpk_dexcをNULLにした場合
15828 には,対象CPU例外ハンドラ番号に対するCPU例外ハンドラの定義を解除する
15829 【NGKI3139】.
15830
15831 静的APIにおいては,excnoとexcatrは整数定数式パラメータ,exchdrは一般定
15832 数式パラメータである【NGKI3140】.
15833
15834 CPU例外ハンドラを定義する場合(DEF_EXCの場合およびdef_excにおいて
15835 pk_dexcをNULL以外にした場合)で,対象CPU例外ハンドラ番号に対してすでに
15836 CPU例外ハンドラが定義されている場合には,E_OBJエラーとなる【NGKI3141】.
15837
15838 保護機能対応カーネルにおいて,DEF_EXCは,カーネルドメインの囲みの中に記
15839 述しなければならない.そうでない場合には,E_RSATRエラーとなる
15840 【NGKI3143】.また,def_excでCPU例外ハンドラを定義する場合には,CPU例外
15841 ハンドラの属する保護ドメインを設定する必要はなく,CPU例外ハンドラ属性に
15842 TA_DOM(domid)を指定した場合にはE_RSATRエラーとなる【NGKI3144】.ただし,
15843 TA_DOM(TDOM_SELF)を指定した場合には,指定が無視され,E_RSATRエラーは検
15844 出されない【NGKI3145】.
15845
15846 マルチプロセッサ対応カーネルで,登録するCPU例外ハンドラの属するクラスの
15847 初期割付けプロセッサが,そのCPU例外が発生するプロセッサでない場合には,
15848 E_RSATRエラーとなる【NGKI3146】.
15849
15850 CPU例外ハンドラの定義を解除する場合(def_excにおいてpk_dexcをNULLにした
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
318
15851 場合)で,対象CPU例外ハンドラ番号に対してCPU例外ハンドラが定義されてい
15852 ない場合には,E_OBJエラーとなる【NGKI3147】.また,対象CPU例外ハンドラ
15853 番号に対して定義されたCPU例外ハンドラが,静的APIで定義されたものである
15854 場合には,ターゲット定義でE_OBJエラーとなる場合がある【NGKI3148】.
15855
15856 静的APIにおいて,exchdrが不正である場合にE_PARエラーが検出されるか否か
15857 は,ターゲット定義である【NGKI3149】.
15858
15859 【TOPPERS/ASPカーネルにおける規定】
15860
15861 ASPカーネルでは,DEF_EXCのみをサポートする【ASPS0200】.
15862
15863 【TOPPERS/FMPカーネルにおける規定】
15864
15865 FMPカーネルでは,DEF_EXCのみをサポートする【FMPS0165】.
15866
15867 【TOPPERS/HRP2カーネルにおける規定】
15868
15869 HRP2カーネルでは,DEF_EXCのみをサポートする【HRPS0165】.
15870
15871 【TOPPERS/SSPカーネルにおける規定】
15872
15873 SSPカーネルでは,DEF_EXCのみをサポートする【SSPS0145】.
15874
15875 【μITRON4.0仕様との関係】
15876
15877 def_excによって,定義済みのCPU例外ハンドラを再定義しようとした場合に,
15878 E_OBJエラーとすることにした.
15879 ----------------------------------------------------------------------
15880 xsns_dpn CPU例外発生時のディスパッチ保留状態の参照〔TI〕【NGKI3150】
15881
15882 【C言語API】
15883 bool_t stat = xsns_dpn(void *p_excinf)
15884
15885 【パラメータ】
15886 void * p_excinf CPU 例外の情報を記憶しているメモリ領域の先頭
15887 番地
15888
15889 【リターンパラメータ】
15890 bool_t state ディスパッチ保留状態
15891
15892 【機能】
15893
15894 CPU例外発生時のディスパッチ保留状態を参照する.具体的な振舞いは以下の通
15895 り.
15896
15897 実行中のCPU例外ハンドラの起動原因となったCPU例外が,カーネル管理外の
15898 CPU例外でなく,タスクコンテキストで発生し,そのタスクがディスパッチ保留
15899 状態でなかった場合にfalse,そうでない場合にtrueが返る【NGKI3151】.
15900
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
319
15901 保護機能対応のカーネルにおいて,xsns_dpnをタスクコンテキストから呼び出
15902 した場合には,trueが返る【NGKI3152】.
15903
15904 p_excinfには,CPU例外ハンドラに渡されるp_excinfパラメータをそのまま渡す
15905 【NGKI3153】.
15906
15907 【使用方法】
15908
15909 xsns_dpnは,CPU例外ハンドラの中で,どのようなリカバリ処理が可能かを判別
15910 したい場合に使用する.xsns_dpnがfalseを返した場合(trueを返した場合では
15911 ないので注意すること),非タスクコンテキスト用のサービスコールを用いて
15912 CPU例外を起こしたタスクよりも優先度の高いタスクを起動または待ち解除し,
15913 そのタスクでリカバリ処理を行うことができる.ただし,CPU例外を起こしたタ
15914 スクが最高優先度の場合には,この方法でリカバリ処理を行うことはできない.
15915
15916 【使用上の注意】
15917
15918 xsns_dpnは,E_CTXエラーを返すことがないために〔TI〕となっているが,CPU
15919 例外ハンドラから呼び出すためのものである.CPU例外ハンドラ以外から呼び出
15920 した場合や,p_excinfに正しい値を渡さなかった場合,xsns_dpnが返す値は意
15921 味を持たない.
15922
15923 どちらの条件でtrueが返るか間違いやすいので注意すること.
15924
15925 【TOPPERS/SSPカーネルにおける規定】
15926
15927 SSPカーネルでは,xsns_dpnをサポートしない【SSPS0146】.
15928
15929 【μITRON4.0仕様との関係】
15930
15931 μITRON4.0仕様に定義されていないサービスコールである.
15932
15933 【仕様決定の理由】
15934
15935 保護機能対応のカーネルにおいては,xsns_dpnをユーザドメインから呼び出す
15936 ことは禁止すべきである.ユーザドメインの実行中は,必ずタスクコンテキス
15937 トであるため,xsns_dpnをタスクコンテキストから呼び出した場合に必ずtrue
15938 を返す仕様とすることで,xsns_dpnをユーザドメインから呼び出すことを実質
15939 的に禁止している.
15940 ----------------------------------------------------------------------
15941 xsns_xpn CPU例外発生時のタスク例外処理保留状態の参照〔TI〕【NGKI3154】
15942
15943 【C言語API】
15944 bool_t stat = xsns_xpn(void *p_excinf)
15945
15946 【パラメータ】
15947 void * p_excinf CPU 例外の情報を記憶しているメモリ領域の先頭
15948 番地
15949
15950 【リターンパラメータ】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
320
15951 bool_t state タスク例外処理保留状態
15952
15953 【機能】
15954
15955 CPU例外発生時にタスク例外処理ルーチンを実行開始できない状態であったかを
15956 参照する.具体的な振舞いは以下の通り.
15957
15958 実行中のCPU例外ハンドラの起動原因となったCPU例外が,カーネル管理外の
15959 CPU例外でなく,タスクコンテキストで発生し,そのタスクがタスク例外処理ルー
15960 チンを実行開始できる状態であった場合にfalse,そうでない場合にtrueが返る
15961 【NGKI3155】.
15962
15963 保護機能対応カーネルにおいて,CPU例外が発生したタスクがユーザタスクの場
15964 合には,ユーザスタック領域の残りが少なく,タスク例外処理ルーチンを実行
15965 開始できない(タスク例外処理ルーチンを実行開始しようとすると,タスク例
15966 外実行開始時スタック不正例外が発生する)場合にも,trueを返す【NGKI3156】.
15967
15968 保護機能対応のカーネルにおいて,xsns_xpnをタスクコンテキストから呼び出
15969 した場合には,trueが返る【NGKI3157】.
15970
15971 p_excinfには,CPU例外ハンドラに渡されるp_excinfパラメータをそのまま渡す
15972 【NGKI3158】.
15973
15974 【使用方法】
15975
15976 xsns_xpnは,CPU例外ハンドラの中で,どのようなリカバリ処理が可能かを判別
15977 したい場合に使用する.xsns_xpnがfalseを返した場合(trueを返した場合では
15978 ないので注意すること),非タスクコンテキスト用のサービスコールを用いて
15979 CPU例外を起こしたタスクにタスク例外を要求し,タスク例外処理ルーチンでリ
15980 カバリ処理を行うことができる.
15981
15982 【使用上の注意】
15983
15984 xsns_xpnは,E_CTXエラーを返すことがないために〔TI〕となっているが,CPU
15985 例外ハンドラから呼び出すためのものである.CPU例外ハンドラ以外から呼び出
15986 した場合や,p_excinfに正しい値を渡さなかった場合,xsns_xpnが返す値は意
15987 味を持たない.
15988
15989 どちらの条件でtrueが返るか間違いやすいので注意すること.
15990
15991 【TOPPERS/SSPカーネルにおける規定】
15992
15993 SSPカーネルでは,xsns_xpnをサポートしない【SSPS0147】.
15994
15995 【μITRON4.0仕様との関係】
15996
15997 μITRON4.0仕様に定義されていないサービスコールである.
15998
15999 【仕様決定の理由】
16000
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
321
16001 保護機能対応のカーネルにおいては,xsns_xpnをユーザドメインから呼び出す
16002 ことは禁止すべきである.ユーザドメインの実行中は,必ずタスクコンテキス
16003 トであるため,xsns_xpnをタスクコンテキストから呼び出した場合に必ずtrue
16004 を返す仕様とすることで,xsns_xpnをユーザドメインから呼び出すことを実質
16005 的に禁止している.
16006 ----------------------------------------------------------------------
16007
16008 4.11 拡張サービスコール管理機能
16009
16010 拡張サービスコールは,非特権モードで実行される処理単位から,特権モード
16011 で実行すべきルーチンを呼び出すための機能である【NGKI3159】.特権モード
16012 で実行するルーチンを,拡張サービスコールと呼ぶ.拡張サービスコールは,
16013 特権モードで実行される処理単位からも呼び出すことができる【NGKI3160】.
16014
16015 保護機能対応カーネルにおいて,拡張サービスコールは,カーネルドメインに
16016 属する【NGKI3161】.拡張サービスコールは,それを呼び出す処理単位とは別
16017 の処理単位であり,拡張サービスコールからカーネルオブジェクトをアクセス
16018 する場合には,拡張サービスコールがアクセスの主体となる【NGKI3162】.そ
16019 のため,拡張サービスコールからは,すべてのカーネルオブジェクトに対して,
16020 すべての種別のアクセスを行うことが許可される.
16021
16022 保護機能対応でないカーネルでは,非特権モードと特権モードの区別がないた
16023 め,拡張サービスコール管理機能をサポートしない【NGKI3163】.
16024
16025 C言語による拡張サービスコールの記述形式は次の通り【NGKI3164】.
16026
16027 ER_UINT extended_svc(intptr_t par1, intptr_t par2, intptr_t par3,
16028 intptr_t par4, intptr_t par5, ID cdmid)
16029 {
16030 拡張サービスコール本体
16031 }
16032
16033 cdmidには,拡張サービスコールを呼び出した処理単位が属する保護ドメインの
16034 ID番号が渡される【NGKI3165】.すなわち,拡張サービスコールから呼び出し
16035 た場合にはTDOM_KERNEL(=-1)が,タスク本体(拡張サービスコールを除く)
16036 から呼び出した場合にはそのタスク(自タスク)の属する保護ドメインIDが渡
16037 される.
16038
16039 par1~par5には,拡張サービスコールに対するパラメータが渡される
16040 【NGKI3166】.
16041
16042 拡張サービスコール管理機能に関連するカーネル構成マクロは次の通り.
16043
16044 TMAX_FNCD 拡張サービスコールの機能番号の最大値(動的生成対応
16045 カーネルでは,登録できる拡張サービスコールの数に一
16046 致)【NGKI3167】
16047
16048 【TOPPERS/ASPカーネルにおける規定】
16049
16050 ASPカーネルでは,拡張サービスコール管理機能をサポートしない【ASPS0201】.
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
322
16051
16052 【TOPPERS/FMPカーネルにおける規定】
16053
16054 FMPカーネルでは,拡張サービスコール管理機能をサポートしない【FMPS0166】.
16055
16056 【TOPPERS/HRP2カーネルにおける規定】
16057
16058 HRP2カーネルでは,拡張サービスコール管理機能をサポートする【HRPS0166】.
16059
16060 【TOPPERS/SSPカーネルにおける規定】
16061
16062 SSPカーネルでは,拡張サービスコール管理機能をサポートしない【SSPS0148】.
16063
16064 【未決定事項】
16065
16066 動的生成対応カーネルにおいてTMAX_FNCDを設定する方法については,現時点で
16067 は未決定である.
16068
16069 【μITRON4.0仕様との関係】
16070
16071 この仕様では,拡張サービスコールに対するパラメータを,intptr_t型のパラ
16072 メータ5個に固定した.
16073
16074 拡張サービスコールに,それを呼び出した処理単位が属する保護ドメインのID
16075 番号を渡す機能を追加した.
16076
16077 TMAX_FNCDは,μITRON4.0仕様に規定されていないカーネル構成マクロである.
16078 ----------------------------------------------------------------------
16079 DEF_SVC 拡張サービスコールの定義〔SP〕【NGKI3168】
16080 def_svc 拡張サービスコールの定義〔TPD〕【NGKI3169】
16081
16082 【静的API】
16083 DEF_SVC(FN fncd, { ATR svcatr, EXTSVC extsvc, SIZE stksz })
16084
16085 【C言語API】
16086 ER ercd = def_svc(FN fncd, const T_DSVC *pk_dsvc)
16087
16088 【パラメータ】
16089 FN fncd 拡張サービスコールの機能コード
16090 T_DSVC * pk_d svc 拡張サービスコールの定義情報を入れたパケッ
16091 トへのポインタ(静的APIを除く)
16092
16093 *拡張サービスコールの定義情報(パケットの内容)
16094 ATR svcatr 拡張サービスコール属性
16095 EXTSVC extsvc 拡張サービスコールの先頭番地
16096 SIZE stksz 拡張サービスコールで使用するスタックサイズ
16097
16098 【リターンパラメータ】
16099 ER ercd 正常終了(E_OK)またはエラーコード
16100
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
323
16101 【エラーコード】
16102 E_CTX コンテキストエラー
16103 ・非タスクコンテキストからの呼出し〔s〕【NGKI3170】
16104 ・CPUロック状態からの呼出し〔s〕【NGKI3171】
16105 E_RSATR 予約属性
16106 ・svcatrが無効【NGKI3172】
16107 ・その他の条件については機能の項を参照
16108 E_PAR パラメータエラー
16109 ・fncdが0または負の値【NGKI3173】
16110 ・fncdがTMAX_FNCDよりも大きい〔s〕【NGKI3174】
16111 ・extsvcがプログラムの先頭番地として正しくない【NGKI3175】
16112 ・stkszが負の値〔S〕【NGKI3290】
16113 E_OACV オブジェクトアクセス違反
16114 ・システム状態に対する管理操作が許可されていない〔s〕
16115 【NGKI3176】
16116 E_MACV メモリアクセス違反
16117 ・pk_dsvcが指すメモリ領域への読出しアクセスが許可されて
16118 いない〔s〕【NGKI3177】
16119 E_OBJ オブジェクト状態エラー
16120 ・条件については機能の項を参照
16121
16122 【機能】
16123
16124 fncdで指定した機能コード(対象機能コード)に対して,各パラメータで指定
16125 した拡張サービスコール定義情報に従って,拡張サービスコールを定義する
16126 【NGKI3178】.ただし,def_svcにおいてpk_dsvcをNULLにした場合には,対象
16127 機能コードに対する拡張サービスコールの定義を解除する【NGKI3179】.
16128
16129 静的APIにおいては,fncd,svcatr,stkszは整数定数式パラメータ,svchdrは
16130 一般定数式パラメータである【NGKI3180】.
16131
16132 拡張サービスコールを定義する場合(DEF_SVCの場合およびdef_svcにおいて
16133 pk_dsvcをNULL以外にした場合)で,対象機能コードに対してすでに拡張サービ
16134 スコールが定義されている場合には,E_OBJエラーとなる【NGKI3181】.
16135
16136 DEF_SVCは,カーネルドメインの囲みの中に記述しなければならない.そうでな
16137 い場合には,E_RSATRエラーとなる【NGKI3183】.また,def_svcで拡張サービ
16138 スコールを定義する場合には,拡張サービスコールの属する保護ドメインを設
16139 定する必要はなく,拡張サービスコール属性にTA_DOM(domid)を指定した場合に
16140 はE_RSATRエラーとなる【NGKI3184】.ただし,TA_DOM(TDOM_SELF)を指定した
16141 場合には,指定が無視され,E_RSATRエラーは検出されない【NGKI3185】.
16142
16143 マルチプロセッサ対応カーネルでは,DEF_SVCは,クラスの囲みの外に記述しな
16144 ければならない.そうでない場合には,E_RSATRエラーとなる【NGKI3187】.ま
16145 た,def_svcで拡張サービスコールを定義する場合には,拡張サービスコールの
16146 属するクラスを設定する必要はなく,拡張サービスコール属性に
16147 TA_CLS(clsid)を指定した場合にはE_RSATRエラーとなる【NGKI3188】.ただし,
16148 TA_CLS(TCLS_SELF)を指定した場合には,指定が無視され,E_RSATRエラーは検
16149 出されない【NGKI3189】.
16150
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
324
16151 拡張サービスコールの定義を解除する場合(def_svcにおいてpk_dsvcをNULLに
16152 した場合)で,対象機能コードに対して拡張サービスコールが定義されていな
16153 い場合には,E_OBJエラーとなる【NGKI3190】.
16154
16155 【TOPPERS/HRP2カーネルにおける規定】
16156
16157 HRP2カーネルでは,DEF_SVCのみをサポートする【HRPS0167】.
16158
16159 【μITRON4.0仕様との関係】
16160
16161 拡張サービスコールの定義情報に,stksz(拡張サービスコールで使用するスタッ
16162 クサイズ)を追加した.
16163
16164 extsvcのデータ型を,EXTSVCに変更した.
16165 ----------------------------------------------------------------------
16166 cal_svc 拡張サービスコールの呼出し〔TIP〕【NGKI3191】
16167
16168 【C言語API】
16169 ER_UINT ercd = cal_svc(FN fncd, intptr_t par1, intptr_t par2,
16170 intptr_t par3, intptr_t par4, intptr_t par5)
16171
16172 【パラメータ】
16173 FN fncd 呼び出す拡張サービスコールの機能コード
16174 intptr_t par1 拡張サービスコールへの第1パラメータ
16175 intptr_t par2 拡張サービスコールへの第2パラメータ
16176 intptr_t par3 拡張サービスコールへの第3パラメータ
16177 intptr_t par4 拡張サービスコールへの第4パラメータ
16178 intptr_t par5 拡張サービスコールへの第5パラメータ
16179
16180 【リターンパラメータ】
16181 ER_UINT ercd 正常終了(正の値または0)またはエラーコード
16182
16183 【エラーコード】
16184 E_SYS システムエラー
16185 ・条件については機能の項を参照
16186 E_RSFN 予約機能コード
16187 ・fncdが0または負の値【NGKI3192】
16188 ・fncdがTMAX_FNCDよりも大きい【NGKI3193】
16189 ・fncdで指定した機能コードに対して拡張サービスコールが
16190 定義されていない【NGKI3194】
16191 E_NOMEM メモリ不足
16192 ・条件については機能の項を参照
16193 *その他,拡張サービスコールが返すエラーコードがそのまま返る.
16194
16195 【機能】
16196
16197 fncdで指定した機能コードの拡張サービスコールを,par1,par2,…,par5を
16198 パラメータとして呼び出し,拡張サービスコールの返値を返す【NGKI3195】.
16199
16200 また,タスクコンテキストから呼び出した場合には,次のエラーが検出される
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
325
16201 【NGKI3196】.スタック(ユーザタスクの場合はシステムスタック)の残り領
16202 域が,拡張サービスコールで使用するスタックサイズよりも小さい場合には,
16203 E_NOMEMエラーとなる【NGKI3197】.また,拡張サービスコールのネストレベル
16204 が上限(=255)を超える場合には,E_SYSエラーが返る【NGKI3198】.
16205
16206 【μITRON4.0仕様との関係】
16207
16208 μITRON4.0仕様では,cal_svcでカーネルのサービスコールを呼び出せるかどう
16209 かは実装定義としているが,この仕様では,カーネルのサービスコールを呼び
16210 出せないこととした.
16211
16212 拡張サービスコールが呼び出される時に,スタックの残り領域のサイズをチェッ
16213 クする機能を追加した.
16214
16215 拡張サービスコールに対するパラメータを,intptr_t型のパラメータ5個に固定
16216 し,cal_svcから返るエラー(E_SYS,E_RSFN,E_NOMEM)について規定した.
16217
16218 【仕様決定の理由】
16219
16220 パラメータの型と数を固定したのは,型チェックを厳密にできるようにし,パ
16221 ラメータをコンパイラやコーリングコンベンションによらずに正しく渡せるよ
16222 うにするためである.
16223 ----------------------------------------------------------------------
16224
16225 4.12 システム構成管理機能
16226
16227 システム構成管理機能には,非タスクコンテキスト用スタック領域を設定する
16228 機能,初期化ルーチンと終了処理ルーチンを登録する機能,カーネルのコンフィ
16229 ギュレーション情報やバージョン情報を参照する機能が含まれる.
16230
16231 非タスクコンテキスト用スタック領域は,非タスクコンテキストで実行される
16232 処理単位が用いるスタック領域である.
16233
16234 保護機能対応カーネルにおいて,非タスクコンテキスト用のスタック領域は,
16235 カーネルの用いるオブジェクト管理領域と同様に扱われる【NGKI3199】.
16236
16237 初期化ルーチンは,カーネルが実行を制御する処理単位で,カーネルの動作開
16238 始の直前に,カーネル非動作状態で実行される【NGKI3200】.
16239
16240 保護機能対応カーネルにおいて,初期化ルーチンは,カーネルドメインに属す
16241 る【NGKI3201】.
16242
16243 初期化ルーチン属性に指定できる属性はない【NGKI3202】.そのため初期化ルー
16244 チン属性には,TA_NULLを指定しなければならない【NGKI3203】.
16245
16246 C言語による初期化ルーチンの記述形式は次の通り【NGKI3204】.
16247
16248 void initialization_routine(intptr_t exinf)
16249 {
16250 初期化ルーチン本体
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
326
16251 }
16252
16253 exinfには,初期化ルーチンの拡張情報が渡される【NGKI3205】.
16254
16255 終了処理ルーチンは,カーネルが実行を制御する処理単位で,カーネルの動作
16256 終了の直後に,カーネル非動作状態で実行される【NGKI3206】.
16257
16258 保護機能対応カーネルにおいて,終了処理ルーチンは,カーネルドメインに属
16259 する【NGKI3207】.
16260
16261 終了処理ルーチン属性に指定できる属性はない【NGKI3208】.そのため終了処
16262 理ルーチン属性には,TA_NULLを指定しなければならない【NGKI3209】.
16263
16264 C言語による終了処理ルーチンの記述形式は次の通り【NGKI3210】.
16265
16266 void termination_routine(intptr_t exinf)
16267 {
16268 終了処理ルーチン本体
16269 }
16270
16271 exinfには,終了処理ルーチンの拡張情報が渡される【NGKI3211】.
16272
16273 【μITRON4.0仕様との関係】
16274
16275 非タスクコンテキスト用スタック領域の設定と,終了処理ルーチンは,
16276 μITRON4.0仕様に規定されていない機能である.
16277 ----------------------------------------------------------------------
16278 DEF_ICS 非タスクコンテキスト用スタック領域の設定〔S〕【NGKI3212】
16279
16280 【静的API】
16281 DEF_ICS({ SIZE istksz, STK_T *istk })
16282
16283 【パラメータ】
16284 *非タスクコンテキスト用スタック領域の設定情報
16285 SIZE istksz 非タスクコンテキスト用スタック領域のサイズ
16286 (バイト数)
16287 STK_T istk 非タスクコンテキスト用スタック領域の先頭番地
16288
16289 【エラーコード】
16290 E_RSATR 予約属性
16291 ・カーネルドメインの囲みの中に記述されていない〔P〕【NGKI3213】
16292 ・クラスの囲みの中に記述されていない〔M〕【NGKI3214】
16293 E_PAR パラメータエラー
16294 ・条件については機能の項を参照
16295 E_NOMEM メモリ不足
16296 ・非タスクコンテキスト用スタック領域が確保できない【NGKI3215】
16297 E_OBJ オブジェクト状態エラー
16298 ・非タスクコンテキスト用スタック領域が設定済み【NGKI3216】
16299 ・その他の条件については機能の項を参照
16300
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
327
16301 【機能】
16302
16303 各パラメータで指定した非タスクコンテキスト用スタック領域の設定情報に従っ
16304 て,非タスクコンテキスト用スタック領域を設定する【NGKI3217】.istkszに
16305 0以下の値を指定した時や,ターゲット定義の最小値よりも小さい値を指定した
16306 時には,E_PARエラーとなる【NGKI3254】.
16307
16308 istkszは整数定数式パラメータ,istkは一般定数式パラメータである.コンフィ
16309 ギュレータは,静的APIのメモリ不足(E_NOMEM)エラーを検出することができ
16310 ない【NGKI3218】.
16311
16312 istkをNULLとした場合,istkszで指定したサイズのスタック領域が,コンフィ
16313 ギュレータにより確保される【NGKI3219】.istkszにターゲット定義の制約に
16314 合致しないサイズを指定した時には,ターゲット定義の制約に合致するように
16315 大きい方に丸めたサイズで確保される【NGKI3220】.
16316
16317 istkにNULL以外を指定した場合,istkとistkszで指定したスタック領域は,ア
16318 プリケーションで確保しておく必要がある【NGKI3221】.スタック領域をアプ
16319 リケーションで確保する方法については,「2.15.3 カーネル共通マクロ」の節
16320 を参照すること.その方法に従わず,istkやistkszにターゲット定義の制約に
16321 合致しない先頭番地やサイズを指定した時には,E_PARエラーとなる
16322 【NGKI3222】.
16323
16324 保護機能対応カーネルでは,istkとistkszで指定した非タスクコンテキスト用
16325 のスタック領域がカーネル専用のメモリオブジェクトに含まれない場合,
16326 E_OBJエラーとなる【NGKI3223】.
16327
16328 DEF_ICSにより非タスクコンテキスト用スタック領域を設定しない場合,ターゲッ
16329 ト定義のデフォルトのサイズのスタック領域が,コンフィギュレータにより確
16330 保される【NGKI3224】.
16331
16332 マルチプロセッサ対応カーネルでは,非タスクコンテキスト用スタック領域は
16333 プロセッサ毎に確保する必要がある【NGKI3225】.DEF_ICSにより設定する非タ
16334 スクコンテキスト用スタック領域は,DEF_ICSの記述をその囲みの中に含むクラ
16335 スの初期割付けプロセッサが使用する【NGKI3226】.そのプロセッサに対して
16336 すでに非タスクコンテキスト用スタック領域が設定されている場合には,
16337 E_OBJエラーとなる【NGKI3227】.
16338
16339 【TOPPERS/SSPカーネルにおける規定】
16340
16341 SSPカーネルでは,istkにはNULLを指定しなくてはならず,その場合でも,コン
16342 フィギュレータは非タスクコンテキスト用のスタック領域を確保しない
16343 【SSPS0149】.これは,SSPカーネルでは,すべての処理単位が共有スタック領
16344 域を使用し,非タスクコンテキストのみが用いるスタック領域を持たないため
16345 である.そのため,DEF_ICSの役割は,非タスクコンテキストが用いるスタック
16346 領域のサイズを指定することのみとなる.itskにNULL以外を指定した場合には,
16347 E_PARエラーとなる【SSPS0150】.
16348
16349 共有スタック領域の設定方法については,DEF_STKの項を参照すること.
16350
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
328
16351 【μITRON4.0仕様との関係】
16352
16353 μITRON4.0仕様に定義されていない静的APIである.
16354 ----------------------------------------------------------------------
16355 DEF_STK 共有スタック領域の設定〔S〕【NGKI3228】
16356
16357 【静的API】
16358 DEF_STK({ SIZE stksz, S TK_T *stk })
16359
16360 【パラメータ】
16361 *共有スタック領域の設定情報
16362 SIZE stksz 共有スタック領域のサイズ(バイト数)
16363 STK_T stk 共有スタック領域の先頭番地
16364
16365 【エラーコード】
16366 E_PAR パラメータエラー
16367 ・条件については機能の項を参照
16368 E_NOMEM メモリ不足
16369 ・共有スタック領域が確保できない【NGKI3229】
16370 E_OBJ オブジェクト状態エラー
16371 ・共有スタック領域が設定済み
16372
16373 【サポートするカーネル】
16374
16375 DEF_STKは,TOPPERS/SSPカーネルのみがサポートする静的APIである.他のカー
16376 ネルは,DEF_STKをサポートしない【NGKI3230】.
16377
16378 【機能】
16379
16380 各パラメータで指定した共有スタック領域の設定情報に従って,共有スタック
16381 領域を設定する【NGKI3231】.stkszに0以下の値を指定した時や,ターゲット
16382 定義の最小値よりも小さい値を指定した時には,E_PARエラーとなる【NGKI3255】.
16383
16384 stkszは整数定数式パラメータ,stkは一般定数式パラメータである.コンフィ
16385 ギュレータは,静的APIのメモリ不足(E_NOMEM)エラーを検出することができ
16386 ない【NGKI3232】.
16387
16388 stkをNULLとした場合,stkszで指定したサイズのスタック領域が,コンフィギュ
16389 レータにより確保される【NGKI3233】.stkszにターゲット定義の制約に合致し
16390 ないサイズを指定した時には,ターゲット定義の制約に合致するように大きい
16391 方に丸めたサイズで確保される【NGKI3234】.
16392
16393 stkにNULL以外を指定した場合,stkとstkszで指定したスタック領域は,アプリ
16394 ケーションで確保しておく必要がある【NGKI3235】.スタック領域をアプリケー
16395 ションで確保する方法については,「2.15.3 カーネル共通マクロ」の節を参照
16396 すること.その方法に従わず,stkやstkszにターゲット定義の制約に合致しな
16397 い先頭番地やサイズを指定した時には,E_PARエラーとなる【NGKI3236】.
16398
16399 コンフィギュレータは,各タスクのスタック領域のサイズと,非タスクコンテ
16400 キスト用のスタック領域のサイズから,共有スタック領域に必要なサイズを計
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
329
16401 算する【NGKI3237】.DEF_STKにより共有スタック領域を設定しない場合,必要
16402 なサイズの共有スタック領域が,コンフィギュレータにより確保される
16403 【NGKI3238】.
16404
16405 stkszに指定したスタック領域のサイズが,共有スタック領域に必要なサイズよ
16406 りも小さい場合,コンフィギュレータは警告メッセージを出力する【NGKI3239】.
16407
16408 【μITRON4.0仕様との関係】
16409
16410 μITRON4.0仕様に定義されていない静的APIである.
16411 ----------------------------------------------------------------------
16412 ATT_INI 初期化ルーチンの追加〔S〕【NGKI3240】
16413
16414 【静的API】
16415 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
16416
16417 【パラメータ】
16418 *初期化ルーチンの追加情報
16419 ATR iniatr 初期化ルーチン属性
16420 intptr_t exinf 初期化ルーチンの拡張情報
16421 INIRTN inirtn 初期化ルーチンの先頭番地
16422
16423 【エラーコード】
16424 E_RSATR 予約属性
16425 ・iniatrが無効【NGKI3241】
16426 ・カーネルドメインの囲みの中に記述されていない〔P〕【NGKI3242】
16427 E_PAR パラメータエラー
16428 ・inirtnがプログラムの先頭番地として正しくない【NGKI3243】
16429
16430 【機能】
16431
16432 各パラメータで指定した初期化ルーチン追加情報に従って,初期化ルーチンを
16433 追加する【NGKI3244】.
16434
16435 iniatrは整数定数式パラメータ,exinfとinirtnは一般定数式パラメータである
16436 【NGKI3245】.
16437
16438 inirtnが不正である場合にE_PARエラーが検出されるか否かは,ターゲット定義
16439 である【NGKI3246】.
16440
16441 【補足説明】
16442
16443 マルチプロセッサ対応カーネルでは,クラスに属さないグローバル初期化ルー
16444 チンはマスタプロセッサで実行され,クラスに属するローカル初期化ルーチン
16445 はそのクラスの初期割付けプロセッサにより実行される.
16446 ----------------------------------------------------------------------
16447 ATT_TER 終了処理ルーチンの追加〔S〕【NGKI3247】
16448
16449 【静的API】
16450 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
330
16451
16452 【パラメータ】
16453 *終了処理ルーチンの追加情報
16454 ATR teratr 終了処理ルーチン属性
16455 intptr_t exinf 終了処理ルーチンの拡張情報
16456 TERRTN terrtn 終了処理ルーチンの先頭番地
16457
16458 【エラーコード】
16459 E_RSATR 予約属性
16460 ・teratrが無効【NGKI3248】
16461 ・カーネルドメインの囲みの中に記述されていない〔P〕【NGKI3249】
16462 E_PAR パラメータエラー
16463 ・terrtnがプログラムの先頭番地として正しくない【NGKI3250】
16464
16465 【機能】
16466
16467 各パラメータで指定した終了処理ルーチン追加情報に従って,終了処理ルーチ
16468 ンを追加する【NGKI3251】.
16469
16470 teratrは整数定数式パラメータ,exinfとterrtnは一般定数式パラメータである
16471 【NGKI3252】.
16472
16473 terrtnが不正である場合にE_PARエラーが検出されるか否かは,ターゲット定義
16474 である【NGKI3253】.
16475
16476 【補足説明】
16477
16478 マルチプロセッサ対応カーネルでは,クラスに属さないグローバル終了処理ルー
16479 チンはマスタプロセッサで実行され,クラスに属するローカル終了処理ルーチ
16480 ンはそのクラスの初期割付けプロセッサにより実行される.
16481
16482 【μITRON4.0仕様との関係】
16483
16484 μITRON4.0仕様に定義されていない静的APIである.
16485 ----------------------------------------------------------------------
16486 ref_cfg コンフィギュレーション情報の参照〔T〕
16487
16488 【C言語API】
16489 ER ercd = ref_cfg(T_RCFG *pk_rcfg)
16490
16491 ☆未完成
16492
16493 【TOPPERS/ASPカーネルにおける規定】
16494
16495 ASPカーネルでは,ref_cfgをサポートしない.
16496
16497 【TOPPERS/FMPカーネルにおける規定】
16498
16499 FMPカーネルでは,ref_cfgをサポートしない.
16500
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
331
16501 【TOPPERS/HRP2カーネルにおける規定】
16502
16503 HRP2カーネルでは,ref_cfgをサポートしない.
16504
16505 【TOPPERS/SSPカーネルにおける規定】
16506
16507 SSPカーネルでは,ref_cfgをサポートしない.
16508 ----------------------------------------------------------------------
16509 ref_ver バージョン情報の参照〔T〕
16510
16511 【C言語API】
16512 ER ercd = ref_ver(T_RVER *pk_rver)
16513
16514 ☆未完成
16515
16516 【TOPPERS/ASPカーネルにおける規定】
16517
16518 ASPカーネルでは,ref_verをサポートしない.
16519
16520 【TOPPERS/FMPカーネルにおける規定】
16521
16522 FMPカーネルでは,ref_verをサポートしない.
16523
16524 【TOPPERS/HRP2カーネルにおける規定】
16525
16526 HRP2カーネルでは,ref_verをサポートしない.
16527
16528 【TOPPERS/SSPカーネルにおける規定】
16529
16530 SSPカーネルでは,ref_verをサポートしない.
16531 ----------------------------------------------------------------------
16532
16533
16534 第5章 リファレンス
16535
16536 5.1 サービスコール一覧
16537
16538 (1) タスク管理機能
16539
16540 ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk) 〔TD〕
16541 ER ercd = sac_tsk(ID tskid, const ACVCT *p_acvct) 〔TPD〕
16542 ER ercd = del_tsk(ID tskid) 〔TD〕
16543 ER ercd = act_tsk(ID tskid) 〔T〕
16544 ER ercd = iact_tsk(ID tskid) 〔I〕
16545 ER ercd = mact_tsk(ID tskid, ID prcid) 〔TM〕
16546 ER ercd = imact_tsk(ID tskid, ID prcid) 〔IM〕
16547 ER_UINT actcnt = can_act(ID tskid) 〔T〕
16548 ER ercd = mig_tsk(ID tskid, ID prcid) 〔TM〕
16549 ER ercd = ext_tsk() 〔T〕
16550 ER ercd = ter_tsk(ID tskid) 〔T〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
332
16551 ER ercd = chg_pri(ID tskid, PRI tskpri) 〔T〕
16552 ER ercd = get_pri(ID tskid, PRI *p_tskpri) 〔T〕
16553 ER ercd = get_inf(intptr_t *p_exinf) 〔T〕
16554 ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk) 〔T〕
16555
16556 (2) タスク付属同期機能
16557
16558 ER ercd = slp_tsk() 〔T〕
16559 ER ercd = tslp_tsk(TMO tmout) 〔T〕
16560 ER ercd = wup_tsk(ID tskid) 〔T〕
16561 ER ercd = iwup_tsk(ID tskid) 〔I〕
16562 ER_UINT wupcnt = can_wup(ID tskid) 〔T〕
16563 ER ercd = rel_wai(ID tskid) 〔T〕
16564 ER ercd = irel_wai(ID tskid) 〔I〕
16565 ER ercd = sus_tsk(ID tskid) 〔T〕
16566 ER ercd = rsm_tsk(ID tskid) 〔T〕
16567 ER ercd = dis_wai(ID tskid) 〔TP〕
16568 ER ercd = idis_wai(ID tskid) 〔IP〕
16569 ER ercd = ena_wai(ID tskid) 〔TP〕
16570 ER ercd = iena_wai(ID tskid) 〔IP〕
16571 ER ercd = dly_tsk(RELTIM dlytim) 〔T〕
16572
16573 (3) タスク例外処理機能
16574
16575 ER ercd = def_tex(ID tskid, cons t T_DTEX *pk_dtex) 〔TD〕
16576 ER ercd = ras_tex(ID tskid, TEXPTN rasptn) 〔T〕
16577 ER ercd = iras_tex(ID tskid, TEXPTN rasptn) 〔I〕
16578 ER ercd = dis_tex() 〔T〕
16579 ER ercd = ena_tex() 〔T〕
16580 bool_t state = sns_tex() 〔TI〕
16581 ER ercd = ref_tex(ID tskid, T_RTEX *pk_rtex) 〔T〕
16582
16583 (4) 同期・通信機能
16584
16585 セマフォ
16586
16587 ER_ID semid = acre_sem(const T_CSEM *pk_csem) 〔TD〕
16588 ER ercd = sac_sem(ID semid, const ACVCT *p_acvct) 〔TPD〕
16589 ER ercd = del_sem(ID semid) 〔TD〕
16590 ER ercd = sig_sem(ID semid) 〔T〕
16591 ER ercd = isig_sem(ID semid) 〔I〕
16592 ER ercd = wai_sem(ID semid) 〔T〕
16593 ER ercd = pol_sem(ID semid) 〔T〕
16594 ER ercd = twai_sem(ID semid, TMO tmout) 〔T〕
16595 ER ercd = ini_sem(ID semid) 〔T〕
16596 ER ercd = ref_sem(ID semid, T_RSEM *pk_rsem) 〔T〕
16597
16598 イベントフラグ
16599
16600 ER_ID flgid = acre_flg(const T_CFLG *pk_cflg) 〔TD〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
333
16601 ER ercd = sac_flg(ID flgid, const ACVCT *p_acvct) 〔TPD〕
16602 ER ercd = del_flg(ID flgid) 〔TD〕
16603 ER ercd = set_flg(ID flgid, FLGPTN setptn) 〔T〕
16604 ER ercd = iset_flg(ID flgid, FLGPTN setptn) 〔I〕
16605 ER ercd = clr_flg(ID flgid, FLGPTN clrptn) 〔T〕
16606 ER ercd = wai_flg(ID flgid, FLGPTN waiptn, 〔T〕
16607 MODE wfmode, FLGPTN *p_flgptn)
16608 ER ercd = pol_flg(ID flgid, FLGPTN waiptn, 〔T〕
16609 MODE wfmode, FLGPTN *p_flgptn)
16610 ER ercd = t wai_flg(ID flgid, FLGPTN waiptn, 〔T〕
16611 MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
16612 ER ercd = ini_flg(ID flgid) 〔T〕
16613 ER ercd = ref_flg(ID flgid, T_RFLG *pk_rflg) 〔T〕
16614
16615 データキュー
16616
16617 ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq) 〔TD〕
16618 ER ercd = sac_dtq(ID dtqid, const ACVCT *p_acvct) 〔TPD〕
16619 ER ercd = del_dtq(ID dtqid) 〔TD〕
16620 ER ercd = snd_dtq(ID dtqid, intptr_t data) 〔T〕
16621 ER ercd = psnd_dtq(ID dtqid, intptr_t data) 〔T〕
16622 ER ercd = ipsnd_dtq(ID dtqid, intptr_t data) 〔I〕
16623 ER ercd = tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) 〔T〕
16624 ER ercd = fsnd_dtq(ID dtqid, intptr_t data) 〔T〕
16625 ER ercd = ifsn d_dtq(ID dtqid, intptr_t data) 〔I〕
16626 ER ercd = rcv_dtq(ID dtqid, intptr_t *p_data) 〔T〕
16627 ER ercd = prcv_dtq(ID dtqid, intptr_t *p_data) 〔T〕
16628 ER ercd = trcv_dtq(ID dt qid, intptr_t *p_data, TMO tmout) 〔T〕
16629 ER ercd = ini_dtq(ID dtqid) 〔T〕
16630 ER ercd = ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) 〔T〕
16631
16632 優先度データキュー
16633
16634 ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq) 〔TD〕
16635 ER ercd = sac_pdq(ID pdqid, const ACVCT *p_acvct) 〔TPD〕
16636 ER ercd = del_pdq(ID pdqid) 〔TD〕
16637 ER ercd = snd_pdq(ID pdqid, intptr_t data, PRI datapri) 〔T〕
16638 ER ercd = psnd_pdq(ID pdqid, intptr_t data, PRI datapri) 〔T〕
16639 ER ercd = ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) 〔I〕
16640 ER ercd = tsnd_pdq(ID pdqid, intptr_t data, 〔T〕
16641 PRI datapri, TMO tmout)
16642 ER ercd = rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) 〔T〕
16643 ER ercd = prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) 〔T〕
16644 ER ercd = trcv_pdq(ID pdqid, intptr_t *p_data, 〔T〕
16645 PRI *p_datapri, TMO tmout)
16646 ER ercd = ini_pdq(ID pdqid) 〔T〕
16647 ER ercd = ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) 〔T〕
16648
16649 メールボックス
16650
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
334
16651 ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx) 〔TDp〕
16652 ER ercd = del_mbx(ID mbxid) 〔TDp〕
16653 ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg) 〔Tp〕
16654 ER ercd = rcv_mbx(ID mbxid, T_MSG **ppk_msg) 〔Tp〕
16655 ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg) 〔Tp〕
16656 ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) 〔Tp〕
16657 ER ercd = ini_mbx(ID mbxid) 〔Tp〕
16658 ER ercd = ref_mbx (ID mbxid, T_RMBX *pk_rmbx) 〔Tp〕
16659
16660 ミューテックス
16661
16662 ER_ID mtxid = acre_mtx(const T_CMTX *pk_cmtx) 〔TD〕
16663 ER ercd = sac_mtx(ID mtxid, const ACVCT *p_acvct) 〔TPD〕
16664 ER ercd = del_mtx(ID mtxid) 〔TD〕
16665 ER ercd = loc_mtx(ID mtxid) 〔T〕
16666 ER ercd = ploc_mtx(ID mtxid) 〔T〕
16667 ER ercd = tloc_mtx(ID mtxid, TMO tmout) 〔T〕
16668 ER ercd = unl_mtx(ID mtxid) 〔T〕
16669 ER ercd = ini_mtx(ID mtxid) 〔T〕
16670 ER ercd = ref_mtx(ID mtxid, T_RMTX *pk_rmtx) 〔T〕
16671
16672 メッセージバッファ
16673
16674 ER_ID mbfid = acre_mbf(const T_CMBF *pk_cmbf) 〔TD〕
16675 ER ercd = sac_mbf(ID mbfid, const ACVCT *p_acvct) 〔TPD〕
16676 ER ercd = del_mbf(ID mbfid) 〔TD〕
16677 ER ercd = snd_mbf(ID mbfid, const void *msg, uint_t msgsz) 〔T〕
16678 ER ercd = psnd_mbf(ID mbfid, const void *msg, uint_t msgsz ) 〔T〕
16679 ER ercd = tsnd_mbf(ID mbfid, const void *msg, 〔T〕
16680 uint_t msgsz, TMO tmout)
16681 ER_UINT msgsz = rcv_mbf(ID mbfid, void *msg) 〔T〕
16682 ER_UINT msgsz = prcv_mbf(ID mbfid, void *msg) 〔T〕
16683 ER_UINT msgsz = trcv_mbf(ID mbfid, void *msg, TMO tmout) 〔T〕
16684 ER ercd = ini_mbf(ID mbfid) 〔T〕
16685 ER ercd = ref_mbf(ID mbfid, T_RMBF *pk_rmbf) 〔T〕
16686
16687 スピンロック
16688
16689 ER_ID spnid = acre_spn(const T_CSPN *pk_cspn) 〔TMD〕
16690 ER ercd = sac_spn(ID spnid, const ACVCT *p_acvct) 〔TPMD〕
16691 ER ercd = del_spn(ID spnid) 〔TMD〕
16692 ER ercd = loc_spn(ID spnid) 〔TM〕
16693 ER ercd = iloc_spn(ID spnid) 〔IM〕
16694 ER ercd = try_spn(ID spnid) 〔TM〕
16695 ER ercd = itry_spn(ID spnid) 〔IM〕
16696 ER ercd = unl_spn(ID spnid) 〔TM〕
16697 ER ercd = iunl_spn(ID spnid) 〔IM〕
16698 ER ercd = ref_spn(ID spnid, T_RSPN *pk_rspn) 〔TM〕
16699
16700 (5) メモリプール管理機能
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
335
16701
16702 固定長メモリプール
16703
16704 ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf) 〔TD〕
16705 ER ercd = sac_mpf(ID mpfid, const ACVCT *p_acvct) 〔TPD〕
16706 ER ercd = del_mpf(ID mpfid) 〔TD〕
16707 ER ercd = get_mpf(ID mpfid, void **p_blk) 〔T〕
16708 ER ercd = pget_mpf(ID mpfid, void **p_blk) 〔T〕
16709 ER ercd = tget_mpf(ID mpfid, void **p_blk, TMO tmout) 〔T〕
16710 ER ercd = rel_mpf(ID mpfid, void *blk) 〔T〕
16711 ER ercd = ini_mpf(ID mpfid) 〔T〕
16712 ER ercd = ref_mpf(ID mpfid, T_RMPF *pk_rmpf) 〔T〕
16713
16714 (6) 時間管理機能
16715
16716 システム時刻管理
16717
16718 ER ercd = get_tim(SYSTIM *p_systim) 〔T〕
16719 ER ercd = get_utm(SYSUTM *p_sysutm) 〔TI〕
16720
16721 周期ハンドラ
16722
16723 ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc) 〔TD〕
16724 ER ercd = sac_cyc(ID cycid, const ACVCT *p_acvct) 〔TPD〕
16725 ER ercd = del_cyc(ID cycid) 〔TD〕
16726 ER ercd = sta_cyc(ID cycid) 〔T〕
16727 ER ercd = msta_cyc(ID cycid, ID prcid) 〔TM〕
16728 ER ercd = stp_cyc(ID cycid) 〔T〕
16729 ER ercd = ref_cyc(ID cycid, T_RCYC *pk_rcyc) 〔T〕
16730
16731 アラームハンドラ
16732
16733 ER_ID almid = acre_alm(const T_CALM *pk_calm) 〔TD〕
16734 ER ercd = sac_alm(ID almid, const ACVCT *p_acvct) 〔TPD〕
16735 ER ercd = del_alm(ID almid) 〔TD〕
16736 ER ercd = sta_alm(ID almid, RELTIM almtim) 〔T〕
16737 ER ercd = ista_alm(ID almid, RELTIM almtim) 〔I〕
16738 ER ercd = msta_alm(ID almid, RELTIM almtim, ID prcid) 〔TM〕
16739 ER ercd = imsta_alm(ID almid, RELTIM almtim, ID prcid) 〔IM〕
16740 ER ercd = stp_alm(ID almid) 〔T〕
16741 ER ercd = istp_alm(ID almid) 〔I〕
16742 ER ercd = ref_alm(ID almid, T_RALM *pk_ralm) 〔T〕
16743
16744 オーバランハンドラ
16745
16746 ER ercd = def_ovr(const T_DOVR *pk_dovr) 〔TD〕
16747 ER ercd = sta_ovr(ID tskid, OVRTIM ovrtim) 〔T〕
16748 ER ercd = ista_ovr(ID tskid, OVRTIM ovrtim) 〔I〕
16749 ER ercd = stp_ovr(ID tskid) 〔T〕
16750 ER ercd = istp_ovr(ID tskid) 〔I〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
336
16751 ER ercd = ref_ovr(ID tskid, T_ROVR *pk_rovr) 〔T〕
16752
16753 (7) システム状態管理機能
16754
16755 ER ercd = sac_sys(const ACVCT *p_acvct) 〔TPD〕
16756 ER ercd = rot_rdq(PRI tskpri) 〔T〕
16757 ER ercd = irot_rdq(PRI tskpri) 〔I〕
16758 ER ercd = mrot_rdq (PRI tskpri, ID prcid) 〔TM〕
16759 ER ercd = imrot_rdq(PRI tskpri, ID prcid) 〔IM〕
16760 ER ercd = get_tid(ID *p_tskid) 〔T〕
16761 ER ercd = iget_tid(ID *p_t skid) 〔I〕
16762 ER ercd = get_did(ID *p_domid) 〔TP〕
16763 ER ercd = get_pid(ID *p_prcid) 〔TM〕
16764 ER ercd = iget_pid(ID *p_prcid) 〔IM〕
16765 ER ercd = loc_cpu() 〔T〕
16766 ER ercd = iloc_cpu() 〔I〕
16767 ER ercd = unl_cpu() 〔T〕
16768 ER ercd = iunl_cpu() 〔I〕
16769 ER ercd = dis_dsp() 〔T〕
16770 ER ercd = ena_dsp() 〔T〕
16771 bool_t state = sns_ctx() 〔TI〕
16772 bool_t state = sns_loc() 〔TI〕
16773 bool_t state = sns_dsp() 〔TI〕
16774 bool_t state = sns_dpn() 〔TI〕
16775 bool_t state = sns_ker() 〔TI〕
16776 ER ercd = ext_ker() 〔TI〕
16777 ER ercd = ref_sys(T_RSYS *pk_rsys) 〔T〕
16778
16779 (8) メモリオブジェクト管理機能
16780
16781 ER ercd = att_mem(const T_AMEM *pk_amem) 〔TPD〕
16782 ER ercd = att_pma(const T _AMEM *pk_apma) 〔TPD〕
16783 ER ercd = sac_mem(const void *base, const ACVCT *p_acvct) 〔TPD〕
16784 ER ercd = det_mem(const void *base) 〔TPD〕
16785 ER ercd = prb_mem(const void *base, SIZE size, 〔TP〕
16786 ID tskid, MODE pmmode)
16787 ER ercd = ref_mem(const void *base, T_RMEM *pk_rmem) 〔TP〕
16788
16789 (9) 割込み管理機能
16790
16791 ER ercd = cfg_int(INTNO intno, const T_CINT *pk_cint) 〔TD〕
16792 ER_ID isrid = acre_isr(const T_CISR *pk_cisr) 〔TD〕
16793 ER ercd = sac_isr(ID isrid, const ACVCT *p_acvct) 〔TPD〕
16794 ER ercd = del_isr(ID isrid) 〔TD〕
16795 ER ercd = ref_isr(ID isrid, T_RISR *pk_risr) 〔T〕
16796 ER ercd = def_inh(INHNO inhno, const T_DINH *pk_dinh) 〔TD〕
16797 ER ercd = dis_in t(INTNO intno) 〔T〕
16798 ER ercd = ena_int(INTNO intno) 〔T〕
16799 ER ercd = ref_int(INTNO intno, T_RINT *pk_rint) 〔T〕
16800 ER ercd = chg_ipm(PRI intp ri) 〔T〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
337
16801 ER ercd = get_ipm(PRI *p_intpri) 〔T〕
16802
16803 (10) CPU例外管理機能
16804
16805 ER ercd = def_exc(EXCNO excno, const T_DEXC *pk_dexc) 〔TD〕
16806 bool_t stat = xsns_dpn(void *p_excinf) 〔TI〕
16807 bool_t stat = xsns_xpn(void *p_excinf) 〔TI〕
16808
16809 (11) 拡張サービスコール管理機能
16810
16811 ER ercd = def_svc(FN fncd, const T_DSVC *pk_dsvc) 〔TPD〕
16812 ER_UINT ercd = cal_svc(FN fncd, intptr_t par1, intptr_t par2, 〔TIP〕
16813 intptr_t par3, intptr_t par4, intptr_t par5)
16814
16815 (12) システム構成管理機能
16816
16817 ER ercd = ref_cfg(T_RCFG *pk_rcfg) 〔T〕
16818 ER ercd = ref_ver(T_RVER *pk_rver) 〔T〕
16819
16820 5.2 静的API一覧
16821
16822 (1) タスク管理機能
16823
16824 *保護機能対応でないカーネルの場合
16825 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task, 〔S〕
16826 PRI itskpri, SIZE stksz, STK_T *stk })
16827
16828 *保護機能対応カーネルの場合
16829 CRE_TSK(ID tskid, { ATR tsk atr, intptr_t exinf, TASK task, 〔SP〕
16830 PRI itskpri, SIZE stksz, STK_T *stk,
16831 SIZE sstksz, STK_T *sstk })
16832 ※ sstkszおよびsstkの記述は省略することができる.
16833
16834 AID_TSK(uint_t notsk) 〔SD〕
16835 SAC_TSK(ID tskid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16836 ACPTN acptn3, ACPTN acptn4 })
16837 DEF_EPR(ID tskid, { PRI exepri }) 〔S〕
16838
16839 (2) タスク付属同期機能
16840
16841 なし
16842
16843 (3) タスク例外処理機能
16844
16845 DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn }) 〔S〕
16846
16847 (4) 同期・通信機能
16848
16849 セマフォ
16850
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
338
16851 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem }) 〔S〕
16852 AID_SEM(uint_t nosem) 〔SD〕
16853 SAC_SEM(ID semid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16854 ACPTN acptn3, ACPTN acptn4 })
16855
16856 イベントフラグ
16857
16858 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn }) 〔S〕
16859 AID_FLG(uint_t noflg) 〔SD〕
16860 SAC_FLG(ID flgid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16861 ACPTN acptn3, ACPTN acptn4 })
16862
16863 データキュー
16864
16865 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb }) 〔S〕
16866 AID_DTQ(uint_t nodtq) 〔SD〕
16867 SAC_DTQ(ID dtqid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16868 ACPTN acptn3, ACPTN acptn4 })
16869
16870 優先度データキュー
16871
16872 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, 〔S〕
16873 PRI maxdpri, void *pdqmb })
16874 AID_PDQ(uint_t nopdq) 〔SD〕
16875 SAC_PDQ(ID pdqid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16876 ACPTN acptn3 , ACPTN acptn4 })
16877
16878 メールボックス
16879
16880 CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd }) 〔Sp〕
16881 AID_MBX(uint_t nombx) 〔SpD〕
16882
16883 ミューテックス
16884
16885 CRE_MTX(ID mtxid, { ATR mtxatr, PRI ceilpri }) 〔S〕
16886 AID_MTX(uint_t nomtx) 〔SD〕
16887 SAC_MTX(ID mtxid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16888 ACPTN acptn3, ACPTN acptn4 })
16889
16890 メッセージバッファ
16891
16892 CRE_MBF(ID mbfid, { ATR mbfatr, uint_t maxmsz,
16893 SIZE mbfsz, void *mbfmb }) 〔S〕
16894 AID_MBF(uint_t nombf) 〔SD〕
16895 SAC_MBF(ID mbfid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16896 ACPTN acptn3, ACPTN acptn4 })
16897
16898 スピンロック
16899
16900 CRE_SPN(ID spnid, { ATR spnatr }) 〔SM〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
339
16901 AID_SPN(uint_t nospn) 〔SMD〕
16902 SAC_SPN(ID spnid, { ACPTN acptn1, ACPTN acptn2, 〔SPM〕
16903 ACPTN acptn3, ACPTN acptn4 })
16904
16905 (5) メモリプール管理機能
16906
16907 固定長メモリプール
16908
16909 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_ t blksz, 〔S〕
16910 MPF_T *mpf, void *mpfmb })
16911 AID_MPF(uint_t nompf) 〔SD〕
16912 SAC_MPF(ID mpfid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16913 ACPTN acptn3, ACPTN acptn4 })
16914
16915 (6) 時間管理機能
16916
16917 周期ハンドラ
16918
16919 CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr, 〔S〕
16920 RELTIM cyctim, RELTIM cycphs })
16921 AID_CYC(uint_t nocyc) 〔SD〕
16922 SAC_CYC(ID cycid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16923 ACPTN acptn3, ACPTN acptn4 })
16924
16925 アラームハンドラ
16926
16927 CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr }) 〔S〕
16928 AID_ALM(uint_t noalm) 〔SD〕
16929 SAC_ALM(ID almid, { ACPTN acptn1, ACPTN acptn2, 〔SP〕
16930 ACPTN acptn3, ACPTN acptn4 })
16931
16932 オーバランハンドラ
16933
16934 DEF_OVR({ ATR ovratr, OVRHDR ovrhdr }) 〔S〕
16935
16936 (7) システム状態管理機能
16937
16938 SAC_SYS({ ACPTN acptn1, ACPTN acptn2, 〔SP〕
16939 ACPTN acptn3, ACPTN acptn4 })
16940
16941 (8) メモリオブジェクト管理機能
16942
16943 ATT_REG("メモリリージョン名", 〔SP〕
16944 { ATR regatr, void *base, SIZE size })
16945 DEF_SRG("標準ROMリージョン名", "標準RAMリージョン名") 〔SP〕
16946 ATT_SEC("セクション名", { ATR mematr, "メモリリージョン名" }) 〔SP〕
16947 ATA_SEC("セクション名", { ATR mematr, "メモリリージョン名" }, 〔SP〕
16948 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
16949 LNK_SEC("セクション名", { "メモリリージョン名" }) 〔SP〕
16950 ATT_MOD("オブジェクトモジュール名") 〔SP〕
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
340
16951 ATA_MOD("オブジェクトモジュール名", 〔SP〕
16952 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
16953 ATT_MEM({ ATR mematr, void *base, SIZE size }) 〔SP〕
16954 ATA_MEM({ ATR mematr, void *base, SIZE size }, 〔SP〕
16955 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
16956 ATT_PMA({ ATR mematr, void *base, SIZE size, void *paddr }) 〔SP〕
16957 ATA_PMA({ ATR mematr, void *base, SIZE size, void *paddr }, 〔SP〕
16958 { ACPTN acptn1, ACPTN acptn2, ACPTN acptn3, ACPTN acptn4 })
16959
16960 (9) 割込み管理機能
16961
16962 CFG_INT(INTNO intno, { ATR intatr, PRI intpri }) 〔S〕
16963 CRE_ISR(ID isrid, { ATR isratr, intptr_t exinf, 〔S〕
16964 INTNO intno, ISR isr, PRI isrpri })
16965 ATT_ISR({ ATR isratr, intptr_t exinf, 〔S〕
16966 INTNO intno, ISR isr, PRI isrpri })
16967 AID_ISR(uint_t noisr) 〔SD〕
16968 SAC_ISR(ID isrid, { A CPTN acptn1, ACPTN acptn2, 〔SP〕
16969 ACPTN acptn3, ACPTN acptn4 })
16970 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr }) 〔S〕
16971
16972 (10) CPU例外管理機能
16973
16974 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr }) 〔S〕
16975
16976 (11) 拡張サービスコール管理機能
16977
16978 DEF_SVC(FN fncd, { ATR svcatr, EXTSVC svcrtn, SIZE stksz }) 〔SP〕
16979
16980 (12) システム構成管理機能
16981
16982 DEF_ICS({ SIZE istksz, STK_T *istk }) 〔S〕
16983 DEF_STK({ SIZE stksz, STK_T *stk }) 〔S〕
16984 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn }) 〔S〕
16985 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn }) 〔S〕
16986
16987 5.3 データ型
16988
16989 5.3.1 TOPPERS共通データ型
16990
16991 int8_t 符号付き8ビット整数(オプション,C99準拠)
16992 uint8_t 符号無し8ビット整数(オプション,C99準拠)
16993 int16_t 符号付き16ビット整数(C99準拠)
16994 uint16_t 符号無し16ビット整数(C99準拠)
16995 int32_t 符号付き32ビット整数(C99準拠)
16996 uint32_t 符号無し32ビット整数(C99準拠)
16997 int64_t 符号付き64ビット整数(オプション,C99準拠)
16998 uint64_t 符号無し64ビット整数(オプション,C99準拠)
16999 int128_t 符号付き128ビット整数(オプション,C99準拠)
17000 uint128_t 符号無し128ビット整数(オプション,C99準拠)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
341
17001
17002 int_least8_t 8ビット以上の符号付き整数(C99準拠)
17003 uint_least8_t int_least8_t 型と同じサイズの符号無し整数(C99準拠)
17004
17005 float32_t IEEE754 準拠の32ビット単精度浮動小数点数(オプション)
17006 double64_t IEEE754 準拠の64ビット倍精度浮動小数点数(オプション)
17007
17008 bool_t 真偽値(trueまたはfalse)
17009 int_t 16ビット以上の符号付き整数
17010 uint_t int_t型と同じサイズの符号無し整数
17011 long_t 32ビット以上かつint_t型以上のサイズの符号付き整数
17012 ulong_t long_t型と同じサイズの符号無し整数
17013
17014 intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠)
17015 uintptr_t intptr_t 型と同じサイズの符号無し整数(C99準拠)
17016
17017 FN 機能コード(符号付き整数,int_tに定義)
17018 ER エラーコード(符号付き整数,int_tに定義)
17019 ID オブジェクトのID番号(符号付き整数,int_tに定義)
17020 ATR オブジェクト属性(符号無し整数,uint_tに定義)
17021 STAT オブジェクトの状態(符号無し整数,uint_tに定義)
17022 MODE サービスコールの動作モード(符号無し整数,uint_tに定義)
17023 PRI 優先度(符号付き整数,int_tに定義)
17024 SIZE メモリ領域のサイズ(符号無し整数,ポインタを格納できる
17025 サイズの符号無し整数型に定義)
17026
17027 TMO タイムアウト指定(符号付き整数,単位はミリ秒,int_tに定義)
17028 RELTIM 相対時間(符号無し整数,単位はミリ秒,uint_tに定義)
17029 SYSTIM システム時刻(符号無し整数,単位はミリ秒,ulong_tに定義)
17030 SYSUTM 性能評価用システム時刻(符号無し整数,単位はマイクロ秒,
17031 ulong_t に定義)
17032
17033 FP プログラムの起動番地(型の定まらない関数ポインタ)
17034
17035 ER_BOOL エラーコードまたは真偽値(符号付き整数,int_tに定義)
17036 ER_ID エラーコードまたはID番号(符号付き整数,int_tに定義,
17037 負のID番号は格納できない)
17038 ER_UINT エラーコードまたは符号無し整数(符号付き整数,int_tに
17039 定義,符号無し整数を格納する場合の有効ビット数はuint_t
17040 より1ビット短い)
17041
17042 MB_T オブジェクト管理領域を確保するためのデータ型
17043
17044 ACPTN アクセス許可パターン(符号無し32ビット整数,uint32_tに
17045 定義)
17046
17047 typedef struct acvct { /* アクセス許可ベクタ */
17048 ACPTN acptn1; /* 通常操作1のアクセス許可パターン */
17049 ACPTN acptn2; /* 通常操作2のアクセス許可パターン */
17050 ACPTN acptn3; /* 管理操作のアクセス許可パターン */
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
342
17051 ACPTN acptn4; /* 参照操作のアクセス許可パターン */
17052 } ACVCT;
17053
17054 5.3.2 カーネルの使用するデータ型
17055
17056 TEXPTN タスク例外要因のビットパターン(符号無し整数,uint_tに定義)
17057 FLGPTN イベントフラグのビットパターン(符号無し整数,uint_tに定義)
17058 OVRTIM プロセッサ時間(符号無し整数,単位はマイクロ秒,ulong_tに定義)
17059 INTNO 割込み番号(符号無し整数,uint_tに定義)
17060 INHNO 割込みハンドラ番号(符号無し整数,uint_tに定義)
17061 EXCNO CPU例外ハンドラ番号(符号無し整数,uint_tに定義)
17062
17063 TASK タスクのメインルーチン(関数ポインタ)
17064 TEXRTN タスク例外処理ルーチン(関数ポインタ)
17065 CYCHDR 周期ハンドラ(関数ポインタ)
17066 ALMHDR アラームハンドラ(関数ポインタ)
17067 OVRHDR オーバランハンドラ(関数ポインタ)
17068 ISR 割込みサービスルーチン(関数ポインタ)
17069 INTHDR 割込みハンドラ(関数ポインタ)
17070 EXCHDR CPU例外ハンドラ(関数ポインタ)
17071 EXTSVC 拡張サービスコール(関数ポインタ)
17072 INIRTN 初期化ルーチン(関数ポインタ)
17073 TERRTN 終了処理ルーチン(関数ポインタ)
17074
17075 STK_T スタック領域を確保するためのデータ型
17076 MPF_T 固定長メモリプール領域を確保するためのデータ型
17077
17078 メールボックスのメッセージヘッダ【NGKI4001】
17079
17080 typedef struct t_msg {
17081 struct t_msg *pk_next;
17082 } T_MSG;
17083
17084 メールボックスの優先度付きメッセージヘッダ【NGKI4002】
17085
17086 typedef struct t_msg_pri {
17087 T_MSG msgque; /* メールボックスのメッセージヘッダ */
17088 PRI msgpri; /* メッセージ優先度 */
17089 } T_MSG_PRI;
17090
17091 5.3.3 カーネルの使用するパケット形式
17092
17093 (1) タスク管理機能
17094
17095 タスクの生成情報のパケット形式【NGKI4003】
17096
17097 typedef struct t_ctsk {
17098 ATR tskatr; /* タスク属性 */
17099 intptr_t exinf; /* タスクの拡張情報 */
17100 TASK task; /* タスクのメインルーチンの先頭番地 */
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
343
17101 PRI itskpri; /* タスクの起動時優先度 */
17102 SIZE stksz; /* タスクのスタック領域のサイズ */
17103 STK_T * stk; /* タスクのスタック領域の先頭番地 */
17104 /* 以下は,保護機能対応カーネルの場合 */
17105 SIZE sstksz; /* タスクのシステムスタック領域のサイズ */
17106 STK_T * sstk; /* タスクのシステムスタック領域の先頭番地 */
17107 } T_CTSK;
17108
17109 タスクの現在状態のパケット形式【NGKI4004】
17110
17111 typedef struct t_rtsk {
17112 STAT tskstat; /* タスク状態 */
17113 PRI tskpri; /* タスクの現在優先度 */
17114 PRI tskbpri; /* タスクのベース優先度 */
17115 STAT tskwait; /* 待ち要因 */
17116 ID wobjid; /* 待ち対象のオブジェクトのID */
17117 TMO lefttmo; /* タイムアウトするまでの時間 */
17118 uint_t actcnt; /* 起動要求キューイング数 */
17119 uint_t wupcnt; /* 起床要求キューイング数 */
17120 /* 以下は,保護機能対応カーネルの場合 */
17121 bool_t texmsk; /* タスク例外マスク状態か否か */
17122 bool_t waifbd; /* 待ち禁止状態か否か */
17123 uint_t svclevel; /* 拡張サービスコールのネストレベル */
17124 /* 以下は,マルチプロセッサ対応カーネルの場合 */
17125 ID prcid; /* 割付けプロセッサのID */
17126 ID actprc /* 次の起動時の割付けプロセッサのID */
17127 } T_RTSK;
17128
17129 (2) タスク付属同期機能
17130
17131 なし
17132
17133 (3) タスク例外処理機能
17134
17135 タスク例外処理ルーチンの定義情報のパケット形式【NGKI4005】
17136
17137 typedef struct t_dtex {
17138 ATR texatr; /* タスク例外処理ルーチン属性 */
17139 TEXRTN texrtn; /* タスク例外処理ルーチンの先頭番地 */
17140 } T_DTEX;
17141
17142 タスク例外処理の現在状態のパケット形式【NGKI4006】
17143
17144 typedef struct t_rtex {
17145 STAT texstat; /* タスク例外処理の状態 */
17146 TEXPTN pndptn; /* 保留例外要因 */
17147 } T_RTEX;
17148
17149 (4) 同期・通信機能
17150
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
344
17151 セマフォの生成情報のパケット形式【NGKI4007】
17152
17153 typedef struct t_csem {
17154 ATR sematr; /* セマフォ属性 */
17155 uint_t isemcnt; /* セマフォの初期資源数 */
17156 uint_t maxsem; /* セマフォの最大資源数 */
17157 } T_CSEM;
17158
17159 セマフォの現在状態のパケット形式【NGKI4008】
17160
17161 typedef struct t_rsem {
17162 ID wtskid; /* セマフォの待ち行列の先頭のタスクのID番号 */
17163 uint_t semcnt; /* セマフォの資源数 */
17164 } T_RSEM;
17165
17166 イベントフラグの生成情報のパケット形式【NGKI4009】
17167
17168 typedef struct t_cflg {
17169 ATR flgatr; /* イベントフラグ属性 */
17170 FLGPTN iflgptn; /* イベントフラグの初期ビットパターン */
17171 } T_CFLG;
17172
17173 イベントフラグの現在状態のパケット形式【NGKI4010】
17174
17175 typedef struct t_rflg {
17176 ID wtskid; /* イベントフラグの待ち行列の先頭のタス
17177 クのID番号 */
17178 FLGPTN flgptn; /* イベントフラグのビットパターン */
17179 } T_RFLG;
17180
17181 データキューの生成情報のパケット形式【NGKI4011】
17182
17183 typedef struct t_cdtq {
17184 ATR dtqatr; /* データキュー属性 */
17185 uint_t dtqcnt; /* データキュー管理領域に格納できるデータ数 */
17186 void * dtqmb; /* データキュー管理領域の先頭番地 */
17187 } T_CDTQ;
17188
17189 データキューの現在状態のパケット形式【NGKI4012】
17190
17191 typedef struct t_rdtq {
17192 ID stskid; /* データキューの送信待ち行列の先頭のタ
17193 スクのID番号 */
17194 ID rtskid; /* データキューの受信待ち行列の先頭のタ
17195 スクのID番号 */
17196 uint_t sdtqcnt; /* データキュー管理領域に格納されている
17197 データの数 */
17198 } T_RDTQ;
17199
17200 優先度データキューの生成情報のパケット形式【NGKI4013】
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
345
17201
17202 typedef struct t_cpdq {
17203 ATR pdqatr; /* 優先度データキュー属性 */
17204 uint_t pdqcnt; /* 優先度データキュー管理領域に格納でき
17205 るデータ数 */
17206 PRI maxdpri; /* 優先度データキューに送信できるデータ
17207 優先度の最大値 */
17208 void * pdqmb; /* 優先度データキュー管理領域の先頭番地 */
17209 } T_CPDQ;
17210
17211 優先度データキューの現在状態のパケット形式【NGKI4014】
17212
17213 typedef struct t_rpdq {
17214 ID stskid; /* 優先度データキューの送信待ち行列の先
17215 頭のタスクのID番号 */
17216 ID rtskid; /* 優先度データキューの受信待ち行列の先
17217 頭のタスクのID番号 */
17218 uint_t spdqcnt; /* 優先度データキュー管理領域に格納され
17219 ているデータの数 */
17220 } T_RPDQ;
17221
17222 メールボックスの生成情報のパケット形式【NGKI4015】
17223
17224 typedef struct t_cmbx {
17225 ATR mbxatr; /* メールボックス属性 */
17226 PRI maxmpri; /* 優先度メールボックスに送信できるメッ
17227 セージ優先度の最大値 */
17228 void * mprihd; /* 優先度別のメッセージキューヘッダ領域
17229 の先頭番地 */
17230 } T_CMBX;
17231
17232 メールボックスの現在状態のパケット形式【NGKI4016】
17233
17234 typedef struct t_rmbx {
17235 ID wtskid; /* メールボックスの待ち行列の先頭のタスク
17236 のID番号 */
17237 T_MSG *pk_msg ; /* メッセージキューの先頭につながれたメッ
17238 セージの先頭番地 */
17239 } T_RMBX;
17240
17241 ミューテックスの生成情報のパケット形式【NGKI4017】
17242
17243 typedef struct t_cmtx {
17244 ATR mtxatr; /* ミューテックス属性 */
17245 PRI ceilpri; /* ミューテックスの上限優先度 */
17246 } T_CMTX;
17247
17248 ミューテックスの現在状態のパケット形式【NGKI4018】
17249
17250 typedef struct t_rmtx {
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
346
17251 ID htskid; /* ミューテックスをロックしているタス
17252 クのID番号 */
17253 ID wtskid; /* ミューテックスの待ち行列の先頭のタ
17254 スクのID番号 */
17255 } T_RMTX;
17256
17257 メッセージバッファの生成情報のパケット形式【NGKI4037】
17258
17259 typedef struct t_cmbf {
17260 ATR mbfatr; /* メッセージバッファ属性 */
17261 uint_t maxmsz; /* メッセージバッファの最大メッセージ
17262 サイズ(バイト数)*/
17263 SIZE mbfsz; /* メッセージバッファ管理領域のサイズ
17264 (バイト数)*/
17265 void * mbfmb; /* メッセージバッファ管理領域の先頭番地 */
17266 } T_CMBF;
17267
17268 メッセージバッファの現在状態のパケット形式【NGKI4038】
17269
17270 typedef struct t_rmbf {
17271 ID stskid; /* メッセージバッファの送信待ち行列の先頭の
17272 タスクのID番号 */
17273 ID rtskid; /* メッセージバッファの受信待ち行列の先頭の
17274 タスクのID番号 */
17275 uint_t smbfcnt; /* メッセージバッファ管理領域に格納されてい
17276 るメッセージの数 */
17277 SIZE fmbfsz; /* メッセージバッファ管理領域中の空き領域の
17278 サイズ */
17279 } T_RMBF;
17280
17281 スピンロックの生成情報のパケット形式【NGKI4019】
17282
17283 typedef struct t_cspn {
17284 ATR spnatr; /* スピンロック属性 */
17285 } T_CSPN;
17286
17287 スピンロックの現在状態のパケット形式【NGKI4020】
17288
17289 typedef struct t_rspn {
17290 STAT spnstat /* スピンロックのロック状態 */
17291 } T_RSPN;
17292
17293 (5) メモリプール管理機能
17294
17295 固定長メモリプールの生成情報のパケット形式【NGKI4021】
17296
17297 typedef struct t_cmpf {
17298 ATR mpfatr; /* 固定長メモリプール属性 */
17299 uint_t blkcnt; /* 獲得できる固定長メモリブロックの数 */
17300 uint_t blksz; /* 固定長メモリブロックのサイズ */
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
347
17301 MPF_T * mpf; /* 固定長メモリプール領域の先頭番地 */
17302 void * mpfmb; /* 固定長メモリプール管理領域の先頭番地 */
17303 } T_CMPF;
17304
17305 固定長メモリプールの現在状態のパケット形式【NGKI4022】
17306
17307 typedef struct t_rmpf {
17308 ID wtskid; /* 固定長メモリプールの待ち行列の先頭の
17309 タスクのID番号 */
17310 uint_t fblkcnt; /* 固定長メモリプール領域の空きメモリ領
17311 域に割り付けることができる固定長メモ
17312 リブロックの数 */
17313 } T_RMPF;
17314
17315 (6) 時間管理機能
17316
17317 周期ハンドラの生成情報のパケット形式【NGKI4023】
17318
17319 typedef struct t_ccyc {
17320 ATR cycatr; /* 周期ハンドラ属性 */
17321 intptr_t exinf; /* 周期ハンドラの拡張情報 */
17322 CYCHDR cychdr; /* 周期ハンドラの先頭番地 */
17323 RELTIM cyctim; /* 周期ハンドラの起動周期 */
17324 RELTIM cycphs; /* 周期ハンドラの起動位相 */
17325 } T_CCYC;
17326
17327 周期ハンドラの現在状態のパケット形式【NGKI4024】
17328
17329 typedef struct t_rcyc {
17330 STAT cycstat; /* 周期ハンドラの動作状態 */
17331 RELTIM lefttim; /* 次に周期ハンドラを起動する時刻までの
17332 相対時間 */
17333 /* 以下は,マルチプロセッサ対応カーネルの場合 */
17334 ID prcid; /* 割付けプロセッサのID */
17335 } T_RCYC;
17336
17337 アラームハンドラの生成情報のパケット形式【NGKI4025】
17338
17339 typedef struct t_calm {
17340 ATR almatr; /* アラームハンドラ属性 */
17341 intptr_t exinf; /* アラームハンドラの拡張情報 */
17342 ALMHDR almhdr; /* アラームハンドラの先頭番地 */
17343 } T_CALM;
17344
17345 アラームハンドラの現在状態のパケット形式【NGKI4026】
17346
17347 typedef struct t_ralm {
17348 STAT almstat; /* アラームハンドラの動作状態 */
17349 RELTIM lefttim; /* アラームハンドラを起動する時刻までの
17350 相対時間 */
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
348
17351 /* 以下は,マルチプロセッサ対応カーネルの場合 */
17352 ID prcid; /* 割付けプロセッサのID */
17353 } T_RALM;
17354
17355 オーバランハンドラの定義情報のパケット形式【NGKI4027】
17356
17357 typedef struct t_dovr {
17358 ATR ovratr; /* オーバランハンドラ属性 */
17359 OVRHDR ovrhdr; /* オーバランハンドラの先頭番地 */
17360 } T_DOVR;
17361
17362 オーバランハンドラの現在状態のパケット形式【NGKI4028】
17363
17364 typedef struct t_rovr {
17365 STAT ovrstat; /* オーバランハンドラの動作状態 */
17366 OVRTIM leftotm; /* 残りプロセッサ時間 */
17367 } T_ROVR;
17368
17369 (7) システム状態管理機能
17370
17371 システムの現在状態のパケット形式
17372
17373 ☆未完成
17374
17375 (8) メモリオブジェクト管理機能
17376
17377 メモリオブジェクトの登録情報のパケット形式【NGKI4029】
17378
17379 typedef struct t_amem {
17380 ATR mematr /* メモリオブジェクト属性 */
17381 void * base /* 登録するメモリ領域の先頭番地 */
17382 SIZE size /* 登録するメモリ領域のサイズ(バイト数)*/
17383 } T_AMEM;
17384
17385 物理メモリ領域の登録情報のパケット形式【NGKI4030】
17386
17387 typedef struct t_apma {
17388 ATR mematr /* メモリオブジェクト属性 */
17389 void * base /* 登録するメモリ領域の先頭番地 */
17390 SIZE size /* 登録するメモリ領域のサイズ(バイト数)*/
17391 void * paddr /* 登録するメモリ領域の物理アドレスの先頭
17392 番地 */
17393 } T_APMA;
17394
17395 メモリオブジェクトの現在状態のパケット形式
17396
17397 ☆未完成
17398
17399 (9) 割込み管理機能
17400
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
349
17401 割込み要求ラインの属性の設定情報のパケット形式【NGKI4031】
17402
17403 typedef struct t_cint {
17404 ATR intatr; /* 割込み要求ライン属性 */
17405 PRI intpri; /* 割込み優先度 */
17406 } T_CINT;
17407
17408 割込みサービスルーチンの生成情報のパケット形式【NGKI4032】
17409
17410 typedef struct t_cisr {
17411 ATR isratr; /* 割込みサービスルーチン属性 */
17412 intptr_t exinf; /* 割込みサービスルーチンの拡張情報 */
17413 INTNO intno; /* 割込みサービスルーチンを登録する割込
17414 み番号 */
17415 ISR isr; /* 割込みサービスルーチンの先頭番地 */
17416 PRI isrpri; /* 割込みサービスルーチン優先度 */
17417 } T_CISR;
17418
17419 割込みサービスルーチンの現在状態のパケット形式
17420
17421 ☆未完成
17422
17423 割込みハンドラの定義情報のパケット形式【NGKI4033】
17424
17425 typedef struct t_dinh {
17426 ATR inhatr; /* 割込みハンドラ属性 */
17427 INTHDR inthdr; /* 割込みハンドラの先頭番地 */
17428 } T_DINH;
17429
17430 割込み要求ラインの現在状態のパケット形式
17431
17432 ☆未完成
17433
17434 (10) CPU例外管理機能
17435
17436 CPU例外ハンドラの定義情報のパケット形式【NGKI4034】
17437
17438 typedef struct t_dexc {
17439 ATR excatr; /* CPU 例外ハンドラ属性 */
17440 EXCHDR exchdr; /* CPU 例外ハンドラの先頭番地 */
17441 } T_DEXC;
17442
17443 (11) 拡張サービスコール管理機能
17444
17445 拡張サービスコールの定義情報のパケット形式【NGKI4035】
17446
17447 typedef struct t_dsvc {
17448 ATR svcatr /* 拡張サービスコール属性 */
17449 EXTSVC svcrtn /* 拡張サービスコールの先頭番地 */
17450 SIZE stksz /* 拡張サービスコールで使用するスタック
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
350
17451 サイズ */
17452 } T_DSVC;
17453
17454 (12) システム構成管理機能
17455
17456 コンフィギュレーション情報のパケット形式
17457
17458 ☆未完成
17459
17460 バージョン情報のパケット形式
17461
17462 ☆未完成
17463
17464 5.4 定数とマクロ
17465
17466 5.4.1 TOPPERS共通定数
17467
17468 (1) 一般定数
17469
17470 NULL 無効ポインタ
17471
17472 true 1 真
17473 false 0 偽
17474
17475 E_OK 0 正常終了
17476
17477 (2) 整数型に格納できる最大値と最小値
17478
17479 INT8_MAX int8_t に格納できる最大値(オプション,C99準拠)
17480 INT8_MIN int8_t に格納できる最小値(オプション,C99準拠)
17481 UINT8_MAX uint8_t に格納できる最大値(オプション,C99準拠)
17482 INT16_MAX int16_tに格納できる最大値(C99準拠)
17483 INT16_MIN int16_t に格納できる最小値(C99準拠)
17484 UINT16_MAX uint16_t に格納できる最大値(C99準拠)
17485 INT32_MAX int32_t に格納できる最大値(C99準拠)
17486 INT32_MIN int32_tに格納できる最小値(C99準拠)
17487 UINT32_MAX uint32_t に格納できる最大値(C99準拠)
17488 INT64_MAX int64_t に格納できる最大値(オプション,C99準拠)
17489 INT64_MIN int64_t に格納できる最小値(オプション,C99準拠)
17490 UINT64_MAX uint64_t に格納できる最大値(オプション,C99準拠)
17491 INT128_MAX int128_t に格納できる最大値(オプション,C99準拠)
17492 INT128_MIN int128_t に格納できる最小値(オプション,C99準拠)
17493 UINT128_MAX uint128_t に格納できる最大値(オプション,C99準拠)
17494
17495 INT_LEAST8_MAX int_least8_tに格納できる最大値(C99準拠)
17496 INT_LEAST8_MIN int_least8_t に格納できる最小値(C99準拠)
17497 UINT_LEAST8_MAX uint_least8_t に格納できる最大値(C99準拠)
17498 INT_MAX int_t に格納できる最大値(C90準拠)
17499 INT_MIN int_t に格納できる最小値(C90準拠)
17500 UINT_MAX uint_t に格納できる最大値(C90準拠)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
351
17501 LONG_MAX long_t に格納できる最大値(C90準拠)
17502 LONG_MIN long_t に格納できる最小値(C90準拠)
17503 ULONG_MAX ulong_t に格納できる最大値(C90準拠)
17504
17505 FLOAT32_MIN float32_t に格納できる最小の正規化された正の浮
17506 動小数点数(オプション)
17507 FLOAT32_MAX float32_t に格納できる表現可能な最大の有限浮動
17508 小数点数(オプション)
17509 DOUBLE64_MIN doub le64_tに格納できる最小の正規化された正の浮
17510 動小数点数(オプション)
17511 DOUBLE64_MAX double64_t に格納できる表現可能な最大の有限浮動
17512 小数点数(オプション)
17513
17514 (3) 整数型のビット数
17515
17516 CHAR_BIT char型のビット数(C90準拠)
17517
17518 (4) オブジェクト属性
17519
17520 TA_NULL 0U オブジェクト属性を指定しない
17521
17522 (5) タイムアウト指定
17523
17524 TMO_POL 0 ポーリング
17525 TMO_FEVR -1 永久待ち
17526 TMO_NBLK -2 ノンブロッキング
17527
17528 (6) アクセス許可パターン
17529
17530 TACP_KERNEL 0U カーネルドメインのみにアクセスを許可
17531 TACP_SHARED ̃0U すべての保護ドメインにアクセスを許可
17532
17533 5.4.2 TOPPERS共通マクロ
17534
17535 (1) 整数定数を作るマクロ
17536
17537 INT8_C(val) int_least8_t 型の定数を作るマクロ(C99準拠)
17538 UINT8_C(val) uint_least8_t 型の定数を作るマクロ(C99準拠)
17539 INT16_C(val) int16_t 型の定数を作るマクロ(C99準拠)
17540 UINT16_C(val) uint16_t型の定数を作るマクロ(C99準拠)
17541 INT32_C(val) int32_t 型の定数を作るマクロ(C99準拠)
17542 UINT32_C(val) uint32_t 型の定数を作るマクロ(C99準拠)
17543 INT64_C(val) int64_t 型の定数を作るマクロ(オプション,C99準拠)
17544 UINT64_C(val) uint64_t 型の定数を作るマクロ(オプション,C99準拠)
17545 INT128_C(val) int128_t 型の定数を作るマクロ(オプション,C99準拠)
17546 UINT128_C(val) uint128_t 型の定数を作るマクロ(オプション,C99準拠)
17547
17548 UINT_C(val) uint_t 型の定数を作るマクロ
17549 ULONG_C(val) ulong_t 型の定数を作るマクロ
17550
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
352
17551 (2) 型に関する情報を取り出すためのマクロ
17552
17553 offsetof(structure, field) 構造体structure中のフィールドfieldの
17554 バイト位置を返すマクロ(C90準拠)
17555
17556 alignof(type) 型typeのアラインメント単位を返すマクロ
17557
17558 ALIGN_TYPE(addr, type) 番地addrが型typeに対してアラインしてい
17559 るかどうかを返すマクロ
17560
17561 (3) assertマクロ
17562
17563 assert(exp) exp が成立しているかを検査するマクロ(C90準拠)
17564
17565 (4) コンパイラの拡張機能のためのマクロ
17566
17567 inline インライン関数
17568 Inline ファイルローカルなインライン関数
17569 asm インラインアセンブラ
17570 Asm インラインアセンブラ(最適化抑止)
17571 throw() 例外を発生しない関数
17572 NoReturn リターンしない関数
17573
17574 (5) エラーコード生成・分解マクロ
17575
17576 ERCD(mercd, sercd) メインエラーコードmercdとサブエラーコードsercdか
17577 ら,エラーコードを生成するためのマクロ
17578
17579 MERCD(ercd) エラーコードercdからメインエラーコードを抽出する
17580 ためのマクロ
17581 SERCD(ercd) エラーコードercdからサブエラーコードを抽出するた
17582 めのマクロ
17583
17584 (6) アクセス許可パターン生成マクロ
17585
17586 TACP(domid) domid で指定される保護ドメインに属する処理単位の
17587 みにアクセスを許可するアクセス許可パターン
17588
17589 5.4.3 カーネル共通定数
17590
17591 (1) オブジェクト属性
17592
17593 TA_TPRI 0x01U タスクの待ち行列をタスクの優先度順に
17594
17595 (2) 保護ドメインID
17596
17597 TDOM_SELF 0 自タスクの属する保護ドメイン
17598 TDOM_KERNEL -1 カーネルドメイン
17599 TDOM_NONE -2 無所属(保護ドメインに属さない)
17600
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
353
17601 (3) その他のカーネル共通定数
17602
17603 TCLS_SELF 0 自タスクの属するクラス
17604
17605 TPRC_NONE 0 割付けプロセッサの指定がない
17606 TPRC_INI 0 初期割付けプロセッサ
17607
17608 TSK_SELF 0 自タスク指定
17609 TSK_NONE 0 該当するタスクがない
17610
17611 TPRI_SELF 0 自タスクのベース優先度の指定
17612 TPRI_INI 0 タスクの起動時優先度の指定
17613
17614 TIPM_ENAALL 0 割込み優先度マスク全解除
17615
17616 5.4.4 カーネル共通マクロ
17617
17618 (1) オブジェクト属性を作るマクロ
17619
17620 TA_DOM(domid) domid で指定される保護ドメインに属する
17621 TA_CLS(clsid) clsid で指定されるクラスに属する
17622
17623 (2) サービスコールの呼出し方法を指定するマクロ
17624
17625 SVC_CALL(svc) svc で指定されるサービスコールを関数呼出しによっ
17626 て呼び出すための名称
17627
17628 5.4.5 カーネルの機能毎の定数
17629
17630 (1) タスク管理機能
17631
17632 TA_ACT 0x02U タスクの生成時にタスクを起動する
17633 TA_RSTR 0x04U 生成するタスクを制約タスクとする
17634 TA_FPU FPUレジスタをコンテキストに含める
17635
17636 TTS_RUN 0x01U 実行状態
17637 TTS_RDY 0x02U 実行可能状態
17638 TTS_WAI 0x04U 待ち状態
17639 TTS_SUS 0x08U 強制待ち状態
17640 TTS_WAS 0x0cU 二重待ち状態
17641 TTS_DMT 0x10U 休止状態
17642
17643 TTW_SLP 0x0001U 起床待ち
17644 TTW_DLY 0x0002U 時間経過待ち
17645 TTW_SEM 0x0004U セマフォの資源獲得待ち
17646 TTW_FLG 0x0008U イベントフラグ待ち
17647 TTW_SDTQ 0x0010U データキューへの送信待ち
17648 TTW_RDTQ 0x0020U データキューからの受信待ち
17649 TTW_SPDQ 0x0100U 優先度データキューへの送信待ち
17650 TTW_RPDQ 0x0200U 優先度データキューからの受信待ち
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
354
17651 TTW_MBX 0x0040U メールボックスからの受信待ち
17652 TTW_MTX 0x0080U ミューテックスのロック待ち状態
17653 TTW_SMBF 0x0400U メッセージバッファへの送信待ち
17654 TTW_RMBF 0x0800U メッセージバッファからの受信待ち
17655 TTW_MPF 0x2000U 固定長メモリブロックの獲得待ち
17656
17657 TA_FPUの値は,ターゲット定義とする.
17658
17659 (3) タスク例外処理機能
17660
17661 TTEX_ENA 0x01U タスク例外処理許可状態
17662 TTEX_DIS 0x02U タスク例外処理禁止状態
17663
17664 (4) 同期・通信機能
17665
17666 イベントフラグ
17667
17668 TA_WMUL 0x 02U 複数のタスクが待つのを許す
17669 TA_CLR 0x04U タスクの待ち解除時にイベントフラグをクリアする
17670
17671 TWF_ORW 0x01U イベントフラグのOR待ちモード
17672 TWF_ANDW 0x02U イベントフラグのAND待ちモード
17673
17674 メールボックス
17675
17676 TA_MPRI 0x02U メッセージキューをメッセージの優先度順にする
17677
17678 スピンロック
17679
17680 TSPN_UNL 0x01U 取得されていない状態
17681 TSPN_LOC 0x02U 取得されている状態
17682
17683 (6) 時間管理機能
17684
17685 周期ハンドラ
17686
17687 TA_STA 0x02U 周期ハンドラの生成時に周期ハンドラを動作開始する
17688 TA_PHS 0x04U 周期ハンドラを生成した時刻を基準時刻とする
17689
17690 TCYC_STP 0x01U 周期ハンドラが動作していない状態
17691 TCYC_STA 0x02U 周期ハンドラが動作している状態
17692
17693 アラームハンドラ
17694
17695 TALM_STP 0x01U アラームハンドラが動作していない状態
17696 TALM_STA 0x02U アラームハンドラが動作している状態
17697
17698 オーバランハンドラ
17699
17700 TOVR_STP 0x01U オーバランハンドラが動作していない状態
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
355
17701 TOVR_STA 0x02U オーバランハンドラが動作している状態
17702
17703 (8) メモリオブジェクト管理機能
17704
17705 TA_NOWRITE 0x01U 書込みアクセス禁止
17706 TA_NOREAD 0x02U 読出しアクセス禁止
17707 TA_EXEC 0x04U 実行アクセス許可
17708 TA_MEMINI 0x08U メモリの初期化を行う
17709 TA_MEMPRSV 0x10U メモリの初期化を行わない
17710 TA_SDATA 0x20U ショートデータ領域に配置
17711 TA_UNCACHE 0x40U キャッシュ禁止
17712 TA_IODEV 0x80U 周辺デバイスの領域
17713 TA_WTHROUGH ライトスルーキャッシュを用いる
17714
17715 TPM_WRITE 0x01U 書込みアクセス権のチェック
17716 TPM_READ 0x02U 読出しアクセス権のチェック
17717 TPM_EXEC 0x04U 実行アクセス権のチェック
17718
17719 TA_WTHROUGHの値は,ターゲット定義とする.
17720
17721 (9) 割込み管理機能
17722
17723 TA_ENAINT 0x01U 割込み要求禁止フラグをクリア
17724 TA_EDGE 0x02U エッジトリガ
17725 TA_POSEDGE ポジティブエッジトリガ
17726 TA_NEGEDGE ネガティブエッジトリガ
17727 TA_BOTHEDGE 両エッジトリガ
17728 TA_LOWLEVEL ローレベルトリガ
17729 TA_HIGHLEVEL ハイレベルトリガ
17730
17731 TA_NONKERNEL 0x02U カーネル管理外の割込み
17732
17733 TA_POSEDGE,TA_NEGEDGE,TA_BOTHEDGE,TA_LOWLEVEL,TA_HIGHLEVELの値は,
17734 ターゲット定義とする.
17735
17736 (10) CPU例外管理機能
17737
17738 TA_DIRECT CPU 例外ハンドラを直接呼び出す
17739
17740 TA_DIRECTの値は,ターゲット定義とする.
17741
17742 5.4.6 カーネルの機能毎のマクロ
17743
17744 (1) タスク管理機能
17745
17746 COUNT_STK_T(sz) サイズszのスタック領域を確保するために必要な
17747 STK_T 型の配列の要素数
17748 ROUND_STK_T(sz) 要素数COUNT_STK_T(sz)のSTK_T型の配列のサイズ(sz
17749 を,STK_T型のサイズの倍数になるように大きい方に
17750 丸めた値)
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
356
17751
17752 (4) 同期・通信機能
17753
17754 TSZ_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータ
17755 キュー管理領域のサイズ(バイト数)
17756 TCNT_DTQMB(dtqcnt) dtqcnt で指定した数のデータを格納できるデータ
17757 キュー管理領域を確保するために必要なMB_T型の配
17758 列の要素数
17759
17760 TSZ_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度デー
17761 タキュー管理領域のサイズ(バイト数)
17762 TCNT_PDQMB(pdqcnt) pdqcnt で指定した数のデータを格納できる優先度デー
17763 タキュー管理領域を確保するために必要なMB_T型の
17764 配列の要素数
17765
17766 TSZ_MBFMB(msgcnt, msgsz) msgsz で指定したサイズのメッセージを,
17767 msgcnt で指定した数だけ格納できるメッセー
17768 ジバッファ管理領域のサイズ(バイト数)
17769 TCNT_MBFMB(msgcnt, msgsz) msgsz で指定したサイズのメッセージを,
17770 msgcnt で指定した数だけ格納できるメッセー
17771 ジバッファ管理領域を確保するために必要
17772 なMB_T型の配列の要素数
17773
17774 (5) メモリプール管理機能
17775
17776 COUNT_MPF_T(blksz) 固定長メモリブロックのサイズがblkszの固定長メモ
17777 リプール領域を確保するために,固定長メモリブロッ
17778 ク1つあたりに必要なMPF_T型の配列の要素数を求め
17779 るマクロ
17780 ROUND_MPF_T(blksz) 要素数COUNT_MPF_T(blksz)のMPF_T型の配列のサイズ
17781 (blkszを,MPF_T型のサイズの倍数になるように大き
17782 い方に丸めた値)
17783
17784 TSZ_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理
17785 することができる固定長メモリプール管理領域のサ
17786 イズ(バイト数)
17787 TCNT_MPFMB(blkcnt) blkcnt で指定した数の固定長メモリブロックを管理
17788 することができる固定長メモリプール管理領域を確
17789 保するために必要なMB_T型の配列の要素数
17790
17791 5.5 構成マクロ
17792
17793 5.5.1 TOPPERS共通構成マクロ
17794
17795 (1) 相対時間の範囲
17796
17797 TMAX_RELTIM 相対時間に指定できる最大値
17798
17799 5.5.2 カーネル共通構成マクロ
17800
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
357
17801 (1) サポートする機能
17802
17803 TOPPERS_SUPPORT_PROTECT 保護機能対応のカーネル
17804 TOPPERS_SUPPORT_MULTI_PRC マルチプロセッサ対応のカーネル
17805 TOPPERS_SUPPORT_DYNAMIC_CRE 動的生成対応のカーネル
17806
17807 (2) 優先度の範囲
17808
17809 TMIN_TPRI タスク優先度の最小値(=1)
17810 TMAX_TPRI タスク優先度の最大値
17811
17812 (3) プロセッサの数
17813
17814 TNUM_PRCID プロセッサの数
17815
17816 (4) 特殊な役割を持ったプロセッサ
17817
17818 TOPPERS_MASTER_PRCID マスタプロセッサのID番号
17819 TOPPERS_SYSTIM_PRCID システム時刻管理プロセッサのID番号
17820
17821 (5) タイマ方式
17822
17823 TOPPERS_SYSTIM_LOCAL ローカルタイマ方式の場合にマクロ定義
17824 TOPPERS_SYSTIM_GLOBAL グローバルタイマ方式の場合にマクロ定義
17825
17826 (6) バージョン情報
17827
17828 TKERNEL_MAKER カーネルのメーカコード(=0x0118)
17829 TKERNEL_PRID カーネルの識別番号
17830 TKERNEL_SPVER カーネル仕様のバージョン番号
17831 TKERNEL_PRVER カーネルのバージョン番号
17832
17833 5.5.3 カーネルの機能毎の構成マクロ
17834
17835 (1) タスク管理機能
17836
17837 TMAX_ACTCNT タスクの起動要求キューイング数の最大値
17838
17839 TNUM_TSKID 登録できるタスクの数(動的生成対応でないカーネルで
17840 は,静的APIによって登録されたタスクの数に一致)
17841
17842 (2) タスク付属同期機能
17843
17844 TMAX_WUPCNT タスクの起床要求キューイング数の最大値
17845
17846 (3) タスク例外処理機能
17847
17848 TBIT_TEXPTN タスク例外要因のビット数(TEXPTNの有効ビット数)
17849
17850 (4) 同期・通信機能
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
358
17851
17852 セマフォ
17853
17854 TMAX_MAXSEM セマフォの最大資源数の最大値
17855
17856 TNUM_SEMID 登録できるセマフォの数(動的生成対応でないカーネル
17857 では,静的APIによって登録されたセマフォの数に一致)
17858
17859 イベントフラグ
17860
17861 TBIT_FLGPTN イベントフラグのビット数(FLGPTNの有効ビット数)
17862
17863 TNUM_FLGID 登録できるイベントフラグの数(動的生成対応でないカー
17864 ネルでは,静的APIによって登録されたイベントフラグの
17865 数に一致)
17866
17867 データキュー
17868
17869 TNUM_DTQID 登録できるデータキューの数(動的生成対応でないカー
17870 ネルでは,静的APIによって登録されたデータキューの数
17871 に一致)
17872
17873 優先度データキュー
17874
17875 TMIN_DPRI データ優先度の最小値(=1)
17876 TMAX_DPRI データ優先度の最大値
17877
17878 TNUM_PDQID 登録できる優先度データキューの数(動的生成対応でな
17879 いカーネルでは,静的APIによって登録された優先度デー
17880 タキューの数に一致)
17881
17882 メールボックス
17883
17884 TMIN_MPRI メッセージ優先度の最小値(=1)
17885 TMAX_MPRI メッセージ優先度の最大値
17886
17887 TNUM_MBXID 登録できるメールボックスの数(動的生成対応でないカー
17888 ネルでは,静的APIによって登録されたメールボックスの
17889 数に一致)
17890
17891 ミューテックス
17892
17893 TNUM_MTXID 登録できるミューテックスの数(動的生成対応でないカー
17894 ネルでは,静的APIによって登録されたミューテックスの
17895 数に一致)
17896
17897 メッセージバッファ
17898
17899 TNUM_MBFID 登録できるメッセージバッファの数(動的生成対応でな
17900 いカーネルでは,静的APIによって登録されたメッセー
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
359
17901 ジバッファの数に一致)
17902
17903 スピンロック
17904
17905 TNUM_SPNID 登録できるスピンロックの数(動的生成対応でないカー
17906 ネルでは,静的APIによって登録されたミューテックスの
17907 数に一致)
17908
17909 (5) メモリプール管理機能
17910
17911 固定長メモリプール
17912
17913 TNUM_MPFID 登録できる固定長メモリプールの数(動的生成対応でない
17914 カーネルでは,静的APIによって登録された固定長メモリ
17915 プールの数に一致)
17916
17917 (6) 時間管理機能
17918
17919 システム時刻管理
17920
17921 TIC_NUME タイムティックの周期(単位はミリ秒)の分子
17922 TIC_DENO タイムティックの周期(単位はミリ秒)の分母
17923
17924 TOPPERS_SUPPORT_GET_UTM get_utm がサポートされている
17925
17926 周期ハンドラ
17927
17928 TNUM_CYCID 登録できる周期ハンドラの数(動的生成対応でないカー
17929 ネルでは,静的APIによって登録された周期ハンドラの数
17930 に一致)
17931
17932 アラームハンドラ
17933
17934 TNUM_ALMID 登録できるアラームハンドラの数(動的生成対応でない
17935 カーネルでは,静的APIによって登録されたアラームハン
17936 ドラの数に一致)
17937
17938 オーバランハンドラ
17939
17940 TMAX_OVRTIM プロセッサ時間に指定できる最大値
17941
17942 TOPPERS_SUPPORT_OVR HDR オーバランハンドラ機能がサポートされて
17943 いる
17944
17945 (7) システム状態管理機能
17946
17947 なし
17948
17949 (8) メモリオブジェクト管理機能
17950
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
360
17951 TOPPERS_SUPPORT_ATT_MOD ATT_MOD /ATA_MODがサポートされている
17952 TOPPERS_SUPPORT_ATT_PMA ATT_PMA /ATA_PMA/att_pmaがサポートさ
17953 れている
17954
17955 (9) 割込み管理機能
17956
17957 TMIN_INTPRI 割込み優先度の最小値(最高値)
17958 TMAX_INTPRI 割込み優先度の最大値(最低値,=-1)
17959
17960 TMIN_ISRPRI 割込みサービスルーチン優先度の最小値(=1)
17961 TMAX_ISRPRI 割込みサービスルーチン優先度の最大値
17962
17963 TOPPERS_SUPPORT_DIS_INT dis_int がサポートされている
17964 TOPPERS_SUPPORT_ENA_INT ena_int がサポートされている
17965
17966 (10) CPU例外管理機能
17967
17968 なし
17969
17970 (11) 拡張サービスコール管理機能
17971
17972 TNUM_FNCD 登録できる拡張サービスコールの数(動的生成対応でな
17973 いカーネルでは,静的APIによって登録された拡張サービ
17974 スコールの数に一致)
17975
17976 (12) システム構成管理機能
17977
17978 なし
17979
17980 5.6 エラーコード一覧
17981
17982 (1) メインエラーコード
17983
17984 E_SYS -5 システムエラー
17985 E_NOSPT -9 未サポート機能
17986 E_RSFN -10 予約機能コード
17987 E_RSATR -11 予約属性
17988 E_PAR -17 パラメータエラー
17989 E_ID -18 不正ID番号
17990 E_CTX -25 コンテキストエラー
17991 E_MACV -26 メモリアクセス違反
17992 E_OACV -27 オブジェクトアクセス違反
17993 E_ILUSE -28 サービスコール不正使用
17994 E_NOMEM -33 メモリ不足
17995 E_NOID -34 ID番号不足
17996 E_NORES -35 資源不足
17997 E_OBJ -41 オブジェクト状態エラー
17998 E_NOEXS -42 オブジェクト未登録
17999 E_QOVR -43 キューイングオーバフロー
18000 E_RLWAI -49 待ち禁止状態または待ち状態の強制解除
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
361
18001 E_TMOUT -50 ポーリング失敗またはタイムアウト
18002 E_DLT -51 待ちオブジェクトの削除または再初期化
18003 E_CLS -52 待ちオブジェクトの状態変化
18004 E_WBLK -57 ノンブロッキング受付け
18005 E_BOVR -58 バッファオーバフロー
18006
18007 5.7 機能コード一覧【NGKI4036】
18008
18009 --------------------------------------------------------
18010 -0 -1 -2 -3
18011 --------------------------------------------------------
18012 -0x01 予約 予約 予約 予約
18013 -0x05 act_tsk iact_tsk can_act ext_tsk
18014 -0x09 ter_tsk chg_pri get_pri get_inf
18015 -0x0d slp_tsk tslp_tsk wup_tsk iwup_tsk
18016 -0x11 can_wup rel_wai irel_wai 予約
18017 -0x15 dis_wai idis_wai ena_wai iena_wai
18018 -0x19 sus_tsk rsm_tsk dly_tsk 予約
18019 -0x1d ras_tex iras_tex dis_tex ena_tex
18020 -0x21 sns_tex ref_tex 予約 予約
18021 -0x25 sig_sem isig_sem wai_sem pol_sem
18022 -0x29 twai_sem 予約 予約 予約
18023 -0x2d set_flg iset_flg clr_flg wai_flg
18024 -0x31 pol_flg twai_flg 予約 予約
18025 -0x35 snd_dtq psnd_dtq ipsnd_dtq tsnd_dtq
18026 -0x39 fsnd_dtq ifsnd_dtq rcv_dtq prcv_dtq
18027 -0x3d trcv_dtq 予約 予約 予約
18028 -0x41 snd_pdq psnd_pdq ipsnd_pdq tsnd_pdq
18029 -0x45 rcv_pdq prcv_pdq trcv_pdq 予約
18030 -0x49 snd_mbx rcv_mbx prcv_mbx trcv_mbx
18031 -0x4d loc_mtx ploc_mtx tloc_mtx unl_mtx
18032 -0x51 snd_mbf psnd_mbf tsnd_mbf rcv_mbf
18033 -0x55 prcv_mbf trcv_mbf 予約 予約
18034 -0x59 get_mpf pget_mpf tget_mpf rel_mpf
18035 -0x5d get_tim get_utm 予約 ref_ovr
18036 -0x61 sta_cyc stp_cyc 予約 予約
18037 -0x65 sta_alm ista_alm stp_alm istp_alm
18038 -0x69 sta_ovr ista_ovr stp_ovr istp_ovr
18039 -0x6d sac_sys ref_sys rot_rdq irot_rdq
18040 -0x71 get_did 予約 get_tid iget_tid
18041 -0x75 loc_cpu iloc_cpu unl_cpu iunl_cpu
18042 -0x79 dis_dsp ena_dsp sns_ctx sns_loc
18043 -0x7d sns_dsp sns_dpn sns_ker ext_ker
18044 -0x81 att_mem det_mem sac_mem prb_mem
18045 -0x85 ref_mem 予約 att_pma 予約
18046 -0x89 cfg_int dis_int ena_int ref_int
18047 -0x8d chg_ipm get_ipm 予約 予約
18048 -0x91 xsns_dpn xsns_xpn 予約 予約
18049 -0x95 ref_cfg ref_ver 予約 予約
18050 -0x99 予約 予約 予約 予約
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
362
18051 -0x9d 予約 予約 予約 予約
18052 -0xa1 予約 ini_sem ini_flg ini_dtq
18053 -0xa5 ini_pdq ini_mbx ini_mtx ini_mbf
18054 -0xa9 ini_mpf 予約 予約 予約
18055 -0xad 予約 予約 予約 予約
18056 -0xb1 ref_tsk ref_sem ref_flg ref_dtq
18057 -0xb5 ref_pdq ref_mbx ref_mtx ref_mbf
18058 -0xb9 ref_mpf ref_cyc ref_alm re f_isr
18059 -0xbd ref_spn 予約 予約 予約
18060 -0xc1 acre_tsk acre_sem acre_flg acre_dtq
18061 -0xc5 acre_pdq acre_mbx acre_mtx acre_mbf
18062 -0xc9 acre_mpf acre_cyc acre_alm a cre_isr
18063 -0xcd acre_spn 予約 予約 予約
18064 -0xd1 del_tsk del_sem del_flg del_dtq
18065 -0xd5 del_pdq del_mbx del_mtx del_mbf
18066 -0xd9 del_mpf del_cyc del_alm d el_isr
18067 -0xdd del_spn 予約 予約 予約
18068 -0xe1 sac_tsk sac_sem sac_flg sac_dtq
18069 -0xe5 sac_pdq 予約 sac_mtx sac_mbf
18070 -0xe9 sac_mpf sac_cyc sac_alm sac_ isr
18071 -0xed sac_spn 予約 予約 予約
18072 -0xf1 def_tex def_ovr def_inh def_exc
18073 -0xf5 def_svc 予約 予約 予約
18074 -0xf9 予約 予約 予約 予約
18075 -0xfd 予約 予約 予約 予約
18076 -0x101 mact_tsk imact_tsk mig_tsk 予約
18077 -0x105 msta_cyc 予約 msta_alm imsta_alm
18078 -0x109 mrot_rdq imrot_rdq get_pid iget_pid
18079 -0x10d 予約 予約 予約 予約
18080 -0x111 loc_spn iloc_spn try_spn itry_spn
18081 -0x115 unl_spn iunl_spn 予約 予約
18082 -0x119 予約 予約 予約 予約
18083 -0x11d 予約 予約 予約 予約
18084 --------------------------------------------------------
18085
18086 【μITRON4.0仕様との関係】
18087
18088 サービスコールの機能コードを割り当てなおした.
18089
18090 5.8 カーネルオブジェクトに対するアクセスの種別
18091
18092 ------------------------------------------------------------------------
18093 オブジェクトの種類 通常操作1 通常操作2 管理操作 参照操作
18094 ------------------------------------------------------------------------
18095 メモリオブジェクト 書込み 読出し det_mem ref_mem
18096 実行 sac_mem prb_mem
18097 ------------------------------------------------------------------------
18098 タスク act_tsk ter_tsk del_tsk get_pri
18099 mact_tsk chg_pri sac_tsk ref_tsk
18100 can_act rel_wai def_tex ref_tex
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
363
18101 mig_tsk sus_tsk ref_ovr
18102 wup_tsk rsm_tsk
18103 can_wup dis_wai
18104 ena_wai
18105 ras_tex
18106 sta_ovr
18107 stp_ovr
18108 ------------------------------------------------------------------------
18109 セマフォ sig_sem wai_sem del_sem ref_sem
18110 pol_sem ini_sem
18111 twai_sem sac_sem
18112 ------------------------------------------------------------------------
18113 イベントフラグ set_flg wai_flg del_flg ref_flg
18114 clr_flg pol_flg ini_flg
18115 twai_flg sac_flg
18116 ------------------------------------------------------------------------
18117 データキュー snd_dtq rcv_dtq del_dtq ref_dtq
18118 psnd_dtq prcv_dtq ini_dtq
18119 tsnd_dtq trcv_dtq sac_dtq
18120 fsnd_dtq
18121 ------------------------------------------------------------------------
18122 優先度データキュー snd_pdq rcv_pdq del_pdq ref_pdq
18123 psnd_pdq prcv_pdq ini_pdq
18124 tsnd_pdq trcv_pdq sac_pdq
18125 ------------------------------------------------------------------------
18126 メッセージバッファ snd_mbf rcv_mbf del_mbf ref_mbf
18127 psnd_mbf prcv_mbf ini_mbf
18128 tsnd_mbf trcv_mbf sac_mbf
18129 ------------------------------------------------------------------------
18130 ミューテックス loc_mtx - del_mtx ref_mtx
18131 ploc_mtx ini_mtx
18132 tloc_mtx sac_mtx
18133 unl_mtx
18134 ------------------------------------------------------------------------
18135 スピンロック loc_spn - del_spn ref_spn
18136 try_spn sac_spn
18137 unl_spn
18138 ------------------------------------------------------------------------
18139 固定長メモリプール get_mpf rel_mpf del_mpf ref_mpf
18140 pget_mpf ini_mpf
18141 tget_mpf sac_mpf
18142 ------------------------------------------------------------------------
18143 周期ハンドラ sta_cyc stp_cyc del_cyc ref_cyc
18144 msta_cyc sac_cyc
18145 ------------------------------------------------------------------------
18146 アラームハンドラ sta_alm stp_alm del_alm ref_alm
18147 msta_alm sac_alm
18148 ------------------------------------------------------------------------
18149 割込みサービスルーチン - - del_isr ref_isr
18150 sac_isr
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
364
18151 ------------------------------------------------------------------------
18152 システム状態 rot_rdq loc_cpu acre_yyy get_tim
18153 mrot_rdq unl_cpu att_mem get_ipm
18154 dis_dsp dis_int att_pma ref_sys
18155 ena_dsp ena_int cfg_int ref_int
18156 chg_ipm def_inh ref_cfg
18157 def_exc ref_ver
18158 def_svc
18159 def_ovr
18160 ------------------------------------------------------------------------
18161
18162 すべての保護ドメインから呼び出すことができるサービスコール:
18163
18164 ・自タスクへの操作(ext_tsk,get_inf,slp_tsk,tslp_tsk,dly_tsk,
18165 dis_tex,ena_tex)
18166 ・タスク例外状態参照(sns_tex)
18167 ・性能評価用システム時刻の参照(get_utm)
18168 ・システム状態参照(get_tid,get_did,get_pid,sns_ctx,sns_loc,
18169 sns_dsp,sns_dpn,sns_ker)
18170 ・CPU例外発生時の状態参照(xsns_dpn,xsns_xpn)
18171 ・拡張サービスコールの呼出し(cal_svc)
18172
18173 カーネルドメインのみから呼び出すことができるサービスコール:
18174
18175 ・システム状態のアクセス許可ベクタの設定(sac_sys)
18176 ・カーネルの終了(ext_ker)
18177 ・非タスクコンテキスト専用のサービスコール
18178
18179 アクセス許可ベクタによるアクセス保護を行わないサービスコール:
18180
18181 ・ミューテックスのロック解除(unl_mtx)
18182
18183 【補足説明】
18184
18185 xsns_dpnとxsns_xpnは,エラーコードを返さないために,すべての保護ドメイ
18186 ンから呼び出すことができるサービスコールとしているが,タスクコンテキス
18187 トから呼び出した場合には必ずtrueが返ることとしており,実質的にはカーネ
18188 ルドメインのみから呼び出すことができる.
18189
18190 【μITRON4.0/PX仕様との関係】
18191
18192 get_priは,μITRON4.0/PX仕様ではタスクに対する通常操作1としていたのを,
18193 タスクに対する参照操作に変更した.また,get_ipm(μITRON4.0/PX仕様では
18194 get_ixx)をシステム状態に対する通常操作2から参照操作に,sac_sysをシステ
18195 ム状態に対する管理操作からカーネルドメインのみから呼び出すことができる
18196 サービスコールに変更した.システム時刻に対するアクセス許可ベクタは廃止
18197 し,get_timはシステム状態に対する参照操作とした.
18198
18199 【仕様変更の経緯】
18200
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
365
18201 この仕様のRelease 1.5以前では,unl_mtxは,アクセス許可ベクタによるアク
18202 セス保護を行わないサービスコールとしていた.これは,ミューテックスをロッ
18203 クしたタスク以外がunl_mtxを呼び出すとE_ILUSEエラーとなるため,実質的に
18204 は対象ミューテックスの通常操作1としてアクセス保護されているとみなすこと
18205 ができると考えたためである.しかし,タスクが拡張サービスコールの中で
18206 ミューテックスをロックした場合,アクセス許可ベクタではアクセスが許可さ
18207 れていないミューテックスをロックすることができる.このようなミューテッ
18208 クスのロック解除は,タスクから直接unl_mtxを呼んで行うのではなく,拡張サー
18209 ビスコールの中で行うべきと考えられる.そこで,unl_mtxを,対象ミューテッ
18210 クスの通常操作1としてアクセス保護する仕様に変更した.なお,HRP2カーネル
18211 Release 2.1以前のバージョンは,古い仕様に従って実装されている.
18212
18213 5.9 ターゲット定義事項一覧
18214
18215 ・割込み優先度の段階数[NGKI0256]
18216
18217 ・割込み番号の付与方法[NGKI0272]
18218
18219 ・割込みハンドラ番号の付与方法[NGKI0273]
18220
18221 ・割込み番号に対応しない割込みハンドラ番号や,割込みハンドラ番号に対応
18222 しない割込み番号を設けるか[NGKI0276]
18223
18224 ・受け付けた割込み要求に対して,割込みサービスルーチンも割込みハンドラ
18225 も登録していない場合の振舞い[NGKI0249]
18226
18227 ・割込み要求禁止フラグがサポートされているか[NGKI0260][NGKI0261]
18228
18229 ・割込み要求禁止フラグの振舞いを仕様と異なるものとするか[NGKI0261]
18230
18231 ・割込み要求ラインのトリガモードの設定がサポートされているか[NGKI0267]
18232
18233 ・割込み要求ラインをエッジトリガに設定する場合に,ポジティブエッジトリ
18234 ガかネガティブエッジトリガか両エッジトリガかを設定できるか[NGKI0265]
18235
18236 ・割込み要求ラインをレベルトリガに設定する場合に,ローレベルトリガかハ
18237 イレベルトリガかを設定できるか[NGKI0266]
18238
18239 ・あるプロセッサで割込み要求禁止フラグを動的にセット/クリアしても,他
18240 のプロセッサに対しては割込みがマスク/マスク解除されないものとするか
18241 〔M〕[NGKI0281]
18242
18243 ・TMIN_INTPRIを固定するか設定できるようにするかと,設定できるようにする
18244 場合の設定方法[NGKI0288]
18245
18246 ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか)
18247 [NGKI0289]
18248
18249 ・カーネル管理外の割込みハンドラが実行開始される時のシステム状態とコン
18250 テキスト,割込みハンドラの終了時に行われる処理,割込みハンドラの記述
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
366
18251 方法[NGKI0292]
18252
18253 ・カーネル管理外の割込みの設定方法として,3つの方法のいずれを採用するか
18254 [NGKI0295]
18255
18256 ・カーネル管理外とされた割込みに対して,カーネルのAPIにより割込みハンド
18257 ラを登録できるかと,割込み要求ラインの属性を設定できるか[NGKI0297]
18258
18259 ・CPU例外ハンドラ番号の付与方法[NGKI0306]
18260
18261 ・発生したCPU例外に対して,CPU例外ハンドラを登録していない場合の振舞い
18262 [NGKI0314]
18263
18264 ・メモリオブジェクトの先頭番地とサイズに対する制約〔P〕[NGKI0070]
18265 [NGKI2774]
18266
18267 ・コンパイラが出力しないセクションの中で,どれを標準のセクションと扱う
18268 か〔P〕[NGKI0113]
18269
18270 ・保護ドメイン毎の標準セクションのセクション名を,標準のセクション名と
18271 保護ドメイン名を"_"でつないだものとする仕様を変更するか〔P〕[NGKI0116]
18272
18273 ・タスクのユーザスタック領域はそのタスク(とカーネルドメインに属する処
18274 理単位)のみがアクセスできるという仕様を変更するか〔P〕[NGKI0074]
18275
18276 ・メモリオブジェクトに対して,通常のメモリアクセスにより,許可されてい
18277 ない書込みアクセスまたは読出しアクセス(実行アクセスを含む)を行おう
18278 とした場合に,どのCPU例外ハンドラが起動されるか〔P〕[NGKI0411]
18279
18280 ・メモリオブジェクトに対して,サービスコールを通じて,許可されていない
18281 書込みアクセスまたは読出しアクセスを行おうとした場合に,サービスコー
18282 ルからE_MACVエラーが返るか,メモリアクセス違反ハンドラが起動されるか
18283 〔P〕[NGKI0413]
18284
18285 ・メモリアクセス違反ハンドラで,アクセス違反を発生させたアクセスに関す
18286 る情報(アクセスした番地,アクセスの種別,アクセスした命令の番地など)
18287 を参照する方法〔P〕[NGKI0414]
18288
18289 ・メモリオブジェクトの書込みアクセスと読出しアクセス(実行アクセスを含
18290 む)に対して設定できるアクセス許可パターンに対する制限〔P〕[NGKI0417]
18291
18292 ・1つの保護ドメインに登録できるメモリオブジェクトの数に対する制限〔P〕
18293 [NGKI0423]
18294
18295 ・ユーザスタック領域に対して実行アクセスを行えるか〔P〕[NGKI0440]
18296
18297 ・タスクのユーザスタック領域を,そのタスクが属する保護ドメイン全体から
18298 アクセスできるものとするか〔P〕[NGKI0441]
18299
18300 ・使用できるクラスのID番号とその属性〔M〕[NGKI0107]
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
367
18301
18302 ・どのプロセッサをマスタプロセッサとするか〔M〕[NGKI0101]
18303
18304 ・ローカルタイマ方式とグローバルタイマ方式のどちらの方式を用いることが
18305 できるか〔M〕[NGKI0108]
18306
18307 ・グローバルタイマ方式の場合に,どのプロセッサをシステム時刻管理プロセッ
18308 サとするか〔M〕[NGKI0111]
18309
18310 ・int8_t,uint8_t,int64_t,uint64_t,int128_t,uint128_t,float32_t,
18311 double64_tが使用できるか[NGKI0488][NGKI0490]
18312
18313 ・ターゲット定義のタスク属性[NGKI1016]
18314
18315 ・タスクが用いるスタック領域のサイズの最小値[NGKI1042]
18316
18317 ・タスクのシステムスタック領域のサイズの最小値〔P〕[NGKI1044]
18318
18319 ・タスクが用いるスタック領域の先頭番地とサイズに対する制約[NGKI1050]
18320 [NGKI1056]
18321
18322 ・ユーザスタックのスタック領域(ユーザスタック領域)をアプリケーション
18323 で確保する方法〔P〕[NGKI1059]
18324
18325 ・タスクのシステムスタック領域の先頭番地とサイズに対する制約〔P〕
18326 [NGKI1062][NGKI1065][NGKI1070]
18327
18328 ・データキュー管理領域の先頭番地に対する制約[NGKI1687]
18329
18330 ・優先度データキュー管理領域の先頭番地に対する制約[NGKI1824]
18331
18332 ・メッセージバッファ管理領域の先頭番地とサイズに対する制約[NGKI3319]
18333 [NGKI3324]
18334
18335 ・生成できるスピンロックの数の上限〔M〕[NGKI2142]
18336
18337 ・スピンロックに対して,複数のプロセッサがロックの取得を待っている時に,
18338 どのプロセッサが最初にロックを取得できるか〔M〕[NGKI2183]
18339
18340 ・固定長メモリプール領域の先頭番地に対する制約[NGKI2249]
18341
18342 ・固定長メモリプール管理領域の先頭番地に対する制約[NGKI2256]
18343
18344 ・タイムティックの周期[NGKI2335]
18345
18346 ・マルチプロセッサ対応カーネルにおける性能評価用システム時刻の扱い〔M〕
18347 [NGKI2346]
18348
18349 ・get_utmがサポートされているか[NGKI2360]
18350
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
368
18351 ・オーバランハンドラ機能がサポートされているか[NGKI2598]
18352
18353 ・オーバランハンドラ機能のプロセッサ時間に指定できる値の上限[NGKI2594]
18354
18355 ・ターゲット定義のメモリリージョン属性〔P〕
18356
18357 ・メモリリージョンの先頭番地とサイズに対する制約〔P〕[NGKI2768]
18358
18359 ・メモリオブジェクトに対するTA_NOWRITE属性,TA_NOREAD属性,TA_EXEC属性
18360 の内,どのような場合にどの属性の指定が無視されるか〔P〕[NGKI2782]
18361
18362 ・ショートデータ領域がサポートされておらず,TA_SDATA属性が無視されるか
18363 〔P〕[NGKI2789]
18364
18365 ・TA_NOWRITEを指定した場合に,TA_SDATAが無視されるか〔P〕[NGKI2790]
18366
18367 ・TA_UNCACHE属性やTA_IODEV属性を指定しても意味がなく,これらの属性が無
18368 視されるか〔P〕[NGKI2792]
18369
18370 ・キャッシュ禁止にできないメモリオブジェクトと周辺デバイスの領域として
18371 扱うことができないメモリオブジェクト〔P〕[NGKI2793]
18372
18373 ・ターゲット定義のメモリオブジェクト属性〔P〕[NGKI2794]
18374
18375 ・ATA_SECにより登録できるセクションが属する保護ドメインや登録できる数
18376 に対する制限〔P〕[NGKI2831]
18377
18378 ・ATT_MOD/ATA_MODがサポートされているか〔P〕[NGKI2859]
18379
18380 ・ATT_MOD/ATA_MODにより登録されるセクション毎のメモリオブジェクトに設
18381 定されるメモリオブジェクト属性〔P〕[NGKI2850]
18382
18383 ・クラスの囲みの中に記述されたATT_MOD/ATA_MODにおいて,クラスの標準メ
18384 モリリージョンが定義されている場合でも,共通の標準メモリリージョンに
18385 配置されるセクション〔PM〕[NGKI3271]
18386
18387 ・ATA_MODにより登録できるオブジェクトモジュールが属する保護ドメインや登
18388 録できる数に対する制限〔P〕[NGKI2857]
18389
18390 ・ATT_MEM/ATA_MEMにより登録できるメモリオブジェクトが属する保護ドメイ
18391 ンや登録できる数に対する制限〔P〕[NGKI2878]
18392
18393 ・ATT_MEM/ATA_MEM/att_memにより登録するメモリ領域の先頭番地とサイズに
18394 対する制約〔P〕[NGKI2880]
18395
18396 ・ATT_PMA/ATA_PMA/att_pmaがサポートされているか〔P〕[NGKI2903]
18397 [HRPS0156]
18398
18399 ・ATT_PMA/ATA_PMAにより登録できるメモリオブジェクトが属する保護ドメイ
18400 ンや登録できる数に対する制限〔P〕[NGKI2898]
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
369
18401
18402 ・ATT_PMA/ATA_PMA/att_pmaにより登録するメモリ領域の先頭番地とサイズ,
18403 物理アドレス空間における先頭番地に対する制約〔P〕[NGKI2900]
18404
18405 ・ターゲット定義の割込み要求ライン属性[NGKI2945]
18406
18407 ・割込みハンドラ属性にTA_NONKERNELを指定できるか[NGKI2957]
18408
18409 ・その他のターゲット定義の割込みハンドラ属性[NGKI2959]
18410
18411 ・cfg_intにおいて,複数の割込み要求ラインの割込み優先度が連動して設定さ
18412 れるか〔D〕[NGKI2980]
18413
18414 ・CFG_INT/cfg_intで,カーネル管理外の割込み要求ラインに対しても属性を
18415 設定できるか[NGKI2982]
18416
18417 ・CFG_INT/cfg_intで,各割込み要求ラインに対して設定できる割込み要求ラ
18418 イン属性/割込み優先度に対する制限[NGKI2986]
18419
18420 ・割込みサービスルーチンが属することができるクラスに対する制限〔M〕
18421 [NGKI3018]
18422
18423 ・CRE_ISR/ATT_ISRにおいて,isrが不正である場合にE_PARエラーが検出され
18424 るか[NGKI3020]
18425
18426 ・DEF_INH/def_inhで,カーネル管理外の割込みに対しても割込みハンドラを
18427 定義できるか[NGKI3064]
18428
18429 ・カーネル管理外に固定されている割込みハンドラがあるか[NGKI3067]
18430
18431 ・カーネル管理に固定されている割込みハンドラがあるか[NGKI3068]
18432
18433 ・割込みハンドラが属することができるクラスに対する制限〔M〕[NGKI3074]
18434
18435 ・def_inhで,静的APIで定義された割込みハンドラの定義を解除できるか〔D〕
18436 [NGKI3077]
18437
18438 ・DEF_INH/def_inhで割込みハンドラを定義(または定義解除)できない割込
18439 みハンドラ番号[NGKI3078]
18440
18441 ・def_inhを呼び出したタスクが割り付けられているプロセッサから定義(また
18442 は定義解除)できない割込みハンドラ〔M〕[NGKI3079]
18443
18444 ・DEF_INHにおいて,inthdrが不正である場合にE_PARエラーが検出されるか
18445 [NGKI3080]
18446
18447 ・dis_intがサポートされているか[NGKI3091]
18448
18449 ・dis_intにより,どのような場合に割込み要求ラインの割込み要求禁止フラグ
18450 をセットできないか[NGKI3087]
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
370
18451
18452 ・dis_intにおいて,割込み要求禁止フラグの振舞いが,この仕様の規定と異な
18453 るか[NGKI3089]
18454
18455 ・ena_intがサポートされているか[NGKI3104]
18456
18457 ・ena_intにより,どのような場合に割込み要求ラインの割込み要求禁止フラグ
18458 をクリアできないか[NGKI3100]
18459
18460 ・ena_intにおいて,割込み要求禁止フラグの振舞いが,この仕様の規定と異な
18461 るか[NGKI3102]
18462
18463 ・chg_ipmにより,割込み優先度マスクをTMIN_INTPRIよりも小さい値に変更で
18464 きるか[NGKI3114]
18465
18466 ・ターゲット定義のCPU例外ハンドラ属性[NGKI3123]
18467
18468 ・def_excで,静的APIで定義されたCPU例外ハンドラの定義を解除できるか〔D〕
18469 [NGKI3148]
18470
18471 ・DEF_EXCにおいて,exchdrが不正である場合にE_PARエラーが検出されるか
18472 [NGKI3149]
18473
18474 ・非タスクコンテキスト用スタック領域のサイズの最小値[NGKI3254]
18475
18476 ・非タスクコンテキスト用スタック領域の先頭番地とサイズに対する制約
18477 [NGKI3220][NGKI3222]
18478
18479 ・DEF_ICSにより非タスクコンテキスト用スタック領域を設定しない場合の,非
18480 タスクコンテキスト用スタック領域のデフォルトのサイズ[NGKI3224]
18481
18482 ・共有スタック領域のサイズの最小値[NGKI3255]
18483
18484 ・共有スタック領域の先頭番地とサイズに対する制約[NGKI3234][NGKI3236]
18485
18486 ・ATT_INIにおいて,inirtnが不正である場合にE_PARエラーが検出されるか
18487 [NGKI3246]
18488
18489 ・ATT_TERにおいて,terrtnが不正である場合にE_PARエラーが検出されるか
18490 [NGKI3253]
18491
18492 5.10 省略名の元になった英語
18493
18494 5.10.1 サービスコールと静的APIの名称の中のxxxの元になった英語
18495
18496 xxx 元になった英語
18497 ----------------------
18498 act activate
18499 aid automatically assigned ID
18500 ata attach with access control vector
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
371
18501 att attach
18502 cal call
18503 can cancel
18504 cfg configure
18505 chg change
18506 clr clear
18507 cre create
18508 def define
18509 del delete
18510 det detach
18511 dis disable
18512 dly delay
18513 ena enable
18514 epr execution priority
18515 ext exit
18516 get get
18517 ini initialize
18518 lnk link
18519 loc lock
18520 mig migrate
18521 pol poll
18522 prb probe
18523 ras raise
18524 rcv receive
18525 ref reference
18526 rel release
18527 rot rotate
18528 rsm resume
18529 sac set access control vector
18530 set set
18531 sig signal
18532 slp sleep
18533 snd send
18534 sns sense
18535 sta start
18536 stp stop
18537 sus suspend
18538 ter terminate
18539 try try
18540 unl unlock
18541 wai wait
18542 wup wake up
18543
18544 5.10.2 サービスコールと静的APIの名称の中のyyyの元になった英語
18545
18546 yyy 元になった英語
18547 ----------------------
18548 act activation
18549 alm alarm handler
18550 cfg configuration
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
372
18551 cpu CPU
18552 ctx context
18553 cyc cyclic handler
18554 did domain ID
18555 dpn dispatch pending
18556 dsp dispatch
18557 dtq data queue
18558 exc exception
18559 flg eventflag
18560 ics interrupt context stack
18561 inf information
18562 inh interrupt handler
18563 ini initilization
18564 int interrupt
18565 ipm interrupt priority mask
18566 isr interrupt service routine
18567 ker kernel
18568 loc lock
18569 mbf message buffer
18570 mbx mailbox
18571 mpf fixed -sized memory pool
18572 mem memory
18573 mod module
18574 mtx mutex
18575 ovr overrun handler
18576 pdq priority data queue
18577 pid processor ID
18578 pma physical memory area
18579 pri priority
18580 rdq ready queue
18581 reg region
18582 sec section
18583 sem semaphore
18584 srg standard memory region
18585 spn spin lock
18586 stk stack
18587 sys system
18588 svc service call
18589 ter termination
18590 tex task exception
18591 tid task ID
18592 tim time
18593 tsk task
18594 utm time in micro second
18595 ver version
18596 wai wait
18597 wup wake up
18598 xpn exception pending
18599
18600 5.10.3 サービスコールの名称の中のzの元になった英語
TOPPERS 新世代カーネル統合仕様書
Release 1.6.0
373
18601
18602 z 元になった英語
18603 ----------------------
18604 a automatic ID assignment
18605 f force
18606 i interrupt
18607 m multiprocessor
18608 p poll
18609 t timeout
18610 x exception
18611
18612 5.11 バージョン履歴
18613
18614 2008年11月19日 Release 1.0.0 最初のリリース
18615 2009年5月8日 Release 1.1.0 FMPカーネルに関する記述が完成
18616 2010年5月10日 Release 1.2.0
18617 2011年5月5日 Release 1.3.0 HRP2カーネルに関する記述が完成
18618 2012年5月16日 Release 1.4.0 SSPカーネルに関する記述が完成
18619 2012年12月19日 Release 1.5.0 HRP2カーネルの仕様変更を反映
18620 2014年1月16日 Release 1.6.0
18621
18622 以上
図2-1. 想定するソフトウェア構成
アプリケーションプログラム
システムサービス
カーネル
システムインタフェースレイヤ
プロセッサ, メモリ, タイマ 周辺デバイス
アプリケーションシステム
図2-2. タスクの状態遷移
待ち解除
プリエンプト
ディスパッチ
強制待ち
待ち解除
待ち
生成 削除
終了
強制終了
強制終了
起動
再開
強制待ち 強制待ち
再開
実行できる状態
広義の待ち状態
起動された状態
実行状態 RUNNING
実行可能状態 READY
待ち状態 WAITING
二重待ち状態 WAITING-
SUSPENDED
強制待ち状態 SUSPENDED
休止状態 DORMANT
未登録状態 NON-EXISTENT
図2-3. 過渡的な状態も含めたタスクの状態遷移
強制待ち
待ち解除
再開
生成 削除
待ち解除
プリエンプト
ディスパッチ
待ち
終了
強制終了
強制終了
起動
再開
強制待ち強制待ち
ディスパッチ保留
ディスパッチ 保留解除
ディスパッチ 保留解除
強制待ち 再開
実行状態 (ディスパッチ保留状態)
強制待ち状態 [実行継続中]
実行状態 RUNNING
実行可能状態 READY
待ち状態 WAITING
二重待ち状態 WAITING-
SUSPENDED
強制待ち状態 SUSPENDED
休止状態 DORMANT
未登録状態 NON-EXISTENT
図2-4. TOPPERS標準割込み処理モデルの概念図
プロセッサ およびIRC
周辺デバイス割込み要求
割込み要求ライン
周辺デバイス割込み要求
……
(intno)割込み番号
割込み受付け
……
(inhno)割込みハンドラ番号
割込みサービス ルーチンID (isrid)
マルチプロセッサ対応 カーネルにおいて
プロセッサ毎に持つ範囲
割込みサービスルーチン (ISR)
割込み ハンドラ
割込み ハンドラ
割込み ハンドラ
割込みサービスルーチン (ISR)
全割込みロック フラグ
CPUロック フラグ
割込み優先度 マスク (IPM)
割込み 優先度比較
割込み 優先度比較
割込み 優先度比較
割込み 優先度設定
割込み 優先度設定
割込み 優先度設定
割込み要求 禁止フラグ
割込み要求 禁止フラグ
割込み要求 禁止フラグ
エッジ/ レベル変換
エッジ/ レベル変換
エッジ/ レベル変換
割込み選択
図2-5. マルチプロセッサ対応カーネルにおける割込み番号と割込みハンドラ番号
割込み要求ライン
(intno)
割込み番号
(inhno)
割込みハンドラ番号
プロセッサ1 プロセッサ2 プロセッサn
ローカルIRC ローカルIRC ローカルIRC
0x0
1…
01
0x0
1…
02
0x0
1…
03
0x0
1…
04
0x0
2…
01
0x0
2…
02
0x0
2…
03
0x0
2…
04
0x0n…
01
0x0n…
02
0x0n…
03
0x0n…
04
0x0
1…
01
0x0
1…
02
0x0
2…
01
0x0
2…
02
0x0n…
01
0x0n…
02
0x0
0…
03
0x0
0…
04
グローバルIRC
図2-6. マルチプロセッサ対応カーネルにおけるシステム初期化の流れ
スタートアップ モジュール
マスタプロセッサ スレーブプロセッサ
同期
同期
同期
同期
カーネルの動作開始 カーネルの動作開始
カーネル動作状態に 遷移
カーネル動作状態に 遷移
ローカル初期化 ルーチンの実行
ローカル初期化 ルーチンの実行
グローバル初期化 ルーチンの実行
カーネル自身の初期化と 静的APIの処理
カーネル自身の初期化と 静的APIの処理
カーネルの 初期化処理へ分岐
カーネルの 初期化処理へ分岐
共有リソースの 初期化処理
プロセッサ毎の 初期化処理
プロセッサ毎の 初期化処理
スタートアップ モジュールの実行開始
スタートアップ モジュールの実行開始
図2-7. マルチプロセッサ対応カーネルにおけるシステム終了処理の流れ
マスタプロセッサ スレーブプロセッサカーネルを終了させる
サービスコールを 呼び出すプロセッサ
同期
同期
同期
ターゲットシステム 依存の終了処理
ターゲットシステム 依存の終了処理
ターゲットシステム 依存の終了処理
グローバル終了処理 ルーチンの実行
ローカル終了処理 ルーチンの実行
ローカル終了処理 ルーチンの実行
ローカル終了処理 ルーチンの実行
カーネル非動作状態に 遷移
カーネル非動作状態に 遷移
カーネルの 終了処理の開始
カーネルの 終了処理の開始
他のプロセッサに カーネルの終了を要求
カーネル非動作状態に 遷移
カーネルを終了させる サービスコールの呼出し
図2-8. コンフィギュレータの処理モデル
system.cfg
システムコンフィギュレーションファイル
kernel_cfg.c
カーネル 構成・初期化ファイル
※ ファイル名中の斜体の部分は例である.
cfg1_out.c
パラメータ計算用 C言語ファイル
cfg1_out.srec
パラメータ計算 結果ファイル
system.srec
ロードモジュール
その他のソースファイル, オブジェクトファイル
エラーメッセージ
kernel_cfg.h
カーネル構成・初期化 ヘッダファイル
system.syms
シンボルファイル
cfg1_out.syms
シンボルファイル
コンフィギュレータ (パス1)
コンフィギュレータ (パス2)
コンフィギュレータ (パス3)
Cコンパイラ (+関連ツール)
Cコンパイラ (+関連ツール)
図2-9. 保護機能対応カーネルにおけるコンフィギュレータの処理モデル
※ ファイル名中の斜体の部分は例である.
仮のリンカ スクリプト
cfg2_out.ld
仮のリンカ スクリプト
kernel_mem2.c
kernel_mem3.c
仮のメモリ構成・ 初期化ファイル
仮のメモリ構成・ 初期化ファイル
kernel_cfg.c
カーネル 構成・初期化ファイル
kernel_cfg.h
カーネル構成・初期化 ヘッダファイル
cfg2_out.syms
コンフィギュレータ (パス2)
コンフィギュレータ (パス3)
コンフィギュレータ (パス4)
cfg1_out.syms
シンボルファイル
cfg1_out.srec
パラメータ計算 結果ファイル
Cコンパイラ (+関連ツール)
cfg2_out.srec
Cコンパイラ (+関連ツール)
その他のソースファイル, オブジェクトファイル
ldscript.ld
リンカスクリプト
kernel_mem.c
メモリ構成・ 初期化ファイル
Cコンパイラ (+関連ツール)
system.srec
その他のソースファイル, オブジェクトファイル
system.syms
cfg3_out.symscfg3_out.srec
シンボルファイルロードモジュール
仮のシンボルファイル仮のロードモジュール
仮のシンボルファイル仮のロードモジュール
その他のソースファイル, オブジェクトファイル
cfg3_out.ld
オプション