Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Unable to debug with Hardfault_Handler

nrf52832

SDK 14.2

My application is locking up, and finding the cause is proving to be difficult. I've enabled DEBUG and DEBUG_NRF and included the hardfault library from the SDK including the file for the compiler I'm using (GCC, hardfault_handler_gcc.c). I was hopeful seeing the calls to NRF_LOG_ERROR in Hardfault_c_handler() that I might get some information about what is happening, but best I can tell this function is never executed. 

Using Segger's Ozone debugger, I can tell that the call stack halts on <Hardfault_Exception> but no error messages are provided. I've attempted trying to override Hardfault_process() and explicitly generate hardfaults using hardfault_genhf.h functions, but no information is ever provided in RTT. Any ideas on what I'm missing?

Parents
  • Hi,

     

    We have a known issue with GCC in SDK v14.2, where the define "NRF_BREAKPOINT_COND" expands to __builtin_trap(), which fails with newlib-nano.

    Here's the section in app_util_platform.h:

    #if defined(__GNUC__)
    #define NRF_BREAKPOINT __builtin_trap() // Expands to _exit()
     
    Define this to a __NOP() or an actual breakpoint "__asm__("BKPT 0");", and the "app_error" assert handler (and the SDK hardfault handler library) should work normally with GCC.
    Could you try this, and report back the fault-details?
     
    Cheers,
    Håkon
  • Hi Hakon, 

    Thanks for your response. I've tried changing NRF_BREAKPOINT to either __NOP() or __asm__("BKPT 0"); but neither changes the behavior. 

    Also, curiously, despite hardfault_implementation.c and hardfault_handler_gcc.c being included in the build and being compiled, it does not show up in the list of sources in Ozone's analysis of the .elf. This keeps me from putting a breakpoint in those files. 

    *Addition*

    I've enabled -frecord-gcc-switches to verify the following:

    * hardfault and hardfault/nrf52/handler are being included (-I)

    * -0g and -g3 GCC flags are set

    * DEBUG and DEBUG_NRF are set

  • Bringing HardFault_Handler() into my main.cpp makes it work as expected. I must be doing something wrong in how it gets linked from my SDK lib?

    main.cpp:

    #include <libraries/hardfault/hardfault_genhf.h>
    #include <libraries/hardfault/hardfault.h>
    
    #include <VK_HAL.h>
    #include <libraries/timer/app_timer.h>
    
    
    const VK_HAL::HAL& hal = VK_HAL::get_HAL();
    APP_TIMER_DEF(test_hardfault_timer);
    
    extern "C" {
    
    
    extern void HardFault_c_handler(uint32_t *);
    
    void HardFault_Handler(void) __attribute__(( naked ));
    
    void HardFault_Handler(void)
    {
    	__ASM volatile(
    	"   .syntax unified                        \n"
    
    			"   ldr   r0, =0xFFFFFFFD                  \n"
    			"   cmp   r0, lr                           \n"
    			"   bne   HardFault_Handler_ChooseMSP      \n"
    			/* Reading PSP into R0 */
    			"   mrs   r0, PSP                          \n"
    			"   b     HardFault_Handler_Continue       \n"
    			"HardFault_Handler_ChooseMSP:              \n"
    			/* Reading MSP into R0 */
    			"   mrs   r0, MSP                          \n"
    			/* -----------------------------------------------------------------
    			 * If we have selected MSP check if we may use stack safetly.
    			 * If not - reset the stack to the initial value. */
    			"   ldr   r1, =__StackTop                  \n"
    			"   ldr   r2, =__StackLimit                \n"
    
    			/* MSP is in the range of the stack area */
    			"   cmp   r0, r1                           \n"
    			"   bhi   HardFault_MoveSP                 \n"
    			"   cmp   r0, r2                           \n"
    			"   bhi   HardFault_Handler_Continue       \n"
    			/* ----------------------------------------------------------------- */
    			"HardFault_MoveSP:                         \n"
    			"   mov   SP, r1                           \n"
    			"   movs  r0, #0                           \n"
    
    			"HardFault_Handler_Continue:               \n"
    			"   ldr r3, =%0                            \n"
    			"   bx r3                                  \n"
    
    			"   .ltorg                                 \n"
    	: : "X"(HardFault_c_handler)
    	);
    }
    
    void test_hardfault_timer_handler(void * p_context) {
    	NRF_LOG_INFO("Force a hardfault (undefined instruction)");
    	hardfault_genhf_undefined_instr();
    }
    
    } // Extern C
    
    void setup() {
    	// Create a 5 second timer to generate a hardfault
    	APP_ERROR_CHECK(app_timer_create(&test_hardfault_timer, APP_TIMER_MODE_REPEATED, test_hardfault_timer_handler));
    	APP_ERROR_CHECK(app_timer_start(test_hardfault_timer, APP_TIMER_TICKS(5000), NULL));
    }
    
    
    void loop() {
    
    }
    
    VK_HAL_MAIN()  // Sets up a normal look with app_sched_execute() and nrf_pwr_mgmt_run()

    RTT:

    Process: JLinkExe
    <info> BLE: BLE Stack Init
    <info> pwr_mgmt: Init
    <info> I2C: I2C Init
    <info> DRV_NCP1855: State:CHARGE DONE
    <info> DRV_KMX62: Init and detected
    <info> DRV_LSM6DSM: Init and detected
    <info> app: run()
    <info> pwr_mgmt: CPU Usage: 1%
    <info> pwr_mgmt: CPU Usage: 0%
    <info> pwr_mgmt: CPU Usage: 0%
    <info> pwr_mgmt: CPU Usage: 0%
    <info> pwr_mgmt: CPU Usage: 0%
    <info> app: Force a hardfault (undefined instruction)
    <error> hardfault: HARD FAULT at 0x000232CA
    <error> hardfault:   R0:  0x0000000C  R1:  0x00000001  R2:  0x200023C8  R3:  0x00000000
    <error> hardfault:   R12: 0x00000000  LR:  0x00023FF7  PSR: 0x01000000
    <error> hardfault: Cause: The processor has attempted to execute an undefined instruction.

  •  

    I cannot spot anything that should provide issues debugging this library, based on your configuration and build files. Could you do a "make VERBOSE=1" just to see that the proper debug flags (optimization and debug level) are actually being passed to the compiler?

     

    Cheers,

    Håkon

  • ➜  build git:(master) ✗ make clean
    ➜  build git:(master) ✗ make flash_basicapp_vka1_s132_5.0.0 -j8 VERBOSE=1 | grep hardfault_implementation
    [ 39%] Building C object nrf5_sdk/14.2.0/CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/hardfault_implementation.c.obj
    cd /Users/todd/Projects/myproject/build/nrf5_sdk/14.2.0 && /usr/local/bin/arm-none-eabi-gcc -DBOARD_VKAB010001 -DCONFIG_GPIO_AS_PINRESET -DDCONFIG_NFCT_PINS_AS_GPIOS -DDEBUG -DDEBUG_NRF -DNRF52 -DNRF52832 -DNRF52832_XXAA -DNRF52_SERIES -DNRF_SD_BLE_API_VERSION=5 -DS132 -DSD_BLE_API_VERSION=5 -DSOFTDEVICE_PRESENT -I/Users/todd/Projects/myproject/config -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/device -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/boards -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/toolchain -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/toolchain/cmsis/include -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/softdevice/common -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/softdevice/s132/headers -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_advertising -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_dtm -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_racp -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ancs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ans_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_bas -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_bas_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_cscs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_cts_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_dfu -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_dis -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_gls -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hids -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hrs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hrs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hts -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ias -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ias_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_lbs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_lbs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_lls -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_nus -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_nus_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_rscs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_rscs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_tps -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/common -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/nrf_ble_gatt -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/nrf_ble_qwr -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/peer_manager -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/clock -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/common -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/delay -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/gpiote -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/hal -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/i2s -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/ppi -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/rtc -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/spi_master -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/timer -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/twi_master -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/uart -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/wdt -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/uart -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/atomic -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/atomic_fifo -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/balloc -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/bsp -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/button -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_log -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_log/src -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_memobj -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_section_vars -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/fds -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/fifo -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/fstorage -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/gpiote -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/hardfault -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/hardfault/nrf52/handler -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/mem_manager -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/mutex -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/pwr_mgmt -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/queue -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/scheduler -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/strerror -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/timer -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/twi_mngr -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/util -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/external/fprintf -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/external/segger_rtt  --std=gnu99 -Wall -Wno-attributes -Wno-format -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin --short-enums -Og -g3   -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=gnu11 -o CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/hardfault_implementation.c.obj   -c /Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/hardfault/hardfault_implementation.c
    /usr/local/bin/arm-none-eabi-ar qc libNRF5_SDK_14.2.0_vka1.a  CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/boards/boards.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/toolchain/system_nrf52.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/ble_advertising/ble_advertising.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_advdata.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_conn_params.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_conn_state.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_srv_common.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/nrf_ble_gatt/nrf_ble_gatt.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/gatt_cache_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/gatts_cache_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/id_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_data_storage.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_database.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_id.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/pm_buffer.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/pm_mutex.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/security_dispatcher.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/security_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/ble_services/ble_nus/ble_nus.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/clock/nrf_drv_clock.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/common/nrf_drv_common.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/gpiote/nrf_drv_gpiote.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/i2s/nrf_drv_i2s.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/spi_master/nrf_drv_spi.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/twi_master/nrf_drv_twi.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/uart/nrf_drv_uart.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/ppi/nrf_drv_ppi.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/timer/nrf_drv_timer.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/atomic_fifo/nrf_atfifo.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/uart/app_uart_fifo.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/balloc/nrf_balloc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/bsp/bsp.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/bsp/bsp_btn_ble.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/bsp/bsp_nfc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/button/app_button.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/fds/fds.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/fifo/app_fifo.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/fstorage/nrf_fstorage.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/hardfault_implementation.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_memobj/nrf_memobj.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_backend_rtt.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_backend_serial.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_backend_uart.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_default_backends.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_frontend.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_str_formatter.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_section_vars/nrf_section_iter.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/queue/nrf_queue.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/scheduler/app_scheduler.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/spi_mngr/nrf_spi_mngr.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/strerror/nrf_strerror.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/timer/app_timer.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/twi_mngr/nrf_twi_mngr.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/app_error.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/app_error_weak.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/app_util_platform.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/nrf_assert.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/sdk_mapped_flags.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/softdevice/common/nrf_sdh.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/softdevice/common/nrf_sdh_ble.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/softdevice/common/nrf_sdh_soc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/fprintf/nrf_fprintf.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/fprintf/nrf_fprintf_format.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/segger_rtt/SEGGER_RTT.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/segger_rtt/SEGGER_RTT_printf.c.obj
    
    ➜  build git:(master) ✗ make clean
    ➜  build git:(master) ✗ make flash_basicapp_vka1_s132_5.0.0 -j8 VERBOSE=1 | grep hardfault_handler_gcc
    [ 40%] Building C object nrf5_sdk/14.2.0/CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c.obj
    cd /Users/todd/Projects/myproject/build/nrf5_sdk/14.2.0 && /usr/local/bin/arm-none-eabi-gcc -DBOARD_VKAB010001 -DCONFIG_GPIO_AS_PINRESET -DDCONFIG_NFCT_PINS_AS_GPIOS -DDEBUG -DDEBUG_NRF -DNRF52 -DNRF52832 -DNRF52832_XXAA -DNRF52_SERIES -DNRF_SD_BLE_API_VERSION=5 -DS132 -DSD_BLE_API_VERSION=5 -DSOFTDEVICE_PRESENT -I/Users/todd/Projects/myproject/config -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/device -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/boards -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/toolchain -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/toolchain/cmsis/include -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/softdevice/common -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/softdevice/s132/headers -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_advertising -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_dtm -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_racp -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ancs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ans_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_bas -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_bas_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_cscs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_cts_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_dfu -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_dis -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_gls -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hids -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hrs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hrs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_hts -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ias -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_ias_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_lbs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_lbs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_lls -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_nus -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_nus_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_rscs -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_rscs_c -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/ble_services/ble_tps -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/common -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/nrf_ble_gatt -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/nrf_ble_qwr -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/ble/peer_manager -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/clock -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/common -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/delay -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/gpiote -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/hal -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/i2s -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/ppi -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/rtc -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/spi_master -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/timer -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/twi_master -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/uart -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/drivers_nrf/wdt -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/uart -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/atomic -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/atomic_fifo -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/balloc -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/bsp -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/button -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_log -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_log/src -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_memobj -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/experimental_section_vars -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/fds -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/fifo -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/fstorage -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/gpiote -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/hardfault -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/hardfault/nrf52/handler -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/mem_manager -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/mutex -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/pwr_mgmt -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/queue -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/scheduler -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/strerror -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/timer -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/twi_mngr -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/util -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/external/fprintf -I/Users/todd/Projects/myproject/nrf5_sdk/14.2.0/external/segger_rtt  --std=gnu99 -Wall -Wno-attributes -Wno-format -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin --short-enums -Og -g3   -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=gnu11 -o CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c.obj   -c /Users/todd/Projects/myproject/nrf5_sdk/14.2.0/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c
    /usr/local/bin/arm-none-eabi-ar qc libNRF5_SDK_14.2.0_vka1.a  CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/boards/boards.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/toolchain/system_nrf52.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/ble_advertising/ble_advertising.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_advdata.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_conn_params.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_conn_state.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/common/ble_srv_common.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/nrf_ble_gatt/nrf_ble_gatt.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/gatt_cache_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/gatts_cache_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/id_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_data_storage.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_database.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_id.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/peer_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/pm_buffer.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/pm_mutex.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/security_dispatcher.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/peer_manager/security_manager.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/ble/ble_services/ble_nus/ble_nus.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/clock/nrf_drv_clock.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/common/nrf_drv_common.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/gpiote/nrf_drv_gpiote.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/i2s/nrf_drv_i2s.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/spi_master/nrf_drv_spi.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/twi_master/nrf_drv_twi.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/uart/nrf_drv_uart.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/ppi/nrf_drv_ppi.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/drivers_nrf/timer/nrf_drv_timer.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/atomic_fifo/nrf_atfifo.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/uart/app_uart_fifo.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/balloc/nrf_balloc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/bsp/bsp.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/bsp/bsp_btn_ble.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/bsp/bsp_nfc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/button/app_button.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/fds/fds.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/fifo/app_fifo.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/fstorage/nrf_fstorage.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/hardfault_implementation.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_memobj/nrf_memobj.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_backend_rtt.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_backend_serial.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_backend_uart.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_default_backends.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_frontend.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_log/src/nrf_log_str_formatter.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/experimental_section_vars/nrf_section_iter.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/queue/nrf_queue.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/scheduler/app_scheduler.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/spi_mngr/nrf_spi_mngr.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/strerror/nrf_strerror.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/timer/app_timer.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/twi_mngr/nrf_twi_mngr.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/app_error.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/app_error_weak.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/app_util_platform.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/nrf_assert.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/libraries/util/sdk_mapped_flags.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/softdevice/common/nrf_sdh.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/softdevice/common/nrf_sdh_ble.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/components/softdevice/common/nrf_sdh_soc.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/fprintf/nrf_fprintf.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/fprintf/nrf_fprintf_format.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/segger_rtt/SEGGER_RTT.c.obj CMakeFiles/NRF5_SDK_14.2.0_vka1.dir/external/segger_rtt/SEGGER_RTT_printf.c.obj

  • Everything looks normal. I see that you're creating a full library, then most likely linking a .elf based on the library. This is the only step I can see that differs.

    Does the .elf file list this as a function at all?

    You can check using objdump:

    $ arm-none-eabi-objdump <my.elf> -t | grep HardFault

    This should list them as functions:
    00025fde l .text 00000000 HardFault_Handler_Continue
    00025fd8 l .text 00000000 HardFault_MoveSP
    00025fbc g F .text 00000040 HardFault_Handler
    00025eac g F .text 00000110 HardFault_c_handler
    00025e88 w F .text 00000024 HardFault_process

    If that is not present as functions in your .elf file, I suspect there's some forced inlining happening under-the-hood, or some stripping of debug information due to the .o -> .a -> .elf. Here's a thread on stackoverflow which shows issues with the "naked" keyword when using a static library: https://stackoverflow.com/questions/30355013/linking-with-static-library-not-equivalent-to-linking-with-its-objects

     

    If the .elf does not have the above mentioned functions, could you try skipping the "create library" part of your build?

     

    Cheers,

    Håkon

  • I think your suspicion is correct:

    arm-none-eabi-objdump basicapp_vka1_s132_5.0.0.elf -t | grep HardFault
    00023822  w    F .text	00000002 HardFault_Handler

    vs

    arm-none-eabi-objdump libNRF5_SDK_14.2.0_vka1.a -t | grep HardFault
    00000000 l    d  .text.HardFault_process	00000000 .text.HardFault_process
    00000000 l    d  .text.HardFault_c_handler	00000000 .text.HardFault_c_handler
    00000000 l    d  .rodata.HardFault_c_handler.str1.4	00000000 .rodata.HardFault_c_handler.str1.4
    00000000  w    F .text.HardFault_process	00000024 HardFault_process
    00000000 g     F .text.HardFault_c_handler	00000118 HardFault_c_handler
    00000004       O *COM*	00000004 HardFault_p_stack
    00000000 l    d  .text.HardFault_Handler	00000000 .text.HardFault_Handler
    00000022 l       .text.HardFault_Handler	00000000 HardFault_Handler_Continue
    0000001c l       .text.HardFault_Handler	00000000 HardFault_MoveSP
    00000000 g     F .text.HardFault_Handler	00000040 HardFault_Handler
    00000000         *UND*	00000000 HardFault_c_handler

    I'll work on doing it without the library.

