nOS_Error nOS_TimerCreate (nOS_Timer *timer, nOS_TimerCallback callback, void *arg, nOS_TimerCounter reload, nOS_TimerMode mode) { nOS_Error err; #if (NOS_CONFIG_SAFE > 0) if (timer == NULL) { err = NOS_E_INV_OBJ; } else if (timer->state != NOS_TIMER_DELETED) { err = NOS_E_INV_OBJ; } else if ((mode != NOS_TIMER_FREE_RUNNING) && (mode != NOS_TIMER_ONE_SHOT)) { err = NOS_E_INV_VAL; } else #endif { timer->count = 0; timer->reload = reload; timer->state = (nOS_TimerState)(NOS_TIMER_CREATED | (nOS_TimerState)(mode & NOS_TIMER_MODE)); timer->callback = callback; timer->arg = arg; timer->node.payload = (void *)timer; nOS_EnterCritical(); nOS_AppendToList(&_timerList, &timer->node); nOS_LeaveCritical(); err = NOS_OK; } return err; }
nOS_Error nOS_SignalSend (nOS_Signal *signal, void *arg) { nOS_Error err; nOS_StatusReg sr; #if (NOS_CONFIG_SAFE > 0) if (signal == NULL) { err = NOS_E_INV_OBJ; } else #endif { nOS_EnterCritical(sr); #if (NOS_CONFIG_SAFE > 0) if (signal->state == NOS_SIGNAL_DELETED) { err = NOS_E_INV_OBJ; } else #endif { if (signal->state & NOS_SIGNAL_RAISED) { err = NOS_E_OVERFLOW; } else { signal->state = (nOS_SignalState)(signal->state | NOS_SIGNAL_RAISED); signal->arg = arg; nOS_AppendToList(&_signalList, &signal->node); err = nOS_SemGive(&_signalSem); if (err != NOS_OK) { signal->state = (nOS_SignalState)(signal->state &~ NOS_SIGNAL_RAISED); nOS_RemoveFromList(&_signalList, &signal->node); } } } nOS_LeaveCritical(sr); } return err; }
nOS_Error nOS_ThreadCreate (nOS_Thread *thread, nOS_ThreadEntry entry, void *arg, nOS_Stack *stack, size_t ssize #ifdef NOS_USE_SEPARATE_CALL_STACK ,size_t cssize #endif #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) ,uint8_t prio #endif #if (NOS_CONFIG_THREAD_SUSPEND_ENABLE > 0) ,nOS_ThreadState state #endif #if (NOS_CONFIG_THREAD_NAME_ENABLE > 0) ,const char *name #endif ) { nOS_Error err; nOS_StatusReg sr; #if (NOS_CONFIG_SAFE > 0) if (thread == NULL) { err = NOS_E_INV_OBJ; } else if (thread == &nOS_idleHandle) { err = NOS_E_INV_OBJ; } else if (entry == NULL) { err = NOS_E_INV_VAL; } else if (stack == NULL) { err = NOS_E_INV_VAL; } else #ifndef NOS_SIMULATED_STACK if (ssize == 0) { err = NOS_E_INV_VAL; } else #endif #ifdef NOS_USE_SEPARATE_CALL_STACK if (cssize == 0) { err = NOS_E_INV_VAL; } else #endif #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) if (prio > NOS_CONFIG_HIGHEST_THREAD_PRIO) { err = NOS_E_INV_PRIO; } else #endif #if (NOS_CONFIG_THREAD_SUSPEND_ENABLE > 0) if ((state != NOS_THREAD_READY) && (state != NOS_THREAD_SUSPENDED)) { err = NOS_E_INV_STATE; } else #endif #endif { nOS_EnterCritical(sr); #if (NOS_CONFIG_SAFE > 0) if (thread->state != NOS_THREAD_STOPPED) { err = NOS_E_INV_OBJ; } else #endif { #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) thread->prio = prio; #endif thread->state = NOS_THREAD_READY; #if (NOS_CONFIG_THREAD_SUSPEND_ENABLE > 0) if (state == NOS_THREAD_SUSPENDED) { thread->state = (nOS_ThreadState)(thread->state | NOS_THREAD_SUSPENDED); } #endif thread->event = NULL; thread->ext = NULL; #if (NOS_CONFIG_THREAD_NAME_ENABLE > 0) thread->name = name; #endif thread->error = NOS_OK; thread->readyWait.payload = thread; #if (NOS_CONFIG_WAITING_TIMEOUT_ENABLE > 0) || (NOS_CONFIG_SLEEP_ENABLE > 0) || (NOS_CONFIG_SLEEP_UNTIL_ENABLE > 0) thread->tout.payload = thread; thread->timeout = 0; #endif #if (NOS_CONFIG_THREAD_SUSPEND_ALL_ENABLE > 0) thread->node.payload = thread; nOS_AppendToList(&nOS_allThreadsList, &thread->node); #endif nOS_InitContext(thread, stack, ssize #ifdef NOS_USE_SEPARATE_CALL_STACK ,cssize #endif ,entry, arg); #if (NOS_CONFIG_THREAD_SUSPEND_ENABLE > 0) if (thread->state == NOS_THREAD_READY) #endif { nOS_AppendThreadToReadyList(thread); #if (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) if (prio > nOS_runningThread->prio) { nOS_Schedule(); } #endif } err = NOS_OK; } nOS_LeaveCritical(sr); } return err; }