📄 tkref.c
字号:
/* *---------------------------------------------------------------------- * T-Kernel / Standard Extension * * Copyright (C) 2006 by Ken Sakamura. All rights reserved. * T-Kernel / Standard Extension is distributed * under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * * Version: 1.00.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* * tkref.c (proc) * * Indicate state of T-Kernel object */#if DEBUGFUNC_SUPPORT#include <stdio.h>#define DSP printf#define DSP_LF putchar('\n')#define DSP_CH(c) putchar(c)#define TSD_DUT_DIV_10 10#define TSD_DUM_RTN_M1 (-1)#define TSD_DUT_SFT_16 16U#define TSD_DPL_SZ_20 20#define TSD_DUM_MSK_0X80 0x80U#define TSD_DEX_VAL_4 4#define TSD_DUT_MSK_0XFF 0xffUEXPORT W DumpPageLen = TSD_DPL_SZ_20; /* Length of pages to be dumped *//* * Stop page-by-page display * n = Number of lines displayed * n = Reset to 0 * Return value 0: Continue; -1: Terminate */EXPORT W DumpMore( W n ){static W CurPageLen = 0; W c; if ( n == 0 ) { CurPageLen = DumpPageLen; return 0; } if (( CurPageLen <= 0 )||( (CurPageLen -= n) > 0 )) { return 0; } /* Stop display */ CurPageLen = DumpPageLen; DSP("..more(y/n)?"); c = getchar(); if (( c > 0 )&&( ((UW)c & TSD_DUM_MSK_0X80) != 0 )) { c = getchar(); /* Double-byte character */ } DSP("\b\b\b\b\b\b\b\b\b\b\b\b\b\b" " " "\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); return ( c == 'Y' || c == 'y' )? 0: TSD_DUM_RTN_M1;}/* * Display of exinf * Display format 12345678 NAME */LOCAL void dsp_exinf( VP exinf ){ UB *p = (UB*)&exinf; W i; if ( exinf == NULL ) { return; } DSP("%08x", exinf); for ( i = 0; i < TSD_DEX_VAL_4; ++i ) { if ( !((p[i] == 0 )|| isprint(p[i]))) { return; } } DSP(" %.4s", p);}/* ------------------------------------------------------------------------ *//* * Task *//*TSK STATE (MAX:123)TID PRI:BPR SLT WUP SUS STS(*:NODISWAI) ST+UT(x10) RID EXINF/NAME123 123:123 123 123 123 XXX-YYYY *[123] 12345+12345 123 12345678 ABCD XXX-EV:12* [123] PROCESS*/LOCAL void dump_tsk( ID id, T_RTSK *ref, T_ITSK *inf, ID rid, PINFO *pinfo ){ B *p; /* TID PRI:BPR SLT WUP SUS */ DSP("%3d %3d:%3d %3d %3d %3d ", id, ref->tskpri, ref->tskbpri, ref->slicetime, ref->wupcnt, ref->suscnt); /* STS */ switch ( ref->tskstat & ~TTS_NODISWAI ) { case TTS_RUN: p = "RUN"; break; case TTS_RDY: p = "RDY"; break; case TTS_WAI: p = "WAI"; break; case TTS_SUS: p = "SUS"; break; case TTS_WAS: p = "WAS"; break; case TTS_DMT: p = "DMT"; break; default: p = "???"; break; } DSP(p); if ( (ref->tskstat & TTS_WAI) != 0 ) { UINT tev = 0; switch ( ref->tskwait ) { case TTW_SLP: p = "SLP"; break; case TTW_DLY: p = "DLY"; break; case TTW_SEM: p = "SEM"; break; case TTW_FLG: p = "FLG"; break; case TTW_SDTQ: p = "SDTQ"; break; case TTW_RDTQ: p = "RDTQ"; break; case TTW_MBX: p = "MBX"; break; case TTW_MTX: p = "MTX"; break; case TTW_SMBF: p = "SMBF"; break; case TTW_RMBF: p = "RMBF"; break; case TTW_CAL: p = "CAL"; break; case TTW_ACP: p = "ACP"; break; case TTW_RDV: p = "RDV"; break; case TTW_MPF: p = "MPF"; break; case TTW_MPL: p = "MPL"; break; default: tev = (ref->tskwait >> TSD_DUT_SFT_16) & TSD_DUT_MSK_0XFF; p = ( tev != 0 )? "EV": "???"; break; } if ( tev == 0 ) { DSP("-%-5s", p); } else { DSP("-%2s:%02x", p, tev); } DSP("%c", ( (ref->tskstat & TTS_NODISWAI) != 0 )? '*': ' '); if ( ref->wid > 0 ) { DSP("[%3d]", ref->wid); } else { DSP(" "); } } else { DSP(" "); } /* ST+UT RID */ DSP(" %5d+%-5d %3d ", inf->stime / TSD_DUT_DIV_10, inf->utime / TSD_DUT_DIV_10, rid); if ( pinfo == NULL ) { /* EXINF */ dsp_exinf(ref->exinf); } else { /* NAME */ DSP("[%3d] %.20S", pinfo->procid, pinfo->name); } DSP_LF;}/* * Indicate task state * tskid > 0 Tasks specified by tskid only * tskid = 0 All tasks * opt 1: Not display header */EXPORT void DumpTask( ID tskid, UW opt ){ T_RTSK ref; T_ITSK inf; ID id, maxid, rid; PINFO *pinfo; ER err; maxid = 0; tk_get_cfn("TMaxTskId", &maxid, 0); DumpMore(0); if ( (opt & 1U) == 0 ) { DSP("TSK STATE (MAX:%d)\n", maxid); DSP("TID PRI:BPR SLT WUP SUS STS(*:NODISWAI) ST+UT(x10) RID EXINF/NAME\n"); } if ( tskid > 0 ) { maxid = tskid; } else { tskid = 1; } for ( id = tskid; id <= maxid; id++ ) { err = tk_ref_tsk(id, &ref); if ( err < E_OK ) { if ( err != E_NOEXS ) { DSP("%3d ** %s **\n", id, tkstrerror(err)); } continue; } tk_inf_tsk(id, &inf, FALSE); rid = tk_get_rid(id); pinfo = NULL; if ( ref.exinf == PRCTSK_EXINF ) { PINFO **pp; err = tk_get_res(rid, PM_SVC, (VP*)&pp); if (( err >= E_OK )&&( pp != NULL )) { pinfo = *pp; } } dump_tsk(id, &ref, &inf, rid, pinfo); if ( DumpMore(1) ) { break; } }}/* ------------------------------------------------------------------------ *//* * Semaphore *//*SEM STATE (MAX:123) ID WID CNT EXINF123 123 123 12345678 ABCD*//* * Indicate semaphore state * semid > 0 Semaphores specified by semid only * semid = 0 All semaphores * opt 1: Not display header */EXPORT void DumpSemaphore( ID semid, UW opt ){ T_RSEM ref; ID id, maxid; ER err; maxid = 0; tk_get_cfn("TMaxSemId", &maxid, 1); DumpMore(0); if ( (opt & 1U) == 0 ) { DSP("SEM STATE (MAX:%d):\n", maxid); DSP(" ID WID CNT EXINF\n"); } if ( semid > 0 ) { maxid = semid; } else { semid = 1; } for ( id = semid; id <= maxid; id++ ) { err = tk_ref_sem(id, &ref); if ( err < E_OK ) { if ( err != E_NOEXS ) { DSP("%3d ** %s **\n", id, tkstrerror(err)); } continue; } DSP("%3d %3d %3d ", id, ref.wtsk, ref.semcnt); dsp_exinf(ref.exinf); DSP_LF; if ( DumpMore(1) ) { break; } }}/* ------------------------------------------------------------------------ *//* * Mutex *//*MTX STATE (MAX:123) ID HID WID EXINF123 123 123 12345678 ABCD*//* * Indicate mutex state * mtxid > 0 Mutexes specified by mtxid only * mtxid = 0 All mutexes * opt 1: Not display header */EXPORT void DumpMutex( ID mtxid, UW opt ){ T_RMTX ref; ID id, maxid; ER err; maxid = 0; tk_get_cfn("TMaxMtxId", &maxid, 1); DumpMore(0); if ( (opt & 1U) == 0 ) { DSP("MTX STATE (MAX:%d):\n", maxid); DSP(" ID HID WID EXINF\n"); } if ( mtxid > 0 ) { maxid = mtxid; } else { mtxid = 1; } for ( id = mtxid; id <= maxid; id++ ) { err = tk_ref_mtx(id, &ref); if ( err < E_OK ) { if ( err != E_NOEXS ) { DSP("%3d ** %s **\n", id, tkstrerror(err)); } continue; } DSP("%3d %3d %3d ", id, ref.htsk, ref.wtsk); dsp_exinf(ref.exinf); DSP_LF; if ( DumpMore(1) ) { break; } }}/* ------------------------------------------------------------------------ *//* * Event flag *//*FLG STATE (MAX:123) ID WID PTN EXINF123 123 12345678 12345678 ABCD*//* * Indicate event flag state * flgid > 0 Event flags specified by flgid only * flgid = 0 All event flags * opt 1: Not display header */EXPORT void DumpEventFlag( ID flgid, UW opt ){ T_RFLG ref; ID id, maxid; ER err; maxid = 0; tk_get_cfn("TMaxFlgId", &maxid, 1); DumpMore(0); if ( (opt & 1U) == 0 ) { DSP("FLG STATE (MAX:%d):\n", maxid); DSP(" ID WID PTN EXINF\n"); } if ( flgid > 0 ) { maxid = flgid; } else { flgid = 1; } for ( id = flgid; id <= maxid; id++ ) { err = tk_ref_flg(id, &ref); if ( err < E_OK ) { if ( err != E_NOEXS ) { DSP("%3d ** %s **\n", id, tkstrerror(err)); } continue; } DSP("%3d %3d %08x ", id, ref.wtsk, ref.flgptn); dsp_exinf(ref.exinf); DSP_LF; if ( DumpMore(1) ) { break; } }}/* ------------------------------------------------------------------------ *//* * Mail box *//*MBX STATE (MAX:123) ID WID MSG EXINF123 123 12345678 12345678 ABCD*//* * Indicate mail box state * mbxid > 0 Mail boxes specified by mbxid only * mbxid = 0 All mail boxes * opt 1: Not display header */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -