Problem running LESC on nRF5 SDK with App Scheduler running

Hi there,

I have a project developed in SES, using nRF5 SDK v15.3.0 with only Just Works security without using LESC running on nRF52840. It has been running fine for 2 years. Recently, I have upgraded it to nRF5 SDK v17.1.0. Everything works fine.

Now we need to improve the security by adding LESC support.

I modify the code using the Glucose Application and (experimental) LE Secure Connections Multirole Example as reference.

1. sdk_config.h:
#define PM_LESC_ENABLED 1
#define NRF_BLE_LESC_ENABLED 1
2. Define the security parameters
3. Add nrf_ble_lesc_request_handler() in idle_state_handle(void) inside the main loop.

#define SEC_PARAM_BOND                  1                       /**< Perform bonding. */
#define SEC_PARAM_MITM                  0                       /**< Man In The Middle protection required. */
#define SEC_PARAM_LESC                  1                       /**< LE Secure Connections enabled. */
#define SEC_PARAM_KEYPRESS              0                       /**< Keypress notifications not enabled. */
#define SEC_PARAM_IO_CAPABILITIES       BLE_GAP_IO_CAPS_NONE    /**< Display I/O capabilities. */
#define SEC_PARAM_OOB                   0                       /**< Out Of Band data not available. */
#define SEC_PARAM_MIN_KEY_SIZE          7                       /**< Minimum encryption key size. */
#define SEC_PARAM_MAX_KEY_SIZE          16                      /**< Maximum encryption key size. */

#define PASSKEY_TXT                     "Passkey:"              /**< Message to be displayed together with the pass-key. */
#define PASSKEY_TXT_LENGTH              8                       /**< Length of message to be displayed together with the pass-key. */
#define PASSKEY_LENGTH                  6                       /**< Length of pass-key received by the stack for display. */

//......

static void idle_state_handle(void) {
    ret_code_t err_code;

    err_code = nrf_ble_lesc_request_handler();
    APP_ERROR_CHECK(err_code);

    app_sched_execute();
    if (NRF_LOG_PROCESS() == false)
    {
        nrf_pwr_mgmt_run();
    }
}

However, when the program is loaded on the target board, it always runs into a hard fault during bebug. The biggest difference with these examples is that I have used the App scheduler. The reason I use App scheduler is that a hardware interrupt takes quite some time to process. I don't want it to cause any issue to the soft device.

Is app scheduler not able to use with LESC? Any suggestions for me to modify / debug the code?

Thank you!

----------------

Hi there,

I did further investigation by modifying the Glucose Monitor example.  Below is what I did to check if app scheduler can be used.

1. Add #include "app_scheduler.h"

2. Add below code

void check_if_put_bmr_to_sleep_seh(void *p_ev_data, uint16_t ev_size) {
    NRF_LOG_INFO("Reached 30 seconds! Reset clock counter to ZERO!");
}

/**@brief Function to check if bmr should be put to sleep
 *
 * @details if m_clock_cnt >= 30; reset m_clock_cnt = 0; 
*/
void check_if_put_bmr_to_sleep() {
    ret_code_t  err_code;
    if (m_clock_cnt >= 30) {
        m_clock_cnt = 0;

        err_code = app_sched_event_put(0,0,check_if_put_bmr_to_sleep_seh);
        APP_ERROR_CHECK(err_code);
    }
}

/**@brief Function for the 1 second clock emulation.
 *
 * @details Run every 1 second, post status, determine ultra low power shutdown, determine timeout shutdown during operations
 */
void clock_em_eh(void *p_context) {
    UNUSED_PARAMETER(p_context);
    m_clock_cnt++;
    check_if_put_bmr_to_sleep();

}

/**@brief Function for starting application timers.
 */
static void application_timers_start(void)
{
    ret_code_t err_code;

    // Start application timers.
    err_code = app_timer_start(m_battery_timer_id, BATTERY_LEVEL_MEAS_INTERVAL, NULL);
    APP_ERROR_CHECK(err_code);

    // Start clock emulation timer
    err_code = app_timer_start(clock_em_tid, APP_TIMER_TICKS(1000), NULL);
    m_clock_cnt = 0; 
    APP_ERROR_CHECK(err_code);
}

3. After I started debugging in SES, I got the DH_key and had completed the connection.  However, once the "app_sched_event_put(0,0,check_if_put_bmr_to_sleep_seh)" was executed the hardfault error (timer_expire) came out. 

4.  Does it imply that the app scheduler cannot be used with the lesc request handler?  

5.  In my project, I am using fstorage library to save 2 pages of data to flash upon completion of certain operations.  Currently, I put the "save flash" operation in a function in the app scheduler queue.  I also have an interrupt routine which may take up to 100 milliseconds to complete in the app scheduler queue.  If the app scheduler cannot be used with lesc, and if I want to stay using nRF SDK, is there any good way to achieve it?

Thank you!

Related