gpt4 book ai didi

c - 如何处理嵌入式 C 中的环绕计数器

转载 作者:太空狗 更新时间:2023-10-29 16:39:17 26 4
gpt4 key购买 nike

我需要处理一个为我的应用程序提供报价的计数器。计数器是 32 位的,所以我需要知道的是当它换行时如何处理它。例如:

我有一个返回 (timestamp + shifttime) 的函数,还有另一个函数会返回 1 或 0,具体取决于时间是否已经过去,但有可能我的counter 将如何包装,我该如何处理?


非常感谢大家的回复。我将在此编辑中提供更多详细信息。

我正在使用 STM32 Cortex-M3。我想使用 RTC 计数器将其用作我的应用程序的时钟,以安排需要在特定时间间隔发生的任务。 RTC 可以产生溢出中断,因此检测中断不是问题。我遇到的主要问题(或者至少我认为是一个问题)是当某些任务获得 (timestamp+shift)

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 = 14StatusLedTimeStamp = 253 我将如何查看 FlashLedTimeStamp 已过期??

请记住,我不必一直检查当前计数器是多少以及某些时间戳是否已过期。我希望这能说明我遇到的问题是什么。

最佳答案

只要开始计数和结束计数之间的差小于 232 并且执行无符号 32 位算术,即使计数值跨越换行点,也没关系。 (如果使用有符号运算,跨度必须小于232/2)

例如:

Start count: 0xfffffff
End Count: 0x00000002 (incremented through 0,1,2 - i.e. three counts)

End - Start == 0x00000002 - 0xfffffff == 0x00000003

所以只要计数器是内置整数类型的位宽,并且使用该类型,就可以得到正确答案。如果计数器寄存器的宽度可能不是内置整数类型的宽度,您可以通过屏蔽高阶“溢出”位来实现相同的效果。

如果您出于其他原因需要更大的计数,或者如果连续时间戳之间的差异太大,那么您可以简单地使用另一个整数,该整数在低阶计数器回绕时递增。这个整数将构成一个更大整数的高位,所以第二个整数的LSB就是这个更大整数的第33位。

关于c - 如何处理嵌入式 C 中的环绕计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3095623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com