/* 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
#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;
/* 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
/* 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
/** %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
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 )
{
/* %jp{ミューテックスをTCBに接続} */
{
_KERNEL_T_MTXHDL mtxhdl_head;
- _KERNEL_T_MTXHDL mtxhdl;
mtxhdl = _KERNEL_MTX_GET_MTXHDL(mtxid, mtxcb);
_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
_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