exception.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. //其余异常
  18. EXCEPT_MODE_SUSPEND_OVERFLOW, //异常 —— 持续处于异常挂起模式
  19. //无异常
  20. EXCEPT_NO_EXCEPTION = 0
  21. }ExcepType_t;
  22. /// 异常标记
  23. typedef struct tagExcepSign
  24. {
  25. jmp_buf _StackInfo; // 保存异常处理入口的堆栈信息
  26. int _ExcepType; // 异常类型,0表示无异常,异常类型号一般取小于0的数
  27. } ExcepSign;
  28. /// 获取异常类型号
  29. #define ExcepType(ExcepSign) ((ExcepSign)._ExcepType)
  30. /// 可能抛出异常的代码块
  31. #define Try(ExcepSign) if ( ((ExcepSign)._ExcepType = setjmp((ExcepSign)._StackInfo)) == 0 )
  32. /// 捕获特定异常
  33. #define Catch(ExcepSign, ExcepType) else if ((ExcepSign)._ExcepType == (ExcepType))
  34. /// 捕获所有可能异常
  35. #define CatchElse(ExcepSign) else if((ExcepSign)._ExcepType < 0)
  36. /// 抛出异常
  37. #define Throw(ExcepSign, ExcepType) longjmp((ExcepSign)._StackInfo, ExcepType)
  38. extern ExcepSign Global_Ex;
  39. void Except_SaveExceptype(ExcepType_t excep_type);
  40. uint32_t Except_IsExist(void);
  41. void Exception_Init(void);
  42. #endif