⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssp_spy.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifdef __cplusplusextern "C"{#endif#include "syscfg.h"#if( AOS_INCLUDE_SSP_KER_SPY == TRUE )#include "sys/sys_pub.h"#include "aos.h"#include "ssp_event.h"#include "ssp_task.h"#include "ssp_msg.h"#include "ssp_cputick.h"#include "ssp_spy.h"#include "ssp_debug.h"TASK_INFINITE_LOOP_TRACE_S *g_pTaskInfiniteLoopTrace;U32 g_ulTickIsrCtr;U32 g_ulAnchor;U32 g_ulTaskSpy = SPY_OFF;U32 g_ulContinueTime;CPU_TICK_S start_tick={0,0};DBG_POOL_S *dbg_pool = NULL;U32         m_ulTraceSn = 0;U32         g_ulEnableTrace = FALSE;U32         g_ulIsSoftwareResetLastTime = 0;extern EXCEPTION_BUF_S *g_pException;extern void drv_cpu_reset( void );extern char * sysMemTop (void);#if( CONFIG_BOARD_GMPU != TRUE )extern char * sysPhysMemTop(void);#endifvoid dbg_dbg_info_cache_flush();U32 m_spy_init(){       g_pTaskInfiniteLoopTrace = &dbg_pool->dbg_info[dbg_pool->cur_dbg_index].infinite_loop_task;    if(g_pTaskInfiniteLoopTrace->m_ulInitFlag != SPY_INIT_FLAG)    {        aos_memzero((VOID *)g_pTaskInfiniteLoopTrace,sizeof(TASK_INFINITE_LOOP_TRACE_S));        g_pTaskInfiniteLoopTrace->m_ulInitFlag = SPY_INIT_FLAG;        g_pTaskInfiniteLoopTrace->m_ulIndex    = 0;    }    g_ulRefresh     = FALSE;    g_ulTickIsrCtr  = 0;    g_ulAnchor      = 0;#if(CONFIG_OS_VXWORKS == TRUE)    g_ulTaskSpy     = SPY_ON;#elif(CONFIG_OS_WINDOWS == TRUE)    g_ulTaskSpy     = SPY_OFF;#endif    g_ulContinueTime= SPY_RUN_TICK;        aos_cputick_get(&start_tick);        return AOS_SUCC;}VOID ssp_task_spy(){#if( CONFIG_OS_VXWORKS == TRUE )    U32 lockKey;    U32 ulCurTaskId;    U32 bp,sp;    U32 i;         if(g_pTaskInfiniteLoopTrace->m_ulInitFlag != SPY_INIT_FLAG)    {        return;    }        if (SPY_OFF == g_ulTaskSpy)    {        return;    }    lockKey = aos_int_lock();        if (TRUE == g_ulRefresh)    {        g_ulRefresh     = FALSE;        g_ulAnchor      = 0;        g_ulTickIsrCtr  = 0;    }    g_ulTickIsrCtr ++;        if (0 == (g_ulTickIsrCtr % SPY_ISR_TICK))    {                ulCurTaskId = aos_task_self();        if ((g_ulTickIsrCtr > g_ulContinueTime) &&             (ulCurTaskId > 0) && (ulCurTaskId < CONFIG_TASK_NUMBER))        {            TASK_INFINITE_LOOP_ITEM_S * pTaskItem;            SYS_TIME_S DateTime;                        pTaskItem = g_pTaskInfiniteLoopTrace->m_aItem + g_pTaskInfiniteLoopTrace->m_ulIndex;                        if( (0 != pTaskItem->m_ulTaskId) && (ulCurTaskId != pTaskItem->m_ulTaskId) )            {                g_pTaskInfiniteLoopTrace->m_ulIndex = (g_pTaskInfiniteLoopTrace->m_ulIndex + 1) % SPY_TASK_NUM;                            pTaskItem = g_pTaskInfiniteLoopTrace->m_aItem + g_pTaskInfiniteLoopTrace->m_ulIndex;            }            pTaskItem->m_ulTaskId = ulCurTaskId;                        aos_memcpy(pTaskItem->m_cName,                       g_pstTask[ulCurTaskId].name,AOS_NAME_LEN);            pTaskItem->m_ulPowerOn = 1;            if(g_ulAnchor == 0)            {                g_ulAnchor = 1;                pTaskItem->m_ulLoop ++;            }                                    aos_time_get(&DateTime);            pTaskItem->m_uDate      = DateTime.date;            pTaskItem->m_uHour      = DateTime.hour;            pTaskItem->m_uMinute    = DateTime.minute;            pTaskItem->m_uSecond    = DateTime.second;            pTaskItem->m_ulMillisec = DateTime.millisec;            pTaskItem->m_ulRunTick  = g_ulTickIsrCtr;            if (g_ulTickIsrCtr > pTaskItem->m_ulMaxTick)            {                pTaskItem->m_ulMaxTick = g_ulTickIsrCtr;            }            pTaskItem->m_ulPc = sys_task_pc(0);            pTaskItem->m_ulSp = sys_get_cur_sp();                        bp = sys_task_bp(0);            sp = pTaskItem->m_ulSp;                        {#ifndef _EIA2000V5                if( bp < (U32)sysMemTop() )                {                    for(i = 0;i < EXCEPTION_STACK_SIZE;i++)                    {                        if((sp + i) < bp)                        {                            pTaskItem->m_aStack[i] = *(U32 *)(sp+i);                        }                        else                        {                            pTaskItem->m_aStack[i] = 0;                        }                    }                }                                else#endif                {                    for(i = 0;i < EXCEPTION_STACK_SIZE;i++)                    {                        pTaskItem->m_aStack[i] = 0xEE;                    }                }            }                        {                i = 0;                pTaskItem->m_aStackLayer[i].stack_addr     = sp;                pTaskItem->m_aStackLayer[i].next_inst_addr = pTaskItem->m_ulPc;                i++;#ifndef _EIA2000V5                if( sp < (U32)sysMemTop() )                {                    sp = *(U32 *)sp;                    for ( ; (i< EXCEPTION_STACK_LAYER) && (sp != 0); i++ )                    {                        if( sp < ((U32)sysMemTop()-4) )                        {                            pTaskItem->m_aStackLayer[i].stack_addr     = sp;                            pTaskItem->m_aStackLayer[i].next_inst_addr = *(U32 *)(sp + 4);                            sp = *(U32 *)sp;                        }                        else                        {                            break;                        }                    }                }#endif                if( i < EXCEPTION_STACK_LAYER )                {                    pTaskItem->m_aStackLayer[i].stack_addr     = sp;                    pTaskItem->m_aStackLayer[i].next_inst_addr = 0xBAD00BAD;                    i++;                }                if( i < EXCEPTION_STACK_LAYER )                {                    pTaskItem->m_aStackLayer[i].stack_addr     = NULL;                    pTaskItem->m_aStackLayer[i].next_inst_addr = NULL;                }            }                        dbg_dbg_info_cache_flush();                        if( g_ulTickIsrCtr >= SPY_RUN_DEADLINE_IN_TICK )            {                dbg_force_reset();            }         }            }        aos_int_unlock(lockKey);#endif    }TASK_INFINITE_LOOP_TRACE_S* ssp_get_task_infinite_loop_cb_base(){    return g_pTaskInfiniteLoopTrace;}VOID ssp_stack_spy(){         U32 lockKey;    U32 bp;    U32 top;    U32 ulTaskID;    U32 ulStackSize;    S8  cName[AOS_NAME_LEN+1];    S8 *cStackOverFlowDown = "\r\nstack overflow down,task:%s,bp=0x%x,"                             "stack size=0x%x.\r\n";    S8 *cStackOverFlowUp   = "\r\nstack overflow up,task:%s,bp=0x%x,"                             "stack size=0x%x.\r\n";    S8 *cStackOverFlow     = "\r\nstack overflow,task:%s,bp=0x%x,"                             "stack size=0x%x.\r\n";    ulTaskID = aos_task_self();    if(ulTaskID == U32_BUTT)    {                return;    }    lockKey = aos_int_lock();    if( (TASK_STATUS_CREATE == g_pstTask[ulTaskID].status)      ||(NULL ==g_pstTask[ulTaskID].stack_bottom) )    {        aos_int_unlock(lockKey);        return;    }    bp          = aos_task_bp(ulTaskID);    ulStackSize = g_pstTask[ulTaskID].stack_size;    top         = bp - ulStackSize + 64;    aos_task_name(ulTaskID,cName);        if((*(U32 *)top != SPY_STACK_DEFAULT_VALUE) &&        (*(g_pstTask[ulTaskID].stack_bottom) != SPY_STACK_BOTTOM_VALUE))    {        dbg_dbg_info_cache_flush();        aos_int_unlock(lockKey);        aos_printf(MPE_SYS,cStackOverFlow,cName,bp,ulStackSize);        return;    }    if(*(U32 *)top != SPY_STACK_DEFAULT_VALUE)    {        dbg_dbg_info_cache_flush();        aos_int_unlock(lockKey);        aos_printf(MPE_SYS,cStackOverFlowUp,cName,bp,ulStackSize);                return;    }    if(*(g_pstTask[ulTaskID].stack_bottom) != SPY_STACK_BOTTOM_VALUE)    {        dbg_dbg_info_cache_flush();        aos_int_unlock(lockKey);        aos_printf(MPE_SYS,cStackOverFlowDown,cName,bp,ulStackSize);        return;    }    aos_int_unlock(lockKey);}VOID ssp_stack_check(U32 ulTaskID){    static BOOL bIsRecord = TRUE;    U32 lockKey;    U32 bp;    U32 top;    U32 ulStackSize;    S8  cName[AOS_NAME_LEN+1];    S8 *cStackOverFlowDown = "\r\nstack overflow down,task:%s,bp=0x%x,"                             "stack size=0x%x.\r\n";    S8 *cStackOverFlowUp   = "\r\nstack overflow up,task:%s,bp=0x%x,"                             "stack size=0x%x.\r\n";    S8 *cStackOverFlow     = "\r\nstack overflow,task:%s,bp=0x%x,"                             "stack size=0x%x.\r\n";    if(ulTaskID >= CONFIG_TASK_NUMBER)    {        return;    }        lockKey = aos_int_lock();    if( (TASK_STATUS_CREATE == g_pstTask[ulTaskID].status)      ||(NULL ==g_pstTask[ulTaskID].stack_bottom)       || TRUE == g_pstTask[ulTaskID].bisVxSysCreate)    {        aos_int_unlock(lockKey);        return;    }    bp          = aos_task_bp(ulTaskID);    ulStackSize = g_pstTask[ulTaskID].stack_size;    top         = bp - ulStackSize + 64;    aos_task_name(ulTaskID,cName);        if((*(U32 *)top != SPY_STACK_DEFAULT_VALUE) &&        (*(g_pstTask[ulTaskID].stack_bottom) != SPY_STACK_BOTTOM_VALUE))    {        dbg_dbg_info_cache_flush();        aos_int_unlock(lockKey);                if(bIsRecord)        {            AOS_ASSERT(0);            aos_printf(MPE_SYS,cStackOverFlow,cName,bp,ulStackSize);            bIsRecord = FALSE;        }        return;    }    if(*(U32 *)top != SPY_STACK_DEFAULT_VALUE)    {        dbg_dbg_info_cache_flush();        aos_int_unlock(lockKey);                if(bIsRecord)        {            AOS_ASSERT(0);            aos_printf(MPE_SYS,cStackOverFlowUp,cName,bp,ulStackSize);            bIsRecord = FALSE;        }                return;    }    if(*(g_pstTask[ulTaskID].stack_bottom) != SPY_STACK_BOTTOM_VALUE)    {        dbg_dbg_info_cache_flush();        aos_int_unlock(lockKey);        if(bIsRecord)        {            AOS_ASSERT(0);            aos_printf(MPE_SYS,cStackOverFlowDown,cName,bp,ulStackSize);            bIsRecord = FALSE;        }        return;    }    aos_int_unlock(lockKey);}VOID ssp_add_task_switch_track( U32 sys_last_task, U32 sys_next_task ){    TSK_SW_TRACK_S * tsk_sw_trackp;    U32              lockKey;    lockKey = aos_int_lock();    tsk_sw_trackp = &dbg_pool->dbg_info[dbg_pool->cur_dbg_index].tsk_sw_info;            tsk_sw_trackp->last_tasks[tsk_sw_trackp->cur_index] = sys_last_task;    aos_cputick_get(&tsk_sw_trackp->last_ticks[tsk_sw_trackp->cur_index]);    aos_cputick_sub(&tsk_sw_trackp->last_ticks[tsk_sw_trackp->cur_index], &start_tick);    tsk_sw_trackp->cur_count++;    tsk_sw_trackp->cur_index++;    if( CONFIG_TASK_SWITCH_TRACK_NUM == tsk_sw_trackp->cur_index )    {        tsk_sw_trackp->cur_index = 0;    }    tsk_sw_trackp->cur_task = sys_next_task;    aos_cputick_get(&start_tick);    aos_int_unlock( lockKey );}VOID ssp_get_os_task_name( U32 osTid, S8 tsk_name[9] ){#if( CONFIG_OS_VXWORKS == TRUE )        S8 *p;    if( osTid )    {        p = (S8*)taskName(osTid);        if( !p )        {            p = "Unknown";        }    }    else    {        p = "T_ISR";    }    aos_strncpy( tsk_name, p , 8 );    tsk_name[8] = 0;#else    aos_strcpy( tsk_name, "Unknown" );#endif}VOID ssp_show_task_switch_track(){#if( CONFIG_OS_VXWORKS == TRUE )    U32 idx, sec, usec;    TSK_SW_TRACK_S * tsk_sw_trackp;    S8      str_base[100], *str_buf;    S32     offset, buf_len;    S8      tsk_name[9];    tsk_sw_trackp = &dbg_pool->dbg_info[dbg_pool->cur_dbg_index].tsk_sw_info;    buf_len = 100;    str_buf = str_base;    ssp_get_os_task_name(tsk_sw_trackp->cur_task, tsk_name);    offset = aos_snprintf( str_buf, (U32)buf_len, "SWITCH:%8s", tsk_name );    buf_len -= offset;    str_buf += offset;    idx = tsk_sw_trackp->cur_index;    if( 0 == idx )    {        idx = CONFIG_TASK_SWITCH_TRACK_NUM - 1;    }    else    {        idx--;    }    ssp_get_os_task_name(tsk_sw_trackp->last_tasks[idx], tsk_name);    aos_cputick_2us( &tsk_sw_trackp->last_ticks[idx], &sec, &usec );    offset = aos_snprintf( str_buf, (U32)buf_len, "<-%8s, elapsed time=(%us,%uus)",                tsk_name, sec, usec );    if( 0 == idx )    {        idx = CONFIG_TASK_SWITCH_TRACK_NUM - 1;    }    else    {        idx--;    }    ssp_get_os_task_name(tsk_sw_trackp->last_tasks[idx], tsk_name);    buf_len -= offset;    str_buf += offset;        aos_cputick_2us( &tsk_sw_trackp->last_ticks[idx], &sec, &usec );    offset = aos_snprintf( str_buf, (U32)buf_len, "<-task=%9s, elapsed time=(%us,%uus)...",                tsk_name, sec, usec );    aos_printf( MPE_TASK, "%s", str_base );#endif}U32 m_dbg_info_init(){#if( CONFIG_OS_VXWORKS == TRUE )#if( CONFIG_BOARD_GMPU == TRUE || CONFIG_BOARD_GDSP == TRUE )    dbg_pool = (DBG_POOL_S*)CONFIG_DEBUG_INFO_ADDR;#else    dbg_pool = (DBG_POOL_S*)sysMemTop();#endif#else    dbg_pool = (DBG_POOL_S*)malloc(CONFIG_DEBUG_INFO_LEN);    aos_memset( dbg_pool, 0, CONFIG_DEBUG_INFO_LEN );#endif#if( CONFIG_VERSION_DEBUG == TRUE )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -