exception.h 1.3 KB

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