查看: 4011|回复: 15

[其他] 定时器计数溢出处理

[复制链接]
  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
    发表于 2016-12-2 09:11:07 | 显示全部楼层 |阅读模式
    假定我用定时器每1毫秒增加一,这个定为无符号长整型(long)全局变量:TIM1count;
    在运行程中我定义静态变量long time
    static long time=0;
    if((TIM1count-time)>100)
    {
      do some ;
    time=TIM1cout;//
    }

    这个功能是每隔100毫秒运行一次;
    这个TIM1cout 如果不超过最大值:2^32 ;是可以正常运行,但是要是溢出后就会出现问题,请问怎么处理这个BUG
    就是象
    static long time=0;
    if((TIM1count-time)>100)
    {
      do some ;
    time=TIM1cout;//这时time=4964294575;
    }
    运行到下一个计数器,
    TIM1cout=1;
    上面的语句就会出问题。。。
    希望大神给点指点

    我知道答案 目前已有15人回答
    不知道大家放假了吗
    回复

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25494
    最后登录
    2025-9-9
    发表于 2016-12-2 09:41:11 | 显示全部楼层
    楼主你好!
    long = int, 你数据越界了。
    可以定义为unsigned long long int.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
     楼主| 发表于 2016-12-2 09:52:27 | 显示全部楼层
    小恩GG 发表于 2016-12-2 09:41
    楼主你好!
    long = int, 你数据越界了。
    可以定义为unsigned long long int.

    我用的是8位的单片机,他的数据手册  unsigned long 最大值就是4294967295
    不知道大家放假了吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-12-2 10:03:58 | 显示全部楼层
    LZ还好,你这种定时器的用法本来就是很多风险的,中断资源宝贵用时需谨慎!你这问题确实如恩哥说的那样,解决方法就是你给一个比溢出值要小的最大值做裸机判断,这样应该可以解决一部分小问题,我给你个定时器任务的调度内核,比你这样用好多了

    timesysto.zip

    1.1 KB, 下载次数: 3, 下载积分: 威望 1

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25494
    最后登录
    2025-9-9
    发表于 2016-12-2 10:29:21 | 显示全部楼层
    lulugl 发表于 2016-12-2 09:52
    我用的是8位的单片机,他的数据手册  unsigned long 最大值就是4294967295

    先不说你几位单片机,单纯从你给的数据比较上说,

    4294967295 =? 0XFFFFFFFF, 四个字节
    4964294575=?  0x127e51faf, 有没有超出4个字节?
    都5个字节了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2023-1-31 09:38
  • 签到天数: 186 天

    连续签到: 1 天

    [LV.7]常住居民III

    0

    主题

    394

    帖子

    0

    高级会员

    Rank: 4

    积分
    852
    最后登录
    2023-2-8
    发表于 2016-12-2 11:16:14 | 显示全部楼层
    无论多少字节,必然要越界。现在楼主问的就是越界这个问题。
    期待大神出现
    赶紧干活吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-12-2 11:50:17 | 显示全部楼层
    三好学生 发表于 2016-12-2 11:16
    无论多少字节,必然要越界。现在楼主问的就是越界这个问题。
    期待大神出现 ...
    1. TICK DiffTime(TICK start, TICK end)
    2. {
    3.         TICK dwValue;

    4.         if (end >= start)
    5.         {
    6.                 dwValue = end - start;
    7.         }
    8.         else
    9.         {
    10.                 dwValue = MAX_COUNT_VALUE + end - start;
    11.         }

    12.         return dwValue;
    13. }
    14. 这样能解决么?最核心问题是越界后时间的差值不对了吧
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-27 15:17
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    124

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    395
    最后登录
    2021-4-28
    发表于 2016-12-2 13:51:28 | 显示全部楼层
    TIM1count其它地方要用吗?不用的话,直接
    static long time=0;
    if((time)>100)
    {
      do some ;
    time=0;//
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2023-1-31 09:38
  • 签到天数: 186 天

    连续签到: 1 天

    [LV.7]常住居民III

    0

    主题

    394

    帖子

    0

    高级会员

    Rank: 4

    积分
    852
    最后登录
    2023-2-8
    发表于 2016-12-6 10:54:40 | 显示全部楼层

    厉害了!这样挺好哇,既然楼主的1ms才让long型的数据加1,然后又是间隔100ms处理一次事务,所以越界也不会有时间差值的错误的。我觉得。
    赶紧干活吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
     楼主| 发表于 2016-12-7 11:47:13 | 显示全部楼层
    没事逛荡 发表于 2016-12-2 13:51
    TIM1count其它地方要用吗?不用的话,直接
    static long time=0;
    if((time)>100)

    其它的地方共用这个TIM1count
    不知道大家放假了吗
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-11 15:12 , Processed in 0.114330 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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