 Vit (15.09.2015 12:58 - 13:01, просмотров: 691) ответил Скрипач на Да. Так и есть.
 Vit (15.09.2015 12:58 - 13:01, просмотров: 691) ответил Скрипач на Да. Так и есть.
зырь чё напереговнокодил:) #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;
}