#include "api.h" #ifndef TASKMGR_MAX_TASKS #define TASKMGR_MAX_TASKS 12 #endif unsigned taskmgr_ms_till_next(void){ return 10; } static unsigned right_here=0; struct run_tag { int oneshot;/** 0 && effective_passed < run_tab[i].frequency_ms) { run_tab[i].awaiting = run_tab[i].frequency_ms - effective_passed; } else if(effective_passed > 0) { backed_up=1; if(run_tab[i].stack_up) { /*--stack up logic--*/ run_tab[i].awaiting=0; run_tab[i].deficit = effective_passed - run_tab[i].frequency_ms; } else { run_tab[i].awaiting=0; } } if(run_tab[i].oneshot) { run_tab[i].cb = NULL; run_tab[i].ud = NULL; } task2run(run_tab[i].ud); } else { run_tab[i].awaiting -= effective_passed; } /*--deal with SLOW,LONG running callbacks vs for_max_ms "run for" issue--*/ if(time_passed(right_now,gettime_ms())>for_max_ms)break; } return backed_up; } void taskmgr_run(unsigned for_max_ms){ unsigned total_passed=0; unsigned initial_moment = gettime_ms(); int backed_up = one_loop(for_max_ms); if(for_max_ms > 0) { while(backed_up) { total_passed=time_passed(initial_moment,gettime_ms()); if(total_passed>=for_max_ms) break; backed_up=one_loop(total_passed < for_max_ms ? for_max_ms - total_passed : 1); } } }