OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / extension / mutex / include / kernel.h
1 /*
2  *  TOPPERS/ASP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Advanced Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
9  *              Graduate School of Information Science, Nagoya Univ., JAPAN
10  * 
11  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32  *      免責すること.
33  * 
34  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38  *  の責任を負わない.
39  * 
40  *  @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
41  */
42
43 /*
44  *              TOPPERS/ASPカーネル 標準ヘッダファイル
45  *
46  *  TOPPERS/ASPカーネルがサポートするサービスコールの宣言と,必要なデー
47  *  タ型,定数,マクロの定義を含むヘッダファイル.
48  *
49  *  アセンブリ言語のソースファイルからこのファイルをインクルードする時
50  *  は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
51  *  除くようになっている.
52  *
53  *  このファイルをインクルードする前にインクルードしておくべきファイル
54  *  はない.
55  */
56
57 #ifndef TOPPERS_KERNEL_H
58 #define TOPPERS_KERNEL_H
59
60 #ifdef __cplusplus
61 extern "C" {
62 #endif
63
64 /*
65  *      TOPPERS共通のデータ型・定数・マクロ
66  */
67 #include <t_stddef.h>
68
69 /*
70  *  ターゲット依存部
71  */
72 #include "target_kernel.h"
73
74 #ifndef TOPPERS_MACRO_ONLY
75
76 /*
77  *  データ型の定義
78  */
79
80 /*
81  *  ビットパターンやオブジェクト番号の型定義
82  */
83 typedef uint_t          TEXPTN;         /* タスク例外要因のビットパターン */
84 typedef uint_t          FLGPTN;         /* イベントフラグのビットパターン */
85 typedef uint_t          INTNO;          /* 割込み番号 */
86 typedef uint_t          INHNO;          /* 割込みハンドラ番号 */
87 typedef uint_t          EXCNO;          /* CPU例外ハンドラ番号 */
88
89 /*
90  *  処理単位の型定義
91  */
92 typedef void    (*TASK)(intptr_t exinf);
93 typedef void    (*TEXRTN)(TEXPTN texptn, intptr_t exinf);
94 typedef void    (*CYCHDR)(intptr_t exinf);
95 typedef void    (*ALMHDR)(intptr_t exinf);
96 typedef void    (*ISR)(intptr_t exinf);
97 typedef void    (*INTHDR)(void);
98 typedef void    (*EXCHDR)(void *p_excinf);
99 typedef void    (*INIRTN)(intptr_t exinf);
100 typedef void    (*TERRTN)(intptr_t exinf);
101
102 /*
103  *  メモリ領域確保のための型定義
104  */
105 #ifndef TOPPERS_STK_T
106 #define TOPPERS_STK_T   intptr_t
107 #endif /* TOPPERS_STK_T */
108 typedef TOPPERS_STK_T   STK_T;  /* スタック領域を確保するための型 */
109
110 #ifndef TOPPERS_MPF_T
111 #define TOPPERS_MPF_T   intptr_t
112 #endif /* TOPPERS_MPF_T */
113 typedef TOPPERS_MPF_T   MPF_T;  /* 固定長メモリプール領域を確保するための型 */
114
115 /*
116  *  メッセージヘッダの型定義
117  */
118 typedef struct t_msg {                  /* メールボックスのメッセージヘッダ */
119         struct t_msg    *pk_next;
120 } T_MSG;
121
122 typedef struct t_msg_pri {              /* 優先度付きメッセージヘッダ */
123         T_MSG   msgque;                         /* メッセージヘッダ */
124         PRI             msgpri;                         /* メッセージ優先度 */
125 } T_MSG_PRI;
126
127 /*
128  *  パケット形式の定義
129  */
130 typedef struct t_rtsk {
131         STAT    tskstat;        /* タスク状態 */
132         PRI             tskpri;         /* タスクの現在優先度 */
133         PRI             tskbpri;        /* タスクのベース優先度 */
134         STAT    tskwait;        /* 待ち要因 */
135         ID              wobjid;         /* 待ち対象のオブジェクトのID */
136         TMO             lefttmo;        /* タイムアウトするまでの時間 */
137         uint_t  actcnt;         /* 起動要求キューイング数 */
138         uint_t  wupcnt;         /* 起床要求キューイング数 */
139 } T_RTSK;
140
141 typedef struct t_rtex {
142         STAT    texstat;        /* タスク例外処理の状態 */
143         TEXPTN  pndptn;         /* 保留例外要因 */
144 } T_RTEX;
145
146 typedef struct t_rsem {
147         ID              wtskid;         /* セマフォの待ち行列の先頭のタスクのID番号 */
148         uint_t  semcnt;         /* セマフォの現在の資源数 */
149 } T_RSEM;
150
151 typedef struct t_rflg {
152         ID              wtskid;         /* イベントフラグの待ち行列の先頭のタスクのID番号 */
153         FLGPTN  flgptn;         /* イベントフラグの現在のビットパターン */
154 } T_RFLG;
155
156 typedef struct t_rdtq {
157         ID              stskid;         /* データキューの送信待ち行列の先頭のタスクのID番号 */
158         ID              rtskid;         /* データキューの受信待ち行列の先頭のタスクのID番号 */
159         uint_t  sdtqcnt;        /* データキュー管理領域に格納されているデータの数 */
160 } T_RDTQ;
161
162 typedef struct t_rpdq {
163         ID              stskid;         /* 優先度データキューの送信待ち行列の先頭のタスク
164                                                    のID番号 */
165         ID              rtskid;         /* 優先度データキューの受信待ち行列の先頭のタスク
166                                                    のID番号 */
167         uint_t  spdqcnt;        /* 優先度データキュー管理領域に格納されているデー
168                                                    タの数 */
169 } T_RPDQ;
170
171 typedef struct t_rmbx {
172         ID              wtskid;         /* メールボックスの待ち行列の先頭のタスクのID番号 */
173         T_MSG   *pk_msg;        /* メッセージキューの先頭につながれたメッセージ
174                                                    の先頭番地 */
175 } T_RMBX;
176
177 typedef struct t_rmtx {
178         ID              htskid;         /* ミューテックスをロックしているタスクのID番号 */
179         ID              wtskid;         /* ミューテックスの待ち行列の先頭のタスクのID番号 */
180 } T_RMTX;
181
182 typedef struct t_rmpf {
183         ID              wtskid;         /* 固定長メモリプールの待ち行列の先頭のタスクの
184                                                    ID番号 */
185         uint_t  fblkcnt;        /* 固定長メモリプール領域の空きメモリ領域に割り
186                                                    付けることができる固定長メモリブロックの数 */
187 } T_RMPF;
188
189 typedef struct t_rcyc {
190         STAT    cycstat;        /* 周期ハンドラの動作状態 */
191         RELTIM  lefttim;        /* 次に周期ハンドラを起動する時刻までの相対時間 */
192 } T_RCYC;
193
194 typedef struct t_ralm {
195         STAT    almstat;        /* アラームハンドラの動作状態 */
196         RELTIM  lefttim;        /* アラームハンドラを起動する時刻までの相対時間 */
197 } T_RALM;
198
199 /*
200  *  サービスコールの宣言
201  */
202
203 /*
204  *  タスク管理機能
205  */
206 extern ER               act_tsk(ID tskid) throw();
207 extern ER               iact_tsk(ID tskid) throw();
208 extern ER_UINT  can_act(ID tskid) throw();
209 extern ER               ext_tsk(void) throw();
210 extern ER               ter_tsk(ID tskid) throw();
211 extern ER               chg_pri(ID tskid, PRI tskpri) throw();
212 extern ER               get_pri(ID tskid, PRI *p_tskpri) throw();
213 extern ER               get_inf(intptr_t *p_exinf) throw();
214 extern ER               ref_tsk(ID tskid, T_RTSK *pk_rtsk) throw();
215
216 /*
217  *  タスク付属同期機能
218  */
219 extern ER               slp_tsk(void) throw();
220 extern ER               tslp_tsk(TMO tmout) throw();
221 extern ER               wup_tsk(ID tskid) throw();
222 extern ER               iwup_tsk(ID tskid) throw();
223 extern ER_UINT  can_wup(ID tskid) throw();
224 extern ER               rel_wai(ID tskid) throw();
225 extern ER               irel_wai(ID tskid) throw();
226 extern ER               sus_tsk(ID tskid) throw();
227 extern ER               rsm_tsk(ID tskid) throw();
228 extern ER               dly_tsk(RELTIM dlytim) throw();
229
230 /*
231  *  タスク例外処理機能
232  */
233 extern ER               ras_tex(ID tskid, TEXPTN rasptn) throw();
234 extern ER               iras_tex(ID tskid, TEXPTN rasptn) throw();
235 extern ER               dis_tex(void) throw();
236 extern ER               ena_tex(void) throw();
237 extern bool_t   sns_tex(void) throw();
238 extern ER               ref_tex(ID tskid, T_RTEX *pk_rtex) throw();
239
240 /*
241  *  同期・通信機能
242  */
243 extern ER               sig_sem(ID semid) throw();
244 extern ER               isig_sem(ID semid) throw();
245 extern ER               wai_sem(ID semid) throw();
246 extern ER               pol_sem(ID semid) throw();
247 extern ER               twai_sem(ID semid, TMO tmout) throw();
248 extern ER               ini_sem(ID semid) throw();
249 extern ER               ref_sem(ID semid, T_RSEM *pk_rsem) throw();
250
251 extern ER               set_flg(ID flgid, FLGPTN setptn) throw();
252 extern ER               iset_flg(ID flgid, FLGPTN setptn) throw();
253 extern ER               clr_flg(ID flgid, FLGPTN clrptn) throw();
254 extern ER               wai_flg(ID flgid, FLGPTN waiptn,
255                                                 MODE wfmode, FLGPTN *p_flgptn) throw();
256 extern ER               pol_flg(ID flgid, FLGPTN waiptn,
257                                                 MODE wfmode, FLGPTN *p_flgptn) throw();
258 extern ER               twai_flg(ID flgid, FLGPTN waiptn,
259                                                 MODE wfmode, FLGPTN *p_flgptn, TMO tmout) throw();
260 extern ER               ini_flg(ID flgid) throw();
261 extern ER               ref_flg(ID flgid, T_RFLG *pk_rflg) throw();
262
263 extern ER               snd_dtq(ID dtqid, intptr_t data) throw();
264 extern ER               psnd_dtq(ID dtqid, intptr_t data) throw();
265 extern ER               ipsnd_dtq(ID dtqid, intptr_t data) throw();
266 extern ER               tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) throw();
267 extern ER               fsnd_dtq(ID dtqid, intptr_t data) throw();
268 extern ER               ifsnd_dtq(ID dtqid, intptr_t data) throw();
269 extern ER               rcv_dtq(ID dtqid, intptr_t *p_data) throw();
270 extern ER               prcv_dtq(ID dtqid, intptr_t *p_data) throw();
271 extern ER               trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) throw();
272 extern ER               ini_dtq(ID dtqid) throw();
273 extern ER               ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) throw();
274
275 extern ER               snd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
276 extern ER               psnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
277 extern ER               ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
278 extern ER               tsnd_pdq(ID pdqid, intptr_t data,
279                                                                                 PRI datapri, TMO tmout) throw();
280 extern ER               rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
281 extern ER               prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
282 extern ER               trcv_pdq(ID pdqid, intptr_t *p_data,
283                                                                                 PRI *p_datapri, TMO tmout) throw();
284 extern ER               ini_pdq(ID pdqid) throw();
285 extern ER               ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) throw();
286
287 extern ER               snd_mbx(ID mbxid, T_MSG *pk_msg) throw();
288 extern ER               rcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
289 extern ER               prcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
290 extern ER               trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) throw();
291 extern ER               ini_mbx(ID mbxid) throw();
292 extern ER               ref_mbx(ID mbxid, T_RMBX *pk_rmbx) throw();
293
294 extern ER               loc_mtx(ID mtxid) throw();
295 extern ER               ploc_mtx(ID mtxid) throw();
296 extern ER               tloc_mtx(ID mtxid, TMO tmout) throw();
297 extern ER               unl_mtx(ID mtxid) throw();
298 extern ER               ini_mtx(ID mtxid) throw();
299 extern ER               ref_mtx(ID mtxid, T_RMTX *pk_rmtx) throw();
300
301 /*
302  *  メモリプール管理機能
303  */
304 extern ER               get_mpf(ID mpfid, void **p_blk) throw();
305 extern ER               pget_mpf(ID mpfid, void **p_blk) throw();
306 extern ER               tget_mpf(ID mpfid, void **p_blk, TMO tmout) throw();
307 extern ER               rel_mpf(ID mpfid, void *blk) throw();
308 extern ER               ini_mpf(ID mpfid) throw();
309 extern ER               ref_mpf(ID mpfid, T_RMPF *pk_rmpf) throw();
310
311 /*
312  *  時間管理機能
313  */
314 extern ER               get_tim(SYSTIM *p_systim) throw();
315 extern ER               get_utm(SYSUTM *p_sysutm) throw();
316
317 extern ER               sta_cyc(ID cycid) throw();
318 extern ER               stp_cyc(ID cycid) throw();
319 extern ER               ref_cyc(ID cycid, T_RCYC *pk_rcyc) throw();
320
321 extern ER               sta_alm(ID almid, RELTIM almtim) throw();
322 extern ER               ista_alm(ID almid, RELTIM almtim) throw();
323 extern ER               stp_alm(ID almid) throw();
324 extern ER               istp_alm(ID almid) throw();
325 extern ER               ref_alm(ID almid, T_RALM *pk_ralm) throw();
326
327 /*
328  *  システム状態管理機能
329  */
330 extern ER               rot_rdq(PRI tskpri) throw();
331 extern ER               irot_rdq(PRI tskpri) throw();
332 extern ER               get_tid(ID *p_tskid) throw();
333 extern ER               iget_tid(ID *p_tskid) throw();
334 extern ER               loc_cpu(void) throw();
335 extern ER               iloc_cpu(void) throw();
336 extern ER               unl_cpu(void) throw();
337 extern ER               iunl_cpu(void) throw();
338 extern ER               dis_dsp(void) throw();
339 extern ER               ena_dsp(void) throw();
340 extern bool_t   sns_ctx(void) throw();
341 extern bool_t   sns_loc(void) throw();
342 extern bool_t   sns_dsp(void) throw();
343 extern bool_t   sns_dpn(void) throw();
344 extern bool_t   sns_ker(void) throw();
345 extern ER               ext_ker(void) throw();
346
347 /*
348  *  割込み管理機能
349  */
350 extern ER               dis_int(INTNO intno) throw();
351 extern ER               ena_int(INTNO intno) throw();
352 extern ER               chg_ipm(PRI intpri) throw();
353 extern ER               get_ipm(PRI *p_intpri) throw();
354
355 /*
356  *  CPU例外管理機能
357  */
358 extern bool_t   xsns_dpn(void *p_excinf) throw();
359 extern bool_t   xsns_xpn(void *p_excinf) throw();
360
361 #endif /* TOPPERS_MACRO_ONLY */
362
363 /*
364  *  オブジェクト属性の定義
365  */
366 #define TA_ACT                  UINT_C(0x02)    /* タスクを起動された状態で生成 */
367
368 #define TA_TPRI                 UINT_C(0x01)    /* タスクの待ち行列を優先度順に */
369 #define TA_MPRI                 UINT_C(0x02)    /* メッセージキューを優先度順に */
370
371 #define TA_WMUL                 UINT_C(0x02)    /* 複数の待ちタスク */
372 #define TA_CLR                  UINT_C(0x04)    /* イベントフラグのクリア指定 */
373
374 #define TA_CEILING              UINT_C(0x03)    /* 優先度上限プロトコル */
375
376 #define TA_STA                  UINT_C(0x02)    /* 周期ハンドラを動作状態で生成 */
377
378 #define TA_NONKERNEL    UINT_C(0x02)    /* カーネル管理外の割込み */
379
380 #define TA_ENAINT               UINT_C(0x01)    /* 割込み要求禁止フラグをクリア */
381 #define TA_EDGE                 UINT_C(0x02)    /* エッジトリガ */
382
383 /*
384  *  サービスコールの動作モードの定義
385  */
386 #define TWF_ORW                 UINT_C(0x01)    /* イベントフラグのOR待ち */
387 #define TWF_ANDW                UINT_C(0x02)    /* イベントフラグのAND待ち */
388
389 /*
390  *  オブジェクトの状態の定義
391  */
392 #define TTS_RUN                 UINT_C(0x01)    /* 実行状態 */
393 #define TTS_RDY                 UINT_C(0x02)    /* 実行可能状態 */
394 #define TTS_WAI                 UINT_C(0x04)    /* 待ち状態 */
395 #define TTS_SUS                 UINT_C(0x08)    /* 強制待ち状態 */
396 #define TTS_WAS                 UINT_C(0x0c)    /* 二重待ち状態 */
397 #define TTS_DMT                 UINT_C(0x10)    /* 休止状態 */
398
399 #define TTW_SLP                 UINT_C(0x0001)  /* 起床待ち */
400 #define TTW_DLY                 UINT_C(0x0002)  /* 時間経過待ち */
401 #define TTW_SEM                 UINT_C(0x0004)  /* セマフォの資源獲得待ち */
402 #define TTW_FLG                 UINT_C(0x0008)  /* イベントフラグ待ち */
403 #define TTW_SDTQ                UINT_C(0x0010)  /* データキューへの送信待ち */
404 #define TTW_RDTQ                UINT_C(0x0020)  /* データキューからの受信待ち */
405 #define TTW_SPDQ                UINT_C(0x0100)  /* 優先度データキューへの送信待ち */
406 #define TTW_RPDQ                UINT_C(0x0200)  /* 優先度データキューからの受信待ち */
407 #define TTW_MBX                 UINT_C(0x0040)  /* メールボックスからの受信待ち */
408 #define TTW_MPF                 UINT_C(0x2000)  /* 固定長メモリブロックの獲得待ち */
409
410 #define TTEX_ENA                UINT_C(0x01)    /* タスク例外処理許可状態 */
411 #define TTEX_DIS                UINT_C(0x02)    /* タスク例外処理禁止状態 */
412
413 #define TCYC_STP                UINT_C(0x01)    /* 周期ハンドラが動作していない */
414 #define TCYC_STA                UINT_C(0x02)    /* 周期ハンドラが動作している */
415
416 #define TALM_STP                UINT_C(0x01)    /* アラームハンドラが動作していない */
417 #define TALM_STA                UINT_C(0x02)    /* アラームハンドラが動作している */
418
419 /*
420  *  その他の定数の定義
421  */
422 #define TSK_SELF                0                       /* 自タスク指定 */
423 #define TSK_NONE                0                       /* 該当するタスクがない */
424
425 #define TPRI_SELF               0                       /* 自タスクのベース優先度 */
426 #define TPRI_INI                0                       /* タスクの起動時優先度 */
427
428 #define TIPM_ENAALL             0                       /* 割込み優先度マスク全解除 */
429
430 /*
431  *  構成定数とマクロ
432  */
433
434 /*
435  *  サポートする機能
436  */
437 #ifdef TOPPERS_TARGET_SUPPORT_DIS_INT
438 #define TOPPERS_SUPPORT_DIS_INT                 /* dis_intがサポートされている */
439 #endif /* TOPPERS_TARGET_SUPPORT_DIS_INT */
440
441 #ifdef TOPPERS_TARGET_SUPPORT_ENA_INT
442 #define TOPPERS_SUPPORT_ENA_INT                 /* ena_intがサポートされている */
443 #endif /* TOPPERS_TARGET_SUPPORT_ENA_INT */
444
445 #ifdef TOPPERS_TARGET_SUPPORT_GET_UTM
446 #define TOPPERS_SUPPORT_GET_UTM                 /* get_utmがサポートされている */
447 #endif /* TOPPERS_TARGET_SUPPORT_GET_UTM */
448
449 #define TOPPERS_SUPPORT_MUTEX                   /* ミューテックス機能拡張 */
450
451 /*
452  *  優先度の範囲
453  */
454 #define TMIN_TPRI               1                       /* タスク優先度の最小値(最高値)*/
455 #define TMAX_TPRI               16                      /* タスク優先度の最大値(最低値)*/
456 #define TMIN_DPRI               1                       /* データ優先度の最小値(最高値)*/
457 #define TMAX_DPRI               16                      /* データ優先度の最大値(最低値)*/
458 #define TMIN_MPRI               1                       /* メッセージ優先度の最小値(最高値)*/
459 #define TMAX_MPRI               16                      /* メッセージ優先度の最大値(最低値)*/
460 #define TMIN_ISRPRI             1                       /* 割込みサービスルーチン優先度の最小値 */
461 #define TMAX_ISRPRI             16                      /* 割込みサービスルーチン優先度の最大値 */
462
463 /*
464  *  バージョン情報
465  */
466 #define TKERNEL_MAKER   UINT_C(0x0118)  /* カーネルのメーカーコード */
467 #define TKERNEL_PRID    UINT_C(0x0007)  /* カーネルの識別番号 */
468 #define TKERNEL_SPVER   UINT_C(0xf512)  /* カーネル仕様のバージョン番号 */
469 #define TKERNEL_PRVER   UINT_C(0x1060)  /* カーネルのバージョン番号 */
470
471 /*
472  *  キューイング回数の最大値
473  */
474 #define TMAX_ACTCNT             UINT_C(1)               /* 起動要求キューイング数の最大値 */
475 #define TMAX_WUPCNT             UINT_C(1)               /* 起床要求キューイング数の最大値 */
476
477 /*
478  *  ビットパターンのビット数
479  */
480 #ifndef TBIT_TEXPTN                                     /* タスク例外要因のビット数 */
481 #define TBIT_TEXPTN             (sizeof(TEXPTN) * CHAR_BIT)
482 #endif /* TBIT_TEXPTN */
483
484 #ifndef TBIT_FLGPTN                                     /* イベントフラグのビット数 */
485 #define TBIT_FLGPTN             (sizeof(FLGPTN) * CHAR_BIT)
486 #endif /* TBIT_FLGPTN */
487
488 /*
489  *  メモリ領域確保のためのマクロ
490  *
491  *  以下のTOPPERS_COUNT_SZとTOPPERS_ROUND_SZの定義は,unitが2の巾乗であ
492  *  ることを仮定している.
493  */
494 #ifndef TOPPERS_COUNT_SZ
495 #define TOPPERS_COUNT_SZ(sz, unit)      (((sz) + (unit) - 1) / (unit))
496 #endif /* TOPPERS_COUNT_SZ */
497 #ifndef TOPPERS_ROUND_SZ
498 #define TOPPERS_ROUND_SZ(sz, unit)      (((sz) + (unit) - 1) & ~((unit) - 1))
499 #endif /* TOPPERS_ROUND_SZ */
500
501 #define COUNT_STK_T(sz)         TOPPERS_COUNT_SZ(sz, sizeof(STK_T))
502 #define ROUND_STK_T(sz)         TOPPERS_ROUND_SZ(sz, sizeof(STK_T))
503
504 #define COUNT_MPF_T(blksz)      TOPPERS_COUNT_SZ(blksz, sizeof(MPF_T))
505 #define ROUND_MPF_T(blksz)      TOPPERS_ROUND_SZ(blksz, sizeof(MPF_T))
506
507 /*
508  *  その他の構成定数
509  */
510 #define TMAX_MAXSEM             UINT_MAX        /* セマフォの最大資源数の最大値 */
511
512 #ifdef __cplusplus
513 }
514 #endif
515
516 #endif /* TOPPERS_KERNEL_H */