如何处理嵌入式C中的包装计数器

前端之家收集整理的这篇文章主要介绍了如何处理嵌入式C中的包装计数器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要处理一个计数器,让我给我的应用程序打勾.柜台是32位,所以我需要知道的是如何处理它,当它包装.例如:

我有一个函数返回(时间戳移位时间),我有另一个函数将返回1或0,这取决于时间是否已经过去,但是我的计数器可能会包装如何处理这个?

谢谢

非常感谢所有的回应者们.我将在这个编辑中给出更多的细节.

我正在使用STM32 Cortex-M3.我想使用RTC计数器将其用作我的应用程序的刻度来计划需要在特定间隔发生的任务. RTC可以产生溢出中断,因此检测中断不是问题.我有(或至少我认为是一个问题)的主要问题是某些任务获得(时间戳移位)即是.

int main( void )
{
FlashLedTimeStamp = ReturnCounter( 20 );  // currentcounter value + a shift of 20
StatusLedTimeStamp = ReturnCounter( 3 );  // currentcounter value + a shift of 3

//then later on ....
while(1)
{
    /* other tasks could go here */

    if( HasTimeElapsed( FlashLedTimeStamp );
    {
       /* do something and get another timestamp value */
       FlashLedTimeStamp = ReturnCounter( 20 );  // currentcounter value + a shift of 20
    }

    if( HasTimeElapsed( StatusLedTimeStamp );
    {
       /* do something and get another timestamp value */
       FlashLedTimeStamp = StatusLedTimeStamp( 3 );  // currentcounter value + a shift of 3
    }
}   
}

假设我的RTC计数器只有8位长,使数学变得容易.

如果我的当前计数器是250,当我收到我的时间戳,这意味着FlashLedTimeStamp = 14和StatusLedTimeStamp = 253我将如何检查看到FlashLedTimeStamp已过期?

请记住,我不一定要检查所有的时间,看看当前的计数器是什么,以及某些时间戳是否已经过期.我希望这清楚地说明了我所遇到的问题是感谢所有的进步.

解决方法

如果你采取两个时间戳读数,你的第一读数大于第二读数,那么你的计数器已经包装了.这是检测包装计数器的基本方法.

然而,这不会检测到计数器是否已经被多次包装,或者计数器已经包装并且恰好大于第一读数的情况.由于你说这是一个嵌入式系统,你的描述使你的“计数器”听起来像一个时钟,看看当时钟达到零时,是否可以设置一个中断点火(这样每次时钟复位都会产生一个中断).当该中断触发时,增加一个单独的计数器.这应该有效地为您的时钟增加了额外的精度,并允许您的计数器包装,而不会导致问题.

猜你在找的C&C++相关文章