系统滴答计时器读取时间发生时光倒流,高手解答下

2019-12-20 21:29发布

STM32F103,用系统滴答定时器,1ms的中断中期,USART接收数据过程中有超时检查,读两次时间,会出现第二次读出的时间比第一次小。比如第一次读是16S,905ms。第二次读就是16S,0ms。有个规律,凡是出现时光倒流的时候,第二次读取的毫秒值必定为0。代码如下:
void SysTick_Handler(void)
{
        Sys_Msecond++;
        if(Sys_Msecond>=1000)
        {
                Sys_Second++;
                Sys_Msecond = 0;
                if(Sys_Msecond > YEAR30)//秒数太大不可信,归零
                {
                        Sys_Second = 0;
                }
        }
}
读取时间的代码:
unsigned int Get_Sys_Secd(void)
{
        return  Sys_Second;
}
unsigned int Get_Sys_Msecd(void)
{
        return  Sys_Msecond;
}
void Get_Sys_Time(Sys_Time *time)
{
        time->Second = Get_Sys_Secd();
        time->Msecond = Get_Sys_Msecd();
        return ;
}
////////////////////////////////////等待数据的时候反复读取当前时间,这个肯定是会被滴答定时器中断打断
        while(cur_rcv == USART2_Rcv_Done)
        {
                Get_Sys_Time(&time_now);
                if( TURE == Is_TimeOut(&time_pre,&time_now,USART_RCV_TIMEOUT ) )
                {
                        return TIMEOUT;
                }
        }
后面我就猜测是读数据的顺序问题,抱着试一试的心态,搞了一把,解决了,但是不知其所以然,高手看下。
修改了读时间的顺序,先读毫秒
void Get_Sys_Time(Sys_Time *time)
{
        time->Msecond = Get_Sys_Msecd();
        time->Second = Get_Sys_Secd();//注意顺序,先读毫秒,不然会出现时光倒流。
        return ;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
cc224
1楼-- · 2019-12-22 03:59
先读毫秒也会有问题,比如在999ms的时候读了毫秒,对应是16秒的999ms,然后再去读秒的时候进了秒,变成了17秒,你读到的时候就是17s999ms,然而你再读一次时间,可能就是17s10ms这样。

可以在关中断方式下读,读完再打开中断,这样数据就不会错,反正读两个数据很快
如果有强迫症不想关中断,可以先读ms,再读s,再读一次ms,如果第二次的ms反而比第一次的小,说明发生了翻转,
这个时候的秒是不可靠的数据,就再读一次秒,ms也用第二次的数据就好了。
shuen729
2楼-- · 2019-12-22 09:52
cc224 发表于 2018-4-13 12:25
先读毫秒也会有问题,比如在999ms的时候读了毫秒,对应是16秒的999ms,然后再去读秒的时候进了秒,变成了17 ...

明白了,多谢。
shuen729
3楼-- · 2019-12-22 12:11
albert.hu 发表于 2018-4-13 11:30
你设计的时序有问题

读事件函数分两次

明白了,多谢。
shuen729
4楼-- · 2019-12-22 13:21
leafstamen 发表于 2018-4-13 11:31
过程是这样的:读出来秒了,然后进中断更新时间了,然后退出中断了,然后你继续去读毫秒了。 ...

明白了,多谢。
zjk
5楼-- · 2019-12-22 18:13
 精彩回答 2  元偷偷看……
相由心生
6楼-- · 2019-12-22 20:04
还有注意溢出的问题

一周热门 更多>