Breakpoints
===========

Comparators in the Flash Patch and Breakpoint Unit (FPB) of the |LP| are used
to break on an instruction fetch. This can be used to patch a function as it is
fetched from instruction memory. Or these comparators can be used to supply a
Breakpoint (BKPT) instruction to the CPU. These instructions halt the processors
operation, waiting for the debug probe.


Considerations
--------------

While breakpoints are a useful tool for debugging code online, they have the
possibility of altering the execution flow of a piece of code.


Breakpoints and Timing
^^^^^^^^^^^^^^^^^^^^^^

Synchronous RF protocols are timing sensitive. Breakpoints can easily halt the
execution long enough to lose network timing and break the link.

To still be able to debug, place breakpoints as close as possible to where the
relevant debug information can be read or step through the relevant code
segment to debug.

After you hit a breakpoint and read out the necessary debug information, it is
recommended that you reset the device and re-establish the connection.


Breakpoints and Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When compiler optimizations are enabled, toggling a breakpoint on a line of C
code may not result in the expected behavior. Some examples include the
following.

Code is removed or not compiled in

    Toggling a breakpoint in the IDE results in a breakpoint somewhere other
    than the intended line. Some IDEs disable breakpoints on nonexistent code.

Code block is part of a common subexpression

    A breakpoint might be trigged from a function or piece of code near the
    marked line. This might have been due to the compiler reusing sections.

An if clause is represented by a conditional branch in assembly

    A breakpoint inside an if clause always breaks on the conditional
    statement, even when the condition is not true.

TI recommends selecting an optimization level as low as possible
when debugging. See :ref:`sect_debug_optim` for information on modifying
optimization levels.

.. ifconfig:: device == 'cc23xx'
    
    .. note::
        Due to limitation of Cotex-CM0+, the number of breakpoints for |DEVICE| devices is 4. Check 
        `breakpoints limitation of ARM Cortex-CM0+ <https://developer.arm.com/documentation/ddi0484/b/Debug/About-debug/Breakpoint-unit>`_. 
        During programming stage, debugger will use 3. Breakpoints set by application will be ignored if 
        more than one breakpoint is used by the application.
        It is possible to gain one more breakpoint back by implementing the following steps. Right click on the 
        project, go to Debug As->Debug Configuration->Target, unchecked 'Enable CIO function use'.
        
        .. image:: /debugging/resources/gain_one_more_breakpoint.png