OSDN Git Service

(none)
[hos/hos-v4a.git] / kernel / source / object / isr / kcre_isr.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  acre_sem.c
5  * @brief %en{Activate Task}%jp{タスクの起動}
6  *
7  * Copyright (C) 1998-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #include "core/core.h"
14 #include "object/isrobj.h"
15
16
17
18
19 ER _kernel_cre_isr(ID isrid, const T_CISR *pk_cisr)
20 {
21         _KERNEL_T_ISRCB    *isrcb;
22         _KERNEL_T_ISRCB_RO *isrcb_ro;
23         
24         /* %jp{メモリ確保}%en{get memory} */
25 #if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY
26         {
27                 isrcb    = _KERNEL_ISR_ID2ISRCB(isrid);
28                 isrcb_ro = isrcb;
29         }
30 #elif _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY
31 #if _KERNEL_ISRCB_SPLIT_RO
32         {
33                 /* %jp{ISRCB領域がポインタ管理で、ROM/RAM分離の場合} */
34                 VP   mem;
35                 SIZE memsz;
36
37                 /* %jp{メモリサイズ決定} */
38                 memsz = _KERNEL_SYS_ALG_MEM(sizeof(_KERNEL_T_ISRCB))
39                                         + _KERNEL_SYS_ALG_MEM(sizeof(_KERNEL_T_ISRCB_RO));
40
41                 /* %jp{メモリ確保} */
42                 mem = _KERNEL_SYS_ALC_MEM(memsz);
43
44                 /* %jp{メモリ不足チェック} */
45 #if _KERNEL_SPT_KCRE_ISR_E_NOMEM
46                 if ( mem == NULL )
47                 {
48                         return E_NOMEM;
49                 }
50 #endif
51                 
52                 /* %jp{メモリ割り当て} */
53                 isrcb    = (_KERNEL_T_ISRCB *)mem;
54                 isrcb_ro = (_KERNEL_T_ISRCB_RO *)((VB *)mem + _KERNEL_SYS_ALG_MEM(sizeof(_KERNEL_T_ISRCB)));
55                 _KERNEL_ISR_ID2ISRCB(isrid)           = isrcb;
56                 _KERNEL_ISR_ID2ISRCB(isrid)->isrcb_ro = (const _KERNEL_T_ISRCB_RO *)isrcb_ro;
57         }
58 #else
59         {
60                 VP   mem;
61                 
62                 /* %jp{メモリ確保} */
63                 mem = _KERNEL_SYS_ALC_MEM(sizeof(_KERNEL_T_ISRCB));
64
65                 /* %jp{メモリ不足チェック} */
66 #if _KERNEL_SPT_KCRE_ISR_E_NOMEM
67                 if ( mem == NULL )
68                 {
69                         return E_NOMEM;
70                 }
71 #endif
72
73                 /* %jp{メモリ割り当て} */
74                 isrcb    = (_KERNEL_T_ISRCB *)mem;
75                 isrcb_ro = (_KERNEL_T_ISRCB_RO *)mem;
76                 _KERNEL_ISR_ID2ISRCB(isrid) = isrcb;
77         }
78 #endif
79 #endif
80
81         /* %jp{メンバ初期化} */
82         _KERNEL_ISR_SET_EXINF(isrcb_ro, pk_cisr->exinf);
83         _KERNEL_ISR_SET_ISR(isrcb_ro, pk_cisr->isr);
84
85
86 #if _KERNEL_SPT_DPC
87         _KERNEL_DIS_INT();                                                                              /* %jp{割込み禁止} */
88 #endif
89
90         /* %jp{割り込みリストの先頭に繋ぐ} */
91         _KERNEL_ISR_SET_NEXT(isrcb, _KERNEL_INT_GET_HEAD(pk_cisr->intno));
92         _KERNEL_INT_SET_HEAD(pk_cisr->intno, _KERNEL_ISR_GET_ISRHDL(isrid, isrcb));
93         
94 #if _KERNEL_SPT_DPC
95         if ( !_KERNEL_SYS_SNS_LOC() ) { _KERNEL_DIS_INT(); }    /* %jp{割込み許可} */
96 #endif
97         
98         return E_OK;
99 }
100
101
102
103 /* end of file */