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.

[参考译文] 断点卡住和编译问题

Guru**** 2595805 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1279087/breakpoint-stuck-and-compiling-issues

器件型号:TMS320F28388D
主题中讨论的其他器件:SysConfigC2000WARE

您好!

我使用的是适用于 F28388D 的 MCU063B 版本控制卡。 我还在项目中使用了 C2000Ware 5.00.00.00、SysConfig 和 FreeRTOS。

我有两个不同的问题:

1) 1) 1)有时、在 CPU1中、我在 FreeRTOS 初始化后在我的任务的任何函数中添加一个断点、如果我继续(F8)、系统在该位置保持停止。 我需要移动一步进入/转过来、然后继续正常执行。 在 freertos_init()之前,也就是我的 Main 中调用的最后一个函数之前,断点行为是正确的,然后它 会按照我描述的方式发生变化。 您能帮助我理解为什么以及如何解决它吗?

2)第二个是一个非常奇怪的行为,可能与前一个有关,因为几天前我没有它。 我有3个任务以相同的优先级运行:1个任务用于高级算法(应用)、1个任务用于低电平驱动器(LowLevelManager)、另一个任务只是闪烁的 LED (LED1_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);
    }
}

Msg_Queue 调用 SendCmdToDriver (IO_IDO、(void *)&rty.io_Msg_out、rty.io_Msg_out.id、&lastIoId)时、即:

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;
            }
        }
    }
}

其中、rty 在另一个文件 Application.h 中声明

extern ExtY rty;

ExtY 是一个相当大的自定义数据类型。

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;

  Application_step()中,但在 SendCmdToDriver(...)中,rty.io_Msg_out.id 正确递增 它到达时始终为0。

我还尝试将其分配给变量、然后将其传递给函数:

currentID = rty.io_Msg_out.id;

SendCmdToDriver (IO_IoId Msg_Queue、(void *)&rty.IO_Msg_out、currentID、&lastIoId);

但是、当前 ID 也始终保持为0、并且无法正常工作。

我玩过编译优化和速度与大小的折衷,思考编译问题,也因为我在 RAM 执行接近完全使用,但没有成功。 代码在闪存中传递至执行、具有相同的行为。 有任何想法/帮助吗?

谢谢、此致、

法比奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fabio:

    您是在 QueueSend 还是在 QueueReceive 遇到问题?

    此致、

    维纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena:

    我想您指的是问题2):我声称的是值  rty.io_Msg_out.id 在我的表达式监视器中正确刷新、但我无法将其分配给变量(即 currentID)或直接将其传递给函数。 因此,在  SendCmdToDriver (...)中 , xQueueSend 之前,我可以看到它始终为0,因此 QueueSend 从未完成。

    在其他一些试验中、我得到了  rty.io_Msg_out.id 的地址、并将其放入 currentID 中、然后变为 uint16_t 指针、并且我已检查其是否指向错误的地址:

    怎么会这样呢?  

    此外,是否有任何迹象表明问题1)?

    谢谢。此致、

    法比奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena:

    您是否有关于这2个问题的任何更新?

    再次感谢、此致、

    法比奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    未找到正确地址的问题。 您能否共享相应的汇编指令?

    第一个问题是、您可以尝试重新启动 CCS 还是使用不同的工作区吗?

    此致、

    维纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena:

    关于第一个问题、 我重新启动了很多 CCS 和 PC、没有成功、但更改工作区似乎解决了这个问题:现在我又有一个正常的行为。

    关于第二个问题、请参阅以下说明:

    再次感谢、

    法比奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena:

    我有一个问题:我在不同的文件中对同一个自定义 typedef 有多个定义。

    像 IO_Msg_Out 这样的 E2P_Msg_out 是自定义数据类型结构、我在我的应用程序中更改了这些结构、但 我在另一个通用头文件中没有更改、即使我有#ifndedf 指令来避免重新定义、我认为也会发生一些编译问题、从而导致了奇怪的行为。

    再次感谢、此致、

    法比奥