zf_task.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. *****************************************************************************
  3. * @file zf_task.h
  4. * @author Zorb
  5. * @version V1.0.0
  6. * @date 2018-06-28
  7. * @brief 任务管理的头文件
  8. *****************************************************************************
  9. * @history
  10. *
  11. * 1. Date:2018-06-28
  12. * Author:Zorb
  13. * Modification:建立文件
  14. *
  15. *****************************************************************************
  16. */
  17. #ifndef __ZF_TASK_H__
  18. #define __ZF_TASK_H__
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #include "stdint.h"
  23. #include "stdbool.h"
  24. #include "zf_list.h"
  25. #include "zf_timer.h"
  26. #include "zf_event.h"
  27. /* 用户任务优先级1-31,数字越小,优先级越高 */
  28. /* 任务最高优先级(用户不可用) */
  29. #define TASK_HIGHEST_PRIORITY EVENT_HIGHEST_PRIORITY
  30. /* 任务最低优先级(用户不可用) */
  31. #define TASK_LOWEST_PRIORITY EVENT_LOWEST_PRIORITY
  32. /* 开启任务调度 */
  33. #define TASK_SCHEDULE_ENABLE() Task_scheduleSwitch(true)
  34. /* 关闭任务调度 */
  35. #define TASK_SCHEDULE_DISABLE() Task_scheduleSwitch(false)
  36. /* 获取任务调度标志 */
  37. #define TASK_IS_SCHEDULE_ON() mIsScheduleOn
  38. /* 获取任务系统运行标志 */
  39. #define TASK_IS_SYSTEM_RUN() mIsTaskSystemRun
  40. /* 获取空闲任务 */
  41. #define TASK_GET_IDLE_TASK() pIdleTask
  42. /* 获取空闲任务事件处理器 */
  43. #define TASK_GET_IDLE_TASK_HANDLER() pIdleTaskEventHandler
  44. /* 获取任务列表 */
  45. #define TASK_GET_TASK_LIST() Task_getTaskList()
  46. /* 获取任务数量 */
  47. #define TASK_GET_TASK_COUNT() TASK_GET_TASK_LIST()->Count
  48. /* 创建任务定时器 */
  49. #define TASK_TIMER_CREATE(ppTimer_) do \
  50. { \
  51. Timer_create(ppTimer_); \
  52. if (*ppTimer_ != NULL) \
  53. { \
  54. *ppTimer_->pEventHandler = pIdleTaskEventHandler; \
  55. } \
  56. } while(0)
  57. typedef void (*ITaskProcess)(void *pArg); /* 程序任务类型 */
  58. /* 任务状态 */
  59. typedef enum _TaskState
  60. {
  61. TASK_STATE_STOP = 0, /* 停止 */
  62. TASK_STATE_RUNNING /* 运行 */
  63. } TaskState;
  64. /* 任务结构 */
  65. typedef struct _Task
  66. {
  67. uint32_t *pStkPtr; /* 堆栈指针 */
  68. uint32_t *pStkBase; /* 堆栈基地址 */
  69. uint32_t StkSize; /* 堆栈大小 */
  70. uint32_t DelayTime; /* 任务延时时间(系统周期) */
  71. uint8_t Priority; /* 任务优先级 */
  72. uint8_t State; /* 任务状态 */
  73. uint32_t RunTime; /* 任务总运行时间(系统周期) */
  74. /* 开始任务 */
  75. bool (*Start)(struct _Task * const pTask);
  76. /* 停止任务 */
  77. bool (*Stop)(struct _Task * const pTask);
  78. /* 销毁任务 */
  79. void (*Dispose)(struct _Task * const pTask);
  80. /* 延时任务 */
  81. bool (*Delay)(struct _Task * const pTask, uint32_t tick);
  82. } Task;
  83. extern Task *pTopPriorityTask; /* 最高优先级任务 */
  84. extern Task *pCurrentTask; /* 当前任务 */
  85. extern Task *pIdleTask; /* 空闲任务 */
  86. extern EventHandler *pIdleTaskEventHandler; /* 空闲任务事件处理器 */
  87. extern bool mIsScheduleOn; /* 任务调度开的标志 */
  88. extern bool mIsTaskSystemRun; /* 任务系统是否开始的标志 */
  89. /* 获取任务列表 */
  90. List *Task_getTaskList(void);
  91. /* 创建任务 */
  92. bool Task_create(Task **ppTask, ITaskProcess taskProcess, void *pArg,
  93. uint8_t priority, uint32_t stkSize);
  94. /* 开始任务 */
  95. bool Task_start(Task * const pTask);
  96. /* 停止任务 */
  97. bool Task_stop(Task * const pTask);
  98. /* 销毁任务 */
  99. void Task_dispose(Task * const pTask);
  100. /* 延时任务 */
  101. void Task_delay(struct _Task * const pTask, uint32_t tick);
  102. /* 任务调度开关 */
  103. void Task_scheduleSwitch(bool on);
  104. /* 任务调度 */
  105. void Task_schedule(void);
  106. /* 任务时间更新 */
  107. void Task_timeUpdate(void);
  108. /* 运行所有任务,程序不返回 */
  109. void Task_run(void);
  110. #ifdef __cplusplus
  111. }
  112. #endif
  113. #endif /* __ZF_TASK_H__ */
  114. /******************************** END OF FILE ********************************/