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.

TMS320F28388D: 关于C28与CM4进程间通讯过程设置断点调试以及多通道消息调试的疑问

Part Number: TMS320F28388D


TMS320F28388D: C28XCPU1与CM4 IPC通讯不能进入中断 - C2000Tm︎ 微控制器论坛 - C2000 微控制器 - E2ETm 设计支持 (ti.com)

上面这个链接是工程师整理的IPC通讯相关的一个帖子

这个帖子最后的例程中,C28与CM4双方都是利用中断方式收发消息

C28发送数据 ----> CM收到数据后进入中断读取数据,随后在中断中向C28发送回复消息 ----> C28收到回复消息后进入中断读取回复数据,随后发送回复消息给CM

上述过程循环往复,C28与CM之间不断进行消息交互。

在这个例子中,应该不存在A发送数据,在B没有读取数据的时候A再次发送数据的情况。

问题1. 如果A发送数据,在B没有及时读取数据的情况下,A再次向B发送数据会出现什么情况。

我在调试中遇到了这样的现象:

在C28中设定了固定周期的Timer中断,在timer中断中定时向CM内核发送消息;

在CM内核接收中断中设置断点,发现第一次是可以进到中断中的,但是只能进一次,再全速运行CM的代码,就进不到中断了;但是如果C28和CM都是以全速方式运行,在两方的变量观测窗口、内存观测窗口看,数据交互似乎是正常的。

我想这是不是由于设置断点,导致CM内核程序执行中断,但是此时C28内核还在不停的向CM内核发送数据,从而导致以消息队列机制进行交互出现异常

问题2. 如果需要多个消息通道的数据收发交互,我可以这样定义和使用消息队列吗?

case1:

IPC_MessageQueue_t messageQueue1;
IPC_Message_t TxMsg1, RxMsg1;

IPC_MessageQueue_t messageQueue2;
IPC_Message_t TxMsg2, RxMsg2;


IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT1, IPC_INT1);
IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT2, IPC_INT2);

case2:

IPC_MessageQueue_t messageQueue;
IPC_Message_t TxMsg1, RxMsg1;
IPC_Message_t TxMsg2, RxMsg2;


IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT1, IPC_INT1);

  • 您好,我会在下周回来之后回复您

  • 1.

    我想这是不是由于设置断点,导致CM内核程序执行中断,但是此时C28内核还在不停的向CM内核发送数据,从而导致以消息队列机制进行交互出现异常

    是有这种可能的。

    2. 我向资深工程师咨询一下。

  • 您不需要使用两个独立的CPU1到CM的IPC中断来实现多个CPU1到CM的通信。您可以使用case2并且使用一个CPU1的IPC中断1去处理所有CPU1到CM的通信。

    //
    // Update TxMsg1 
    //
    TxMsg1.command = IPC_CMD_READ_MEM;
    TxMsg1.address = (uint32_t)readData1;
    TxMsg1.dataw1 = 10; // Using dataw1 as data length
    TxMsg1.dataw2 = 1; // Message identifier
    
    //
    // Send message to the queue
    //
    IPC_sendMessageToQueue(IPC_CPU1_L_CPU2_R, &messageQueue, IPC_ADDR_CORRECTION_ENABLE,
    &TxMsg1, IPC_BLOCKING_CALL);
    
    //
    // Update TxMsg2
    //
    TxMsg2.command = IPC_CMD_READ_MEM;
    TxMsg2.address = (uint32_t)readData2;
    TxMsg2.dataw1 = 15; // Using dataw1 as data length
    TxMsg2.dataw2 = 1; // Message identifier
    
    //
    // Send message to the queue
    //
    IPC_sendMessageToQueue(IPC_CPU1_L_CPU2_R, &messageQueue, IPC_ADDR_CORRECTION_ENABLE,
    &TxMsg2, IPC_BLOCKING_CALL);