status_t devices_init(void) { bsp_task_init(); gpio_init(); key_init(); return OK; }
/*-----------------------------------------------------------------------*/ task_t task_create(char *name, void (*task_func)(void *), void *parm, char *stack_base, size_t stack_size, uint8_t pri, uint32_t slice, uint32_t flags) { uint32_t f; int i; struct dtask *task = NULL; if(pri >= MAX_PRIORITY_LEVEL) pri = pri/(256/MAX_PRIORITY_LEVEL); if(name == NULL || task_func == NULL) return RERROR; if(stack_size <= 100) return RERROR; /* find an unused task control block */ SYS_FSAVE(f); for(i=1; i<MAX_TASK_NUMBER; i++) { if(systask[i].state == TASK_STATE_DEAD) { task = &systask[i]; memset(task, 0, sizeof(struct dtask)); task->state = TASK_STATE_SUSPEND; break; } } SYS_FRESTORE(f); if(task == NULL) return RERROR; if(stack_base == NULL) stack_base = malloc(stack_size); else flags |= TASK_FLAGS_STATICSTACK; if(stack_base) { memset(stack_base, TASK_STACK_INIT_CHAR, stack_size); task->sp = bsp_task_init(i, task_func, parm, (char *)(stack_base+stack_size-4), task_exit); strncpy((char *)systask[i].name, name, TASK_NAME_MAX_LENGTH-1); task->flags = flags; task->priority = pri; task->pri_origin = pri; task->timeslice_all = slice; task->timeslice_left = slice; task->stack_base = stack_base; task->stack_size = stack_size; task->taskq = NULL; task->errcode = 0; task->t_delay.onexpired_func = task_timeout; task->t_delay.param[0] = i; #ifdef INCLUDE_JOURNAL journal_task_create(task); #endif #ifdef INCLUDE_PMCOUNTER PMC_PEG_COUNTER(PMC_sys32_counter[PMC_U32_nTask],1); #endif return i; } else { SYS_FSAVE(f); task->state = TASK_STATE_DEAD; SYS_FRESTORE(f); return RERROR; } }