segger embedded studio data breakpoints expressions nRF52833

Hello,

I am trying to set a data breakpoint expression on a global array or global variable  but I don't seem to be able to.

Each time I set a data breakpoint I get a '?' next to the breakpoint. See attached picture.

uint8_t ble_ad[HB_BLE_AD_BUFF_SIZE_MAX].

I am using segger Embedded Studio v5.60 and nRF52833 SoC.

Thank you.

Kind regards

Mohamed

Parents Reply Children
  • I am glad to hear that it worked! 

    I am chasing an intermittent bug which could be caused by a possible stack overflow. How do I set a data breakpoint that is triggered when ble_[6] != 0x19?

    I do not think the HW comparators on Cortex M4 support these kinds of expressions. It does not appear to be supported in Ozone, at least. 

    An alternative (not as good as a breakpoint) may be to use trace in Ozone and sample the register value periodically. This way you can monitor whether the array element is overwritten or not.

    One more question. how do I capture the debugging logs appearing in the Terminal window in a text file automatically?

    The documentation explains how you can do it in Ozone, but it is not something I have tried myself. For SES you can do it like this:

  • Good Morning Vidar,

    An alternative (not as good as a breakpoint) may be to use trace in Ozone and sample the register value periodically. This way you can monitor whether the array element is overwritten or not.

    I am not sure how to do this. Could you please give me an idiot step by step guide ?

    Thank you.

    Kind regards

    Mohamed

  • Hi Mohamed,

    I am not sure what you have tried so far, but it seems like you have to do is to open the 'Data sampling' view and then input your expression. It is the first time I have used this myself.

    Kind regards,

    Vidar

  • Hi Vidar,

    Thank you.

    As you said, this is not as good as a breakpoint because I need to monitor it.

    In order to check if I am running out of stack I would like to fill the stack memory section with say 0xAA and run the program until it crashes. I then check if all the AA in the stack locations have disappeared i.e. overwritten. However, I am not sure where to find where the stack starts and whether it builds up or down. I looked in the .map file but it is not clear. All I know is I am setting the stack size to 8192 bytes in prj.conf.

    CONFIG_MAIN_STACK_SIZE=8192
    CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

    I have only one main thread from which I am submitting a work queue. The code looks something like this,

    static struct k_work WorkQ1;

    void main( void )
    {

    ...[snip]...

    k_work_init( &WorkQ1, WorkQ1_tasks );

    ...

    k_work_submit( &WorkQ1 );

    ...[snip]

    }

    So, please help me find where the stack starts and whether it builds up or down.

    Thank you.

    Kind regards

    Mohamed

  • Hi Mohamed,

    The 'data sampling' feature is used for monitoring a variable over time. The only reason it may not be as good as a data breakpoint in this case is that it will not halt the CPU if an invalid value is written.

    There are multiple stacks (main stack for interrupt handling + 1 stack for each thread - stack pointers). The stack area allocated to each thread can be found in the map file.

    There is already a built-in stack guard to catch stack overruns and it should be enabled by default in the board files (MPU-assisted stack overflow detection). If you are unsure if it is enabled, you can check if CONFIG_MPU_STACK_GUARD=y is included in your <build folder>/zephyr/.config file.

    Kind regards,

    Vidar

Related