My code bluetooth module hangs if I use flash storage functions inside the ble_evt_handler. I am using the functions from the fstorage example in peripheral folder.
I turned on debug, connected to module, updated the value and then it hangs and no matter what I do it does not return to normal, but the debug says that its still running. From the looks it does not even enter the ble_evt_handler (I know this from the Log command).
The code is below:
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) //This function here handles any event that comes, just add the event name and fill in what you want to do when the event occurs.
{
ret_code_t err_code = NRF_SUCCESS;
NRF_LOG_INFO("Got an Event!"); //To check if it comes here
switch (p_ble_evt->header.evt_id)
{
case BLE_GATTS_EVT_WRITE:
{
nrf_fstorage_api_t * p_fs_api;
p_fs_api = &nrf_fstorage_sd;
#ifdef SOFTDEVICE_PRESENT
NRF_LOG_INFO("SoftDevice is present.");
NRF_LOG_INFO("Initializing nrf_fstorage_sd implementation...");
/* Initialize an fstorage instance using the nrf_fstorage_sd backend.
* nrf_fstorage_sd uses the SoftDevice to write to flash. This implementation can safely be
* used whenever there is a SoftDevice, regardless of its status (enabled/disabled). */
p_fs_api = &nrf_fstorage_sd;
#else
NRF_LOG_INFO("SoftDevice not present.");
NRF_LOG_INFO("Initializing nrf_fstorage_nvmc implementation...");
/* Initialize an fstorage instance using the nrf_fstorage_nvmc backend.
* nrf_fstorage_nvmc uses the NVMC peripheral. This implementation can be used when the
* SoftDevice is disabled or not present.
*
* Using this implementation when the SoftDevice is enabled results in a hardfault. */
p_fs_api = &nrf_fstorage_nvmc;
#endif
err_code = nrf_fstorage_init(&fstorage, p_fs_api, NULL);
APP_ERROR_CHECK(err_code);
NRF_LOG_INFO("Initializing nrf_fstorage_sd implementation...");
/* Let's write to flash. */
NRF_LOG_INFO("Writing \"%x\" to flash.", p_data);
err_code = nrf_fstorage_write(&fstorage, 0x3e100, &p_data, length, NULL);
APP_ERROR_CHECK(err_code);
//Waiting for operation to complete
wait_for_flash_ready(&fstorage);
NRF_LOG_INFO("Done.");
//-----------------Testing - Reading----------------------
char m_hello_world[] = "hello world";
err_code = nrf_fstorage_read(&fstorage, 0x3e100, m_hello_world, length);
APP_ERROR_CHECK(err_code);
NRF_LOG_INFO("Reading \"%x\" to flash.", m_hello_world);
wait_for_flash_ready(&fstorage);
//--------------------------------------------------------
}
}If I comment out the flash storage function (write and read) it works as it should.Any leads would greatly be appreciated. (Do lemme know if additional information is required)
Edit 1: If I run this program in the main before the while loop, it works fine but I require it in the run time.
This works fine:
int main(void)
{
bool erase_bonds;
log_init();
timers_init();
buttons_leds_init(&erase_bonds);
power_management_init();
ble_stack_init(); //Here the BLE stack is initialized
adc_configure(); //ADC for checking the battery
gap_params_init();
gatt_init();
advertising_init(); //Making the iBeacon packet and the Data (major minor UUID etc) into a structure and passing it
db_discovery_init(); //Commented this AUAK
services_init(); //Initializing the services
conn_params_init();
peer_manager_init();
//-------------Flash!-----------------------------
Flash_Test();
//-----------------------------------------
// Start execution.
NRF_LOG_INFO("Beacon Start!.");
advertising_start(erase_bonds);
tx_power_set();
// Enter main loop.
for (;;)
{
idle_state_handle();
}
}
But does not work if I am using it in run-time (also tried to do it via raising a flag and executing the commands in timer but that did not work either.