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,
Here's the handler code:
For instance, the debugger shows the following:
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_Handleraddress:0x8010 1000- NMI vector address:
0x8010 1001
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.
