在线时间0 小时
UID344475
注册时间2012-2-28
NXP金币0
该用户从未签到
新手上路

- 积分
- 53
- 最后登录
- 1970-1-1
|
程序使用CAN中断唤醒与休眠.使用串口打印输出当前CAN状态.当速率正确时(主机和测试机均为500Kbps时),此程序是正常的.当速率不正确时,主机500kbps,测试机100kbps,理论上会导致主机持续的休眠唤醒.本程序既是在错误速率下,持续唤醒休眠,无意间发现了中断的问题,请各位大侠分析下可能是哪里的问题!
程序如下:
此处为判断500ms无数据则进入休眠:
if(CANRecTime >= TIME_500MS)
{
if(CANStatus != CAN_SLEEP)
{
DisableInterrupts;
CANRFLG_WUPIF = 1;
CANCTL0_SLPRQ = 1;
while(!CANCTL1_SLPAK);
CAN_EN = CAN_SLEEP;
CANStatus = CAN_SLEEP;
DebugStrCpy("\r\nCAN STATUS : SLEEP");
EnableInterrupts;
asm("nop"); //添加此句会导致DEBUG持续输出
}
CANRecTime = TIME_500MS; //将此两句提至睡眠控制前执行可消除DEBUG输出引起的RF失效问题(编译器引起)
CANActiveF = 0;
}
///////////////////////////////
以上程序中 如不添加NOP语句则运行正常,添加后不正正常.
正常输出(串口打印)为:
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
CAN STATUS : WAKE UP
CAN STATUS : SLEEP
不正常输出为:
CANTUS : P
CANTUS : UP
CAATUS :EP
CAATUS :E UP
CTATUS EEP
CTATUS KE UP
STATUSLEEP
STATUSAKE UP
STATUSLEEP
STATUWAKE UPN STAT SLEEPN STAT WAKE UAN STA: SLEEAN STA: WAKE CAN ST : SLECAN ST : WAK
CAN US : S
CAN US : WUP
CANTUS : P
CANTUS : UP
////////////////////////////////
开始我以为是编译错误导致的,查看汇编后,编译的语句是没错的.于是怀疑是否由于SEI/CLI语句使用前后有什么需要保护的或者不能执行的?请FAE释疑.
已解决:CLI后,如果有中断,则立即触发。中断检查是不能在指令边界检测的,所以导致执行在下一条语句时即会触发中断。如无NOP指令,则中断发生在RecTime赋值后,ActiveF赋值前;添加NOP指令后,中断发生在NOP指令后,RecTime赋值前。因为唤醒时会把RecTime计时清空,所以导致唤醒后RecTime被清空后,又立即被赋值为500MS,等待时间失效,导致了连续输出。
总之,上述写法不适用频繁的睡眠唤醒总线测试,将RecTime赋值提前到关中断之前是解决此类问题的有效办法。加NOP的调试现象与CLI后中断判断执行时间有关。谢谢各位看官!
|
|