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.

Breakpoint stuck and Compiling issues

Part Number: TMS320F28388D
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

Hi,

I'm using a MCU063B version of the Control Card for the F28388D. I'm also using C2000Ware 5.00.00.00, SysConfig and FreeRTOS in my project.

I have 2 different issues:

1) Since some days, when in CPU1 I add a breakpoint in any function of my tasks after FreeRTOS initialization, if I go on with Continue (F8), the system remains halted in that position. I need to mke a step into/over and then resume to go on normally. Before FreeRTOS_init(), that is the last function called in my Main, the breakpoint behaviour is correct, then it changes in the way I described. Can you help me understand why and how to fix it?

2) The second one is a very weird behaviour, maybe linked to the previous one because some days ago I did not have it. I have 3 tasks running at the same priority: 1 for high level algorithm (Application), one for low level drivers (LowLevelManager) and another one is just a blinking led (LED1_Task).

In the Application task:

{
    TickType_t xLastWakeTime;
    BaseType_t xWasDelayed = pdTRUE;

    uint16_t lastIoId = 0;
    uint16_t lastE2pId = 0;
    uint16_t lastRtcId = 0;
    uint16_t lastDb1Id = 0;
    uint16_t lastDb2Id = 0;
//    uint16_t lastSdId = 0;
    uint16_t lastCMId = 0;
    MCU2to1_Data_t mcu2to1Data_Rx;
    uint16_t currentID = 0;


    // Initialize the xLastWakeTime variable with the current time.
    xLastWakeTime = xTaskGetTickCount();

    //Application level initialization function
    Application_initialize();

    while(1)
    {

        //Step to be called every cycle (0.01ms)
//        if(xWasDelayed == pdTRUE){
            Application_step();

            currentID++;

            SendCmdToDriver(E2P_Msg_Queue, ( void * ) &rtY.E2P_Msg_out, rtY.E2P_Msg_out.id, &lastE2pId);
            SendCmdToDriver(IO_Msg_Queue, ( void * ) &rtY.IO_Msg_out, rtY.IO_Msg_out.id, &lastIoId);
//            SendCmdToDriver(RTC_Msg_Queue, ( void * ) &rtY.RTC_Msg_out, rtY.RTC_Msg_out.id, &lastRtcId);
//            SendCmdToDriver(DB1_Msg_Queue, ( void * ) &rtY.DB1_Msg_out, rtY.DB1_Msg_out.id, &lastDb1Id);
//            SendCmdToDriver(DB2_Msg_Queue, ( void * ) &rtY.DB2_Msg_out, rtY.DB2_Msg_out.id, &lastDb2Id);
//            SendCmdToDriver(SD_Msg_Queue, ( void * ) &rtY.SD_Msg_out, rtY.SD_Msg_out.id, &lastSdId);
            sendCmdToCM(rtY.CPU1toCM_Msg_out.cmd, rtY.CPU1toCM_Msg_out.id, &lastCMId);

            memcpy(&mcu2to1Data_Rx,spiARxDataBuff,MCU2_TO_1_DATASIZE);

            //wait for the next cycle: 10ms
            xWasDelayed=xTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(10));
//        }else{
//            //overrun occurred: to understand what to do...
//            ESTOP0;
//        }
            xTaskAbortDelay(Application_TaskHandle);
    }
}

when SendCmdToDriver(IO_Msg_Queue, ( void * ) &rtY.IO_Msg_out, rtY.IO_Msg_out.id, &lastIoId); is called, that is:

void SendCmdToDriver(QueueHandle_t Msg_Queue, void *msg_out, uint16_t currentId, uint16_t *lastId){
    //send to driver queue if new command has been generated
    if(currentId != *lastId){
        *lastId = currentId;
        if( Msg_Queue != 0 )
        {
            // Send a msg.  Wait for 100 ticks for space to become
            // available if necessary.
            if( xQueueSend( Msg_Queue, msg_out, ( TickType_t ) 100 ) != pdPASS )
            {
                // Failed to post the message, even after 100 ticks.
                ESTOP0;
            }
        }
    }
}

where rtY is declared in another file Application.h:

extern ExtY rtY;

and ExtY is a quite big custom data type.

typedef struct {
  E2P_c28_Msg_t E2P_Msg_out;           /* '<Root>/E2P_Msg_out' */
  IO_Msg_t IO_Msg_out;                 /* '<Root>/IO_Msg_out' */
  RTC_Msg_t RTC_Msg_out;               /* '<Root>/RTC_Msg_out' */
  MCU2to1_Data_t MCU2to1_Data_out;     /* '<Root>/MCU2to1_Data_out' */
  CPU1toCM_Msg_t CPU1toCM_Msg_out;     /* '<Root>/CPU1toCM_Msg_out' */
  DB_Msg_t DB1_Msg_out;                /* '<Root>/DB1_Msg_out' */
  DB_Msg_t DB2_Msg_out;                /* '<Root>/DB2_Msg_out' */
} ExtY;

It happens that rtY.IO_Msg_out.id is correctly incremented in Application_step(), but in SendCmdToDriver(...) it arrives always 0.

I also tried to assign it to a variable and then pass it to the function:

currentID = rtY.IO_Msg_out.id;

SendCmdToDriver(IO_Msg_Queue, ( void * ) &rtY.IO_Msg_out, currentID, &lastIoId);

but also currentID always remain 0 and it does not work.

I played with compiling optimization and Speed vs. size trade off, thinking to compiling problems, also because I was executing in RAM near to full usage, but with no success. Passing to execution in FLASH, the same behaviour. Any idea/help?

Thanks and best regards,

Fabio

  • Hi Fabio,

    Are you facing the issue at the QueueSend or at the QueueReceive?

    Regards,

    Veena

  • Hi Veena,

    I think you are referring to issue 2): what I claim is that the value rtY.IO_Msg_out.id is correctly refreshed in my expressions monitor, but I cannot assign it to a variable (i.e. currentID) or pass it directly to a function. So, in SendCmdToDriver(...) , before xQueueSend, I can see it is always 0, thus QueueSend is never done.

    With some more trials, I get the address of rtY.IO_Msg_out.id and I put it in currentID changed into a uint16_t pointer and I checked it is pointing to the wrong address:

    How can it be? 

    Moreover, any indication about issue 1)?

    Thanks and regards,

    Fabio

  • Hi Veena,

    do you have any update about these 2 issues?

    thanks again and best regards,

    Fabio

  • Regarding the currentID not getting the right address. can you share the corresponding assembly instructions?

    On the first issue, can you try restarting CCS or use a different workspace?

    Regards,

    Veena

  • Hi Veena,

    about the first issue,  I restarted a lot CCS and PC with no success, but it seems that changing the workspace fixed it: now I have again a normal behaviour.

    About the second issue, here the instructions:

    Thanks again,

    Fabio

  • Hi Veena,

    I got the point: I had multiple definitions of the same custom typedef in different files.

    The E2P_Msg_out like IO_Msg_out are custom data type structures that I changed in my application but I did not changed in another common header file and, even though I had #ifndedf instructions to avoid re-definition, I think that some compiling issues happened, causing the weird behaviour.

    Thanks again and best regards,

    Fabio