Part Number:TMS320F28388D
TMS320F28388D: C28XCPU1与CM4 IPC通讯不能进入中断 – C2000︎ 微控制器论坛 – C2000 微控制器 – E2E 设计支持 (ti.com)
上面这个链接是Green Deng工程师整理的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);
Yale Li:
您好,我会在下周回来之后回复您
,
Yale Li:
1.
user78960159 说:我想这是不是由于设置断点,导致CM内核程序执行中断,但是此时C28内核还在不停的向CM内核发送数据,从而导致以消息队列机制进行交互出现异常
是有这种可能的。
2. 我向资深工程师咨询一下。
,
user78960159:
好的 感谢帮助
,
Yale Li:
您不需要使用两个独立的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);