TI 专家您好,
近期工程中发现使用6678进行IPC通信时,一个CCS V5.1软件仿真与EVM6678LE硬件运行结果不一致的问题。测试程序基于6678的IPC demo,主要完成以下的工作:
1、core0依次给core1~core7设置IPC中断;
2、core1~core7在ISR中断程序中执行一些运算,运算结束后将IPCAR清零,清零操作如下:
read_ipcgr = *(volatile Uint32 *) iIPCGRInfo[CoreNum];
*(volatile uint32_t *) iIPCARInfo[CoreNum] = read_ipcgr; //clear the related source info
3、core0做一个轮询判断,当全部核的IPCAR寄存器清零之后,继续之后的计算,轮询代码如下:
uint8_t FinishFlagCnt;
do{
FinishFlagCnt = 0;
uint32_t read_ipcar = 0;
for(i = 0; i<7 ; i++)
{
read_ipcar = *(volatile uint32_t *) iIPCARInfo[(i+1)];
//printf("*(volatile uint32_t *) iIPCARInfo[(i+1)] = %x\n", *(volatile uint32_t *) iIPCARInfo[(i+1)]);
if ( 0 == read_ipcar)
FinishFlagCnt ++;
}
}while(FinishFlagCnt != 7);
在软件仿真中,程序可以正常运行并执行之后的操作。在EVM6678LE开发板上却遇到了最后被设置中断的3~4个核无法清零IPCAR的问题,导致core0无法跳出上述的循环。
为了方便你们重现问题,将测试程序打包在附件,希望可以给出解答。
Thomas Yang1:
没有清零IPCAR的那几个核的中断程序正常执行没有呢?那几个核的清零操作执行没有呢?
Aimee Ma:
回复 Thomas Yang1:
您好,感谢您的回复,
IPCAR寄存器没有清零的那几个核的中断服务程序是正常执行了的,因为计算结果可以在MSMC寄存器中看到了。
为了确定清零操作有没有执行,我把清零的语句放在计算语句之前,发现core0在查询IPCAR[5]~IPCAR[7]寄存器时,这三个寄存器仍然没有清零,但是计算结果已经在MSMC中了,所以我觉得清零操作是执行了的。