2 * Hyper Operating System V4 Advance
5 * @brief %en{system heder file}%jp{システム制御のヘッダファイル}
7 * Copyright (C) 1998-2009 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #ifndef _KERNEL__core_sys_h__
14 #define _KERNEL__core_sys_h__
25 #define _KERNEL_TSS_TSK 0x00 /**< %jp{タスク部実行中} */
26 #define _KERNEL_TSS_LOC 0x01 /**< %jp{割込み禁止(loc_cpu 有効)} */
27 #define _KERNEL_TSS_DSP 0x02 /**< %jp{ディスパッチ禁止 (dis_dsp 有効)} */
28 #define _KERNEL_TSS_CTX 0x04 /**< %jp{タスク独立部実行中} */
29 #define _KERNEL_TSS_SYS 0x08 /**< %jp{システムモード} */
32 /** %jp{プロセッサ制御情報}%en{Processor control block} */
33 typedef struct _kernel_t_proccb
35 STAT stat; /**< %jp{システムのコンテキスト状態}%en{system state} */
36 UB dlydsp; /**< %jp{ディスパッチのディレイ管理} */
39 UB svcent; /**< %jp{サービスコール実行中管理} */
42 _KERNEL_T_TSKHDL tskhdl_run; /**< %jp{実行中タスク} */
43 _KERNEL_T_CTXCB sysctxcb; /**< %jp{システムコンテキスト(アイドル実行等)のコンテキスト} */
44 SIZE sysstksz; /**< %jp{システムコンテキストのスタックサイズ} */
45 VP sysstk; /**< %jp{システムコンテキストのスタック} */
46 SIZE intstksz; /**< %jp{割込みコンテキストのスタックサイズ} */
47 VP intstk; /**< %jp{割込みコンテキストのスタック} */
51 /** %jp{システム制御情報}%en{system control block} */
52 typedef struct _kernel_t_syscb
54 _KERNEL_T_RDQCB rdqcb; /**< %jp{レディーキュー}%en{ready-queue} */
56 _KERNEL_T_TIMCB timcb;
59 _KERNEL_T_TOQCB toqcb; /**< %jp{タイムアウトキュー}%en{timeout-queue} */
63 _KERNEL_T_TMQCB tmqcb; /**< %jp{タイマキュー}%en{timer-queue} */
67 _KERNEL_T_HEPCB hepcb; /**< %jp{カーネルメモリヒープ}%en{kernel heap-memory control block} */
71 _KERNEL_T_DPCCB dpccb; /**< %jp{遅延プロシージャコール用メッセージキュー} */
74 _KERNEL_T_PROCCB proccb[1]; /**< %jp{プロセッサ制御情報}%en{processor control block} */
78 /** %jp{システム制御情報(リードオンリー)}%en{system control block(read only)} */
79 typedef struct _kernel_t_syscb_ro
81 _KERNEL_T_TIMCB_RO timcb_ro;
85 /** %jp{システム制御情報}%en{system control block} */
86 extern _KERNEL_T_SYSCB _kernel_syscb;
87 extern const _KERNEL_T_SYSCB_RO _kernel_syscb_ro;
90 #define _KERNEL_SYS_INI_SYS() do {} while (0) /**< %jp{システムの初期化} */
91 #define _KERNEL_SYS_GET_PRC() (0) /**< %jp{プロセッサ番号取得} */
92 #define _KERNEL_SYS_GET_PRCCB() (&_kernel_syscb.proccb[_KERNEL_SYS_GET_PRC()]) /**< %jp{プロセッサ制御ブロックの取得} */
95 #define _KERNEL_SYS_GET_RDQ() (&_kernel_syscb.rdqcb) /**< %jp{レディーキューの取得} */
96 #define _KERNEL_SYS_CRE_RDQ() _KERNEL_CRE_RDQ(_KERNEL_SYS_GET_RDQ()) /**< %en{create ready-queue}%jp{レディーキューの生成} */
97 #define _KERNEL_SYS_DEL_RDQ() _KERNEL_DEL_RDQ(_KERNEL_SYS_GET_RDQ()) /**< %en{delete ready-queue}%jp{レディーキューの削除} */
98 #define _KERNEL_SYS_ADD_RDQ(tskhdl) _KERNEL_ADD_RDQ(_KERNEL_SYS_GET_RDQ(), (tskhdl)) /**< %jp{タスクをレディーキューに追加} */
99 #define _KERNEL_SYS_RMV_RDQ(tskhdl) _KERNEL_RMV_RDQ(_KERNEL_SYS_GET_RDQ(), (tskhdl)) /**< %jp{タスクをレディーから取り外し} */
100 #define _KERNEL_SYS_RMH_RDQ() _KERNEL_RMH_RDQ(_KERNEL_SYS_GET_RDQ()) /**< %jp{キューの先頭タスクの取り外し} */
101 #define _KERNEL_SYS_REF_RDQ() _KERNEL_REF_RDQ(_KERNEL_SYS_GET_RDQ()) /**< %jp{キューの先頭タスクの参照} */
102 #define _KERNEL_SYS_ROT_RDQ(tskpri) _KERNEL_ROT_RDQ(_KERNEL_SYS_GET_RDQ(), (tskpri)) /**< %jp{レディーキューの回転} */
105 #define _KERNEL_SYS_GET_TIMCB() (&_kernel_syscb.timcb)
106 #define _KERNEL_SYS_GET_TIMCB_RO() (&_kernel_syscb_ro.timcb_ro)
107 #define _KERNEL_SYS_INI_TIM() _KERNEL_INI_TIM(_KERNEL_SYS_GET_TIMCB(), _KERNEL_SYS_GET_TIMCB_RO())
108 #define _KERNEL_SYS_SIG_TIM() _KERNEL_SIG_TIM(_KERNEL_SYS_GET_TIMCB(), _KERNEL_SYS_GET_TIMCB_RO())
109 #define _KERNEL_SYS_GET_TIC() _KERNEL_GET_TIC(_KERNEL_SYS_GET_TIMCB(), _KERNEL_SYS_GET_TIMCB_RO())
110 #define _KERNEL_SYS_SET_TIM(p_tim) _KERNEL_SET_TIM(_KERNEL_SYS_GET_TIMCB(), (p_tim))
111 #define _KERNEL_SYS_GET_TIM() _KERNEL_GET_TIM(_KERNEL_SYS_GET_TIMCB())
114 #define _KERNEL_SYS_GET_TOQCB() (&_kernel_syscb.toqcb) /**< %jp{タイムアウトキューの取得} */
115 #define _KERNEL_SYS_ADD_TOQ(tskhdl, tmout) _KERNEL_ADD_TOQ(_KERNEL_SYS_GET_TOQCB(), (tskhdl), (tmout))
116 #define _KERNEL_SYS_RMV_TOQ(tskhd) _KERNEL_RMV_TOQ(_KERNEL_SYS_GET_TOQCB(), (tskhd))
117 #define _KERNEL_SYS_SIG_TOQ(tictim) _KERNEL_SIG_TOQ(_KERNEL_SYS_GET_TOQCB(), (tictim))
120 #define _KERNEL_SYS_GET_TMQ() (&_kernel_syscb.tmqcb) /**< %jp{タイマキューの取得} */
121 #define _KERNEL_SYS_ADD_TMQ(pk_timobj) _KERNEL_ADD_TMQ(_KERNEL_SYS_GET_TMQ(), (pk_timobj))
122 #define _KERNEL_SYS_RMV_TMQ(pk_timobj) _KERNEL_RMV_TMQ(_KERNEL_SYS_GET_TMQ(), (pk_timobj))
123 #define _KERNEL_SYS_BSY_TMQ(pk_timobj) _KERNEL_BSY_TMQ(_KERNEL_SYS_GET_TMQ(), (pk_timobj))
124 #define _KERNEL_SYS_SIG_TMQ(tictim) _KERNEL_SIG_TMQ(_KERNEL_SYS_GET_TMQ(), (tictim))
126 /* kernel memory heap */
127 #define _KERNEL_SYS_GET_HEP() (&_kernel_syscb.hepcb) /**< %jp{タイマキューの取得} */
128 #define _KERNEL_SYS_INI_HEP(hepsz, hep) _KERNEL_CRE_HEP(_KERNEL_SYS_GET_HEP(), (hepsz), (hep)) /**< %jp{カーネルメモリヒープの初期化} */
129 #define _KERNEL_SYS_ALC_HEP(size) _KERNEL_ALC_HEP(_KERNEL_SYS_GET_HEP(), (size)) /**< %jp{カーネルメモリの割当て} */
130 #define _KERNEL_SYS_FRE_HEP(ptr) _KERNEL_FRE_HEP(_KERNEL_SYS_GET_HEP(), (ptr)) /**< %jp{カーネルメモリの開放} */
131 #define _KERNEL_SYS_ALG_HEP(size) _KERNEL_ALG_HEP(_KERNEL_SYS_GET_HEP(), (size)) /**< %jp{カーネルメモリのサイズアライメント} */
133 /* kernel dpc queue */
135 #define _KERNEL_SYS_GET_DPC() (&_kernel_syscb.dpccb) /**< %jp{DPCキューの取得} */
136 #define _KERNEL_SYS_INI_DPC(que, quecnt) _KERNEL_INI_DPC(_KERNEL_SYS_GET_DPC(), (que), (quecnt)) /**< %jp{DPCキューの初期化} */
137 #define _KERNEL_SYS_REQ_DPC(svc, id, param) _KERNEL_REQ_DPC(_KERNEL_SYS_GET_DPC(), (svc), (id), (param)) /**< %jp{DPCキューへ実行リクエスト} */
138 #define _KERNEL_SYS_EXE_DPC() _KERNEL_EXE_DPC(_KERNEL_SYS_GET_DPC()) /**< %jp{DPCキューの実行} */
140 #define _KERNEL_SYS_GET_DPC() NULL /**< %jp{DPCキューの取得} */
141 #define _KERNEL_SYS_INI_DPC(que, quecnt) do {} while (0) /**< %jp{DPCキューの初期化} */
142 #define _KERNEL_SYS_REQ_DPC(svc, id, param) E_NOMEM /**< %jp{DPCキューへ実行リクエスト} */
143 #define _KERNEL_SYS_EXE_DPC() do {} while (0) /**< %jp{DPCキューの実行} */
148 #define _KERNEL_SYS_INI_SYSSTK(stksz, stk) do { _KERNEL_SYS_GET_PRCCB()->sysstksz = (stksz); _KERNEL_SYS_GET_PRCCB()->sysstk = (stk); } while(0)
149 /**< %jp{システムスタックの初期化} */
150 #define _KERNEL_SYS_INI_INTSTK(stksz, stk) _KERNEL_INI_INT((stksz), (stk)) /**< %jp{割込みスタックの初期化} */
152 #define _KERNEL_SYS_GET_STST() (_KERNEL_SYS_GET_PRCCB()->stat) /**< %jp{カレントプロセッサ状態の取得} */
153 #define _KERNEL_SYS_SET_STST(x) do { _KERNEL_SYS_GET_PRCCB()->stat = (x); } while (0) /**< %jp{カレントプロセッサ状態の設定} */
154 #define _KERNEL_SYS_GET_RUNTSK() (_KERNEL_SYS_GET_PRCCB()->tskhdl_run) /**< %jp{カレントプロセッサの実行中タスク取得} */
155 #define _KERNEL_SYS_SET_RUNTSK(x) do { _KERNEL_SYS_GET_PRCCB()->tskhdl_run = (x); } while (0) /**< %jp{カレントプロセッサの実行中タスク設定} */
156 #define _KERNEL_SYS_GET_SYSCTXCB() (&_KERNEL_SYS_GET_PRCCB()->sysctxcb) /**< %jp{カレントプロセッサのシステムコンテキスト取得} */
157 #define _KERNEL_SYS_GET_SYSSTKSZ() (_KERNEL_SYS_GET_PRCCB()->sysstksz) /**< %jp{カレントプロセッサのシステムコンテキストの初期スタックサイズ取得} */
158 #define _KERNEL_SYS_GET_SYSSTK() (_KERNEL_SYS_GET_PRCCB()->sysstk) /**< %jp{カレントプロセッサのシステムコンテキストの初期スタックアドレス取得} */
159 #define _KERNEL_SYS_GET_SYSISP() ((VP)((UB *)_KERNEL_SYS_GET_SYSSTK() + _KERNEL_SYS_GET_SYSSTKSZ())) /**< %jp{カレントプロセッサのシステムコンテキストの初期スタックポインタ取得} */
162 #define _KERNEL_SYS_SET_CTX() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_CTX; } while (0) /**< %jp{非タスクコンテキストに設定} */
163 #define _KERNEL_SYS_CLR_CTX() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_CTX; } while (0) /**< %jp{非タスクコンテキストを解除} */
164 #define _KERNEL_SYS_SNS_CTX() ((_KERNEL_SYS_GET_PRCCB()->stat & _KERNEL_TSS_CTX) ? TRUE : FALSE) /**< %jp{コンテキスト状態を参照} */
166 #define _KERNEL_SYS_SET_LOC() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_LOC; } while (0) /**< %jp{ロック状態を設定} */
167 #define _KERNEL_SYS_CLR_LOC() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_LOC; } while (0) /**< %jp{ロック状態を解除} */
168 #define _KERNEL_SYS_SNS_LOC() ((_KERNEL_SYS_GET_STST() & _KERNEL_TSS_LOC) ? TRUE : FALSE) /**< %jp{ロック状態を参照} */
170 #define _KERNEL_SYS_SET_DSP() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_DSP; } while (0) /**< %jp{ディスパッチ禁止状態を設定} */
171 #define _KERNEL_SYS_CLR_DSP() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_DSP; } while (0) /**< %jp{ディスパッチ禁止状態を解除} */
172 #define _KERNEL_SYS_SNS_DSP() ((_KERNEL_SYS_GET_PRCCB()->stat & _KERNEL_TSS_DSP) ? TRUE : FALSE) /**< %jp{ディスパッチ禁止状態を参照} */
174 #define _KERNEL_SYS_SET_SYS() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_SYS; } while (0) /**< %jp{システム状態を設定} */
175 #define _KERNEL_SYS_CLR_SYS() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_SYS; } while (0) /**< %jp{システム状態を解除} */
176 #define _KERNEL_SYS_SNS_SYS() ((_KERNEL_SYS_GET_PRCCB()->stat & _KERNEL_TSS_SYS) ? TRUE : FALSE) /**< %jp{システム状態を参照} */
178 #define _KERNEL_SYS_SET_DLY() do { _KERNEL_SYS_GET_PRCCB()->dlydsp = TRUE;} while (0) /**< %jp{ディスパッチ遅延中を設定} */
179 #define _KERNEL_SYS_CLR_DLY() do { _KERNEL_SYS_GET_PRCCB()->dlydsp = FALSE;} while (0) /**< %jp{ディスパッチ遅延中を解除} */
180 #define _KERNEL_SYS_SNS_DLY() (_KERNEL_SYS_GET_PRCCB()->dlydsp) /**< %jp{ディスパッチ遅延中を参照} */
182 #define _KERNEL_SYS_SNS_DPN() ((_KERNEL_SYS_GET_PRCCB()->stat != _KERNEL_TSS_TSK) ? TRUE : FALSE) /**< %jp{ディスパッチ不能を参照} */
186 #if _KERNEL_SPT_DPC /* %jp{遅延プロシージャコールの場合} */
188 #define _KERNEL_SYS_SET_SVC() do { _KERNEL_SYS_GET_PRCCB()->svcent = TRUE; } while (0)
189 #define _KERNEL_SYS_CLR_SVC() do { _KERNEL_SYS_GET_PRCCB()->svcent = FALSE; } while (0)
190 #define _KERNEL_SYS_SNS_SVC() (_KERNEL_SYS_GET_PRCCB()->svcent)
192 #define _KERNEL_ENTER_SVC() do { _KERNEL_SYS_SET_SVC(); } while (0)
193 #define _KERNEL_LEAVE_SVC() do { _KERNEL_SYS_EXE_DPC(); } while (0)
195 #define _KERNEL_SYS_LOC_DPC() do { _KERNEL_DIS_INT(); } while (0)
196 #define _KERNEL_SYS_UNL_DPC() do { if (!(_KERNEL_SYS_GET_STST() & _KERNEL_TSS_LOC)){ _KERNEL_ENA_INT(); } } while (0)
197 #define _KERNEL_SYS_SND_DPC(msg) _KERNEL_DPC_SND_MSG(&_kernel_syscb.dpccb, (msg))
198 #define _KERNEL_SYS_RCV_DPC() _KERNEL_DPC_RCV_MSG(&_kernel_syscb.dpccb)
199 #define _KERNEL_SYS_RDT_DPC() _KERNEL_DPC_REF_DAT(&_kernel_syscb.dpccb)
200 #define _KERNEL_SYS_RFR_DPC() _KERNEL_DPC_REF_FRE(&_kernel_syscb.dpccb)
202 #else /* %jp{バズロック型の場合} */
204 #define _KERNEL_ENTER_SVC() do { _KERNEL_DIS_INT(); } while (0)
205 #define _KERNEL_LEAVE_SVC() do { if (!(_KERNEL_SYS_GET_STST() & (_KERNEL_TSS_LOC | _KERNEL_TSS_SYS))){ _KERNEL_ENA_INT(); } } while (0)
214 void _kernel_cfg_ini(void);
215 void _kernel_cfg_sta(void);
216 void _kernel_idl_lop(void); /**< %jp{アイドルループ}%en{idle loop} */
223 #endif /* _KERNEL__core_sys_h__ */