|
|
@@ -0,0 +1,85 @@
|
|
|
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
+// 头文件区
|
|
|
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
+#include <stdio.h>
|
|
|
+#include "scheduler.h"
|
|
|
+#include "stm32f30x.h"
|
|
|
+
|
|
|
+static Task_Block_t task_block[TASK_NUM]; // 任务块 根据需求设定任务数量
|
|
|
+Task_Ctrl_t Task_Ctrl; // 任务控制块
|
|
|
+
|
|
|
+void SysTick_Handler(void)
|
|
|
+{
|
|
|
+ ISR_CallBlack(&Task_Ctrl); // 每次系统时钟中断,时钟周期加1
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author
|
|
|
+ * @brief 任务添加函数
|
|
|
+ * @param 任务执行时间间隔
|
|
|
+ * @param 任务ID 同时表示任务优先级
|
|
|
+ * @param 任务主体函数
|
|
|
+ * @retval NULL
|
|
|
+ */
|
|
|
+void TaskAdd(uint8_t task_id, Task_Handler_t task, uint32_t on_time)
|
|
|
+{
|
|
|
+ if(task_id >= TASK_NUM){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ task_block[task_id].On_Time = on_time;
|
|
|
+ task_block[task_id].RunTime = 0;
|
|
|
+ task_block[task_id].Task_Handler = task;
|
|
|
+ task_block[task_id].TaskState = 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*更新任务状态*/
|
|
|
+void UpdateTask(p_Task_Block_t Task_Block)
|
|
|
+{
|
|
|
+ Task_Block->RunTime = 0;
|
|
|
+ Task_Block->TaskState = 1;
|
|
|
+}
|
|
|
+
|
|
|
+/*任务初始化函数*/
|
|
|
+void TaskInit(void)
|
|
|
+{
|
|
|
+ Task_Ctrl.Update_State = UpdateTask;
|
|
|
+ Task_Ctrl.Task = task_block;
|
|
|
+
|
|
|
+ SysTick_Config(SystemCoreClock / 1000);
|
|
|
+}
|
|
|
+
|
|
|
+/*放在1ms中断中*/
|
|
|
+void ISR_CallBlack(p_Task_Ctrl_t Task_Ctrl)
|
|
|
+{
|
|
|
+ if (Task_Ctrl->Task != NULL)
|
|
|
+ {
|
|
|
+ for (uint8_t i = 0; i < TASK_NUM; i++)
|
|
|
+ {
|
|
|
+ Task_Ctrl->Task[i].RunTime++;
|
|
|
+ if (Task_Ctrl->Task[i].RunTime > Task_Ctrl->Task[i].On_Time)
|
|
|
+ {
|
|
|
+ if(Task_Ctrl->Update_State) {
|
|
|
+ Task_Ctrl->Update_State(&Task_Ctrl->Task[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void TaskStart()
|
|
|
+{
|
|
|
+ static uint8_t i = 0;
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ for (i = 0; i < TASK_NUM; i++)
|
|
|
+ {
|
|
|
+ if (Task_Ctrl.Task[i].TaskState)
|
|
|
+ {
|
|
|
+ Task_Ctrl.Task[i].TaskState = 0;
|
|
|
+ if(Task_Ctrl.Task[i].Task_Handler) {
|
|
|
+ Task_Ctrl.Task[i].Task_Handler();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|