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