Exemple #1
0
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;
}
Exemple #2
0
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);
    }
}
Exemple #3
0
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;
}
Exemple #4
0
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();
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}