[an error occurred while processing this directive]
Ok, не хочет компилер работать с метками, можно сделать по другому (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено NoMore 30 сентября 2002 г. 16:24
В ответ на: Как это нет операций? А goto? :-))) отправлено AK 27 сентября 2002 г. 13:54

typedef void TASK (void);
typedef TASK* TASKPOINTER;


#define _TaskDecl(task) TASKPOINTER task##ResumePointer; TASK task
#define _LabelDecl(task, label) TASK task##label

#define StartTask(task) task##ResumePointer = task; task##ResumePointer ()
#define OS_Yield(task, label) task##ResumePointer = task##label;} TASK task##label {


_LabelDecl (task1, label1);
_LabelDecl (task1, label2);
_TaskDecl (task1)
{
PORTB = 0xff;
OS_Yield (task1, label1); // return control to the Kernel
PORTB = 0;
OS_Yield (task1, label2); // return control to the Kernel
}


_LabelDecl (task2, label1);
_LabelDecl (task2, label2);
_TaskDecl (task2)
{
PORTB = 0;
OS_Yield (task2, label1); // return control to the Kernel
PORTB = 0xff;
OS_Yield (task2, label2); // return control to the Kernel
}


void main (void)
{
StartTask (task1);
StartTask (task2);
for (;;)
{
task1ResumePointer (); // replace those 2 with OS_Sched () macro/function
task2ResumePointer ();
}
}

Только надо иметь в виду что OS_Yield () (в даной реализации) нельзя помещать внутри других блоков (циклов). Если этого не нужно, то всё фурычит (at least Hi-Tech PICC с этим справился).

Regards, NoMore

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru