This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/MSP430FR5728: strange debug behavior for FRAM section when single stepping

Part Number: MSP430FR5728

Tool/software: Code Composer Studio

When I put a breakpoint after the deliberate infinite while loop in the program below, and I run the code (simplification from a bigger project) in the debugger, then it, correctly, stays in the loop and keeps running because it never reaches the breakpoint.

When I then interrupt execution using the debugger 'pause' button, it shows me that I am still in the while loop, as expected.

The problem starts when I then start to single step in the debugger.
After stepping through the loop one ore twice, the value of frameData[833] changes to a (seemingly) random value, and the program jumps out of the loop.

What is wrong?
Did I make a mistake in the linker command file (see below)?
I am using CCS 9.2 in windows

program:
#include "port.h"
#define REG_HOLDING_NREGS 870            // 10 bit,1.5V ref, ADC values ozone, humidity, internal- and external temperature and heater current + all pixels of camera
#pragma DATA_SECTION(usRegHoldingBuf,".FRAM")
static USHORT   usRegHoldingBuf[REG_HOLDING_NREGS];

volatile USHORT dataReady = 0;

void camera(USHORT * frameData , char calibrate) //short int * frameData , char calibrate)
{
    if (calibrate)
      frameData[833]=0;
    else {
        while(dataReady == 0)
        {
            dataReady = frameData[833] & 0x0800;
        }
      __no_operation();                       // BREAKPOINT; check ADC_Result
    }
}

int main(void)
{
    WDTCTL = WDTPW+WDTHOLD; // reset watchdog timer to 36 minutes
    camera(& usRegHoldingBuf[6], 0);      // grab an image with the IR camera and stor it in usRegHoldingBuf
    camera(& usRegHoldingBuf[6], 1);
}


linker command file:
/******************************************************************************/
/* lnk_msp430fr5728.cmd - LINKER COMMAND FILE FOR LINKING MSP430FR5728 PROGRAMS     */
/*                                                                            */
/*   Usage:  lnk430 <obj files...>    -o <out file> -m <map file> lnk.cmd     */
/*           cl430  <src files...> -z -o <out file> -m <map file> lnk.cmd     */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/* These linker options are for command line linking only.  For IDE linking,  */
/* you should set your linker options in Project Properties                   */
/* -c                                               LINK USING C CONVENTIONS  */
/* -stack  0x0100                                   SOFTWARE STACK SIZE       */
/* -heap   0x0100                                   HEAP AREA SIZE            */
/*                                                                            */
/*----------------------------------------------------------------------------*/


/****************************************************************************/
/* SPECIFY THE SYSTEM MEMORY MAP                                            */
/****************************************************************************/

MEMORY
{
    SFR                     : origin = 0x0000, length = 0x0010
    PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0
    PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100
    RAM                     : origin = 0x1C00, length = 0x0400
    INFOA                   : origin = 0x1880, length = 0x0080
    INFOB                   : origin = 0x1800, length = 0x0080
    FRAM_DATA                : origin = 0xC200, length = 0x02F0 /* added and taken from FRAM*/
    FRAM                    : origin = 0xC4F0, length = 0x3A90 /* was 3D80 */
    SIGNATURE               : origin = 0xFF88, length = 0x0008
    INT00                   : origin = 0xFF90, length = 0x0002
    INT01                   : origin = 0xFF92, length = 0x0002
    INT02                   : origin = 0xFF94, length = 0x0002
    INT03                   : origin = 0xFF96, length = 0x0002
    INT04                   : origin = 0xFF98, length = 0x0002
    INT05                   : origin = 0xFF9A, length = 0x0002
    INT06                   : origin = 0xFF9C, length = 0x0002
    INT07                   : origin = 0xFF9E, length = 0x0002
    INT08                   : origin = 0xFFA0, length = 0x0002
    INT09                   : origin = 0xFFA2, length = 0x0002
    INT10                   : origin = 0xFFA4, length = 0x0002
    INT11                   : origin = 0xFFA6, length = 0x0002
    INT12                   : origin = 0xFFA8, length = 0x0002
    INT13                   : origin = 0xFFAA, length = 0x0002
    INT14                   : origin = 0xFFAC, length = 0x0002
    INT15                   : origin = 0xFFAE, length = 0x0002
    INT16                   : origin = 0xFFB0, length = 0x0002
    INT17                   : origin = 0xFFB2, length = 0x0002
    INT18                   : origin = 0xFFB4, length = 0x0002
    INT19                   : origin = 0xFFB6, length = 0x0002
    INT20                   : origin = 0xFFB8, length = 0x0002
    INT21                   : origin = 0xFFBA, length = 0x0002
    INT22                   : origin = 0xFFBC, length = 0x0002
    INT23                   : origin = 0xFFBE, length = 0x0002
    INT24                   : origin = 0xFFC0, length = 0x0002
    INT25                   : origin = 0xFFC2, length = 0x0002
    INT26                   : origin = 0xFFC4, length = 0x0002
    INT27                   : origin = 0xFFC6, length = 0x0002
    INT28                   : origin = 0xFFC8, length = 0x0002
    INT29                   : origin = 0xFFCA, length = 0x0002
    INT30                   : origin = 0xFFCC, length = 0x0002
    INT31                   : origin = 0xFFCE, length = 0x0002
    INT32                   : origin = 0xFFD0, length = 0x0002
    INT33                   : origin = 0xFFD2, length = 0x0002
    INT34                   : origin = 0xFFD4, length = 0x0002
    INT35                   : origin = 0xFFD6, length = 0x0002
    INT36                   : origin = 0xFFD8, length = 0x0002
    INT37                   : origin = 0xFFDA, length = 0x0002
    INT38                   : origin = 0xFFDC, length = 0x0002
    INT39                   : origin = 0xFFDE, length = 0x0002
    INT40                   : origin = 0xFFE0, length = 0x0002
    INT41                   : origin = 0xFFE2, length = 0x0002
    INT42                   : origin = 0xFFE4, length = 0x0002
    INT43                   : origin = 0xFFE6, length = 0x0002
    INT44                   : origin = 0xFFE8, length = 0x0002
    INT45                   : origin = 0xFFEA, length = 0x0002
    INT46                   : origin = 0xFFEC, length = 0x0002
    INT47                   : origin = 0xFFEE, length = 0x0002
    INT48                   : origin = 0xFFF0, length = 0x0002
    INT49                   : origin = 0xFFF2, length = 0x0002
    INT50                   : origin = 0xFFF4, length = 0x0002
    INT51                   : origin = 0xFFF6, length = 0x0002
    INT52                   : origin = 0xFFF8, length = 0x0002
    INT53                   : origin = 0xFFFA, length = 0x0002
    INT54                   : origin = 0xFFFC, length = 0x0002
    RESET                   : origin = 0xFFFE, length = 0x0002
}

/****************************************************************************/
/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY                              */
/****************************************************************************/

SECTIONS
{
    GROUP(ALL_FRAM)
    {
       GROUP(READ_WRITE_MEMORY): ALIGN(0x0200) RUN_START(fram_rw_start)
       {
          .cio        : {}                   /* C I/O BUFFER                      */
          .sysmem     : {}                   /* DYNAMIC MEMORY ALLOCATION AREA    */
       }

       GROUP(READ_ONLY_MEMORY): ALIGN(0x0200) RUN_START(fram_ro_start)
       {
          .cinit      : {}                   /* INITIALIZATION TABLES             */
          .pinit      : {}                   /* C++ CONSTRUCTOR TABLES            */
          .init_array : {}                   /* C++ CONSTRUCTOR TABLES            */
          .mspabi.exidx : {}                 /* C++ CONSTRUCTOR TABLES            */
          .mspabi.extab : {}                 /* C++ CONSTRUCTOR TABLES            */
          .const      : {}                   /* CONSTANT DATA                     */
       }

       GROUP(EXECUTABLE_MEMORY): ALIGN(0x0200) RUN_START(fram_rx_start)
       {
          .text       : {}                   /* CODE                              */
       }
    } > FRAM

    .bss        : {} > RAM                /* GLOBAL & STATIC VARS              */
    .data       : {} > RAM                /* GLOBAL & STATIC VARS              */
    .TI.noinit  : {} > INFOA                /* For #pragma noinit                */
    .TI.persistent  : {} > FRAM                /* For #pragma noinit                */

    .stack      : {} > RAM (HIGH)         /* SOFTWARE SYSTEM STACK             */

    .FRAM_DATA : {} > FRAM_DATA    type=NOINIT        /* new section, used as extra RAM */

    .infoA     : {} > INFOA              /* MSP430 INFO FRAM  MEMORY SEGMENTS */
    .infoB     : {} > INFOB

    /* MSP430 INTERRUPT VECTORS          */
    .int00       : {}               > INT00
    .int01       : {}               > INT01
    .int02       : {}               > INT02
    .int03       : {}               > INT03
    .int04       : {}               > INT04
    .int05       : {}               > INT05
    .int06       : {}               > INT06
    .int07       : {}               > INT07
    .int08       : {}               > INT08
    .int09       : {}               > INT09
    .int10       : {}               > INT10
    .int11       : {}               > INT11
    .int12       : {}               > INT12
    .int13       : {}               > INT13
    .int14       : {}               > INT14
    .int15       : {}               > INT15
    .int16       : {}               > INT16
    .int17       : {}               > INT17
    .int18       : {}               > INT18
    .int19       : {}               > INT19
    .int20       : {}               > INT20
    .int21       : {}               > INT21
    .int22       : {}               > INT22
    .int23       : {}               > INT23
    .int24       : {}               > INT24
    .int25       : {}               > INT25
    .int26       : {}               > INT26
    .int27       : {}               > INT27
    .int28       : {}               > INT28
    .int29       : {}               > INT29
    .int30       : {}               > INT30
    RTC          : { * ( .int31 ) } > INT31 type = VECT_INIT
    .int32       : {}               > INT32
    .int33       : {}               > INT33
    .int34       : {}               > INT34
    .int35       : {}               > INT35
    PORT2        : { * ( .int36 ) } > INT36 type = VECT_INIT
    .int37       : {}               > INT37
    .int38       : {}               > INT38
    PORT1        : { * ( .int39 ) } > INT39 type = VECT_INIT
    TIMER1_A1    : { * ( .int40 ) } > INT40 type = VECT_INIT
    TIMER1_A0    : { * ( .int41 ) } > INT41 type = VECT_INIT
    DMA          : { * ( .int42 ) } > INT42 type = VECT_INIT
    .int43       : {}               > INT43
    TIMER0_A1    : { * ( .int44 ) } > INT44 type = VECT_INIT
    TIMER0_A0    : { * ( .int45 ) } > INT45 type = VECT_INIT
    ADC10        : { * ( .int46 ) } > INT46 type = VECT_INIT
    USCI_B0      : { * ( .int47 ) } > INT47 type = VECT_INIT
    USCI_A0      : { * ( .int48 ) } > INT48 type = VECT_INIT
    WDT          : { * ( .int49 ) } > INT49 type = VECT_INIT
    TIMER0_B1    : { * ( .int50 ) } > INT50 type = VECT_INIT
    TIMER0_B0    : { * ( .int51 ) } > INT51 type = VECT_INIT
    COMP_D       : { * ( .int52 ) } > INT52 type = VECT_INIT
    UNMI         : { * ( .int53 ) } > INT53 type = VECT_INIT
    SYSNMI       : { * ( .int54 ) } > INT54 type = VECT_INIT
    .reset       : {}               > RESET  /* MSP430 RESET VECTOR         */
}

