Why does my NMI handler address end with a 0, but the vector address ends with a 1?
Happy Sunday guys, I am working with an STM32-F49ZI Nucleo board, which features an ARM Cortex-M4 32-bit MCU. I am using GCC as my compiler and GCC linker.
For debugging, I am using OpenOCD and I inspected the addresses through the memory window in the debugger
I have written my own NMI handler function,
NMI_Handler
, and when I inspect its address in the debugger, I see that it ends with a 0. However, the vector address for the NMI handler contains the same address, but the last bit is set to 1. I understand that this might be related to the ARM Cortex-M4’s support for Thumb instructions (which are 16-bit), but I'm having trouble understanding why the last bit is set to 1.
Here's the handler code:
For instance, the debugger shows the following:
- NMI_Handler
address: 0x8010 1000
- NMI vector address: 0x8010 1001
Could you explain why there is a discrepancy between these addresses and how the ARM Cortex-M architecture influences this behavior?"Solution:Jump to solution
The last bit of the vector address is set to 1 to indicate that the handler uses Thumb instructions. When the processor jumps to the handler, it automatically clears this bit to get the actual function address, Cortex-M processors always operate in Thumb mode.
1 Reply
Solution
The last bit of the vector address is set to 1 to indicate that the handler uses Thumb instructions. When the processor jumps to the handler, it automatically clears this bit to get the actual function address, Cortex-M processors always operate in Thumb mode.