From af33f02e8ec92de30f7d6cb48e1a3c1bbc9562a6 Mon Sep 17 00:00:00 2001 From: ryuz Date: Sat, 10 Nov 2007 04:25:33 +0000 Subject: [PATCH] (none) --- aplfw/sample/arm/utb_arm7at91/boot_task.c | 4 +-- cfgrtr/source/cretsk.cpp | 4 +++ kernel/include/object/mtxobj.h | 44 +++++++++++++++++++++++++++++++ kernel/include/object/tskobj.h | 6 ++--- kernel/include/parser/parsknl.h | 12 +++++++++ kernel/source/object/mtx/loc_mtx.c | 38 ++++++++++++++++++++++++-- 6 files changed, 101 insertions(+), 7 deletions(-) diff --git a/aplfw/sample/arm/utb_arm7at91/boot_task.c b/aplfw/sample/arm/utb_arm7at91/boot_task.c index 44f50f8..83c2c5b 100755 --- a/aplfw/sample/arm/utb_arm7at91/boot_task.c +++ b/aplfw/sample/arm/utb_arm7at91/boot_task.c @@ -80,7 +80,7 @@ void Boot_Task(VP_INT exinf) /* デバイスドライバ */ /*************************/ - +#if 0 /* LAN9118デバドラ生成 (/dev/eth0 に登録) */ Lan9118Drv_Create(&g_Lan9118Drv[0], (void *)0x40000000, 24); File_AddDevice("eth0", (C_DRVOBJ *)&g_Lan9118Drv[0]); @@ -92,7 +92,7 @@ void Boot_Task(VP_INT exinf) /* IP層の上にTCP/IP層構築 (/dev/tcpip0 に登録) */ TcpIp_Create(&g_TcpIp[0], "/dev/ip0"); File_AddDevice("tcpip0", (C_DRVOBJ *)&g_TcpIp[0]); - +#endif /* AT91 USARTデバドラ生成 (/dev/com0 に登録) */ At91UsartDrv_Create(&g_At91UsartDrv[0], (void *)0xfffc0000, 2, 32000000, 64); diff --git a/cfgrtr/source/cretsk.cpp b/cfgrtr/source/cretsk.cpp index 12bdd9f..8902640 100755 --- a/cfgrtr/source/cretsk.cpp +++ b/cfgrtr/source/cretsk.cpp @@ -327,6 +327,10 @@ void CApiCreTsk::WriteTcbRam(FILE *fp, int iObj) fprintf(fp, "0, "); /* %jp{強制待ち要求ネスト回数} */ #endif +#if _KERNEL_TCB_MTXHDL + fprintf(fp, "0, "); /* %jp{所有するミューテックスのリスト} */ +#endif + #if _KERNEL_TCB_ERCD fprintf(fp, "0, "); /* ercd */ #endif diff --git a/kernel/include/object/mtxobj.h b/kernel/include/object/mtxobj.h index 87984d6..ef431cc 100755 --- a/kernel/include/object/mtxobj.h +++ b/kernel/include/object/mtxobj.h @@ -191,6 +191,30 @@ extern _KERNEL_T_MTXCB *_kernel_mtxcb_tbl[]; /**< %jp{ミューテ /* ------------------------------------------ */ +/* Convert Handle */ +/* ------------------------------------------ */ + +#if _KERNEL_MTXHDL_ID /* %jp{ミューテックスハンドルにIDを使う}%en{MTXHDL is ID} */ + +#define _KERNEL_MTX_ID2MTXHDL(mtxid) (mtxid) +#define _KERNEL_MTX_MTXHDL2ID(mtxhdl) (mtxhdl) +#define _KERNEL_MTX_MTXCB2MTXHDL(mtxcb) _KERNEL_MTX_MTXCB2ID(mtxcb) +#define _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl) _KERNEL_MTX_ID2MTXCB(mtxhdl) +#define _KERNEL_MTX_GET_MTXHDL(mtxid, mtxcb) (mtxid) + +#else /* %jp{ミューテックスハンドルにMTXCBのアドレスを使う}%en{TSKHDL is Address of MTXCB} */ + +#define _KERNEL_MTX_ID2MTXHDL(mtxid) _KERNEL_MTX_ID2MTXCB(mtxid) +#define _KERNEL_MTX_MTXHDL2ID(mtxhdl) _KERNEL_MTX_MTXCB2ID(mtxhdl) +#define _KERNEL_MTX_MTXCB2MTXHDL(mtxcb) (mtxhdl) +#define _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl) (mtxhdl) +#define _KERNEL_MTX_GET_MTXHDL(mtxid, mtxcb) (mtxcb) + +#endif + + + +/* ------------------------------------------ */ /* Accessor for MTXCB */ /* ------------------------------------------ */ @@ -234,6 +258,26 @@ extern _KERNEL_T_MTXCB *_kernel_mtxcb_tbl[]; /**< %jp{ミューテ #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) +#else +#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) +#else +#define _KERNEL_MTX_SET_PREV(mtxcb, x) do { } while (0) +#define _KERNEL_MTX_GET_PREV(mtxcb) (0) +#endif + + /* ceilpri */ #if _KERNEL_MTXCB_CEILPRI #define _KERNEL_MTX_SET_CEILPRI(mtxcb_ro, x) do { (mtxcb_ro)->ceilpri = (_KERNEL_MTXCB_T_CEILPRI)(x); } while (0) diff --git a/kernel/include/object/tskobj.h b/kernel/include/object/tskobj.h index 2f520ce..f29032b 100755 --- a/kernel/include/object/tskobj.h +++ b/kernel/include/object/tskobj.h @@ -735,7 +735,7 @@ extern _KERNEL_T_TCB *_kernel_tcb_tbl[]; /**< %jp{タスクコン /* Convert Handle */ /* ------------------------------------------ */ -#if _KERNEL_TSKHDL_ID /* %en{TSKHDL is ID}%jp{タスクポインタにIDを使う} */ +#if _KERNEL_TSKHDL_ID /* %jp{タスクハンドルにIDを使う}%en{TSKHDL is ID} */ #define _KERNEL_TSK_ID2TSKHDL(tskid) (tskid) #define _KERNEL_TSK_TSKHDL2ID(tskhdl) (tskhdl) @@ -743,7 +743,7 @@ extern _KERNEL_T_TCB *_kernel_tcb_tbl[]; /**< %jp{タスクコン #define _KERNEL_TSK_TSKHDL2TCB(tskhdl) _KERNEL_TSK_ID2TCB(tskhdl) #define _KERNEL_TSK_GET_TSKHDL(tskid, tcb) (tskid) -#else /* %en{TSKHDL is Address of TCB}%jp{タスクポインタにTCBのアドレスを使う} */ +#else /* %jp{タスクハンドルにTCBのアドレスを使う}%en{TSKHDL is Address of TCB} */ #define _KERNEL_TSK_ID2TSKHDL(tskid) _KERNEL_TSK_ID2TCB(tskid) #define _KERNEL_TSK_TSKHDL2ID(tskhdl) _KERNEL_TSK_TCB2ID(tskhdl) @@ -863,7 +863,7 @@ extern _KERNEL_T_TCB *_kernel_tcb_tbl[]; /**< %jp{タスクコン /* mtxhdl */ #if _KERNEL_TCB_MTXHDL #define _KERNEL_TSK_SET_MTXHDL(tcb, x) do { (tcb)->mtxhdl = (x); } while(0) -#define _KERNEL_TSK_GET_MTXHDLtcb) ((tcb)->mtxhdl) +#define _KERNEL_TSK_GET_MTXHDL(tcb) ((tcb)->mtxhdl) #else #define _KERNEL_TSK_SET_MTXHDL(tcb, x) do { } while(0) #define _KERNEL_TSK_GET_MTXHDL(tcb) _KERNEL_MTXHDL_NULL diff --git a/kernel/include/parser/parsknl.h b/kernel/include/parser/parsknl.h index 82306f9..fd10036 100755 --- a/kernel/include/parser/parsknl.h +++ b/kernel/include/parser/parsknl.h @@ -334,7 +334,14 @@ #define _KERNEL_SPT_FLG TRUE #define _KERNEL_SPT_DTQ FALSE #define _KERNEL_SPT_MBX FALSE + +/* %jp{ミューテックスオブジェクトサポートの判定} */ +#if ((_KERNEL_CFG_CRE_MTX)|| (_KERNEL_CFG_ACRE_MTX) || (_KERNEL_CFG_SCRE_MTX)) && (_KERNEL_CFG_TMAX_MTXID) > 0 +#define _KERNEL_SPT_MTX TRUE +#else #define _KERNEL_SPT_MTX FALSE +#endif + #define _KERNEL_SPT_MBF FALSE #define _KERNEL_SPT_MPF FALSE #define _KERNEL_SPT_MPL FALSE @@ -774,6 +781,9 @@ #define _KERNEL_TCB_WUPCNT (_KERNEL_TMAX_WUPCNT > 0) #define _KERNEL_TCB_SUSCNT (_KERNEL_TMAX_SUSCNT > 0) +/**< %jp{所有するミューテックスのリスト} */ +#define _KERNEL_TCB_MTXHDL _KERNEL_SPT_MTX + /* %jp{E_OK以外の待ち解除要因があれば必要} */ #define _KERNEL_TCB_ERCD (_KERNEL_SPT_REL_WAI || _KERNEL_SPT_TER_TSK || _KERNEL_SPT_TMOUT || _KERNEL_SPT_DELOBJ) @@ -980,6 +990,8 @@ #define _KERNEL_MTXCB_QUE TRUE #define _KERNEL_MTXCB_TSKHDL TRUE #define _KERNEL_MTXCB_MTXATR TRUE +#define _KERNEL_MTXCB_NEXT TRUE +#define _KERNEL_MTXCB_PREV TRUE diff --git a/kernel/source/object/mtx/loc_mtx.c b/kernel/source/object/mtx/loc_mtx.c index 6479def..f906f3d 100755 --- a/kernel/source/object/mtx/loc_mtx.c +++ b/kernel/source/object/mtx/loc_mtx.c @@ -83,8 +83,42 @@ ER loc_mtx(ID mtxid) _KERNEL_MTX_SET_TSKHDL(mtxcb, tskhdl); /* %jp{ミューテックス資源の獲得} */ /* %jp{ミューテックスをTCBに接続} */ - - + { + _KERNEL_T_MTXHDL mtxhdl_head; + _KERNEL_T_MTXHDL mtxhdl; + + mtxhdl = _KERNEL_MTX_GET_MTXHDL(mtxid, mtxcb); + + mtxhdl_head = _KERNEL_TSK_GET_MTXHDL(tcb); + if ( mtxhdl_head == _KERNEL_MTXHDL_NULL ) + { + /* %jp{最初の1つを接続} */ + _KERNEL_TSK_SET_MTXHDL(tcb, mtxhdl); + _KERNEL_MTX_SET_NEXT(mtxcb, mtxhdl); + _KERNEL_MTX_SET_NEXT(mtxcb, mtxhdl); + } + else + { + _KERNEL_T_MTXHDL mtxhdl_next; + _KERNEL_T_MTXHDL mtxhdl_prev; + _KERNEL_T_MTXCB_PTR mtxcb_next; + _KERNEL_T_MTXCB_PTR mtxcb_prev; + + /* %jp{接続の先頭/末尾を取得} */ + mtxhdl_next = mtxhdl_head; + mtxcb_next = _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl_next); + mtxhdl_prev = _KERNEL_MTX_GET_PREV(mtxcb_next); + mtxcb_prev = _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl_prev); + + /* %jp{末尾に接続} */ + _KERNEL_MTX_SET_PREV(mtxcb_next, mtxhdl); + _KERNEL_MTX_SET_NEXT(mtxcb_prev, mtxhdl); + _KERNEL_MTX_SET_NEXT(mtxcb, mtxhdl_next); + _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) ) -- 2.11.0