ethan
2023-04-08 f5e277c240b9211a1f047b88788f34f3dd5a97c2
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
 
#include "os_task.h"
#include "os_clock.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;          
 
/**
 * @brief 
 * 
 * @param p_task 
 * @param cnt 
 * @return int 
 */
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 func 
 * @param tick 
 * @param work_tick 
 * @param par 
 * @return int 
 */
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 GetTick 
 */
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++; 
            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_GetTickFlag())
        ;
    os_ClearTickFlag();
}