tao_z
2022-05-29 fa8669b0092240642af78e84c0e89f596444fdad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
 * @file os_task.c
 * @author Ethan Tao (tzj0429@163.com)
 * @brief 
 * @version 0.1
 * @date 2021-12-09
 * 
 * @copyright Copyright (c) 2021 Äþ²¨ÕýÀÊÆû³µÁ㲿¼þÓÐÏÞ¹«Ë¾ 
 * 
 */
#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;
}