static void task_softint(void *arg) { UVAR_t intno = (UVAR_t) arg; JIF_t now, exptime; UVAR_t c; c = 0; now = jiffies; for (;;) { /* do busy waiting for 1 2/3 seconds */ exptime = now + HZ + (2*HZ / 3); do { now = jiffies; } while (!POS_TIMEAFTER(now, exptime)); /* rise software interrupt every 1.67 seconds */ posSoftInt(intno, 6); c++; if (c == 2) { posTaskYield(); } if (c == 3) { posTaskSleep(1); c = 0; } } }
static void pollTask(void *arg) { uint8_t *valuePtr = (uint8_t*) arg; uint8_t value = *valuePtr; for (;;) { PORTB = value; posTaskYield(); } }
NOSTASK_t POSCALL nosTaskCreate(POSTASKFUNC_t funcptr, void *funcarg, VAR_t priority, UINT_t stacksize, const char* name) { POSTASK_t task; #if NOSCFG_FEATURE_REGISTRY != 0 REGELEM_t re; #endif #if POSCFG_TASKSTACKTYPE == 0 void *stk; #endif #if NOSCFG_FEATURE_REGISTRY != 0 re = nos_regNewSysKey(REGTYPE_TASK, name == NULL ? (const char*)"t*" : name); if (re == NULL) return NULL; #else (void) name; #endif /*===============================================*/ #if POSCFG_TASKSTACKTYPE == 0 if (stacksize == 0) stacksize = NOSCFG_DEFAULT_STACKSIZE; task = NULL; stk = nosMemAlloc(NOSCFG_STKMEM_RESERVE + stacksize); if (stk != NULL) { posTaskSchedLock(); #if NOSCFG_STACK_GROWS_UP == 0 task = posTaskCreate(funcptr, funcarg, priority, (void*) (((MEMPTR_t)stk) + stacksize - (NOSCFG_STKMEM_RESERVE + 1))); #else task = posTaskCreate(funcptr, funcarg, priority, (void*) (((MEMPTR_t)stk) + NOSCFG_STKMEM_RESERVE)); #endif if (task != NULL) { task->nosstkroot = stk; task->exithook = nos_taskExitHook; #if NOSCFG_FEATURE_REGISTRY != 0 nos_regEnableSysKey(re, task); POS_SETTASKNAME(task, re->name); #else POS_SETTASKNAME(task, name); #endif } posTaskSchedUnlock(); #if POSCFG_FEATURE_SLEEP != 0 posTaskSleep(0); #elif POSCFG_FEATURE_YIELD != 0 posTaskYield(); #endif } /*-----------------------------------------------*/ #elif POSCFG_TASKSTACKTYPE == 1 if (stacksize == 0) stacksize = NOSCFG_DEFAULT_STACKSIZE; #if NOSCFG_FEATURE_REGISTRY != 0 posTaskSchedLock(); #endif task = posTaskCreate(funcptr, funcarg, priority, stacksize); #if NOSCFG_FEATURE_REGISTRY != 0 if (task != NULL) { task->exithook = nos_taskExitHook; nos_regEnableSysKey(re, task); POS_SETTASKNAME(task, re->name); } posTaskSchedUnlock(); #else POS_SETTASKNAME(task, name); #endif /*-----------------------------------------------*/ #elif POSCFG_TASKSTACKTYPE == 2 #if NOSCFG_FEATURE_REGISTRY != 0 posTaskSchedLock(); #endif (void) stacksize; task = posTaskCreate(funcptr, funcarg, priority); #if NOSCFG_FEATURE_REGISTRY != 0 if (task != NULL) { task->exithook = nos_taskExitHook; nos_regEnableSysKey(re, task); POS_SETTASKNAME(task, re->name); } posTaskSchedUnlock(); #else POS_SETTASKNAME(task, name); #endif #endif /* POSCFG_TASKSTACKTYPE == 2 */ /*===============================================*/ #if NOSCFG_FEATURE_REGISTRY != 0 if (task == NULL) { nos_regDelSysKey(REGTYPE_TASK, NULL, re); } #endif return (POSTASK_t) task; }