Vit (15.09.2015 12:58 - 13:01, просмотров: 577) ответил Скрипач на Да. Так и есть.
зырь чё напереговнокодил:) #include <setjmp.h>
jmp_buf main_snap;
typedef struct utask{
void (*fun)(void * Args);
bool yielded;
jmp_buf snap;
}utask;
utask * cur_task;
#define _OS_Yield() do{ \
cur_task->yielded = true; \
if(!setjmp(cur_task->snap)){ \
longjmp(main_snap, 1); \
} \
cur_task->yielded = false; \
}while(0)
void first(void * Args);
void second(void * Args);
utask first_task={
&first,
false,
};
utask second_task={
&second,
false,
};
utask * tasks[]={ &first_task, &second_task};//херня вместо списка, вместо OS_Add(), но для суперконфигураторов
void Scheduler(void){// обязательно с Большой буквы:)
static int idx;
idx = 0;
do{
cur_task = tasks[idx++];
if(idx >= sizeof(tasks)/sizeof(tasks[0]))idx = 0;
if (!setjmp(main_snap)) {
if(!cur_task->yielded) {
cur_task->fun(0);
} else {
longjmp(cur_task->snap, 1);
}
}
}while(1);
}
void first(void * Args){
...
//for(;;)
{
...
_OS_Yield();
...
_OS_Yield();
...
}
}
void second(void * Args){
...
for(;;)
{
...
_OS_Yield();
...
_OS_Yield();
...
}
}
int main(void){
...
Scheduler();
return 0;
}