2 * Hyper Operating System V4 Advance
5 * @brief %en{Activate Task}%jp{タスクの起動}
7 * Copyright (C) 1998-2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "core/core.h"
14 #include "object/isrobj.h"
19 ER _kernel_cre_isr(ID isrid, const T_CISR *pk_cisr)
21 _KERNEL_T_ISRCB *isrcb;
22 _KERNEL_T_ISRCB_RO *isrcb_ro;
24 if ( pk_cisr->intno < _KERNEL_INT_TMIN_INTNO || pk_cisr->intno > _KERNEL_INT_TMAX_INTNO )
29 /* %jp{メモリ確保}%en{get memory} */
30 #if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY
32 isrcb = _KERNEL_ISR_ID2ISRCB(isrid);
35 #elif _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY
36 #if _KERNEL_ISRCB_SPLIT_RO
38 /* %jp{ISRCB領域がポインタ管理で、ROM/RAM分離の場合} */
43 memsz = _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_ISRCB))
44 + _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_ISRCB_RO));
47 mem = _KERNEL_SYS_ALC_HEP(memsz);
50 #if _KERNEL_SPT_KCRE_ISR_E_NOMEM
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;
68 mem = _KERNEL_SYS_ALC_HEP(sizeof(_KERNEL_T_ISRCB));
71 #if _KERNEL_SPT_KCRE_ISR_E_NOMEM
79 isrcb = (_KERNEL_T_ISRCB *)mem;
80 isrcb_ro = (_KERNEL_T_ISRCB_RO *)mem;
81 _KERNEL_ISR_ID2ISRCB(isrid) = isrcb;
87 _KERNEL_ISR_SET_EXINF(isrcb_ro, pk_cisr->exinf);
88 _KERNEL_ISR_SET_ISR(isrcb_ro, pk_cisr->isr);
92 _KERNEL_DIS_INT(); /* %jp{割込み禁止} */
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));
100 if ( !_KERNEL_SYS_SNS_LOC() ) { _KERNEL_ENA_INT(); } /* %jp{割込み許可} */