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.

  • 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!

  • The reason why it matters is because there are two versions of UART0_IRQHandler--the weak version in arm_startup_nrf51.s and the strong version in app_uart_fifo.c. The assembly file is assembled by the assembler and will produce C-style names (probably "UART0_IRQHandler"). The source file is compiled by the C++ compiler, and will produce C++-style names (probably "UART0_IRQHandler()"). Since the two are different, the C++ generated version will not replace the assembler version, which leaves you with the weakly-bound default interrupt handler. The linker, then, noticing that there are no references anywhere to "UART0_IRQHandler()", strips the symbol out as an unused function.

    You will need to extern "C" all interrupt handlers as well as anytime there is a transition between your C++ code and Nordic's C code.

  • It worked... nearly! I have extern "C"'d UART0_IRQHandler() and now I can set a breakpoint on it, and the program functions, i.e. I can tx/rx chars to/from the nRF51.

    However, none of my breakpoints actually work. Not just in the IRQ handler, but anywhere. Any ideas on this?

  • I think I'm all sorted now - it seems my problems were also related to the default linker control file, which was considerably different to the one used in the UART example project.

Related