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); }
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; }