static void nrfx_rng_handler(uint8_t rng_val) { NRF_DRV_RNG_LOCK(); if (!NRF_DRV_RNG_SD_IS_ENABLED()) { UNUSED_RETURN_VALUE(nrf_queue_push(&m_rand_pool, &rng_val)); if (nrf_queue_is_full(&m_rand_pool)) { nrfx_rng_stop(); } NRF_LOG_DEBUG("Event: NRF_RNG_EVENT_VALRDY."); } NRF_DRV_RNG_RELEASE(); }
ret_code_t nrf_queue_push(nrf_queue_t const * p_queue, void const * p_element) { ret_code_t status = NRF_SUCCESS; ASSERT(p_queue != NULL); ASSERT(p_element != NULL); CRITICAL_REGION_ENTER(); bool is_full = nrf_queue_is_full(p_queue); if (!is_full || (p_queue->mode == NRF_QUEUE_MODE_OVERFLOW)) { // Get write position. size_t write_pos = p_queue->p_cb->back; p_queue->p_cb->back = nrf_queue_next_idx(p_queue, p_queue->p_cb->back); if (is_full) { // Overwrite the oldest element. p_queue->p_cb->front = nrf_queue_next_idx(p_queue, p_queue->p_cb->front); } // Write a new element. switch (p_queue->element_size) { case sizeof(uint8_t): ((uint8_t *)p_queue->p_buffer)[write_pos] = *((uint8_t *)p_element); break; case sizeof(uint16_t): ((uint16_t *)p_queue->p_buffer)[write_pos] = *((uint16_t *)p_element); break; case sizeof(uint32_t): ((uint32_t *)p_queue->p_buffer)[write_pos] = *((uint32_t *)p_element); break; case sizeof(uint64_t): ((uint64_t *)p_queue->p_buffer)[write_pos] = *((uint64_t *)p_element); break; default: memcpy((void *)((size_t)p_queue->p_buffer + write_pos * p_queue->element_size), p_element, p_queue->element_size); break; } // Update utilization. size_t utilization = queue_utilization_get(p_queue); if (p_queue->p_cb->max_utilization < utilization) { p_queue->p_cb->max_utilization = utilization; } } else { status = NRF_ERROR_NO_MEM; } CRITICAL_REGION_EXIT(); return status; }