/** * @file os_task.c * @author your name (you@domain.com) * @brief * @version 0.1 * @date 2021-04-05 * * @copyright Copyright (c) 2021 * */ #include "os_task.h" static OS_TASK_MSG *g_p_task = NULL; //任务队列 static int g_task_cnt = 0; //总任务数量 static int g_task_pos = 0; //当前任务个数 /*! * @brief 初始化任务队列 * @param [in] p_task 任务队列保存的数据 * @param [in] cnt 设置最多保存cnt个任务 * @return int 返回初始化是否成功 * @retval 0 成功 * @note null */ int InitOSTaskQueue(OS_TASK_MSG *p_task, int cnt) { unsigned char i = 0; g_p_task = p_task; g_task_cnt = cnt; for (i = 0; i < g_task_cnt; i++) { g_p_task[i].func = NULL; } return 0; } /*! * @brief 创建一个任务 * @param [in] func 执行任务的函数指针 * @param [in] tick 执行当前任务需要多少个周期 * @param [in] work_tick 在一个周期内具体哪个时间片去执行 * @param [in] par 传入任务需要的参数 * @return int 返回初始化是否成功 * @retval 0 成功 * @retval -1 失败 * @note null */ int OSTaskCreate(TASK_FUNC func, int tick, int work_tick, void *par) { if (g_task_pos < g_task_cnt) { g_p_task[g_task_pos].func = func; g_p_task[g_task_pos].cycle_tick = tick; g_p_task[g_task_pos].work_tick = work_tick; g_p_task[g_task_pos].par = par; g_task_pos++; return 0; } else { return -1; } } /*! * @brief 调度所有任务 * @param [in] tick 执行当前任务需要多少个周期 * @note null */ void OSSchedule(void (*GetTick)()) { int i = 0; if (NULL == GetTick) { return; } while (1) { GetTick(); for (i = 0; i < g_task_pos; i++) { g_p_task[i].cur_tick++; //当前任务CPU分片 if ((g_p_task[i].cur_tick == g_p_task[i].work_tick) && (g_p_task[i].func != NULL)) { g_p_task[i].func(g_p_task[i].par); } if (g_p_task[i].cur_tick >= g_p_task[i].cycle_tick) { g_p_task[i].cur_tick = 0; } } } }