查看: 1650|回复: 3

[其他] 谨慎使用中断处理的标志

[复制链接]
  • TA的每日心情
    无聊
    2019-8-29 13:37
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    18

    主题

    88

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    251
    最后登录
    2022-1-14
    发表于 2015-11-10 12:48:52 | 显示全部楼层 |阅读模式
    因为处理不慎,可能出现莫名其妙的问题

    举例如下:
    byte gflag1, gflag2, gflag3, gflag4;

    void clearFlag(void)
    {
    gflag1 = 0; gflag2 = 0; gflag3 = 0; gflag4 = 0;
    }

    main()
    {
    if(gflag1)
    {
    //do something
    }else if(gflag2)
    {
    //do something
    }else if(gflag3)
    {
    //do something
    }else if(gflag4)
    {
    //do something
    }

    if(gflag1 || gflag2 || gflag3 || gflag4) clearFlag();//为了不处理同时出现多个标志的情况,或者为了方便,问题就出在这里,如果从这里发生中断,中断置位标志数据后,当程序从中断跳出继续执行这里时,就会把刚刚设置的标志立马清零,造成不能根据标志正常工作,正确的做法,应该在标志处理的同时清标志
    }

    /////////中断函数
    interrupt 15 void ISR15_Timer_CH7(void)
    {
        if(condition1) gflag1 = 1;
        if(condition2) gflag1 = 1;
        if(condition1) gflag1 = 1;
        if(condition1) gflag1 = 1;
    }

    ///////////////////////主函数中正确的处理方法
    main()
    {
    if(gflag1)
    {
    gflag1 = 0;
    //do something
    }else if(gflag2)
    {
    gflag2 = 0;
    //do something
    }else if(gflag3)
    {
    gflag3 = 0;
    //do something
    }else if(gflag4)
    {
    gflag4 = 0;
    //do something
    }
    }

    我知道答案 目前已有3人回答
    回复

    使用道具 举报

    该用户从未签到

    11

    主题

    343

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1260
    最后登录
    2017-11-6
    发表于 2015-11-11 08:47:15 | 显示全部楼层
    是这个道理,但是回来之后标志的更新应该放在那个位置。ISR里面?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-8-29 13:37
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    18

    主题

    88

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    251
    最后登录
    2022-1-14
     楼主| 发表于 2015-11-13 11:09:53 | 显示全部楼层
    watershade 发表于 2015-11-11 08:47
    是这个道理,但是回来之后标志的更新应该放在那个位置。ISR里面?

    对,更新可以放到ISR里,我就是这么处理的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-3 09:41
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    3

    主题

    732

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1802
    最后登录
    1970-1-1
    发表于 2015-12-22 19:59:39 | 显示全部楼层
    不错的小技巧
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-23 14:00 , Processed in 0.091195 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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