nOS_Error nOS_ThreadSuspendAll (void) { nOS_Error err; nOS_StatusReg sr; #if (NOS_CONFIG_SAFE > 0) #if (NOS_CONFIG_SCHED_LOCK_ENABLE > 0) /* Can't suspend all threads from any thread (except idle) when scheduler is locked */ if ((nOS_lockNestingCounter > 0) && (nOS_runningThread != &nOS_idleHandle)) { err = NOS_E_LOCKED; } else #endif #endif { nOS_EnterCritical(sr); nOS_WalkInList(&nOS_allThreadsList, _SuspendThread, NULL); if (nOS_runningThread != &nOS_idleHandle) { nOS_Schedule(); } nOS_LeaveCritical(sr); err = NOS_OK; } return err; }
void nOS_TimerProcess (void) { if (nOS_SemTake (&_timerSem, #if (NOS_CONFIG_TIMER_THREAD_ENABLE > 0) NOS_WAIT_INFINITE #else NOS_NO_WAIT #endif ) == NOS_OK) { nOS_WalkInList(&_timerList, _TickTimer, NULL); } }
nOS_Error nOS_ThreadResumeAll (void) { nOS_StatusReg sr; #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) && (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) bool sched = false; #endif nOS_EnterCritical(sr); #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) && (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) nOS_WalkInList(&nOS_allThreadsList, _ResumeThread, &sched); #else nOS_WalkInList(&nOS_allThreadsList, _ResumeThread, NULL); #endif #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) && (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) if (sched) { nOS_Schedule(); } #endif nOS_LeaveCritical(sr); return NOS_OK; }
void nOS_TimeTick (void) { nOS_EnterCritical(); #if (NOS_CONFIG_TIME_TICKS_PER_SECOND > 1) _timePrescaler++; _timePrescaler %= NOS_CONFIG_TIME_TICKS_PER_SECOND; if (_timePrescaler == 0) #endif { _timeCounter++; #if (NOS_CONFIG_TIME_WAIT_ENABLE > 0) nOS_WalkInList(&_timeEvent.waitList, _TickTime, NULL); #endif } nOS_LeaveCritical(); }
nOS_Error nOS_FlagSend (nOS_Flag *flag, nOS_FlagBits flags, nOS_FlagBits mask) { nOS_Error err; nOS_StatusReg sr; nOS_FlagResult res; #if (NOS_CONFIG_SAFE > 0) if (flag == NULL) { err = NOS_E_INV_OBJ; } else #endif { res.rflags = NOS_FLAG_NONE; #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) && (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) res.sched = false; #endif nOS_EnterCritical(sr); #if (NOS_CONFIG_SAFE > 0) if (flag->e.type != NOS_EVENT_FLAG) { err = NOS_E_INV_OBJ; } else #endif { flag->flags ^= ((flag->flags ^ flags) & mask); nOS_WalkInList(&flag->e.waitList, _TestFlag, &res); /* Clear all flags that have awoken the waiting threads. */ flag->flags &=~ res.rflags; #if (NOS_CONFIG_HIGHEST_THREAD_PRIO > 0) && (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) /* Schedule only if one of awoken thread has an higher priority. */ if (res.sched) { nOS_Schedule(); } #endif err = NOS_OK; } nOS_LeaveCritical(sr); } return err; }
nOS_Error nOS_FlagSend (nOS_Flag *flag, nOS_FlagBits flags, nOS_FlagBits mask) { nOS_Error err; nOS_StatusReg sr; nOS_FlagBits res; #if (NOS_CONFIG_SAFE > 0) if (flag == NULL) { err = NOS_E_INV_OBJ; } else #endif { nOS_EnterCritical(sr); #if (NOS_CONFIG_SAFE > 0) if (flag->e.type != NOS_EVENT_FLAG) { err = NOS_E_INV_OBJ; } else #endif { flag->flags ^= ((flag->flags ^ flags) & mask); res = NOS_FLAG_NONE; nOS_WalkInList(&flag->e.waitList, _TestFlag, &res); /* Clear all flags that have awoken the waiting threads. */ flag->flags &=~ res; #if (NOS_CONFIG_SCHED_PREEMPTIVE_ENABLE > 0) nOS_Schedule(); #endif err = NOS_OK; } nOS_LeaveCritical(sr); } return err; }