打印

有段程序看不明白~~~

[复制链接]
1321|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
intermec|  楼主 | 2014-11-2 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, timer, ck, ST, TE
uint8_t current_clock = 0;  

void timer_config(void)  
{  
    /* Systick时钟每秒触发CLOCK_SECOND次 */  
    if (SysTick_Config(SystemCoreClock / CLOCK_SECOND))  
    {  
        while (1);  
    }  
}  
  
void SysTick_Handler(void)  
{  
    /* 时间标志累加 */  
    current_clock++;  
}  
  
uint16_t clock_time(void)  
{  
    return current_clock;  
}  
  
void timer_set(timer_typedef* ptimer,uint16_t interval)  
{  
    /* 设置时间间隔 */  
    ptimer->interval = interval;  
    /* 设置启动时间 */  
    ptimer->start = clock_time();  
}  
  
void timer_reset(timer_typedef * ptimer)  
{  
    ptimer->start =ptimer->start + ptimer->interval;  
}  
  
int8_t timer_expired(timer_typedef* ptimer)  
{  
   
    if((int8_t)(clock_time() - ptimer->start) >= (int8_t)ptimer->interval)  
        return 1;  
    else  
        return 0;  
}   

想问问这个函数中当ptimer->start=250,ptimer->interval=10时,current_clock为无符号会益出,但我写了程序测了下,它能返回1,高手能讲解下为什么吗??

相关帖子

沙发
keer_zu| | 2014-11-3 09:09 | 只看该作者
uint16_t clock_time(void)  
{  
    return current_clock;  
}  
  
你的函数返回类型是unsigned short的吧。就因为这个。建议不要这样写,特别是非8位的片子。

使用特权

评论回复
板凳
xlsbz| | 2014-11-3 17:00 | 只看该作者
本帖最后由 xlsbz 于 2014-11-3 17:02 编辑

负数取反加1。谭浩强书前几页就有

使用特权

评论回复
地板
xlsbz| | 2014-11-3 17:01 | 只看该作者
这个编译器要强制。51keil不用

使用特权

评论回复
5
intermec|  楼主 | 2014-11-3 20:06 | 只看该作者
keer_zu 发表于 2014-11-3 09:09
uint16_t clock_time(void)  
{  
    return current_clock;  

是的,这里是 uint8_t

使用特权

评论回复
6
intermec|  楼主 | 2014-11-3 20:12 | 只看该作者
本帖最后由 intermec 于 2014-11-3 20:24 编辑
yyy71cj 发表于 2014-11-3 10:32
问题就出现在
    if((int8_t)(clock_time() - ptimer->start) >= (int8_t)ptimer->interval)  
这句。

原来这样,但这还有个疑问就是,我觉得这样来实现定时会不会有问题呢?平时总是用标志位来定时,第一次看到还能这样写的,,但我总感觉这其中的转换是否每次都会间隔10呢,因为这其中的转换有点乱,不是很会算,还请大虾,指点下~~~

还有就是为什么要转成int8_t呢??
能讲解下越位补偿是什么概念吗??

使用特权

评论回复
7
intermec|  楼主 | 2014-11-4 00:00 | 只看该作者
本帖最后由 intermec 于 2014-11-4 00:13 编辑
yyy71cj 发表于 2014-11-3 21:04
其实要达到目的很简单,你先把这两个无符号变量扩大成有符号16位的,就能达到目的。因为比较运算 ...

感谢版主的耐心讲解,,,原来越位补偿是版主自创的,怪不得百度不着。。。,但这个回答中我有一点不明白,为什么说“但是对于你这种情况,可能强制成int16_t更合理”,如果定义成16位变量不也和8位一样存在益出的情况吗??

使用特权

评论回复
8
keer_zu| | 2014-11-21 18:18 | 只看该作者
找到问题所在了吗?如果找到了,谈谈心得吧。敞开交流嘛。。。。。。。。。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

49

帖子

1

粉丝