void vPortEnterCritical( void ) { uint8_t IS_NESTED_CRITICAL_REGION = ++uxCriticalNesting > 1 ? 1 : 0; uint32_t err_code = sd_nvic_critical_region_enter(&IS_NESTED_CRITICAL_REGION); if (err_code == NRF_ERROR_SOFTDEVICE_NOT_ENABLED) { __disable_irq(); } else { APP_ERROR_CHECK(err_code); } }
void app_util_critical_region_enter(uint8_t *p_nested) { #ifdef NRF52 ASSERT(APP_LEVEL_PRIVILEGED == privilege_level_get()) #endif #if defined(SOFTDEVICE_PRESENT) /* return value can be safely ignored */ (void) sd_nvic_critical_region_enter(p_nested); #else app_util_disable_irq(); #endif }
void nrf51822_int_disable(void) { uint8_t IS_NESTED_CRITICAL_REGION = 0; uint32_t err_code = sd_nvic_critical_region_enter(&IS_NESTED_CRITICAL_REGION); if (err_code == NRF_ERROR_SOFTDEVICE_NOT_ENABLED) { //__disable_irq(); } if(IS_NESTED_CRITICAL_REGION) { critical_region_nested_cnt++; } }
void core_util_critical_section_enter() { // if a critical section has already been entered, just update the counter if (_entry_count) { ++_entry_count; return; } // in this path, a critical section has never been entered // routine of SD V11 work even if the softdevice is not active sd_nvic_critical_region_enter(&_sd_state); assert(_entry_count == 0); // entry count should always be equal to 0 at this point ++_entry_count; }
/**@snippet [Handling the data received over BLE] */ static void ossw_data_handler(ble_ossw_t * p_ossw, uint8_t * p_data, uint16_t length) { #ifdef OSSW_DEBUG sd_nvic_critical_region_enter(0); printf("DAT: 0x%02x 0x%02x 0x%02x\r\n", p_data[0], p_data[1], p_data[2]); sd_nvic_critical_region_exit(0); #endif switch(p_data[0]) { case 0x01: scr_mngr_handle_event(SCR_EVENT_APP_CONNECTION_CONFIRMED, NULL); break; case 0x10: // set current time rtc_set_current_time(((uint32_t)p_data[1]<<24) | ((uint32_t)p_data[2]<<16) | ((uint32_t)p_data[3]<<8) | (uint32_t)p_data[4]); break; case 0x40: // command first part command_reset_data(); command_append_data(p_data+1, length-1); break; case 0x41: // command next part command_append_data(p_data+1, length-1); break; case 0x42: // command last part command_append_data(p_data+1, length-1); command_data_complete(); break; case 0x43: // command first and last part command_reset_data(); command_append_data(p_data+1, length-1); command_data_complete(); break; } }
uint32_t spi_master_send_recv(const spi_master_hw_instance_t spi_master_hw_instance, uint8_t * const p_tx_buf, const uint16_t tx_buf_len, uint8_t * const p_rx_buf, const uint16_t rx_buf_len) { #if defined(SPI_MASTER_0_ENABLE) || defined(SPI_MASTER_1_ENABLE) volatile spi_master_instance_t * p_spi_instance = spi_master_get_instance( spi_master_hw_instance); APP_ERROR_CHECK_BOOL(p_spi_instance != NULL); uint32_t err_code = NRF_SUCCESS; uint16_t max_length = 0; uint8_t nested_critical_region = 0; //Check if disable all IRQs flag is set if (p_spi_instance->disable_all_irq) { //Disable interrupts. APP_ERROR_CHECK(sd_nvic_critical_region_enter(&nested_critical_region)); } else { //Disable interrupt SPI. APP_ERROR_CHECK(sd_nvic_DisableIRQ(p_spi_instance->irq_type)); } //Initialize and perform data transfer if (p_spi_instance->state == SPI_MASTER_STATE_IDLE) { max_length = (rx_buf_len > tx_buf_len) ? rx_buf_len : tx_buf_len; if (max_length > 0) { p_spi_instance->state = SPI_MASTER_STATE_BUSY; p_spi_instance->bytes_count = 0; p_spi_instance->started_flag = false; p_spi_instance->max_length = max_length; /* Initialize buffers */ spi_master_buffer_init(p_tx_buf, tx_buf_len, &(p_spi_instance->p_tx_buffer), &(p_spi_instance->tx_length), &(p_spi_instance->tx_index)); spi_master_buffer_init(p_rx_buf, rx_buf_len, &(p_spi_instance->p_rx_buffer), &(p_spi_instance->rx_length), &(p_spi_instance->rx_index)); nrf_gpio_pin_clear(p_spi_instance->pin_slave_select); spi_master_send_initial_bytes(p_spi_instance); } else { err_code = NRF_ERROR_INVALID_PARAM; } } else { err_code = NRF_ERROR_BUSY; } //Check if disable all IRQs flag is set. if (p_spi_instance->disable_all_irq) { //Enable interrupts. APP_ERROR_CHECK(sd_nvic_critical_region_exit(nested_critical_region)); } else { //Enable SPI interrupt. APP_ERROR_CHECK(sd_nvic_EnableIRQ(p_spi_instance->irq_type)); } return err_code; #else return NRF_ERROR_NOT_SUPPORTED; #endif }