工具/软件:Code Composer Studio
通过使用 CPU1中的 IPC 标志来注意 CPU2、我们在一个 ISR 中设置了两个 IPC 标志、如下所示、该 ISR 在2ms 运行:
#define IPC_FLAG_DATAREQUEST_CPU1 IPC_FLAG26
#define IPC_FLAG_DATAREQUEST_CPU2 IPC_FLAG27
void DataExchange(){
#if defined (CPU1)
// CPU1将 IPC 标志设置为每个 CPU
IPCLtoRFlagSet (IPC_FLAG_DATAREQUEST_CPU1);
IPCLtoRFlagSet (IPC_FLAG_DATAREQUEST_CPU2);
#endif
}
并在另一个运行速度为125us 的 ISR 中检测每个 CPU 中的 IPC 标志:
void CmdCheck(){
#if defined (CPU1)
DataRequest = IPCLtoRFlagBusy (IPC_FLAG_DATAREQUEST_CPU1);
#Elif Defined (CPU2)
DataRequest = IPCRtoLFlagBusy (IPC_FLAG_DATAREQUEST_CPU2);
#endif
if (DataRequest){
//重置 IPC 标志
#if defined (CPU1)
IPCLtoRFlagClear (IPC_FLAG_DATAREQUEST_CPU1);
#Elif Defined (CPU2)
IPCRtoLFlagAcknowledge (IPC_FLAG_DATAREEST_CPU2);
#endif
}
在正常情况下 ,在设置 IPC_FLAG26后,CmdCheck()中的指示器仅触发一次。
此机制有时工作正常、但我们发现 IPC_FLAG26 每次都不能正确清除、这会使设置 IPC_FLAG26后连续触发两次指示器。
在查看了1日专题讨论会和 F28377规格后、我使用的机器主义似乎是正确的。
在 F2837xD 示例:IPC_GPIO_TOGGLE 中,我发现每个 CPU 不仅通过调用 IPCLtoRFlagClear,而且还通过调用 IPCRtoLFlagAcknowledge 来清除自己的标志。
本地 CPU 清零本地标志是否必须在 CLR 之前使用 ACK? 但如果是这样、为什么该机制有时工作正常?
或者我没有注意到什么?