ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
619520 Топик полностью
Vit (15.09.2015 12:58 - 13:01, просмотров: 578) ответил Скрипач на Да. Так и есть.
зырь чё напереговнокодил:) #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; }