zf_critical.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /**
  2. *****************************************************************************
  3. * @file zf_critical.h
  4. * @author Zorb
  5. * @version V1.0.0
  6. * @date 2018-06-28
  7. * @brief 硬件相关操作(临界状态、现场保护与恢复、PendSV异常)的头文件
  8. *****************************************************************************
  9. * @history
  10. *
  11. * 1. Date:2018-06-28
  12. * Author:Zorb
  13. * Modification:建立文件
  14. *
  15. *****************************************************************************
  16. */
  17. #ifndef __ZF_CRITICAL_H__
  18. #define __ZF_CRITICAL_H__
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #include "stdint.h"
  23. #include "zf_task.h"
  24. extern Task *pTopPriorityTask; /* 最高优先级任务 */
  25. extern Task *pCurrentTask; /* 当前任务 */
  26. /* 中断控制及状态寄存器 SCB_ICSR */
  27. #define NVIC_INT_CTRL 0xE000ED04
  28. /* 系统优先级寄存器 SCB_SHPR3:bit16~23 */
  29. #define NVIC_SYSPRI14 0xE000ED22
  30. /* 触发PendSV异常的值 Bit28:PENDSVSET */
  31. #define NVIC_PENDSVSET 0x10000000
  32. /* PendSV 优先级的值(最低) */
  33. #define NVIC_PENDSV_PRI 0xFF
  34. /* 触发PendSV异常,用于任务切换 */
  35. #define TASK_SWITCH() *((volatile uint32_t *)NVIC_INT_CTRL) = NVIC_PENDSVSET
  36. /* 任务堆栈数据类型 */
  37. typedef uint32_t ZF_STK_TYPE;
  38. /* 中断寄存器的值 */
  39. #define ZF_SR_VAL() uint32_t ZF_SR
  40. /* 保存中断寄存器的值,然后关中断 */
  41. #define ZF_INT_DIS() do \
  42. { \
  43. ZF_SR = ZF_SR_Save(); \
  44. } while (0)
  45. /* 恢复中断寄存器的值 */
  46. #define ZF_INT_EN() do \
  47. { \
  48. ZF_SR_Restore(ZF_SR); \
  49. } while (0)
  50. /* 进入临界区 */
  51. #define ZF_CRITICAL_ENTER() do \
  52. { \
  53. ZF_INT_DIS(); \
  54. } while (0)
  55. /* 退出临界区 */
  56. #define ZF_CRITICAL_EXIT() do \
  57. { \
  58. ZF_INT_EN(); \
  59. } while (0)
  60. /* 中断寄存器的值 */
  61. extern uint32_t ZF_SR;
  62. /* 保存中断寄存器的值,然后关中断 */
  63. __asm uint32_t ZF_SR_Save(void);
  64. /* 恢复中断寄存器的值 */
  65. __asm void ZF_SR_Restore(uint32_t sr);
  66. /* 关闭所有中断(但是不包括fault和NMI中断) */
  67. __asm void INTERRUPT_DISABLE(void);
  68. /* 开启中断总开关 */
  69. __asm void INTERRUPT_ENABLE(void);
  70. /* 初始化任务堆栈 */
  71. void ZF_initTaskStack(Task *pTask, ITaskProcess taskProcess, void *parg);
  72. /* 开启中断,并触发PendSV异常(用于系统第一次任务调度) */
  73. __asm void SF_readyGo(void);
  74. #ifdef __cplusplus
  75. }
  76. #endif
  77. #endif /* __ZF_CRITICAL_H__ */
  78. /******************************** END OF FILE ********************************/