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 think you've understood me - that's the situation! I just muddled up where I'd obtained the info from, and then dug my hole deeper...

    Anyway - Name mangling, I did wonder if that was the issue. I was of the impression it might not matter because I was compiling all the C-files with the C++ compiler? But obviously something is wrong, most likely me.

    To answer your question - no, I haven't put extern "C" {} around UART0_IRQHandler() - I will give that a try tomorrow, fingers crossed. But why is this required? As in, why specifically does the interrupt handler need this treatment? Or am I likely to hit this problem with other C-code such as libraries from Nordic?

    Thanks for the responses though!

Reply
  • I think you've understood me - that's the situation! I just muddled up where I'd obtained the info from, and then dug my hole deeper...

    Anyway - Name mangling, I did wonder if that was the issue. I was of the impression it might not matter because I was compiling all the C-files with the C++ compiler? But obviously something is wrong, most likely me.

    To answer your question - no, I haven't put extern "C" {} around UART0_IRQHandler() - I will give that a try tomorrow, fingers crossed. But why is this required? As in, why specifically does the interrupt handler need this treatment? Or am I likely to hit this problem with other C-code such as libraries from Nordic?

    Thanks for the responses though!

Children
No Data
Related