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

Start scaning right after starting advertising.

I use sdk 9.0.0, softdevice s130, nrf51422_xxac. In my application I have to both scan and advertise. When I start one of them (scanning or advertising) application starts running properly but when I start them both my application not always starts executing properly (sometimes it looks like processor is executing total mess and I have to restart it, using button, few times till it starts executing properly). In my code I call starting functions consecutively:

err = ble_advertising_start(BLE_ADV_MODE_FAST); 
APP_ERROR_CHECK(err);
err = sd_ble_gap_scan_start(&scan_params); 

The order of calling these 2 functions does not change anything. In ble_gap.h I did not realize any function for checking if softdevice is ready to start next functionality. I lack ideas what is the reason of such behaviour.

Parents
  • /**< Determines scan interval in units of 0.625 millisecond. */                  
    #define SCAN_INTERVAL 0x00A0    /** < 0.1 s */  
    
                                     
    /**< Determines scan window in units of 0.625 millisecond. */                    
    #define SCAN_WINDOW 0x0050      /** < 0.05 s */                                  
                                                                                 
    static ble_gap_adv_params_t bc_adv_params;                                       
                                                                                     
    static const ble_gap_scan_params_t scan_params = { 0,// Active scanning not set  
                                                     0,// Selective scanning not set. 
                                                    NULL, // White-list not set.     
                                     (uint16_t)SCAN_INTERVAL, // Scan interval.       
                                    (uint16_t)SCAN_WINDOW,   // Scan window.         
                             0 /* Never stop scanning unless explicitly asked to */};
    
    #define APP_ADV_FAST_INTERVAL            0x0028 // 25 ms                         
    #define APP_ADV_SLOW_INTERVAL            0x0C80 // 2 sec                         
    #define APP_ADV_FAST_TIMEOUT             0 // sec                                
    #define APP_ADV_SLOW_TIMEOUT             0 
    

    I use fast advertising. Sorry Aryan I have not answered in comment but it was easier and more clear.

  • no need to apologize ... it good that you managed to narrow down the source of the problem. softdevice RAM address space and application RAM address space is different. If you believe it is a RAM corruption then i am almost sure that it is not the softdevice. Softdevice is compiled with fixed RAM space and if there is a stack corruption, it should be in the lower side of rhe RAM address space and not into the application RAM address space. Softdevice does not use heap memory.

    I think the application has sent the address of an uninitialized pointer or similar. If you are using KEIL, you can set a breakpoint on uart_counter with a condition to see what has set the variable to such a high value.

Reply
  • no need to apologize ... it good that you managed to narrow down the source of the problem. softdevice RAM address space and application RAM address space is different. If you believe it is a RAM corruption then i am almost sure that it is not the softdevice. Softdevice is compiled with fixed RAM space and if there is a stack corruption, it should be in the lower side of rhe RAM address space and not into the application RAM address space. Softdevice does not use heap memory.

    I think the application has sent the address of an uninitialized pointer or similar. If you are using KEIL, you can set a breakpoint on uart_counter with a condition to see what has set the variable to such a high value.

Children
No Data
Related