OSDN Git Service

754cc2713e8c4b927d4917d3af474f1a58881e02
[hos/hos-v4a.git] / kernel / include / core / sys.h
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  sys.h
5  * @brief %en{system heder file}%jp{システム制御のヘッダファイル}
6  *
7  * Copyright (C) 1998-2009 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #ifndef _KERNEL__core_sys_h__
14 #define _KERNEL__core_sys_h__
15
16
17 #include "core/hep.h"
18 #include "core/tim.h"
19 #include "core/toq.h"
20 #include "core/tmq.h"
21 #include "core/dpc.h"
22
23
24 /* %jp{システムの状態} */
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{システムモード} */
30
31
32 /** %jp{プロセッサ制御情報}%en{Processor control block} */
33 typedef struct _kernel_t_proccb
34 {
35         STAT                            stat;                           /**< %jp{システムのコンテキスト状態}%en{system state} */
36         UB                  dlydsp;                             /**< %jp{ディスパッチのディレイ管理} */
37
38 #if _KERNEL_SPT_DPC
39         UB                  svcent;                             /**< %jp{サービスコール実行中管理} */
40 #endif
41
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{割り込みコンテキストのスタック} */
48 } _KERNEL_T_PROCCB;
49
50
51 /** %jp{システム制御情報}%en{system control block} */
52 typedef struct _kernel_t_syscb
53 {
54         _KERNEL_T_RDQCB         rdqcb;                          /**< %jp{レディーキュー}%en{ready-queue} */
55
56         _KERNEL_T_TIMCB         timcb;                          
57
58 #if _KERNEL_SPT_TOQ
59         _KERNEL_T_TOQCB         toqcb;                          /**< %jp{タイムアウトキュー}%en{timeout-queue} */
60 #endif
61
62 #if _KERNEL_SPT_TMQ
63         _KERNEL_T_TMQCB         tmqcb;                          /**< %jp{タイマキュー}%en{timer-queue} */
64 #endif
65
66 #if _KERNEL_SPT_HEP
67         _KERNEL_T_HEPCB         hepcb;                          /**< %jp{カーネルメモリヒープ}%en{kernel heap-memory control block} */
68 #endif
69
70 #if _KERNEL_SPT_DPC
71         _KERNEL_T_DPCCB         dpccb;                          /**< %jp{遅延プロシージャコール用メッセージキュー} */
72 #endif
73
74         _KERNEL_T_PROCCB        proccb[1];                      /**< %jp{プロセッサ制御情報}%en{processor control block} */
75 } _KERNEL_T_SYSCB;
76
77
78 /** %jp{システム制御情報(リードオンリー)}%en{system control block(read only)} */
79 typedef struct _kernel_t_syscb_ro
80 {
81         _KERNEL_T_TIMCB_RO timcb_ro;
82 } _KERNEL_T_SYSCB_RO;
83
84
85 /** %jp{システム制御情報}%en{system control block} */
86 extern       _KERNEL_T_SYSCB            _kernel_syscb;
87 extern const _KERNEL_T_SYSCB_RO         _kernel_syscb_ro;
88
89 /* system */
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{プロセッサ制御ブロックの取得} */
93
94 /* ready queue */
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{レディーキューの回転} */
103
104 /* time */
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())                        
112
113 /* timeout queue */
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))                                      
118
119 /* timer queue */
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))
125
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{カーネルメモリのサイズアライメント} */
132
133 /* kernel dpc queue */
134 #if _KERNEL_SPT_DPC
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キューの実行} */
139 #else
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キューの実行} */
144 #endif
145
146
147
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{割込みスタックの初期化} */
151
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{カレントプロセッサのシステムコンテキストの初期スタックポインタ取得} */
160
161
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{コンテキスト状態を参照} */
165
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{ロック状態を参照} */
169
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{ディスパッチ禁止状態を参照} */
173
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{システム状態を参照} */
177
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{ディスパッチ遅延中を参照} */
181
182 #define _KERNEL_SYS_SNS_DPN()                           ((_KERNEL_SYS_GET_PRCCB()->stat != _KERNEL_TSS_TSK) ? TRUE : FALSE)     /**< %jp{ディスパッチ不能を参照} */
183
184
185
186 #if _KERNEL_SPT_DPC             /* %jp{遅延プロシージャコールの場合} */
187
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)
191
192 #define _KERNEL_ENTER_SVC()                                     do { _KERNEL_SYS_SET_SVC(); } while (0)
193 #define _KERNEL_LEAVE_SVC()                                     do { _KERNEL_SYS_EXE_DPC(); } while (0)
194
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)
201
202 #else                                   /* %jp{バズロック型の場合} */
203
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)
206
207 #endif
208
209
210 #ifdef __cplusplus
211 extern "C" {
212 #endif
213
214 void _kernel_cfg_ini(void);
215 void _kernel_cfg_sta(void);
216 void _kernel_idl_lop(void);                             /**< %jp{アイドルループ}%en{idle loop} */
217
218 #ifdef __cplusplus
219 }
220 #endif
221
222
223 #endif  /* _KERNEL__core_sys_h__ */
224
225
226
227
228 /* end of file */