// ============================================================================= // 函数功能:抛出具体的看门狗异常 // 输入参数:result, 看门狗的异常时需要做的处理 // wdt, 异常的看门狗 // 输出参数: // 返回值 :最终的处理结果 // 说明 :主要是搜集WDT异常时的信息,该函数仅限内部调用,当发现看门狗异常并且需要处理该 // 异常的时候调用该函数 // ============================================================================= enum _EN_EXP_DEAL_TYPE_ __Wdt_TrowWdtExp(enum _EN_EXP_DEAL_TYPE_ result,\ tagWdt *wdt) { struct tagExpThrowPara parahead; tagWdtExpInfo wdtexp; wdtexp.wdt = *wdt; memcpy(wdtexp.wdtname,wdt->pname,CN_EXP_NAMELEN_LIMIT); parahead.name = CN_WDT_EXPDECODERNAME; parahead.dealresult = result; parahead.para = (u8 *)&wdtexp; parahead.para_len = sizeof(wdtexp); parahead.validflag = true; Exp_Throw(¶head, (u32*)&result); return result; }
// ============================================================================= // 函数功能:exception_generaldealer // 此部分主要用来处理CPU异常通用接口,根据异常类型,决定是否抛出异常。 // 输入参数:u32 major,异常主编号; // u32 minor,异常分支编号; // u32 exp_len,异常信息长度 // 输出参数:无 // 返回值 :EN_ExpAction // ============================================================================= enum EN_ExpAction Exp_General(u32 major,u32 minor,u32 exp_len) { char *majorname; struct ExpThrowPara head; enum EN_ExpAction Action; //make sure not shedule bool_t shedule_bak; shedule_bak = g_bScheduleEnable ; g_bScheduleEnable = false; //着手异常处理 //在异常处理汇编处理部分即出错,这个时候直接复位无需CPU参与处理的异常 if(major>= EN_SYSEXP_MAJOR_INVALID_EXCEPTION||minor>=EN_SYSEXP_MINOR_INVALID_EXCEPTION) { major = EN_SYSEXP_MAJOR_INVALID_EXCEPTION; minor = EN_SYSEXP_MINOR_INVALID_EXCEPTION; majorname = s_pcMajorExpNameTab[major]; printk("This exception is invalid!\n\r"); //无需CORE 信息和PERI信息 result = EN_EXP_DEAL_RESET; } else { majorname = s_pcMajorExpNameTab[major]; //printk("Exception:%s\n\r",majorname); //接下来需要根据具体异常类型确定异常处理结果(result) switch (major) { case EN_SYSEXP_MAJOR_IICDI: result=EN_EXP_DEAL_RECORD; break; case EN_SYSEXP_MAJOR_SOVFI: result=EN_EXP_DEAL_RESTART; break; case EN_SYSEXP_MAJOR_SPERRI: result=EN_EXP_DEAL_RESTART; break; case EN_SYSEXP_MAJOR_CB7I: result=EN_EXP_DEAL_RESTART; break; case EN_SYSEXP_MAJOR_CB15I: result=EN_EXP_DEAL_RESTART; break; case EN_SYSEXP_MAJOR_FIXI: result=EN_EXP_DEAL_RESTART; break; case EN_SYSEXP_MAJOR_FLTOI: result=EN_EXP_DEAL_RESTART; break; case EN_SYSEXP_MAJOR_FLTUI: //FLTUI异常只需记录,不需要复位。 result=EN_EXP_DEAL_RECORD; break; case EN_SYSEXP_MAJOR_FLTII: result=EN_EXP_DEAL_RESTART; break; default: result=EN_EXP_DEAL_RESTART; break; } } head.ExpAction=result; head.DecoderName = CN_HARDEXP_INFODECODERNAME; head.ExpInfo =(u8*)(Exception_StartAddress-5); head.ExpInfoLen =exp_len; head.ExpType=0; //TODO: 按需要修改 Action = Exp_Throw(&head); //recovethe shedule g_bScheduleEnable = shedule_bak; return Action; }