//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 头文件区 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include #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(); } } } } }