#include "main.h" #include "sys/task_manager.h" task_scheduler_t g_scheduler = {0}; void task_manager_init(void) { g_scheduler.task_flags = 0U; g_scheduler.tick_100us = 0U; g_scheduler.tick_1ms = 0U; g_scheduler.tick_10ms = 0U; g_scheduler.tick_100ms = 0U; g_scheduler.tick_1s = 0U; } void task_manager_set(uint32_t task_mask) { g_scheduler.task_flags |= task_mask; } uint32_t task_manager_take_pending(void) { uint32_t pending; __disable_irq(); pending = g_scheduler.task_flags; g_scheduler.task_flags &= ~pending; __enable_irq(); return pending; } void task_manager_tick_100us(void) { g_scheduler.tick_100us++; if((g_scheduler.tick_100us % 5U) == 0U) { task_manager_set(1UL << TASK_ADC_VREF_SAMPLE); } if((g_scheduler.tick_100us % 10U) == 0U) { g_scheduler.tick_1ms++; task_manager_set((1UL << TASK_ADC_TEMP_SAMPLE) | (1UL << TASK_ADC_PROCESS)); } if((g_scheduler.tick_100us % 100U) == 0U) { g_scheduler.tick_10ms++; task_manager_set(1UL << TASK_CAN_POLL); } if((g_scheduler.tick_100us % 1000U) == 0U) { g_scheduler.tick_100ms++; task_manager_set((1UL << TASK_CAN_REPORT) | (1UL << TASK_STATUS_LED)); } if((g_scheduler.tick_100us % 10000U) == 0U) { g_scheduler.tick_1s++; task_manager_set((1UL << TASK_HEARTBEAT) | (1UL << TASK_DIAGNOSTIC_PRINT)); } }