如何处理嵌入式 C 中的包装计数器 [英] How to deal with a wrapping counter in embedded C

查看:23
本文介绍了如何处理嵌入式 C 中的包装计数器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I need to deal with a counter that gives me ticks for my application. The counter is 32bits so what I need to know is how to deal with it when it wraps. for example:

I have a function that returns a (timestamp + shifttime) and I have another function that will return 1 or 0 depending whether or not the time has elapsed, but there is a possibility that that my counter will wrap how, do I deal with this?


Thanks a lot for all the responses guys. I will give more detail in this edit.

I am using the STM32 Cortex-M3. I wanna use the RTC counter to use it as the tick for my application to schedule tasks that need to happen at certain intervals. The RTC can generate an overflow interrupt so it's not a problem to detect the interrupt. the main problem that I have (or at least I think is a problem) is when certain tasks gets a (timestamp+shift) i.e.

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
    }
}   
}

Lets assume that my RTC counter is only 8 bits long to make the math easy.

If my current counter is at 250 when I get my timestamps that means that FlashLedTimeStamp = 14 and StatusLedTimeStamp = 253 how would I check to see that FlashLedTimeStamp has expired??

keep in mind that I don't necessarily check all the time to see what the current counter is and whether or not certain timestamps have expired. I hope this makes it clear what the problem I have is.

解决方案

If you take two timestamp readings and your first reading is greater than the second, then your counter has wrapped. That is the basic way to detect a wrapping counter.

This, however, won't detect if a counter has wrapped multiple times, or the case where a counter has wrapped and happens to be greater than the first reading. Since you said this was an embedded system and your description makes your "counter" sound like a clock, see if you can set an interrupt to fire whenever the clock reaches zero (so that you will get an interrupt every time the clock resets). When this interrupt fires, increment a separate counter. This should effectively add extra precision to your clock and allow your counter to wrap without causing problems.

这篇关于如何处理嵌入式 C 中的包装计数器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