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

📄 ssp_except_mips.c

📁 abstract rtos
💻 C
字号:
#ifdef __cplusplusextern "C"{#endif#include "syscfg.h"#if( AOS_INCLUDE_SSP_KER_EXCEPTION == TRUE )#include "sys/sys_pub.h"#include "aos.h"#include "ssp_event.h"#include "ssp_task.h"#include "ssp_except.h"U32 g_ulLastExceptionTime = 0;U32 g_ulContinousExceptionCnt = 0;extern EXCEPTION_BUF_S *g_pException;S8 g_aRegName[][10] = {                       "sr",                       "pc",                       "lo",                       "hi",                       "zero",                       "at",                       "v0",                       "v1",                       "a0",                       "a1",                       "a2",                       "a3",                       "t0",                       "t1",                       "t2",                       "t3",                       "t4",                       "t5",                       "t6",                       "t7",                       "s0",                       "s1",                       "s2",                       "s3",                       "s4",                       "s5",                       "s6",                       "s7",                       "t8",                       "t9",                       "k0",                       "k1",                       "gp",                       "sp",                       "fp",                       "ra",                       "cause",                       "fpcsr"};VOID ssp_except_handle(U32 ulTask,U32 ulVecNum,ESFMIPS *pEsf);#if CONFIG_OS_VXWORKSextern void dbg_dbg_info_cache_flush();extern char * sysMemTop (void);#endifVOID ssp_except_handle(U32 ulTask,U32 ulVecNum,ESFMIPS *pEsf){    U32 ulTaskID;    U32 sp;    U32 bp;    U32 i;    S8  cName[AOS_NAME_LEN+1];    EXCEPTION_ITEM_S *pItem;    SYS_TIME_S DateTime;    U32        cur_sec,pc,instr,cnt,cnt_clear;#if ( CONDIF_BIG_ENDIAN == FALSE )    U32        ra_find,ra;#endif        if(pEsf == NULL)    {        return;    }    ulTaskID = ssp_task_osidTOaosid(ulTask);    if(ulTaskID == U32_BUTT)    {        return;    }    aos_time_get_sec( &cur_sec );        if( (cur_sec - g_ulLastExceptionTime) <= 10 )    {        g_ulContinousExceptionCnt++;    }    else    {        g_ulContinousExceptionCnt = 0;    }    g_ulLastExceptionTime = cur_sec;        g_pException->m_ulCounter ++;    g_pException->m_ulIndex = (g_pException->m_ulIndex + 1) % EXCEPTION_RECORD_NUM;        pItem = g_pException->m_aItem + g_pException->m_ulIndex;        pItem->m_ulVecNum  = ulVecNum;    pItem->m_ulErrorNo = 0;    pItem->m_ulIntCount= (U32)intCount();        for(i = 0;i < AOS_NAME_LEN;i++)    {        pItem->m_cTaskName[i] = g_pstTask[ulTaskID].name[i];    }        aos_time_get(&DateTime);    pItem->m_uDate      = DateTime.date;    pItem->m_uHour      = DateTime.hour;    pItem->m_uMinute    = DateTime.minute;    pItem->m_uSecond    = DateTime.second;    pItem->m_ulMillisec = DateTime.millisec;        pItem->m_ulPc = (U32)pEsf->esfRegs.pc;    pItem->m_ulSp = pEsf->esfRegs.gpreg[29];        sp = pItem->m_ulSp;    bp = g_pstTask[ulTaskID].sys_task_id;#if 0        if( bp < (U32)sysMemTop() )    {        for(i = 0;i < EXCEPTION_STACK_SIZE;i++)        {            if((sp + i) < bp)            {                pItem->m_aStack[i] = *(U32 *)(sp+i);            }            else            {                pItem->m_aStack[i] = 0;            }        }    }        else#endif            {        for(i = 0;i < EXCEPTION_STACK_SIZE;i++)        {            pItem->m_aStack[i] = 0xEE;        }    }        i = 0;    pItem->m_aStackLayer[0].stack_addr     = sp;    pItem->m_aStackLayer[0].next_inst_addr = pItem->m_ulPc;    i++;#if ( CONDIF_BIG_ENDIAN == TRUE )    pc = pEsf->esfRegs.gpreg[31];     pItem->m_aStackLayer[i].stack_addr     = sp;    pItem->m_aStackLayer[i].next_inst_addr = pc;    i++;    for ( ; i< EXCEPTION_STACK_LAYER; i++ )    {#define INSTR_JR         0x03e00008#define INSTR_SP_RESTORE 0x27bd0000#define INSTR_MASK       0xffff0000#define INSTR_SP_MASK    0xffff                instr = 0;        pc += 4;        for( cnt=0; pc > 0x80000000 && cnt < 2000; pc +=4,cnt++,cnt_clear++ )        {            instr = *(U32*)pc;            if( instr == INSTR_JR )            {                break;            }            if( 0 == (cnt_clear %1000) )            {                clear_watch_dog();            }        }        if( instr != INSTR_JR )        {            aos_printf( 0, "i=%u,function too big pc=0x%x,instr=0x%x!!!!", i,pc, instr );            break;        }        pc -= 4;        instr = *(U32*)pc;        if( (instr & INSTR_MASK) != INSTR_SP_RESTORE )        {            aos_printf( 0, "i = %u,abnormal invoke,pc=0x%x,instr=0x%x!!!!",i, pc, instr );            break;        }        sp += instr & INSTR_SP_MASK;#undef INSTR_JR#undef INSTR_SP_RESTORE#undef INSTR_SP_MASK            #undef INSTR_MASK        if(sp > 0x80000000 && sp < bp         && pc > 0x80000000)        {            pc = *(U32*)(sp-4);            pItem->m_aStackLayer[i].stack_addr     = sp;            pItem->m_aStackLayer[i].next_inst_addr = pc;        }        else        {            break;        }    }#else    pc = pItem->m_ulPc;    for ( ; i< EXCEPTION_STACK_LAYER; i++ )    {        if( sp >= bp || sp < 0x80000000 )        {            break;        }#define INSTR_SP_OPEN    0x27bd0000 #define INSTR_SP_MASK    0xffff#define INSTR_RA_STORE   0xafbf0000 #define INSTR_RA_MASK    0xffff#define INSTR_MASK       0xffff0000                instr = 0;        ra = 0;        ra_find = 0;        for( cnt=0; pc > 0x80000000 && cnt < 2000; pc -=4,cnt++,cnt_clear++ )        {            instr = *(U32*)pc;            if( (instr & INSTR_MASK) == INSTR_SP_OPEN              && (S16)(instr & INSTR_SP_MASK) < 0 )            {                break;            }            if( (instr & INSTR_MASK) == INSTR_RA_STORE )            {                ra_find = 1;                ra = *(U32*)( sp + (instr & INSTR_RA_MASK) );            }            if( 0 == (cnt_clear %1000) )            {                clear_watch_dog();            }        }        if( !instr || ((instr & INSTR_MASK) != INSTR_SP_OPEN) )        {            aos_printf( 0, "i=%u, function too big!!!!cnt=%u,pc=0x%x,instr=0x%x",i,cnt,pc,instr );            break;        }        if( !ra_find )        {            aos_printf( 0, "i=%u, abnormal invoke,can't find ra store instr!!!!,pc=0x%x,instr=0x%x",i,pc,instr );            break;        }        pItem->m_aStackLayer[i].stack_addr     = sp;        pItem->m_aStackLayer[i].next_inst_addr = ra;        i++;        sp += -(S16)(instr & INSTR_SP_MASK);        pc = ra;        if( pc > (U32)ssp_task_entry && pc < (U32)ssp_has_starve_task )        {            break;        }#undef INSTR_SP_OPEN  #undef INSTR_SP_MASK  #undef INSTR_RA_STORE #undef INSTR_RA_MASK      }#endif    if( i < EXCEPTION_STACK_LAYER )    {        pItem->m_aStackLayer[i].stack_addr     = sp;        pItem->m_aStackLayer[i].next_inst_addr = 0xBAD00BAD;        i++;    }        if( i < EXCEPTION_STACK_LAYER )    {        pItem->m_aStackLayer[i].stack_addr     = (U32)NULL;        pItem->m_aStackLayer[i].next_inst_addr = (U32)NULL;    }        for(i = 0;i < 32;i++)    {        pItem->m_aReg.gpreg[i] = pEsf->esfRegs.gpreg[i];    }    pItem->m_aReg.sr    = pEsf->esfRegs.sr;    pItem->m_aReg.pc    = pEsf->esfRegs.pc;      pItem->m_aReg.lo    = pEsf->esfRegs.lo;      pItem->m_aReg.hi    = pEsf->esfRegs.hi;      pItem->m_aReg.cause = pEsf->esfRegs.cause;    pItem->m_aReg.fpcsr = pEsf->esfRegs.fpcsr;        dbg_dbg_info_cache_flush();        {                for(i = 0;i < AOS_NAME_LEN;i++)        {            cName[i] = pItem->m_cTaskName[i];        }        cName[i] = '\0';        aos_printf(MPE_SYS,"\r\nexception:0x%x"                           "\r\ntask:%s"                           "\r\npc=0x%x,sp=0x%x,bp=0x%x\r\n",                           pItem->m_ulVecNum,                           cName,                           pItem->m_ulPc,                           pItem->m_ulSp,                           bp);    }#if( CONFIG_BOARD_EIA == TRUE )    drv_cpu_reset();#else    #error unknown platform!!!#endif}#endif#ifdef __cplusplus}#endif

⌨️ 快捷键说明

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