123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include "schedule.h"
- #include "task.h"
- #define task0_mask 0x0000
- #define task1_mask 0x0001
- #define task2_mask 0x0003
- #define task3_mask 0x0007
- #define task4_mask 0x000F
- #define task5_mask 0x001F
- #define task6_mask 0x003F
- #define task7_mask 0x007F
- #define task8_mask 0x00FF
- #define TASK_MAX_QTY 8
- typedef struct
- {
- uint32_t period;
- uint32_t delay;
- } tag_task_list;
- typedef union
- {
- struct
- {
- uint8_t task0_flag : 1;
- uint8_t task1_flag : 1;
- uint8_t task2_flag : 1;
- uint8_t task3_flag : 1;
- uint8_t task4_flag : 1;
- uint8_t task5_flag : 1;
- uint8_t task6_flag : 1;
- uint8_t task7_flag : 1;
- uint8_t task8_flag : 1;
- } bits;
- uint8_t all;
- } tag_tscw;
- tag_task_list task_list[TASK_MAX_QTY];
- tag_tscw tscw;
- void schedule(void)
- {
- if (tscw.bits.task0_flag)
- {
- task0();
- tscw.bits.task0_flag = 0;
- }
- if (tscw.bits.task1_flag && (!(tscw.all & task1_mask)))
- {
- task1();
- tscw.bits.task1_flag = 0;
- }
- if (tscw.bits.task2_flag && (!(tscw.all & task2_mask)))
- {
- task2();
- tscw.bits.task2_flag = 0;
- }
- if (tscw.bits.task3_flag && (!(tscw.all & task3_mask)))
- {
- task3();
- tscw.bits.task3_flag = 0;
- }
- if (tscw.bits.task4_flag && (!(tscw.all & task4_mask)))
- {
- task4();
- tscw.bits.task4_flag = 0;
- }
- if (tscw.bits.task5_flag && (!(tscw.all & task5_mask)))
- {
- task5();
- tscw.bits.task5_flag = 0;
- }
- if (tscw.bits.task6_flag && (!(tscw.all & task6_mask)))
- {
- task6();
- tscw.bits.task6_flag = 0;
- }
- if (tscw.bits.task7_flag && (!(tscw.all & task7_mask)))
- {
- task7();
- tscw.bits.task7_flag = 0;
- }
- task8();
- }
- void schedule_init(uint32_t task_period)
- {
- uint32_t i;
- for (i = 0; i < TASK_MAX_QTY; i++)
- {
- task_list[i].period = task_ass[i][0] / task_period;
- task_list[i].delay = task_ass[i][1] / task_period;
- }
- }
- void schedule_clock(void)
- {
- static volatile uint32_t sys_tick_count = 0;
- uint8_t i = 0;
- sys_tick_count++;
- for (i = 0; i < TASK_MAX_QTY; i++)
- {
- if (sys_tick_count % task_list[i].period == task_list[i].delay)
- {
- tscw.all |= 0x01 << i;
- }
- }
- if (sys_tick_count > 4000000000)
- {
- sys_tick_count = 0;
- }
- }
|