exception.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #ifndef __EXCEPTION_H__
  2. #define __EXCEPTION_H__
  3. #include <stdbool.h>
  4. #include <stdint.h>
  5. #include <string.h>
  6. #include <setjmp.h>
  7. #include "sdk_common.h"
  8. #include "SEGGER_RTT.h"
  9. #include "usr_config.h"
  10. typedef enum {
  11. //数据异常
  12. EXCEPT_DATA_BACK_MAG, //异常 —— 后脚地磁数据
  13. EXCEPT_DATA_FRONT_ACC, //异常 —— 前脚加速度数据
  14. EXCEPT_DATA_FRONT_GRY, //异常 —— 前脚陀螺仪数据
  15. EXCEPT_DATA_FRONT_MAG, //异常 —— 前脚地磁数据
  16. EXCEPT_DATA_CHARGE, //异常 —— 充电数据
  17. EXCEPT_DATA_BATTERY, //异常 —— 电池数据
  18. //其余异常
  19. EXCEPT_MODE_SUSPEND_OVERFLOW, //异常 —— 持续处于异常挂起模式
  20. //无异常
  21. EXCEPT_NO_EXCEPTION = 0
  22. }ExcepType_t;
  23. /// 异常标记
  24. typedef struct tagExcepSign
  25. {
  26. jmp_buf _StackInfo; // 保存异常处理入口的堆栈信息
  27. int _ExcepType; // 异常类型,0表示无异常,异常类型号一般取小于0的数
  28. } ExcepSign;
  29. /// 获取异常类型号
  30. #define ExcepType(ExcepSign) ((ExcepSign)._ExcepType)
  31. /// 可能抛出异常的代码块
  32. #define Try(ExcepSign) if ( ((ExcepSign)._ExcepType = setjmp((ExcepSign)._StackInfo)) == 0 )
  33. /// 捕获特定异常
  34. #define Catch(ExcepSign, ExcepType) else if ((ExcepSign)._ExcepType == (ExcepType))
  35. /// 捕获所有可能异常
  36. #define CatchElse(ExcepSign) else if((ExcepSign)._ExcepType < 0)
  37. /// 抛出异常
  38. #define Throw(ExcepSign, ExcepType) longjmp((ExcepSign)._StackInfo, ExcepType)
  39. extern ExcepSign Global_Ex;
  40. void Except_SaveExceptype(ExcepType_t excep_type);
  41. bool Except_IsError(ExcepType_t excep_type);
  42. void Exception_Init(void);
  43. #endif