Exemplo n.º 1
0
struct os_event *
os_eventq_get(struct os_eventq *evq)
{
    struct os_event *ev;
    os_sr_t sr;

    OS_ENTER_CRITICAL(sr);
pull_one:
    ev = STAILQ_FIRST(&evq->evq_list);
    if (ev) {
        STAILQ_REMOVE(&evq->evq_list, ev, os_event, ev_next);
        ev->ev_queued = 0;
    } else {
        evq->evq_task = os_sched_get_current_task();
        os_sched_sleep(evq->evq_task, OS_TIMEOUT_NEVER);
        OS_EXIT_CRITICAL(sr);

        os_sched(NULL, 0);

        OS_ENTER_CRITICAL(sr);
        evq->evq_task = NULL;
        goto pull_one;
    }
    OS_EXIT_CRITICAL(sr);

    return (ev);
}
Exemplo n.º 2
0
void
os_eventq_put2(struct os_eventq *evq, struct os_event *ev, int isr)
{
    int resched;
    os_sr_t sr;

    OS_ENTER_CRITICAL(sr);

    /* Do not queue if already queued */
    if (OS_EVENT_QUEUED(ev)) {
        OS_EXIT_CRITICAL(sr);
        return;
    }

    /* Queue the event */
    ev->ev_queued = 1;
    STAILQ_INSERT_TAIL(&evq->evq_list, ev, ev_next);

    /* If task waiting on event, wake it up. */
    resched = 0;
    if (evq->evq_task) {
        os_sched_wakeup(evq->evq_task);
        evq->evq_task = NULL;
        resched = 1;
    }

    OS_EXIT_CRITICAL(sr);

    if (resched) {
        os_sched(NULL, isr);
    }
}
void
timer_handler(void)
{
    os_time_tick();
    os_callout_tick();
    os_sched_os_timer_exp();
    os_sched(NULL);
}
static uint32_t
nrf52_trng_get_u32(struct trng_dev *trng)
{
    union {
        uint32_t v32;
        uint8_t v8[4];
    } val;
    size_t num;

    num = nrf52_trng_read(trng, &val.v8, sizeof(val.v8));
    while (num < sizeof(val.v8)) {
        os_sched(NULL);
        num += nrf52_trng_read(trng, &val.v8[num], sizeof(val.v8) - num);
    }

    return val.v32;
}