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         if ( pk_cisr->intno < _KERNEL_INT_TMIN_INTNO || pk_cisr->intno > _KERNEL_INT_TMAX_INTNO )
25         {
26                 return E_PAR;
27         }
28
29         /* %jp{メモリ確保}%en{get memory} */
30 #if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY
31         {
32                 isrcb    = _KERNEL_ISR_ID2ISRCB(isrid);
33                 isrcb_ro = isrcb;
34         }
35 #elif _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY
36 #if _KERNEL_ISRCB_SPLIT_RO
37         {
38                 /* %jp{ISRCB領域がポインタ管理で、ROM/RAM分離の場合} */
39                 VP   mem;
40                 SIZE memsz;
41
42                 /* %jp{メモリサイズ決定} */
43                 memsz = _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_ISRCB))
44                                         + _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_ISRCB_RO));
45
46                 /* %jp{メモリ確保} */
47                 mem = _KERNEL_SYS_ALC_HEP(memsz);
48
49                 /* %jp{メモリ不足チェック} */
50 #if _KERNEL_SPT_KCRE_ISR_E_NOMEM
51                 if ( mem == NULL )
52                 {
53                         return E_NOMEM;
54                 }
55 #endif
56                 
57                 /* %jp{メモリ割り当て} */
58                 isrcb    = (_KERNEL_T_ISRCB *)mem;
59                 isrcb_ro = (_KERNEL_T_ISRCB_RO *)((VB *)mem + _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_ISRCB)));
60                 _KERNEL_ISR_ID2ISRCB(isrid)           = isrcb;
61                 _KERNEL_ISR_ID2ISRCB(isrid)->isrcb_ro = (const _KERNEL_T_ISRCB_RO *)isrcb_ro;
62         }
63 #else
64         {
65                 VP   mem;
66                 
67                 /* %jp{メモリ確保} */
68                 mem = _KERNEL_SYS_ALC_HEP(sizeof(_KERNEL_T_ISRCB));
69
70                 /* %jp{メモリ不足チェック} */
71 #if _KERNEL_SPT_KCRE_ISR_E_NOMEM
72                 if ( mem == NULL )
73                 {
74                         return E_NOMEM;
75                 }
76 #endif
77                 
78                 /* %jp{メモリ割り当て} */
79                 isrcb    = (_KERNEL_T_ISRCB *)mem;
80                 isrcb_ro = (_KERNEL_T_ISRCB_RO *)mem;
81                 _KERNEL_ISR_ID2ISRCB(isrid) = isrcb;
82         }
83 #endif
84 #endif
85         
86         /* %jp{メンバ初期化} */
87         _KERNEL_ISR_SET_EXINF(isrcb_ro, pk_cisr->exinf);
88         _KERNEL_ISR_SET_ISR(isrcb_ro, pk_cisr->isr);
89
90
91 #if _KERNEL_SPT_DPC
92         _KERNEL_DIS_INT();                                                                              /* %jp{割込み禁止} */
93 #endif
94
95         /* %jp{割込みリストの先頭に繋ぐ} */
96         _KERNEL_ISR_SET_NEXT(isrcb, _KERNEL_INT_GET_HEAD(pk_cisr->intno));
97         _KERNEL_INT_SET_HEAD(pk_cisr->intno, _KERNEL_ISR_GET_ISRHDL(isrid, isrcb));
98         
99 #if _KERNEL_SPT_DPC
100         if ( !_KERNEL_SYS_SNS_LOC() ) { _KERNEL_ENA_INT(); }    /* %jp{割込み許可} */
101 #endif
102         
103         return E_OK;
104 }
105
106
107
108 /* end of file */