#include "os_task.h" // extern int OS_TickFlag = 0; static OS_TASK_MSG *g_p_task = NULL; //ÈÎÎñ¶ÓÁÐ static int g_task_cnt = 0; //×ÜÈÎÎñÊýÁ¿ static int g_task_pos = 0; //µ±Ç°ÈÎÎñ¸öÊý volatile int OS_TickFlag = 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) { int 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(GETTICK_t 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; } } } } void OS_GetTick(void) { while (1 != OS_TickFlag) ; OS_TickFlag = 0; }