From: ryuz Date: Sat, 10 Nov 2007 04:40:08 +0000 (+0000) Subject: (none) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=7c0f96b21fa90a52dc1619515794d01862b1945e;p=hos%2Fhos-v4a.git (none) --- diff --git a/kernel/include/config/cfgknl.h b/kernel/include/config/cfgknl.h index 171570d..d81594c 100755 --- a/kernel/include/config/cfgknl.h +++ b/kernel/include/config/cfgknl.h @@ -238,8 +238,8 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ /* Attribute */ #define _KERNEL_CFG_MTX_TA_TFIFO TRUE /**< %jp{TA_TFIFO属性に対応する} */ #define _KERNEL_CFG_MTX_TA_TPRI TRUE /**< %jp{TA_TPRI属性に対応する} */ -#define _KERNEL_CFG_MBX_TA_INHERIT TRUE /**< %jp{TA_INHERIT属性に対応する} */ -#define _KERNEL_CFG_MBX_TA_CEILING TRUE /**< %jp{TA_CEILING属性に対応する} */ +#define _KERNEL_CFG_MTX_TA_INHERIT TRUE /**< %jp{TA_INHERIT属性に対応する} */ +#define _KERNEL_CFG_MTX_TA_CEILING TRUE /**< %jp{TA_CEILING属性に対応する} */ /* Control block */ #define _KERNEL_CFG_MTXCB_ALGORITHM _KERNEL_MTXCB_ALG_BLKARRAY diff --git a/kernel/include/object/mtxobj.h b/kernel/include/object/mtxobj.h index ef431cc..84e15e9 100755 --- a/kernel/include/object/mtxobj.h +++ b/kernel/include/object/mtxobj.h @@ -129,7 +129,7 @@ typedef struct _kernel_t_mtxcb #endif #if _KERNEL_MTXCB_CEILPRI - _KERNEL_MTXCB_T_CEILPRI ceilpri KERNEL_MTXCB_TBITDEF_CEILPRI; /**< %jp{ミューテックスの上限優先度} */ + _KERNEL_MTXCB_T_CEILPRI ceilpri _KERNEL_MTXCB_TBITDEF_CEILPRI; /**< %jp{ミューテックスの上限優先度} */ #endif } _KERNEL_T_MTXCB; @@ -231,50 +231,51 @@ extern _KERNEL_T_MTXCB *_kernel_mtxcb_tbl[]; /**< %jp{ミューテ /* que */ -#define _KERNEL_MTX_GET_QUE(mtxcb) (&(mtxcb)->que) +#define _KERNEL_MTX_GET_QUE(mtxcb) (&(mtxcb)->que) /* tskhdl */ #if _KERNEL_MTXCB_TSKHDL -#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x) do { (mtxcb)->tskhdl = (_KERNEL_MTXCB_T_TSKHDL)(x); } while (0) -#define _KERNEL_MTX_GET_TSKHDL(mtxcb) ((_KERNEL_MTX_T_TSKHDL)(mtxcb)->tskhdl) +#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x) do { (mtxcb)->tskhdl = (_KERNEL_MTXCB_T_TSKHDL)(x); } while (0) +#define _KERNEL_MTX_GET_TSKHDL(mtxcb) ((_KERNEL_MTX_T_TSKHDL)(mtxcb)->tskhdl) #else -#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x) do { } while (0) -#define _KERNEL_MTX_GET_TSKHDL(mtxcb) (0) -#endif - - -/* mtxatr */ -#if _KERNEL_MTXCB_MTXATR -#define _KERNEL_MTX_SET_MTXATR(mtxcb, x) do { (mtxcb)->mtxatr = (_KERNEL_MTXCB_T_MTXATR)(x); } while (0) -#define _KERNEL_MTX_GET_MTXATR(mtxcb) ((_KERNEL_MTX_T_MTXATR)(mtxcb)->mtxatr) -#else -#define _KERNEL_MTX_SET_MTXATR(mtxcb, x) do { } while (0) -#if _KERNEL_SPT_MTX_TA_TFIFO -#define _KERNEL_MTX_GET_MTXATR(mtxcb) (TA_TFIFO) -#else -#define _KERNEL_MTX_GET_MTXATR(mtxcb) (TA_TPRI) -#endif +#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x) do { } while (0) +#define _KERNEL_MTX_GET_TSKHDL(mtxcb) (0) #endif /* next */ #if _KERNEL_MTXCB_NEXT -#define _KERNEL_MTX_SET_NEXT(mtxcb, x) do { (mtxcb)->next = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0) -#define _KERNEL_MTX_GET_NEXT(mtxcb) ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->next) +#define _KERNEL_MTX_SET_NEXT(mtxcb, x) do { (mtxcb)->next = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0) +#define _KERNEL_MTX_GET_NEXT(mtxcb) ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->next) #else -#define _KERNEL_MTX_SET_NEXT(mtxcb, x) do { } while (0) -#define _KERNEL_MTX_GET_NEXT(mtxcb) (0) +#define _KERNEL_MTX_SET_NEXT(mtxcb, x) do { } while (0) +#define _KERNEL_MTX_GET_NEXT(mtxcb) (0) #endif /* prev */ #if _KERNEL_MTXCB_PREV -#define _KERNEL_MTX_SET_PREV(mtxcb, x) do { (mtxcb)->prev = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0) -#define _KERNEL_MTX_GET_PREV(mtxcb) ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->prev) +#define _KERNEL_MTX_SET_PREV(mtxcb, x) do { (mtxcb)->prev = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0) +#define _KERNEL_MTX_GET_PREV(mtxcb) ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->prev) #else -#define _KERNEL_MTX_SET_PREV(mtxcb, x) do { } while (0) -#define _KERNEL_MTX_GET_PREV(mtxcb) (0) +#define _KERNEL_MTX_SET_PREV(mtxcb, x) do { } while (0) +#define _KERNEL_MTX_GET_PREV(mtxcb) (0) +#endif + + + +/* mtxatr */ +#if _KERNEL_MTXCB_MTXATR +#define _KERNEL_MTX_SET_MTXATR(mtxcb_ro, x) do { (mtxcb_ro)->mtxatr = (_KERNEL_MTXCB_T_MTXATR)(x); } while (0) +#define _KERNEL_MTX_GET_MTXATR(mtxcb_ro) ((_KERNEL_MTX_T_MTXATR)(mtxcb_ro)->mtxatr) +#else +#define _KERNEL_MTX_SET_MTXATR(mtxcb_ro, x) do { } while (0) +#if _KERNEL_SPT_MTX_TA_CEILING +#define _KERNEL_MTX_GET_MTXATR(mtxcb_ro) (TA_CEILING) +#else +#define _KERNEL_MTX_GET_MTXATR(mtxcb_ro) (TA_INHERIT) +#endif #endif diff --git a/kernel/include/parser/parsknl.h b/kernel/include/parser/parsknl.h index fd10036..ce8e447 100755 --- a/kernel/include/parser/parsknl.h +++ b/kernel/include/parser/parsknl.h @@ -972,8 +972,8 @@ /* Attribute */ #define _KERNEL_SPT_MTX_TA_TFIFO _KERNEL_CFG_MTX_TA_TFIFO /**< %jp{TA_TFIFO属性に対応する} */ #define _KERNEL_SPT_MTX_TA_TPRI _KERNEL_CFG_MTX_TA_TPRI /**< %jp{TA_TPRI属性に対応する} */ -#define _KERNEL_SPT_MTX_TA_INHERIT _KERNEL_CFG_MBX_TA_INHERIT /**< %jp{TA_INHERIT属性に対応する} */ -#define _KERNEL_SPT_MTX_TA_CEILING _KERNEL_CFG_MBX_TA_CEILING /**< %jp{TA_CEILING属性に対応する} */ +#define _KERNEL_SPT_MTX_TA_INHERIT _KERNEL_CFG_MTX_TA_INHERIT /**< %jp{TA_INHERIT属性に対応する} */ +#define _KERNEL_SPT_MTX_TA_CEILING _KERNEL_CFG_MTX_TA_CEILING /**< %jp{TA_CEILING属性に対応する} */ /* Control block */ #define _KERNEL_MTXCB_ALGORITHM _KERNEL_CFG_MTXCB_ALGORITHM diff --git a/kernel/source/object/mtx/loc_mtx.c b/kernel/source/object/mtx/loc_mtx.c index f906f3d..2f42dd6 100755 --- a/kernel/source/object/mtx/loc_mtx.c +++ b/kernel/source/object/mtx/loc_mtx.c @@ -32,12 +32,13 @@ ER loc_mtx(ID mtxid) /** %jp{ミューテックスのロック獲得} */ ER loc_mtx(ID mtxid) { - _KERNEL_T_MTXCB_PTR mtxcb; - _KERNEL_T_MTXCB_RO_PTR mtxcb_ro; - _KERNEL_T_TSKHDL tskhdl; - _KERNEL_T_TCB *tcb; - _KERNEL_T_TSKHDL loc_tskhdl; - ER ercd; + _KERNEL_T_MTXCB_RO_PTR mtxcb_ro; + _KERNEL_T_MTXCB_PTR mtxcb; + _KERNEL_T_MTXHDL mtxhdl; + _KERNEL_T_TCB_PTR tcb; + _KERNEL_T_TSKHDL tskhdl; + _KERNEL_T_TSKHDL tskhdl_lock; + ER ercd; /* %jp{コンテキストチェック} */ #if _KERNEL_SPT_LOC_MTX_E_CTX @@ -75,7 +76,7 @@ ER loc_mtx(ID mtxid) tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* ロック中のタスクハンドル取得 */ - loc_tskhdl = _KERNEL_MTX_GET_TSKHDL(mtxcb); + tskhdl_lock = _KERNEL_MTX_GET_TSKHDL(mtxcb); if ( _KERNEL_MTX_GET_TSKHDL(mtxcb) == _KERNEL_TSKHDL_NULL ) { @@ -85,7 +86,6 @@ ER loc_mtx(ID mtxid) /* %jp{ミューテックスをTCBに接続} */ { _KERNEL_T_MTXHDL mtxhdl_head; - _KERNEL_T_MTXHDL mtxhdl; mtxhdl = _KERNEL_MTX_GET_MTXHDL(mtxid, mtxcb); @@ -117,13 +117,15 @@ ER loc_mtx(ID mtxid) _KERNEL_MTX_SET_PREV(mtxcb, mtxhdl_prev); } } - - + #if _KERNEL_SPT_MTX_TA_CEILING - /* %jp{タスクの優先度をシーリング値まで引き上げ} */ - if ( _KERNEL_TSK_GET_TSKPRI(tcb) < _KERNEL_MTX_GET_CEILPRI(mtxcb_ro) ) + if ( _KERNEL_MTX_GET_MTXATR(mtxcb_ro) == TA_CEILING ) { - _KERNEL_TSK_SET_TSKPRI(tcb, _KERNEL_MTX_GET_CEILPRI(mtxcb_ro)); + /* %jp{タスクの優先度をシーリング値まで引き上げ} */ + if ( _KERNEL_TSK_GET_TSKPRI(tcb) < _KERNEL_MTX_GET_CEILPRI(mtxcb_ro) ) + { + _KERNEL_TSK_SET_TSKPRI(tcb, _KERNEL_MTX_GET_CEILPRI(mtxcb_ro)); + } } #endif @@ -137,17 +139,19 @@ ER loc_mtx(ID mtxid) _KERNEL_DSP_WAI_TSK(tskhdl); _KERNEL_MTX_ADD_QUE(mtxcb, _KERNEL_MTX_GET_MTXCB_RO(mtxid, mtxcb), tskhdl); /* %jp{待ち行列に追加} */ -#if _KERNEL_MTX_TA_INHERIT +#if _KERNEL_SPT_MTX_TA_INHERIT + /* %jp{優先度継承} */ + if ( _KERNEL_MTX_GET_MTXATR(mtxcb_ro) == TA_INHERIT ) { - _KERNEL_T_TSKHDL loc_tcb; + _KERNEL_T_TCB_PTR tcb_lock; /* %jp{ロック中タスクのTCB取得} */ - loc_tcb = _KERNEL_TSK_TSKHDL2TCB(loc_tskhdl); + tcb_lock = _KERNEL_TSK_TSKHDL2TCB(tskhdl_lock); /* %jp{優先度継承} */ - if ( _KERNEL_TSK_GET_TSKPRI(loc_tcb) > _KERNEL_TSK_GET_TSKPRI(tcb) ) + if ( _KERNEL_TSK_GET_TSKPRI(tcb_lock) > _KERNEL_TSK_GET_TSKPRI(tcb) ) { - _KERNEL_TSK_SET_TSKPRI(loc_tcb, _KERNEL_TSK_GET_TSKPRI(tcb)) + _KERNEL_TSK_SET_TSKPRI(tcb_lock, _KERNEL_TSK_GET_TSKPRI(tcb)); } } #endif