Esempio n. 1
0
// =============================================================================
// 函数功能:抛出具体的看门狗异常
// 输入参数: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(&parahead, (u32*)&result);
    return  result;
}
Esempio n. 2
0
// =============================================================================
// 函数功能: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;
}