[an error occurred while processing this directive]
|
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