source: mypx/extension/messagebuf/test/bit_kernel.c @ 7

このファイルの 7 以降における最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 11.5 KB
 
1/*
2 *  TOPPERS/ASP Kernel
3 *      Toyohashi Open Platform for Embedded Real-Time Systems/
4 *      Advanced Standard Profile Kernel
5 *
6 *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
7 *              Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
10 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
11 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
12 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
13 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
14 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
15 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
16 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
17 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
18 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
19 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
20 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
21 *      €È¡¥
22 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
23 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
24 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
25 *        Êó¹ð€¹€ë€³€È¡¥
26 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
27 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
28 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
29 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
30 *      ÌÈÀÕ€¹€ë€³€È¡¥
31 *
32 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
33 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
34 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
35 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
36 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
37 *
38 *  @(#) $Id$
39 */
40
41/*
42 *              ¥«¡Œ¥Í¥ë€ÎÀ°¹çÀ­ž¡ºº
43 */
44
45#include "kernel/kernel_impl.h"
46#include "kernel/task.h"
47#include "kernel/wait.h"
48#include "kernel/semaphore.h"
49#include "kernel/eventflag.h"
50#include "kernel/dataqueue.h"
51#include "kernel/pridataq.h"
52#include "kernel/mailbox.h"
53#include "kernel/messagebuf.h"
54#include "kernel/mempfix.h"
55#include "kernel/time_event.h"
56
57/*
58 *   ¥š¥é¡Œ¥³¡Œ¥É€ÎÄêµÁ
59 */
60#define E_SYS_LINENO    ERCD(E_SYS, -(__LINE__))
61
62/*
63 *  ŽÉÍý¥Ö¥í¥Ã¥¯€Î¥¢¥É¥ì¥¹€ÎÀµÅöÀ­€Î¥Á¥§¥Ã¥¯
64 */
65#define VALID_TCB(p_tcb) \
66                ((((char *) p_tcb) - ((char *) tcb_table)) % sizeof(TCB) == 0 \
67                        && TMIN_TSKID <= TSKID(p_tcb) && TSKID(p_tcb) <= tmax_tskid)
68
69#define VALID_SEMCB(p_semcb) \
70                ((((char *) p_semcb) - ((char *) semcb_table)) % sizeof(SEMCB) == 0 \
71                        && TMIN_SEMID <= SEMID(p_semcb) && SEMID(p_semcb) <= tmax_semid)
72                               
73#define VALID_FLGCB(p_flgcb) \
74                ((((char *) p_flgcb) - ((char *) flgcb_table)) % sizeof(FLGCB) == 0 \
75                        && TMIN_FLGID <= FLGID(p_flgcb) && FLGID(p_flgcb) <= tmax_flgid)
76
77#define VALID_DTQCB(p_dtqcb) \
78                ((((char *) p_dtqcb) - ((char *) dtqcb_table)) % sizeof(DTQCB) == 0 \
79                        && TMIN_DTQID <= DTQID(p_dtqcb) && DTQID(p_dtqcb) <= tmax_dtqid)
80
81#define VALID_PDQCB(p_pdqcb) \
82                ((((char *) p_pdqcb) - ((char *) pdqcb_table)) % sizeof(PDQCB) == 0 \
83                        && TMIN_PDQID <= PDQID(p_pdqcb) && PDQID(p_pdqcb) <= tmax_pdqid)
84
85#define VALID_MBXCB(p_mbxcb) \
86                ((((char *) p_mbxcb) - ((char *) mbxcb_table)) % sizeof(MBXCB) == 0 \
87                        && TMIN_MBXID <= MBXID(p_mbxcb) && MBXID(p_mbxcb) <= tmax_mbxid)
88
89#define VALID_MBFCB(p_mbfcb) \
90                ((((char *) p_mbfcb) - ((char *) mbfcb_table)) % sizeof(MBFCB) == 0 \
91                        && TMIN_MBFID <= MBFID(p_mbfcb) && MBFID(p_mbfcb) <= tmax_mbfid)
92
93#define VALID_MPFCB(p_mpfcb) \
94                ((((char *) p_mpfcb) - ((char *) mpfcb_table)) % sizeof(MPFCB) == 0 \
95                        && TMIN_MPFID <= MPFID(p_mpfcb) && MPFID(p_mpfcb) <= tmax_mpfid)
96
97/*
98 *  ¥­¥å¡Œ€Î¥Á¥§¥Ã¥¯€Î€¿€á€ÎŽØ¿ô
99 *
100 *  p_queue€Ëp_entry€¬ŽÞ€Þ€ì€Æ€€€ë€«€òÄŽ€Ù€ë¡¥ŽÞ€Þ€ì€Æ€€€ì€Ðtrue¡€ŽÞ€Þ
101 *  €ì€Æ€€€Ê€€Ÿì¹ç€Ë€Ïfalse€òÊÖ€¹¡¥¥À¥Ö¥ë¥ê¥ó¥¯€ÎÉÔÀ°¹ç€ÎŸì¹ç€Ë€â¡€
102 *  false€òÊÖ€¹¡¥
103 */
104static bool_t
105in_queue(QUEUE *p_queue, QUEUE *p_entry)
106{
107        QUEUE   *p_current, *p_next;
108
109        p_current = p_queue->p_next;
110        if (p_current->p_prev != p_queue) {
111                return(false);                                  /* ¥À¥Ö¥ë¥ê¥ó¥¯€ÎÉÔÀ°¹ç */
112        }
113        while (p_current != p_queue) {
114                if (p_current == p_entry) {
115                        return(true);                           /* p_entry€¬ŽÞ€Þ€ì€Æ€€€¿ */
116                }
117
118                /*
119                 *  ¥­¥å¡Œ€ÎŒ¡€ÎÍ×Áǀ˿ʀà
120                 */
121                p_next = p_current->p_next;
122                if (p_next->p_prev != p_current) {
123                        return(false);                           /* ¥À¥Ö¥ë¥ê¥ó¥¯€ÎÉÔÀ°¹ç */
124                }
125                p_current = p_next;
126        }
127        return(false);
128}
129
130/*
131 *  ¥¹¥¿¥Ã¥¯Ÿå€ò»Ø€·€Æ€€€ë€«€Îž¡ºº
132 */
133static bool_t
134on_stack(void *addr, const TINIB *p_tinib)
135{
136        if (p_tinib->stk <= addr
137                                && addr < (void *)((char *)(p_tinib->stk) + p_tinib->stksz)) {
138                return(true);
139        }
140        return(false);
141}
142
143/*
144 *  ¥¿¥¹¥¯Ëè€ÎÀ°¹çÀ­ž¡ºº
145 */
146static ER
147bit_task(ID tskid)
148{
149        TCB                     *p_tcb;
150        const TINIB     *p_tinib;
151        uint_t          tstat, tstat_wait, pri;
152        TMEVTB          *p_tmevtb;
153        SEMCB           *p_semcb;
154        FLGCB           *p_flgcb;
155        DTQCB           *p_dtqcb;
156        PDQCB           *p_pdqcb;
157        MBXCB           *p_mbxcb;
158        MBFCB           *p_mbfcb;
159        MPFCB           *p_mpfcb;
160
161        if (!(TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)) {
162                return(E_ID);
163        }
164        p_tcb = get_tcb(tskid);
165        p_tinib = p_tcb->p_tinib;
166        tstat = p_tcb->tstat;
167        tstat_wait = (tstat & TS_WAIT_MASK);
168        pri = p_tcb->priority;
169
170        /*
171         *  œéŽü²œ¥Ö¥í¥Ã¥¯€Ø€Î¥Ý¥€¥ó¥¿€Îž¡ºº
172         */
173        if (p_tinib != &(tinib_table[INDEX_TSK(tskid)])) {
174                return(E_SYS_LINENO);
175        }
176
177        /*
178         *  tstat€Îž¡ºº
179         */
180        switch (tstat & (TS_RUNNABLE | TS_WAITING | TS_SUSPENDED)) {
181        case TS_DORMANT:
182                if (tstat != TS_DORMANT) {
183                        return(E_SYS_LINENO);
184                }
185                break;
186        case TS_RUNNABLE:
187                if (tstat != TS_RUNNABLE) {
188                        return(E_SYS_LINENO);
189                }
190                break;
191        case TS_WAITING:
192        case (TS_WAITING | TS_SUSPENDED):
193                if (!(TS_WAIT_DLY <= tstat_wait && tstat_wait <= TS_WAIT_MPF)) {
194                        return(E_SYS_LINENO);
195                }
196                if ((tstat & ~(TS_WAIT_MASK | TS_RUNNABLE | TS_WAITING | TS_SUSPENDED))
197                                                                                                                                        != 0U) {
198                        return(E_SYS_LINENO);
199                }
200                break;
201        case TS_SUSPENDED:
202                if (tstat != TS_SUSPENDED) {
203                        return(E_SYS_LINENO);
204                }
205                break;
206        default:
207                return(E_SYS_LINENO);
208        }
209
210        /*
211         *  actque€Îž¡ºº
212         */
213        if (TSTAT_DORMANT(tstat) && p_tcb->actque) {
214                return(E_SYS_LINENO);
215        }
216
217        /*
218         *  ¥¿¥¹¥¯Í¥ÀèÅـΞ¡ºº
219         */
220        if (pri >= TNUM_TPRI) {
221                return(E_SYS_LINENO);
222        }
223
224        /*
225         *  texptn€Îž¡ºº
226         */
227        if (p_tcb->p_tinib->texrtn == NULL && p_tcb->texptn != 0U) {
228                return(E_SYS_LINENO);
229        }
230
231        /*
232         *  µÙ»ßŸõÂրˀª€±€ë¥Á¥§¥Ã¥¯
233         */
234        if (TSTAT_DORMANT(tstat)) {
235                if (!(pri == p_tinib->ipriority)
236                                        && (p_tcb->wupque == false)
237                                        && (p_tcb->enatex == false)
238                                        && (p_tcb->texptn == 0U)) {
239                        return(E_SYS_LINENO);
240                }
241        }
242
243        /*
244         *  ŒÂ¹Ô€Ç€­€ëŸõÂրˀª€±€ë¥Á¥§¥Ã¥¯
245         */
246        if (TSTAT_RUNNABLE(tstat)) {
247                if (!in_queue(&ready_queue[pri], &(p_tcb->task_queue))) {
248                        return(E_SYS_LINENO);
249                }
250        }
251
252        /*
253         *  ÂÔ€ÁŸõÂրˀª€±€ë¥Á¥§¥Ã¥¯
254         */
255        if (TSTAT_WAITING(tstat)) {
256                if (!on_stack(p_tcb->p_winfo, p_tinib)) {
257                        return(E_SYS_LINENO);
258                }
259                p_tmevtb = p_tcb->p_winfo->p_tmevtb;
260                if (p_tmevtb != NULL) {
261                        if (!on_stack(p_tmevtb, p_tinib)) {
262                                return(E_SYS_LINENO);
263                        }
264                        /*
265                         *  (*p_tmevtb)€Îž¡ºº¡ÊÌ€Ž°À®¡Ë
266                         */
267                }
268
269                switch (tstat & TS_WAIT_MASK) {
270                        case TS_WAIT_SLP:
271                                if (p_tcb->wupque == true) {
272                                        return(E_SYS_LINENO);
273                                }
274                                break;
275
276                        case TS_WAIT_DLY:
277                                if (p_tmevtb == NULL) {
278                                        return(E_SYS_LINENO);
279                                }
280                                break;
281
282                        case TS_WAIT_SEM:
283                                p_semcb = ((WINFO_SEM *)(p_tcb->p_winfo))->p_semcb;
284                                if (!VALID_SEMCB(p_semcb)) {
285                                        return(E_SYS_LINENO);
286                                }
287                                if (!in_queue(&(p_semcb->wait_queue), &(p_tcb->task_queue))) {
288                                        return(E_SYS_LINENO);
289                                }
290                                break;
291
292                        case TS_WAIT_FLG:
293                                p_flgcb = ((WINFO_FLG *)(p_tcb->p_winfo))->p_flgcb;
294                                if (!VALID_FLGCB(p_flgcb)) {
295                                        return(E_SYS_LINENO);
296                                }
297                                if (!in_queue(&(p_flgcb->wait_queue), &(p_tcb->task_queue))) {
298                                        return(E_SYS_LINENO);
299                                }
300                                break;
301
302                        case TS_WAIT_SDTQ:
303                                p_dtqcb = ((WINFO_DTQ *)(p_tcb->p_winfo))->p_dtqcb;
304                                if (!VALID_DTQCB(p_dtqcb)) {
305                                        return(E_SYS_LINENO);
306                                }
307                                if (!in_queue(&(p_dtqcb->swait_queue), &(p_tcb->task_queue))) {
308                                        return(E_SYS_LINENO);
309                                }
310                                break;
311
312                        case TS_WAIT_RDTQ:
313                                p_dtqcb = ((WINFO_DTQ *)(p_tcb->p_winfo))->p_dtqcb;
314                                if (!VALID_DTQCB(p_dtqcb)) {
315                                        return(E_SYS_LINENO);
316                                }
317                                if (!in_queue(&(p_dtqcb->rwait_queue), &(p_tcb->task_queue))) {
318                                        return(E_SYS_LINENO);
319                                }
320                                break;
321
322                        case TS_WAIT_SPDQ:
323                                p_pdqcb = ((WINFO_PDQ *)(p_tcb->p_winfo))->p_pdqcb;
324                                if (!VALID_PDQCB(p_pdqcb)) {
325                                        return(E_SYS_LINENO);
326                                }
327                                if (!in_queue(&(p_pdqcb->swait_queue), &(p_tcb->task_queue))) {
328                                        return(E_SYS_LINENO);
329                                }
330                                break;
331
332                        case TS_WAIT_RPDQ:
333                                p_pdqcb = ((WINFO_PDQ *)(p_tcb->p_winfo))->p_pdqcb;
334                                if (!VALID_PDQCB(p_pdqcb)) {
335                                        return(E_SYS_LINENO);
336                                }
337                                if (!in_queue(&(p_pdqcb->rwait_queue), &(p_tcb->task_queue))) {
338                                        return(E_SYS_LINENO);
339                                }
340                                break;
341
342                        case TS_WAIT_MBX:
343                                p_mbxcb = ((WINFO_MBX *)(p_tcb->p_winfo))->p_mbxcb;
344                                if (!VALID_MBXCB(p_mbxcb)) {
345                                        return(E_SYS_LINENO);
346                                }
347                                if (!in_queue(&(p_mbxcb->wait_queue), &(p_tcb->task_queue))) {
348                                        return(E_SYS_LINENO);
349                                }
350                                break;
351
352                        case TS_WAIT_SMBF:
353                                p_mbfcb = ((WINFO_MBF *)(p_tcb->p_winfo))->p_mbfcb;
354                                if (!VALID_MBFCB(p_mbfcb)) {
355                                        return(E_SYS_LINENO);
356                                }
357                                if (!in_queue(&(p_mbfcb->swait_queue), &(p_tcb->task_queue))) {
358                                        return(E_SYS_LINENO);
359                                }
360                                break;
361
362                        case TS_WAIT_RMBF:
363                                p_mbfcb = ((WINFO_MBF *)(p_tcb->p_winfo))->p_mbfcb;
364                                if (!VALID_MBFCB(p_mbfcb)) {
365                                        return(E_SYS_LINENO);
366                                }
367                                if (!in_queue(&(p_mbfcb->rwait_queue), &(p_tcb->task_queue))) {
368                                        return(E_SYS_LINENO);
369                                }
370                                break;
371
372                        case TS_WAIT_MPF:
373                                p_mpfcb = ((WINFO_MPF *)(p_tcb->p_winfo))->p_mpfcb;
374                                if (!VALID_MPFCB(p_mpfcb)) {
375                                        return(E_SYS_LINENO);
376                                }
377                                if (!in_queue(&(p_mpfcb->wait_queue), &(p_tcb->task_queue))) {
378                                        return(E_SYS_LINENO);
379                                }
380                                break;
381                }
382        }
383
384        /*
385         *  tskctxb€Îž¡ºº
386         */
387        if (!TSTAT_DORMANT(tstat) && p_tcb != p_runtsk) {
388                /*
389                 *  ¥¿¡Œ¥²¥Ã¥È°Íž€Îž¡ºº
390                 */
391#if 0
392                if (bit_tskctxb(&(p_tcb->tskctxb))) {
393                        return(E_SYS_LINENO);
394                }
395#endif
396        }
397        return(E_OK);
398}
399
400/*
401 *  ¥»¥Þ¥Õ¥©Ëè€ÎÀ°¹çÀ­ž¡ºº
402 */
403#define INDEX_SEM(semid)        ((uint_t)((semid) - TMIN_SEMID))
404#define get_semcb(semid)        (&(semcb_table[INDEX_SEM(semid)]))
405
406static ER
407bit_semaphore(ID semid)
408{
409        SEMCB                   *p_semcb;
410        const SEMINIB   *p_seminib;
411        uint_t                  semcnt;
412        QUEUE                   *p_queue;
413        TCB                             *p_tcb;
414
415        if (!(TMIN_SEMID <= (semid) && (semid) <= tmax_semid)) {
416                return(E_ID);
417        }
418        p_semcb = get_semcb(semid);
419        p_seminib = p_semcb->p_seminib;
420        semcnt = p_semcb->semcnt;
421
422        /*
423         *  œéŽü²œ¥Ö¥í¥Ã¥¯€Ø€Î¥Ý¥€¥ó¥¿€Îž¡ºº
424         */
425        if (p_seminib != &(seminib_table[INDEX_SEM(semid)])) {
426                return(E_SYS_LINENO);
427        }
428
429        /*
430         *  semcnt€Îž¡ºº
431         */
432        if (semcnt > p_seminib->maxsem) {
433                return(E_SYS_LINENO);
434        }
435
436        /*
437         *  wait_queue€Îž¡ºº
438         */
439        if (semcnt == 0) {
440                p_queue = p_semcb->wait_queue.p_next;
441                while (p_queue != &(p_semcb->wait_queue)) {
442                        p_tcb = (TCB *) p_queue;
443                        p_queue = p_queue->p_next;
444                        if (!VALID_TCB(p_tcb)) {
445                                return(E_SYS_LINENO);
446                        }
447                        if (p_tcb->tstat != (TS_WAITING | TS_WAIT_SEM)) {
448                                return(E_SYS_LINENO);
449                        }
450                        if (p_semcb != ((WINFO_SEM *)(p_tcb->p_winfo))->p_semcb) {
451                                return(E_SYS_LINENO);
452                        }
453                }
454        }
455        else {
456                if (!queue_empty(&(p_semcb->wait_queue))) {
457                        return(E_SYS_LINENO);
458                }
459        }
460        return(E_OK);
461}
462
463/*
464 *  À°¹çÀ­ž¡ºº¥ë¡Œ¥Á¥óËÜÂÎ
465 */
466ER
467bit_kernel(void)
468{
469        ID              tskid;
470        ID              semid;
471        ER              ercd;
472
473        /*
474         *  ¥¿¥¹¥¯Ëè€Îž¡ºº
475         */
476        for (tskid = TMIN_TSKID; tskid <= tmax_tskid; tskid++) {
477                ercd = bit_task(tskid);
478                if (ercd != E_OK) {
479                        return(ercd);
480                }
481        }
482
483        /*
484         *  ¥»¥Þ¥Õ¥©Ëè€Îž¡ºº
485         */
486        for (semid = TMIN_SEMID; semid <= tmax_semid; semid++) {
487                ercd = bit_semaphore(semid);
488                if (ercd != E_OK) {
489                        return(ercd);
490                }
491        }
492
493        return(E_OK);
494}
詳しい使い方は TracBrowser を参照してください。