查看: 3608|回复: 7

HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!(已解决)

[复制链接]

该用户从未签到

4

主题

32

帖子

0

新手上路

Rank: 1

积分
53
最后登录
1970-1-1
发表于 2014-2-13 16:47:38 | 显示全部楼层 |阅读模式
程序使用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后中断判断执行时间有关。谢谢各位看官!
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2014-2-14 09:50:50 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    串口输出用的是查询方式,还是中断方式?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    32

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2014-2-14 09:54:39 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    串口输出是查询方式,一个滚筒缓冲区,双指针,当指针不同步时,打印缓冲区
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    32

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2014-2-14 09:57:53 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    DebugStrCpy()只是把要打印的字符添加到缓冲区,DebugPrint()是查询打印函数,在大循环中调用。现在已经清空了其他所有功能,只剩下CAN和Debug功能了,一样有此现象。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    32

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2014-2-14 09:57:53 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    DebugStrCpy()只是把要打印的字符添加到缓冲区,DebugPrint()是查询打印函数,在大循环中调用。现在已经清空了其他所有功能,只剩下CAN和Debug功能了,一样有此现象。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    32

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2014-2-14 10:55:44 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    没人碰到过吗?  顶一下 别沉了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2014-2-14 11:09:02 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    如果是一条空指令,应该没有太大影响。是否可以仿真一下,看一下当时寄存器的状态。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    32

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2014-2-17 10:42:20 | 显示全部楼层

    RE:HCS08 CAN唤醒与休眠 不同写法编译后会导致不同的调试输出效果!!!轻FAE答疑

    这个确实不太好仿真,因为是CAN频繁中断,仿真的时候连续运行 DEBUG输出是正常的;断点运行又看不出有什么错误。
    另:不仅仅是添加nop指令会导致此类问题。当500MS的赋值指令和清空ActiveF标志位这两条语句调换也会出现与添加NOP指令相同的后果。如果将这两句提前到中断关闭开启之前,调试输出又是好的!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-27 10:18 , Processed in 0.100160 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表