|
@@ -13,6 +13,7 @@ static volatile uint8_t saveRegister;
|
|
*/
|
|
*/
|
|
static volatile task TaskArray[MAX_TASKS]; // очередь задач
|
|
static volatile task TaskArray[MAX_TASKS]; // очередь задач
|
|
static volatile uint8_t arrayTail; // "хвост" очереди
|
|
static volatile uint8_t arrayTail; // "хвост" очереди
|
|
|
|
+
|
|
// внешние переменные
|
|
// внешние переменные
|
|
extern uint8_t TWI_WDT;
|
|
extern uint8_t TWI_WDT;
|
|
|
|
|
|
@@ -22,8 +23,7 @@ static volatile uint16_t TDelay;
|
|
/*
|
|
/*
|
|
* Инициализация РТОС и t_delay, время тика - 1 мс
|
|
* Инициализация РТОС и t_delay, время тика - 1 мс
|
|
*/
|
|
*/
|
|
-inline void RTOS_Init()
|
|
|
|
-{
|
|
|
|
|
|
+inline void RTOS_Init(void) {
|
|
// настраиваем основной таймер
|
|
// настраиваем основной таймер
|
|
TIMER_TCCR = TIMER_CSB;
|
|
TIMER_TCCR = TIMER_CSB;
|
|
TIMER_TCNT = TIMER_CNT;
|
|
TIMER_TCNT = TIMER_CNT;
|
|
@@ -36,15 +36,17 @@ inline void RTOS_Init()
|
|
/*
|
|
/*
|
|
* Добавление задачи в список
|
|
* Добавление задачи в список
|
|
*/
|
|
*/
|
|
-void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod)
|
|
|
|
-{
|
|
|
|
|
|
+void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod) {
|
|
uint8_t i;
|
|
uint8_t i;
|
|
|
|
|
|
- if(!taskFunc) return;
|
|
|
|
- for(i = 0; i < arrayTail; i++) // поиск задачи в текущем списке
|
|
|
|
- {
|
|
|
|
- if(TaskArray[i].pFunc == taskFunc) // если нашли, то обновляем переменные
|
|
|
|
- {
|
|
|
|
|
|
+ if (!taskFunc) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // поиск задачи в текущем списке
|
|
|
|
+ for(i = 0; i < arrayTail; i++) {
|
|
|
|
+ // если нашли, то обновляем переменные
|
|
|
|
+ if (TaskArray[i].pFunc == taskFunc) {
|
|
DISABLE_INTERRUPT;
|
|
DISABLE_INTERRUPT;
|
|
|
|
|
|
TaskArray[i].delay = taskDelay;
|
|
TaskArray[i].delay = taskDelay;
|
|
@@ -52,12 +54,14 @@ void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeri
|
|
TaskArray[i].run = 0;
|
|
TaskArray[i].run = 0;
|
|
|
|
|
|
RESTORE_INTERRUPT;
|
|
RESTORE_INTERRUPT;
|
|
- return; // обновив, выходим
|
|
|
|
|
|
+ // обновив, выходим
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (arrayTail < MAX_TASKS) // если такой задачи в списке нет
|
|
|
|
- { // и есть место,то добавляем
|
|
|
|
|
|
+ // если такой задачи в списке нет
|
|
|
|
+ if (arrayTail < MAX_TASKS) {
|
|
|
|
+ // и есть место, то добавляем
|
|
DISABLE_INTERRUPT;
|
|
DISABLE_INTERRUPT;
|
|
|
|
|
|
TaskArray[arrayTail].pFunc = taskFunc;
|
|
TaskArray[arrayTail].pFunc = taskFunc;
|
|
@@ -65,29 +69,32 @@ void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeri
|
|
TaskArray[arrayTail].period = taskPeriod;
|
|
TaskArray[arrayTail].period = taskPeriod;
|
|
TaskArray[arrayTail].run = 0;
|
|
TaskArray[arrayTail].run = 0;
|
|
|
|
|
|
- arrayTail++; // увеличиваем "хвост"
|
|
|
|
|
|
+ // увеличиваем "хвост"
|
|
|
|
+ arrayTail++;
|
|
RESTORE_INTERRUPT;
|
|
RESTORE_INTERRUPT;
|
|
|
|
+ } else {
|
|
|
|
+ while(1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
* Удаление задачи из списка
|
|
* Удаление задачи из списка
|
|
*/
|
|
*/
|
|
-inline void RTOS_DeleteTask (void (*taskFunc)(void))
|
|
|
|
-{
|
|
|
|
|
|
+inline void RTOS_DeleteTask (void (*taskFunc)(void)) {
|
|
uint8_t i;
|
|
uint8_t i;
|
|
|
|
|
|
- for (i=0; i<arrayTail; i++) // проходим по списку задач
|
|
|
|
- {
|
|
|
|
- if(TaskArray[i].pFunc == taskFunc) // если задача в списке найдена
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
|
|
+ // проходим по списку задач
|
|
|
|
+ for (i=0; i<arrayTail; i++) {
|
|
|
|
+ // если задача в списке найдена
|
|
|
|
+ if (TaskArray[i].pFunc == taskFunc) {
|
|
DISABLE_INTERRUPT;
|
|
DISABLE_INTERRUPT;
|
|
- if(i != (arrayTail - 1)) // переносим последнюю задачу
|
|
|
|
- { // на место удаляемой
|
|
|
|
|
|
+ // переносим последнюю задачу
|
|
|
|
+ if (i != (arrayTail - 1)) {
|
|
|
|
+ // на место удаляемой
|
|
TaskArray[i] = TaskArray[arrayTail - 1];
|
|
TaskArray[i] = TaskArray[arrayTail - 1];
|
|
}
|
|
}
|
|
- arrayTail--; // уменьшаем указатель "хвоста"
|
|
|
|
|
|
+ // уменьшаем указатель "хвоста"
|
|
|
|
+ arrayTail--;
|
|
RESTORE_INTERRUPT;
|
|
RESTORE_INTERRUPT;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -97,31 +104,30 @@ inline void RTOS_DeleteTask (void (*taskFunc)(void))
|
|
/*
|
|
/*
|
|
* Диспетчер РТОС, вызывается в main
|
|
* Диспетчер РТОС, вызывается в main
|
|
*/
|
|
*/
|
|
-
|
|
|
|
-void RTOS_DispatchTask(void)
|
|
|
|
-{
|
|
|
|
|
|
+void RTOS_DispatchTask(void) {
|
|
uint8_t i;
|
|
uint8_t i;
|
|
void (*function) (void);
|
|
void (*function) (void);
|
|
- for (i=0; i<arrayTail; i++) // проходим по списку задач
|
|
|
|
- {
|
|
|
|
- if (TaskArray[i].run == 1) // если флаг на выполнение взведен,
|
|
|
|
- { // запоминаем задачу, т.к. во
|
|
|
|
- function = TaskArray[i].pFunc; // время выполнения может
|
|
|
|
- // измениться индекс
|
|
|
|
- if(TaskArray[i].period == 0)
|
|
|
|
- { // если период равен 0
|
|
|
|
- RTOS_DeleteTask(TaskArray[i].pFunc); // удаляем задачу из списка,
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- TaskArray[i].run = 0; // иначе снимаем флаг запуска
|
|
|
|
- if(!TaskArray[i].delay) // если задача не изменила задержку
|
|
|
|
- { // задаем ее
|
|
|
|
- TaskArray[i].delay = TaskArray[i].period-1;
|
|
|
|
- } // задача для себя может сделать паузу
|
|
|
|
- }
|
|
|
|
- (*function)(); // выполняем задачу
|
|
|
|
|
|
+ // проходим по списку задач
|
|
|
|
+ for (i=0; i<arrayTail; i++) {
|
|
|
|
+ // если флаг на выполнение взведен,
|
|
|
|
+ if (TaskArray[i].run != 0) {
|
|
|
|
+ // запоминаем задачу, т.к. во время выполнения может измениться индекс
|
|
|
|
+ function = TaskArray[i].pFunc;
|
|
|
|
+ if (TaskArray[i].period == 0) {
|
|
|
|
+ // если период равен 0, удаляем задачу из списка,
|
|
|
|
+ RTOS_DeleteTask(TaskArray[i].pFunc);
|
|
|
|
+ } else {
|
|
|
|
+ // иначе снимаем флаг запуска
|
|
|
|
+ TaskArray[i].run = 0;
|
|
|
|
+ // если задача не изменила задержку
|
|
|
|
+ if (!TaskArray[i].delay) {
|
|
|
|
+ // задаем ее
|
|
|
|
+ TaskArray[i].delay = TaskArray[i].period-1;
|
|
|
|
+ // задача для себя может сделать паузу
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // выполняем задачу
|
|
|
|
+ (*function)();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -135,11 +141,13 @@ void tdelay_ms(uint16_t msek) {
|
|
TDelay = msek;
|
|
TDelay = msek;
|
|
|
|
|
|
do {
|
|
do {
|
|
- RTOS_DispatchTask();
|
|
|
|
|
|
+ if (TDelay > 1) {
|
|
|
|
+ RTOS_DispatchTask();
|
|
|
|
+ }
|
|
// делать нехрен -- спим, ждём прерывание
|
|
// делать нехрен -- спим, ждём прерывание
|
|
set_sleep_mode(SLEEP_MODE_IDLE);
|
|
set_sleep_mode(SLEEP_MODE_IDLE);
|
|
sleep_mode();
|
|
sleep_mode();
|
|
- } while (TDelay>0);
|
|
|
|
|
|
+ } while (TDelay != 0);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -153,7 +161,6 @@ ISR(TIMER_OVF_VECT) {
|
|
|
|
|
|
/* RTOS_Timer */
|
|
/* RTOS_Timer */
|
|
uint8_t i;
|
|
uint8_t i;
|
|
-
|
|
|
|
// проходим по списку задач
|
|
// проходим по списку задач
|
|
for (i=0; i<arrayTail; i++) {
|
|
for (i=0; i<arrayTail; i++) {
|
|
// если время до выполнения истекло
|
|
// если время до выполнения истекло
|
|
@@ -167,11 +174,11 @@ ISR(TIMER_OVF_VECT) {
|
|
}
|
|
}
|
|
|
|
|
|
/* TDelay_Timer -- уменьшим счётчик */
|
|
/* TDelay_Timer -- уменьшим счётчик */
|
|
- if (TDelay > 0) {
|
|
|
|
|
|
+ if (TDelay != 0) {
|
|
TDelay --;
|
|
TDelay --;
|
|
}
|
|
}
|
|
|
|
|
|
- if (TWI_WDT > 0) {
|
|
|
|
|
|
+ if (TWI_WDT != 0) {
|
|
TWI_WDT --;
|
|
TWI_WDT --;
|
|
}
|
|
}
|
|
|
|
|