Part Number:TMS320F28377DOther Parts Discussed in Thread:SYSBIOS
使用4个LED监测运行状态(3个LED用于监测CPU1 SYSBIOS的多个Task和Hwi,1个LED监测CPU2定时中断),现象为:
(1)程序在线调试(Release或Ram)时,可以连续运行几分钟,4个LED均正常闪烁,没有问题。
(2)程序离线运行(在Flash中)时,运行几分钟后,监测CPU1 Task的LED由闪烁变为常亮/常灭,Hwi正常闪烁(Hwi由CPU2中的IPC触发);监测CPU2定时中断的LED正常闪烁。
我怀疑CPU1 Task被阻塞,故在Task中设标志位,每进一次Task完成一次递增,通过modbus发现,离线运行时,Task中标志位先增加,后不变,推测Task确实被阻塞,但原因未知。
调用ROV在线调试发现内存溢出(时间较长,一直运行到程序跑飞),如下图:
现在考虑增加Task堆栈进行测试(但总不能无限制的增加?),而且不明白问题出现的原因,请指教!
以及,Task 0x8ad64 stack overflow,是指task_CAN 0x8ab22吗?
(我已注册英文论坛账号,但是无法通过验证,所以无法在英文论坛发帖,如果可以,能否帮忙转发至英文论坛?谢谢!)
Yale Li:
您好,可以的。
如果方便的话,您可以将您的问题直接用英语表达出来吗?翻译的过程难免会有理解上的偏差,这样可以减少中间产生的误解。
,
Kocham HXJ:
你好,我正在尝试修改程序进行测试,如果不能解决,我再汇总问题并翻译!
,
Yale Li:
好的,有问题可以随时与我们联系
,
Kocham HXJ:
你好,经过排查,我发现程序离线运行崩溃的原因是IPC寄存器没有按照预设情况进行置位,从而进入while(1),两个CPU中的IPC函数如下图:
以下是我的理解:
(1)CPU1执行IPCSET.10以后,CPU1检测到IPCFLG.10=1(添加while(1)语句以确保完成置位,这也是离线运行出现问题的地方),CPU2检测到IPCSTS.10=1;
(2)CPU2以IPCSTS.10为判断条件执行数据读取语句,完成数据传输之后,CPU2执行IPCACK.10清除标志位,此时CPU2检测到IPCSTS.10=0;但是我不确定CPU1中IPCFLG是否被清零,这也是一个问题,请指教!
此外,我还尝试将IPC2配置为由CPU2触发,在CPU1中产生中断(使用SYSBIOS Hwi,中断号134),这一部分我还没有进行测试,不过我认为会出现相同的问题。
以及最重要的问题是,为什么IPC没有完成置位从而进入while(1)?我该如何保证两个CPU能够顺利完成置位,以及我该如何进行检测?
,
Kocham HXJ:
当我屏蔽掉 while(IpcRegs.IPCFLG.bit.IPC10 == 0){while_flag2 = 4;},程序可以离线运行,但是CPU2中也有类似语句,为何CPU2不会进入死循环?是否与SYSBIOS有关?
,
Yale Li:
已经帮您转到E2E了,请留意:
https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114387/tms320f28377d-the-ipc-register-is-not-set-according-to-the-preset-condition-causing-the-program-not-to-enter-while-1
您如果需要回复,直接回复在下边就行,我帮您跟进。