/****************************************************************************/
/* MPU SPECIFIC MEMORY SEGMENT DEFINITONS                                   */
/****************************************************************************/

/*
mpusb1 = (fram_ro_start + 0x4000 - 0xFFFF - 1) * 32 / 0x4000 - 1 + 1; // Increment by 1 for Memory Size of x.5
mpusb2 = (fram_rx_start + 0x4000 - 0xFFFF - 1) * 32 / 0x4000 - 1 + 1; // Increment by 1 for Memory Size of x.5
__mpuseg = (mpusb2 << 8) | mpusb1;
__mpusam = 0x7513;
*/


/****************************************************************************/
/* INCLUDE PERIPHERALS MEMORY MAP                                           */
/****************************************************************************/

-l msp430fr5728.cmd



  • Hello,

    bart van thielen said:

    The problem starts when I then start to single step in the debugger.
    After stepping through the loop one ore twice, the value of frameData[833] changes to a (seemingly) random value, and the program jumps out of the loop.

    What is wrong?

    It is hard to say without knowing more details about your application but please note that single stepping is very intrusive. Essentially, a breakpoint is being set on the next line in the loop and the target then runs to it. This kind of "stop mode debug" would stop all threads and prevent any interrupts from being handled when halted. It would certainly impact execution behavior of applications with real-time constraints. The type of behavior you see when stepping is a common symptom of this

    ki

  • Hello Ki,

    The application is a readback for the MLX90640 IR camera, but I threw all the details out to isolate the problem and simplify the code.

    Even If I step in the assembly code window, the value of  frameData[833] is affected without write access to it from the executed assembly code.

    What I worry about most, is that I might have made a mistake in the linker command file when I transferred  the usRegHoldingBuf / frameData variable to FRAM (regular RAM of this chip is too small).
    While compiling I get the warning below, which seems to point in that direction:
    warning #10247-D: creating output section ".FRAM" without a SECTIONS specification

  • bart van thielen said:
    What I worry about most, is that I might have made a mistake in the linker command file when I transferred  the usRegHoldingBuf / frameData variable to FRAM (regular RAM of this chip is too small).

    Did you only see the issue AFTER you modified the linker cmd file?

    bart van thielen said:
    While compiling I get the warning below, which seems to point in that direction:
    warning #10247-D: creating output section ".FRAM" without a SECTIONS specification

    Please see the related post below for more details on this message:

    https://e2e.ti.com/support/processors/f/791/t/829391

    Thanks

    ki

  • Hello,
    I haven’t heard back from you, hence this issue is being closed. If you wish to continue the discussion, please post a reply with an update below (or create a new thread).

    Thanks,
    ki