Reply
  • I think your suspicion is correct:

    arm-none-eabi-objdump basicapp_vka1_s132_5.0.0.elf -t | grep HardFault
    00023822  w    F .text	00000002 HardFault_Handler

    vs

    arm-none-eabi-objdump libNRF5_SDK_14.2.0_vka1.a -t | grep HardFault
    00000000 l    d  .text.HardFault_process	00000000 .text.HardFault_process
    00000000 l    d  .text.HardFault_c_handler	00000000 .text.HardFault_c_handler
    00000000 l    d  .rodata.HardFault_c_handler.str1.4	00000000 .rodata.HardFault_c_handler.str1.4
    00000000  w    F .text.HardFault_process	00000024 HardFault_process
    00000000 g     F .text.HardFault_c_handler	00000118 HardFault_c_handler
    00000004       O *COM*	00000004 HardFault_p_stack
    00000000 l    d  .text.HardFault_Handler	00000000 .text.HardFault_Handler
    00000022 l       .text.HardFault_Handler	00000000 HardFault_Handler_Continue
    0000001c l       .text.HardFault_Handler	00000000 HardFault_MoveSP
    00000000 g     F .text.HardFault_Handler	00000040 HardFault_Handler
    00000000         *UND*	00000000 HardFault_c_handler

    I'll work on doing it without the library.

Children
No Data
Related