主题中讨论的其他器件: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