void POSCALL nosInit(POSTASKFUNC_t firstfunc, void *funcarg, VAR_t priority, UINT_t taskStackSize, UINT_t idleStackSize) { #if POSCFG_TASKSTACKTYPE == 0 void *stk_task1, *stk_idle; #endif taskparams_g.func = firstfunc; taskparams_g.arg = funcarg; #if (NOSCFG_FEATURE_MEMALLOC != 0) && (NOSCFG_MEM_MANAGER_TYPE == 1) nos_initMem(); #endif #if POSCFG_TASKSTACKTYPE == 0 if (taskStackSize == 0) taskStackSize = NOSCFG_DEFAULT_STACKSIZE; if (idleStackSize == 0) idleStackSize = NOSCFG_DEFAULT_STACKSIZE; stk_task1 = NOS_MEM_ALLOC(NOSCFG_STKMEM_RESERVE + taskStackSize); stk_idle = NOS_MEM_ALLOC(NOSCFG_STKMEM_RESERVE + idleStackSize); if ((stk_task1 != NULL) && (stk_idle != NULL)) { #if NOSCFG_STACK_GROWS_UP == 0 posInit(nano_init, stk_task1, priority, (void*) (((MEMPTR_t)stk_task1) + taskStackSize - (NOSCFG_STKMEM_RESERVE + 1)), (void*) (((MEMPTR_t)stk_idle) + idleStackSize - (NOSCFG_STKMEM_RESERVE + 1)) ); #else posInit(nano_init, stk_task1, priority, (void*) (((MEMPTR_t)stk_task1) + NOSCFG_STKMEM_RESERVE), (void*) (((MEMPTR_t)stk_idle) + NOSCFG_STKMEM_RESERVE) ); #endif } #elif POSCFG_TASKSTACKTYPE == 1 if (taskStackSize == 0) taskStackSize = NOSCFG_DEFAULT_STACKSIZE; if (idleStackSize == 0) idleStackSize = NOSCFG_DEFAULT_STACKSIZE; posInit(nano_init, NULL, priority, taskStackSize, idleStackSize); #elif POSCFG_TASKSTACKTYPE == 2 (void) taskStackSize; (void) idleStackSize; posInit(nano_init, NULL, priority); #endif }
VAR_t p_pos_initTask(POSTASK_t task, UINT_t stacksize, POSTASKFUNC_t funcptr, void *funcarg) { unsigned int z; stacksize = STACK_ALIGN_UP(stacksize); task->stack = NOS_MEM_ALLOC(stacksize); if (task->stack == NULL) return -1; task->stackSize = stacksize; #if POSCFG_ARGCHECK > 1 nosMemSet(task->stack, PORT_STACK_MAGIC, stacksize); #endif z = (unsigned int) task->stack + stacksize; constructStackFrame(task, (void*) z, funcptr, funcarg); return 0; }