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.

[参考译文] TMS320F28386S-Q1:IPC API 停止向另一个处理器发送信号

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1245657/tms320f28386s-q1-ipc-api-stops-signaling-the-other-processor

器件型号:TMS320F28386S-Q1
主题中讨论的其他器件:C2000WARE

这是对原帖的修改。 我试图领导我的原始文章更清楚的总结和声明我的问题:

我 试图修改一个 TI 提供的基本 IPC 通信示例、因此该示例是双向的、但我 遇到了问题。

TI 示例如下:

"C:\ti\cc2000\C2000Ware_4_03_00_00\driverlib\f2838x\examples\C28x_cm\IPC\ccs\ipc_ex1_basic.projectspec"

该工具有两个源文件: "ipc_ex1_basic_c28x1.c"和"ipc_ex1_basic_cm.c"。

此示例代码演示了 C28x 处理器如何使用基本 IPC API 函数将包含10个整数的数组发送至通信管理器(CM)处理器。  我能够在 TI 电路板上构建并运行如书中所描述的示例。

我修改了此示例、以便 CM 在收到来自 C28x 的数据后、使用基本 IPC 函数将一组10个整数发送回 C28x。 在每个程序中、我添加了一个全局变量、并在相应程序的 IPC 中断处理程序中递增。

最后、我修改了示例程序 、以继续以这种方式交换消息、一次一个、永远。  

问题在于 IPC 中断处理程序函数不会再次调用  之后 CM 首次发送 C28x 一条 IPC 消息。 因此、当 CM 尝试发送第二条消息时、它不停地等待来自 C28x 端的确认。  正如在未经修改的示例中,在首次调用 IPC ISR 中的 IPC_readCommand ()之后,我将调用 IPC_sendResponse ()和 IPC_ackFlagRtoL()。  是否应调用 IPC_ackFlagRtoL()清除所有必要的内容,以便 CM 能够再次使用 IPC 标志来中断 C28x?  我已经附上了 CM 和 C28x 示例工程(包含我所做的修改)。

下面是原来的帖子有一个更详细的一点...

我以两种方式修改了"ipc_ex1_basic_cm"示例:

1.我添加了一条代码、其中包含数据的消息从 CM 发送回 CPU1。

2.我修改了此示例,因此 CPU1和 CM 将轮流使用 IPC 发送其他消息。

我已经能够观察到以下情况、然后出现问题:

a. CPU1使用带有 FLAG0的 IPC 向 CM 发送一条包含数据的消息

b. CM 的处理程序使用 IPC_readCommand ()、IPC_sendResponse ()和 IPC_ackFlagRtoL()以及 IPC_FLAG0。 处理程序递增计数器(程序启动时初始化为0)。

c. CPU1等待该应答并调用 IPC_getResponse ()来读取响应值。

 重复步骤 a - c、这次 CM 向 CPU1发送消息、CM 将使用 IPC_FLAG1向 CPU1发送信号。  CPU1中的处理程序将计数器递增(程序启动时初始化为0)。

每个处理器中的计数器现在为1。

重复步骤 a - c (CPU1发送到 CM)。  CM 侧的计数器现在为2、而 CPU1侧的计数器仍为1。

问题就在这里:

步骤 a - c 将要重复(CM 发送到 CPU1),但在步骤 A 中,CM 在调用 IPC_waitForAck()时仍被阻止。  此第二次传输过程中,CPU1代码未执行其处理程序,因此不会调用 IPC_ackFlagRtoL()函数(属于处理程序代码的一部分)。

问题是:为什么在首次调用 CPU1的处理程序后不会调用该处理程序?   第一次调用 CPU1的处理程序(针对 IPC_FLAG1)之后、似乎有些东西没有清除、但我不明白。

不使用消息队列(这是对基本 IPC 示例的修改).e2e.ti.com/.../TI_5F00_help_5F00_ticket_5F00_IPC_5F00_lockup.zip

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

    您 没有应答 CPU1上的中断。 确认 IPC ACK 标志后立即放置此代码。  

    IPC_ackFlagRtoL(IPC_CPU1_L_CM_R, IPC_FLAG1);
    ->Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP11);


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

    谢谢 Tristen!  在我阅读的文档中、没有一处地方可以看到在使用"IPC ack"后对这次调用的需求。  因此、文档没有具体说明对它的需求、或者我错过了一个文档、或者读者在更好地了解了文档的不同部分后必须收集这些文档。  我希望我有这种理解,或者我知道在哪里阅读。 阅读了文档后,我假定 IPC_ackFlagRtoL()调用足以清除所有内容,但很显然,这一假设是不正确的。

    您的建议有效。

    您能否向我指出应阅读的文档位置、以便我能够更好地理解 IPC 为何需要此内容?  此外、我想知道为何该调用在 CM 处理器上不是必需的、但在 C28x 处理器上是必需的。  您能解释一下吗?   

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

    您好、James:

    请允许我在另一天写一个完整的回答。

    此致、

    本·科利尔

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

    您好、James:

    对于 C28x 处理器、您可以阅读 F2838x TRM 的这一部分、了解为何需要清除 PIEACK 寄存器。

    TRM 的第3.4节对 C28x CPU 上的中断进行了一般性概述、3.4.2.2对 PIEACK 进行了讨论、不过上面绘制的 PIEACK 寄存器部分提供了更详细的描述。

    CM 是具有不同架构(ARM)的不同 CPU、其中断工作方式也不同。 从 TRM 的第41.7.1节来看、似乎在进入 ISR 后中断标志会自动被清除。  

    如果您有任何其他问题、敬请告知。

    此致、

    本·科利尔

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

    Ben -感谢您为我指出正确的文档,这些文档解释了为什么 Tristen 的提交解决了我的问题。  掌握背景非常有价值。