#ifndef __EXCEPTION_H__ #define __EXCEPTION_H__ #include #include #include #include #include "sdk_common.h" #include "SEGGER_RTT.h" #include "usr_config.h" typedef enum { //数据异常 EXCEPT_DATA_BACK_MAG, //异常 —— 后脚地磁数据 EXCEPT_DATA_FRONT_ACC, //异常 —— 前脚加速度数据 EXCEPT_DATA_FRONT_GRY, //异常 —— 前脚陀螺仪数据 EXCEPT_DATA_FRONT_MAG, //异常 —— 前脚地磁数据 EXCEPT_DATA_CHARGE, //异常 —— 充电数据 //其余异常 EXCEPT_MODE_SUSPEND_OVERFLOW, //异常 —— 持续处于异常挂起模式 //无异常 EXCEPT_NO_EXCEPTION = 0 }ExcepType_t; /// 异常标记 typedef struct tagExcepSign { jmp_buf _StackInfo; // 保存异常处理入口的堆栈信息 int _ExcepType; // 异常类型,0表示无异常,异常类型号一般取小于0的数 } ExcepSign; /// 获取异常类型号 #define ExcepType(ExcepSign) ((ExcepSign)._ExcepType) /// 可能抛出异常的代码块 #define Try(ExcepSign) if ( ((ExcepSign)._ExcepType = setjmp((ExcepSign)._StackInfo)) == 0 ) /// 捕获特定异常 #define Catch(ExcepSign, ExcepType) else if ((ExcepSign)._ExcepType == (ExcepType)) /// 捕获所有可能异常 #define CatchElse(ExcepSign) else if((ExcepSign)._ExcepType < 0) /// 抛出异常 #define Throw(ExcepSign, ExcepType) longjmp((ExcepSign)._StackInfo, ExcepType) extern ExcepSign Global_Ex; void Except_SaveExceptype(ExcepType_t excep_type); uint32_t Except_IsExist(void); void Exception_Init(void); #endif