硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3661|回复: 8
收起左侧

[emWin] emwin裸跑获取时间函数溢出怎么办啊?

[复制链接]

15

主题

34

回帖

79

积分

初级会员

积分
79
发表于 2015-8-3 23:14:23 | 显示全部楼层 |阅读模式
emwin裸跑获取时间函数溢出怎么办啊?裸跑的时候我看例程里面就是用systick来计数,计算到0x7fffffff后再从0 开始,
这个对于emwin的运行没有问题吗?
2.还有带操作系统跑的时候 获取的是操作系统的心跳时间,rtos的心跳时间是不是也跟定时器一样到一定值了 又从0开始的吧?
如果是这样的话  一样会引发溢出的问题啊   
望指导下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-8-3 23:30:01 | 显示全部楼层
都没有问题的,RTOS里面一般都是差值处理方式。

如果是int32_t类型的。
0x7FFF_FFFF 完毕了不是0,是从最小的负值INT32_MIN 开始。
回复

使用道具 举报

15

主题

34

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2015-8-5 18:18:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:都没有问题的,RTOS里面一般都是差值处理方式。

如果是int32_t类型的。
0x7FFF_FFFF 完毕了不是0,是从最小的负值INT32_MIN 开始。 (2015-08-03 23:30) 
我觉得如果是单单差值处理   反而更加会出问题了  ,就按你所说的来分析一下
假如是一个32位的整形数,当计算到0x7FFF_FFFF后再从小的负数加,
在减的时候  出现小数减大数的情况怎么办呢?  因为这个问题是我在看了uip的代码后
想到的  在uip里面 有这么一个函数
int
timer_expired(struct timer *t)
{
    return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval;
}
其中clock_time()  就是获取的我们给的心跳时钟     每次调用这个函数后 就掉下面的函数重新开始
void
timer_reset(struct timer *t)
{
    t->start += t->interval;
}
这样会不会就有机会导致clock_time() - t->start<0 呢?(当时钟变到负值以后,或者说时钟重新计时的时候)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-8-5 18:24:02 | 显示全部楼层

回 anvy178 的帖子

anvy178:我觉得如果是单单差值处理   反而更加会出问题了  ,就按你所说的来分析一下
假如是一个32位的整形数,当计算到0x7FFF_FFFF后再从小的负数加,
在减的时候  出现小数减大数的情况怎么办呢?  因为这个问题是我在看了uip的代码后
想到的 .. (2015-08-05 18:18)
你可以实际在板子上面测试下有符号32位数的减法,用一个小数减大数看看,特别是一个比较小的负数去减一个大的正数,
在一定的范围内,这么结算是没问题的,也就是两个数想减超出了32位无符号数所能表达的最小值,这样的话比较符合实际情况。

简单起见可以用8位有符号数测试。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-8-5 18:33:08 | 显示全部楼层
其实不过UIP,你看下emWin获取时间基准的时候也是这样的:
/*********************************************************************
*
*       Global data
*/
volatile GUI_TIMER_TIME OS_TimeMS;

/*********************************************************************
*
*      Timing:
*                 GUI_X_GetTime()
*                 GUI_X_Delay(int)

  Some timing dependent routines require a GetTime
  and delay function. Default time unit (tick), normally is
  1 ms.
*/

GUI_TIMER_TIME GUI_X_GetTime(void) {
  return OS_TimeMS;
}

void GUI_X_Delay(int ms) {
  int tEnd = OS_TimeMS + ms;
  while ((tEnd - OS_TimeMS) > 0);
}
回复

使用道具 举报

15

主题

34

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2015-8-7 16:04:30 | 显示全部楼层

回 eric2013 的帖子

eric2013:其实不过UIP,你看下emWin获取时间基准的时候也是这样的:
/*********************************************************************
*
*       Global data
*/
....... (2015-08-05 18:33) 
这样获取时间 是没错   

你觉得uip 的那个timer_expired 这个函数会有问题吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-8-7 17:40:15 | 显示全部楼层

回 anvy178 的帖子

anvy178:这样获取时间 是没错  

你觉得uip 的那个timer_expired 这个函数会有问题吗? (2015-08-07 16:04) 
也没问题的,还是我前面说的那个32位无符号数相减的问题。
回复

使用道具 举报

6

主题

32

回帖

6

积分

新手上路

积分
6
发表于 2015-8-12 12:07:29 | 显示全部楼层
请参考,unsigned 和  signed  操作,长字节数 和 短字节数混合运算的 博客
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-8-12 21:50:26 | 显示全部楼层

回 true_casey 的帖子

true_casey:请参考,unsigned 和  signed  操作,长字节数 和 短字节数混合运算的 博客 (2015-08-12 12:07) 
好久没有见你来论坛了[s:142]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-12 23:38 , Processed in 0.520429 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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