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

Cannot breakpoint on UART0_IRQHandler with C++

Hello all,

I am using the examples/peripheral/uart project, which by default is set up as follows:

Language = C Dialect = C99 Language conformance = Standard with IAR extensions

I can breakpoint on UART0_IRQHandler.

However, if I switch this project as follows:

Language = C++ Dialect = Extended embedded C++ Language conformance = Standard with IAR extensions

I now find I can no longer set a breakpoint on UART0_IRQHandler.

Does anyone have any idea how I resolve this? The reason I care about this is I am developing a C++ application and have hit upon this problem, and have found I can reproduce it (more-or-less) using the example project mentioned above.

Regards, Richard.

Parents
  • Go to the disassembly window and try setting a breakpoint on the first assembly instruction of UART0_IRQHandler(). You can get the address of this instruction via the linker .map file (which will probably consist of a PUSH {r?-r?,lr} type of instruction.

    EDIT: I just re-read your post and noticed you said IAR wouldn't even let you set a breakpoint at all. This would seem to indicate your interrupt handler is not even getting compiled in the first place. I would again check the linker .map file and see if this symbol is included in the image. Maybe your code is conditionally compiled out? Maybe your compiler is having trouble recognizing the weak binding of the UART0_IRQHandler symbol and is instead using the stock interrupt handler @ address 0x00000048?

  • I'm not 100% sure I follow your comment but if UART0_IRQHandler was in the assembly listing but missing from the map file, then the linker decided that the UART0_IRQHandler symbol was unused and therefore stripped it from the executable.

    You may be falling victim to C++ name mangling here. Did you put an extern "C" { } around the UART0_IRQHandler() function?

Reply Children
No Data
Related