📄 ssp_except_arm.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_arm.h"extern EXCEPTION_BUF_S *g_pException;S8 g_aRegName[][10] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "pc", "cpsr"};VOID ssp_except_handle(U32 ulTask,U32 ulVecNum,ESF *pEsf);#if CONFIG_OS_VXWORKSextern void dbg_dbg_info_cache_flush();extern char * sysMemTop (void);#endifVOID ssp_except_handle(U32 ulTask,U32 ulVecNum,ESF *pEsf){ U32 ulTaskID; U32 sp,fp; U32 bp; U32 i; EXCEPTION_ITEM_S *pItem; SYS_TIME_S DateTime; REG_SET *pRegs; if(pEsf == NULL) { return; } ulTaskID = ssp_task_osidTOaosid(ulTask); if(ulTaskID == U32_BUTT) { return; } 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; pRegs = aos_list_entry(pEsf, REG_SET, pc); pItem->m_ulPc = (U32)(pEsf->pc); pItem->m_ulSp = pRegs->r[11]; sp = pItem->m_ulSp; bp = g_pstTask[ulTaskID].sys_task_id; 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 { for(i = 0;i < EXCEPTION_STACK_SIZE;i++) { pItem->m_aStack[i] = 0xEE; } } fp = sys_get_cur_fp(); { i = 0; pItem->m_aStackLayer[0].stack_addr = sp; pItem->m_aStackLayer[0].next_inst_addr = pItem->m_ulPc; i++; if( fp < (U32)sysMemTop() ) { fp = *(U32*)(fp-12); for ( ; (i< EXCEPTION_STACK_LAYER) && (sp != 0); i++ ) { if( fp < (U32)sysMemTop() ) { sp = *(U32*)(fp-8); pItem->m_aStackLayer[i].stack_addr = sp; pItem->m_aStackLayer[i].next_inst_addr = *(U32*)(fp-4); fp = *(U32*)(fp-12); } else { break; } } } 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 = NULL; pItem->m_aStackLayer[i].next_inst_addr = NULL; } } for(i = 0;i < 15;i++) { pItem->m_aReg.r[i] = pRegs->r[i]; } pItem->m_aReg.pc = pEsf->pc; pItem->m_aReg.cpsr = pEsf->cpsr; dbg_dbg_info_cache_flush(); #if CONFIG_VERSION_DEBUG { S8 cName[AOS_NAME_LEN+1]; 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,fp=0x%x,bp=0x%x\r\n", pItem->m_ulVecNum, cName, pItem->m_ulPc, pItem->m_ulSp, bp); #if(CONFIG_BOARD_GDSP == TRUE || CONFIG_BOARD_EIA == TRUE ) drv_cpu_reset();#endif } #else drv_cpu_reset(); #endif}#endif#ifdef __cplusplus}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -