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

issue about Ram setting and NRF_ERROR_RESOURCES:

Hi:

  I'm developing a project with  nRF 58232 in ble_app_hrs_rscs_relay example ( s132  sdk:nRF5SDK160098a08e2 ). The device need to be central and peripheral,My device worked fine as peripheral with smart phone. After that I tried to make the device  connect to the smart phone first, and then connect to other device as central. My device worked fine as  central and peripheral at first. But I got [NRF_ERROR_RESOURCES]  error after a while.

<info> app: Peer Temp.

<debug> ble_private_c: send data to peripheral

<debug> nrf_ble_gq: Adding item to the request queue

<debug> nrf_ble_gq: GATTC Write Request

<debug> nrf_ble_gq: SD GATT procedure (1) succeeded on connection handle: 0.

<debug> nrf_ble_gq: Processing the request queue...

<debug> nrf_ble_gq: Processing the request queue...

<debug> ble_private_c: Received HVX on link 0x16, hrm_handle 0x16

<debug> ble_private_c: Received HVX on link 0x16, hrm_handle 0x16

<info> app: Temp Respond.

<info> app: Peer Temp.

<debug> ble_private_c: send data to peripheral

<debug> nrf_ble_gq: Adding item to the request queue

<debug> nrf_ble_gq: GATTC Write Request

<debug> nrf_ble_gq: SD GATT procedure (1) succeeded on connection handle: 0.

<debug> nrf_ble_gq: Processing the request queue...

<debug> nrf_ble_gq: Processing the request queue...

<debug> ble_private_c: Received HVX on link 0x16, hrm_handle 0x16

<debug> ble_private_c: Received HVX on link 0x16, hrm_handle 0x16

<info> app: Temp Respond.

<error> app: ERROR 19 [NRF_ERROR_RESOURCES] at :0PC at: 0x00000000
<error> app: End of error report
 

I seeked the answer for NRF_ERROR_RESOURCES in DevZone.I found it might be caused by size of BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT or BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT. So I changed the size of both BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT  and BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT to 3. Unfortunately I got an unknown error after my device conneted to peripheral.

<info> app: Peripheral connected

<info> app: Central connected<info> app: Attempt to find Peripheral on conn_handle 0x0

<debug> nrf_ble_gq: Registering connection handle: 0x0000

<debug> ble_db_disc: Starting discovery of service with UUID 0xFF00 on connection handle 0x0.

<debug> nrf_ble_gq: Adding item to the request queue

<debug> nrf_ble_gq: GATTC Primary Services Discovery Request

<debug> nrf_ble_gq: SD GATT procedure (2) succeeded on connection handle: 0.

<info> app: Peer Connect.

<debug> nrf_ble_gq: Processing the request queue...
<debug> ble_db_disc: Found service UUID 0xFF00.<debug> nrf_ble_gq: Adding item to the request queue
<debug> nrf_ble_gq: GATTC Characteristic Discovery Request
<debug> nrf_ble_gq: SD GATT procedure (3) succeeded on connection handle: 0.

<error> app: ERROR 13313 [Unknown error code] at :0PC at: 0x00000000
<error> app: End of error report

And I haven't changed the ram setting after BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT  and  BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT were modified.If it needed to modify the ram,how much ram I need to increase in MDK setting If  I increase 1 in BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT or

 BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT  . 

Maybe I get a wrong way to fix NRF_ERROR_RESOURCES. Please tell me what do I miss.

My second problem is about the Ram setting for  __HEAP_SIZE. I had changed NRF_BLE_GQ_GATTS_HVX_MAX_DATA_LEN and NRF_BLE_GQ_GATTC_WRITE_MAX_DATA_LEN to 20.And I found gattc_write_alloc and gatts_hvx_alloc had called nrf_balloc_alloc.But __HEAP_SIZE is zero in ble_app_hrs_rscs_relay example. Did I need to change __HEAP_SIZE. If __HEAP_SIZE need to be changed, I need to change ram setting, right?My ram setting is default in ble_app_hrs_rscs_relay example.

  • Yes, I had included  Peer manager module in my project.

    // <e> PEER_MANAGER_ENABLED - peer_manager - Peer Manager
    //==========================================================
    #ifndef PEER_MANAGER_ENABLED
    #define PEER_MANAGER_ENABLED 1
    #endif
    // <o> PM_MAX_REGISTRANTS - Number of event handlers that can be registered. 
    #ifndef PM_MAX_REGISTRANTS
    #define PM_MAX_REGISTRANTS 3
    #endif
    
    // <o> PM_FLASH_BUFFERS - Number of internal buffers for flash operations. 
    // <i> Decrease this value to lower RAM usage.
    
    #ifndef PM_FLASH_BUFFERS
    #define PM_FLASH_BUFFERS 4
    #endif
    

  • For the PM settings in sdk_config to have an effect, you need to have peer manager related source files included in your project and also initialize PM it in your code. Are you able to debug the code to confirm that the BLE_GATTS_EVT_SYS_ATTR_MISSING event is being processed?

  • I'm sorry for my late reply.I had included peer manager related source files  in my project.

    static void peer_manager_init(void)
    {
        ble_gap_sec_params_t sec_param;
        ret_code_t err_code;
    
        err_code = pm_init();
        APP_ERROR_CHECK(err_code);
    
        memset(&sec_param, 0, sizeof(ble_gap_sec_params_t));
    
        // Security parameters to be used for all security procedures.
        sec_param.bond           = SEC_PARAM_BOND;
        sec_param.mitm           = SEC_PARAM_MITM;
        sec_param.lesc           = SEC_PARAM_LESC;
        sec_param.keypress       = SEC_PARAM_KEYPRESS;
        sec_param.io_caps        = SEC_PARAM_IO_CAPABILITIES;
        sec_param.oob            = SEC_PARAM_OOB;
        sec_param.min_key_size   = SEC_PARAM_MIN_KEY_SIZE;
        sec_param.max_key_size   = SEC_PARAM_MAX_KEY_SIZE;
        sec_param.kdist_own.enc  = 0;
        sec_param.kdist_own.id   = 0;
        sec_param.kdist_peer.enc = 0;
        sec_param.kdist_peer.id  = 0;
    
        err_code = pm_sec_params_set(&sec_param);
        APP_ERROR_CHECK(err_code);
    
        err_code = pm_register(pm_evt_handler);
        APP_ERROR_CHECK(err_code);
    }

    I only found BLE_GATTS_EVT_SYS_ATTR_MISSING event here. And I tired to Log it. It seems that "BLE_GATTS_EVT_SYS_ATTR_MISSING" doesn't show up.

    void gcm_ble_evt_handler(ble_evt_t const * p_ble_evt)
    {
        uint16_t conn_handle = p_ble_evt->evt.gatts_evt.conn_handle;
    
        switch (p_ble_evt->header.evt_id)
        {
            case BLE_GATTS_EVT_SYS_ATTR_MISSING:
    						NRF_LOG_INFO("BLE_GATTS_EVT_SYS_ATTR_MISSING.");
                local_db_apply_in_evt(conn_handle);
                break;
              .....................................................
         }
    }

    <info> app: Slow advertising.
    
    
    <info> app: Peripheral connected
    
    
    <debug> ble_scan: Scanning
    
    
    <info> app: scan connect
    
    
    <info> app: Central connected
    
    <info> app: Attempt to find Peripheral on conn_handle 0x0
    
    <debug> nrf_ble_gq: Registering connection handle: 0x0000
    
    <debug> ble_db_disc: Starting discovery of service with UUID 0xFF00 on connection handle 0x0.
    
    <debug> nrf_ble_gq: Adding item to the request queue
    
    <debug> nrf_ble_gq: GATTC Primary Services Discovery Request
    
    <debug> nrf_ble_gq: SD GATT procedure (2) succeeded on connection handle: 0.
    
    <info> app: Peer Connect.
    
    
    <error> app: ERROR 13313 [Unknown error code] at :0
    
    PC at: 0x00000000
    
    <error> app: End of error report

  • Hi,

    Are you sure PM_LOG_ENABLED is enabled? I'm not seeing any log messages from the peer manager in the log you posted below.

  • Yes, I had enabled PM_LOG_ENABLED.

    // <e> PM_LOG_ENABLED - Enable logging in Peer Manager and its submodules.
    //==========================================================
    #ifndef PM_LOG_ENABLED
    #define PM_LOG_ENABLED 1
    #endif
    // <o> PM_LOG_LEVEL  - Default Severity level
     
    // <0=> Off 
    // <1=> Error 
    // <2=> Warning 
    // <3=> Info 
    // <4=> Debug 
    
    #ifndef PM_LOG_LEVEL
    #define PM_LOG_LEVEL 3
    #endif
    
    // <o> PM_LOG_INFO_COLOR  - ANSI escape code prefix.
     
    // <0=> Default 
    // <1=> Black 
    // <2=> Red 
    // <3=> Green 
    // <4=> Yellow 
    // <5=> Blue 
    // <6=> Magenta 
    // <7=> Cyan 
    // <8=> White 
    
    #ifndef PM_LOG_INFO_COLOR
    #define PM_LOG_INFO_COLOR 0
    #endif
    
    // <o> PM_LOG_DEBUG_COLOR  - ANSI escape code prefix.
     
    // <0=> Default 
    // <1=> Black 
    // <2=> Red 
    // <3=> Green 
    // <4=> Yellow 
    // <5=> Blue 
    // <6=> Magenta 
    // <7=> Cyan 
    // <8=> White 
    
    #ifndef PM_LOG_DEBUG_COLOR
    #define PM_LOG_DEBUG_COLOR 0
    #endif

Related