#include "rtos.h" /* Private varibles */ static volatile task TaskArray[MAX_TASKS]; // очередь задач static volatile u08 arrayTail; // "хвост" очереди /* Private defines */ /* External variables */ extern volatile uint8_t TWI_WDT; /* Delay counter */ volatile uint16_t TDelay; /** * Инициализация РТОС */ inline void RTOS_Init() { // "хвост" в 0 arrayTail = 0; } /** * Добавление задачи в список */ void RTOS_SetTask (void (*taskFunc)(void), u16 taskDelay, u16 taskPeriod) { u08 i; if (!taskFunc) { return; } for (i = 0; i < arrayTail; i++) { // поиск задачи в текущем списке if (TaskArray[i].pFunc == taskFunc) { // если нашли, то обновляем переменные DISABLE_INTERRUPT; TaskArray[i].delay = taskDelay; TaskArray[i].period = taskPeriod; TaskArray[i].run = 0; RESTORE_INTERRUPT; return; // обновив, выходим } } if (arrayTail < MAX_TASKS) { // если такой задачи в списке нет // и есть место,то добавляем DISABLE_INTERRUPT; TaskArray[arrayTail].pFunc = taskFunc; TaskArray[arrayTail].delay = taskDelay; TaskArray[arrayTail].period = taskPeriod; TaskArray[arrayTail].run = 0; arrayTail ++; // увеличиваем "хвост" RESTORE_INTERRUPT; } } /** * Удаление задачи из списка */ inline void RTOS_DeleteTask (void (*taskFunc)(void)) { u08 i; for (i=0; i0); } /** * Таймерная служба РТОС и tdelay (прерывание аппаратного таймера) */ #if defined(__ICCAVR__) #pragma vector=TIMER0_OVF_vect __interrupt void TIMER0_OVF_ISR(void) #elif defined(__GNUC__) ISR(TIMER0_OVF_vect) #endif { /* reload timer counter */ TCNT0 = TIMER0_CNT; //PINB |= 0x20; // LED toggle /* RTOS_Timer */ u08 i; for (i=0; i 0) { TDelay --; } /* I2C wachdog counter */ if (TWI_WDT > 0) { TWI_WDT --; } }