This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Softdevice event handler continuously called with NRF_EVT_RADIO_BLOCKED

I've got another question concerning a timeslot application.

In our timeslot application which is based on the nRF Mesh SDK timeslot.c implementation I noticed that if a BLE connection is active with a connection interval of 7.5ms, the softdevice did not grant any timeslots. I noticed that the cause of this was that the requested timeslot length requested at the end of a timeslot was 14000us and therefore too long to fit into the 7.5ms connection interval. This resultd in the timeslot being canceled via invocation of the softdevice event handler with NRF_EVT_RADIO_CANCELED.

The handling of this event was a call to sd_radio_request() but using the same parameters that were canceled. This resulted in the softdevice event handler being called repeatedly with NRF_EVT_RADIO_CANCELED until either the BLE connection parameters were changed or the central disconnected.

To avert this behaviour I changed the request parameters to the values that were used in case of a NRF_EVT_RADIO_BLOCKED:

m_radio_request_earliest.request_type               = NRF_RADIO_REQ_TYPE_EARLIEST;
m_radio_request_earliest.params.earliest.hfclk      = NRF_RADIO_HFCLK_CFG_NO_GUARANTEE;
m_radio_request_earliest.params.earliest.priority   = NRF_RADIO_PRIORITY_NORMAL;
m_radio_request_earliest.params.earliest.length_us  = 3800;
m_radio_request_earliest.params.earliest.timeout_us = 15000;

This resulted in the timeslot being granted again after NRF_EVT_RADIO_CANCELED occurred.

I then realised that after changing the connection interval to 50ms with a slave latency of 2, timeslots get repeatedly blocked for a duration of 5ms (during the connection event) and only then are they being granted again. See the following chart:

I thought this behaviour looks odd and inefficient. Ideally, I expect the softdevice to not invoke the BLOCKED event, since the timeout - from my understanding - should only occur after 15000us? Invoking sd_radio_request() when handling the BLOCKED event with a length_us of 3800 and a timeout_us of 14000, I definitely don't expect the event handler to be invoked every ~50us!

So I tried to play around with the timeout_us parameter of the nrf_radio_request_t structure, but did not find a viable solution, in fact I only made it worse. When increasing the timeout_us e.g. to 50000, I noticed that the described behaviour occurs for a bit and then disappears, but the timeslot is only started after a total downtime of about 50ms! This drastically reduces the availability of our proprietary radio protocol.

  • Is there a clean way to avert these continuous BLOCKED events while still maximising timeslot duration?
  • Can you elaborate on the difference between the BLOCKED and CANCELED events?
  • What implications does/should changing the timeout of a radio request have?

By the way, this is all on an nRF52832 running S132 7.2.0.

Parents
  • Hi Michael, 
    If you have a look at the documentation of the softdevice (SDS) you can find this scheduling properties: 

    According to this if you request the timeslot at NORMAL priority it will have lower priority than the connection activity, meaning that if the timeslot doesn't fit entirely inside a period when there is no connection event (calculated by the event length reserved) it will get cancelled. 

    Please try to test again with the priority set to HIGH. 

    However, I couldn't explain why you get the event every 50us. We may need to look into your code to see why. 

    You can have a look at my example code here

    I attached the logic trace in my test here when the device first advertised, then entered a connection with interval = 7.5ms after 5 seconds the interval changed to 750ms. You can find the timeslot got cancelled multiple times, but still it get some slots in between. 

    1 MHz, 20 M Samples [9].logicdata

  • Hi Hung Bui,

    Thank you for your response.

    According to this if you request the timeslot at NORMAL priority it will have lower priority than the connection activity, meaning that if the timeslot doesn't fit entirely inside a period when there is no connection event (calculated by the event length reserved) it will get cancelled. 

    I was aware of the above table, thanks. I think you helped me understand the difference between BLOCKED and CANCELED better, still, could you confirm that I got this right:

    • BLOCKED: the request with sd_radio_request() or via return value of the signal callback could not be granted within the provided timeout?
    • CANCELED: the softdevice originally intended to grant the requested timeslot - i.e. but at the point where it should have started, it could not grant it because an event of higher priority (e.g. BLE event when timeslot priority is normal) needs to be served during the timeslot.

    So that means from the callers perspective what happens is actually similar, but the two events are raised at different "stages" in the softdevice's scheduling.

    Is this right?

    Please try to test again with the priority set to HIGH. 

    This does not change the observed behaviour.

    However, I couldn't explain why you get the event every 50us. We may need to look into your code to see why. 

    "My code" for the timeslot implementation is actually the timeslot.c implementation from nRF SDK for Mesh 4.2.0.

    I did just play around with examples\sdk_coexist\ble_app_proximity_coexist in the nRF SDK for Mesh 4.2.0 and stumbled upon one change that I made that seems to be the cause of all my issues:

    Because we usually have the HFCLK running, I changed the hfclk parameter in the radio request to NRF_RADIO_HFCLK_CFG_NO_GUARANTEE. The change was prompted because I was afraid, that we could run into the issue described here. Therefore I implemented this as a temporary workaround.

    With the hfclk parameter set to NRF_RADIO_HFCLK_CFG_NO_GUARANTEE, the softdevice stops granting me timeslots when the connection interval is only 7.5ms. This is the behaviour I observed and described above and I followed this by changing the requests. But I could not reproduce the behaviour with the continuous calls of the softdevice event handler - even when updating to S132 7.2.0.

    So, maybe there is still something in our application that somehow interferes. Unfortunately I can't publicly share the application's source code here.

Reply
  • Hi Hung Bui,

    Thank you for your response.

    According to this if you request the timeslot at NORMAL priority it will have lower priority than the connection activity, meaning that if the timeslot doesn't fit entirely inside a period when there is no connection event (calculated by the event length reserved) it will get cancelled. 

    I was aware of the above table, thanks. I think you helped me understand the difference between BLOCKED and CANCELED better, still, could you confirm that I got this right:

    • BLOCKED: the request with sd_radio_request() or via return value of the signal callback could not be granted within the provided timeout?
    • CANCELED: the softdevice originally intended to grant the requested timeslot - i.e. but at the point where it should have started, it could not grant it because an event of higher priority (e.g. BLE event when timeslot priority is normal) needs to be served during the timeslot.

    So that means from the callers perspective what happens is actually similar, but the two events are raised at different "stages" in the softdevice's scheduling.

    Is this right?

    Please try to test again with the priority set to HIGH. 

    This does not change the observed behaviour.

    However, I couldn't explain why you get the event every 50us. We may need to look into your code to see why. 

    "My code" for the timeslot implementation is actually the timeslot.c implementation from nRF SDK for Mesh 4.2.0.

    I did just play around with examples\sdk_coexist\ble_app_proximity_coexist in the nRF SDK for Mesh 4.2.0 and stumbled upon one change that I made that seems to be the cause of all my issues:

    Because we usually have the HFCLK running, I changed the hfclk parameter in the radio request to NRF_RADIO_HFCLK_CFG_NO_GUARANTEE. The change was prompted because I was afraid, that we could run into the issue described here. Therefore I implemented this as a temporary workaround.

    With the hfclk parameter set to NRF_RADIO_HFCLK_CFG_NO_GUARANTEE, the softdevice stops granting me timeslots when the connection interval is only 7.5ms. This is the behaviour I observed and described above and I followed this by changing the requests. But I could not reproduce the behaviour with the continuous calls of the softdevice event handler - even when updating to S132 7.2.0.

    So, maybe there is still something in our application that somehow interferes. Unfortunately I can't publicly share the application's source code here.

Children
No Data
Related