具有灵活位大小的定时器环绕

米拉尔

给定一个计数器/计时器增加并以给定的位宽简单地换行,对于找到计数器的两个捕获值之间的差(该计数器可能在两点之间换行)的问题,众所周知的解决方案是在计数器上执行无符号减法(如果不知道哪个较大,可以将结果解释为有符号)。

例如,给定一个32位定时器,可以使用如下代码来确定某些代码运行所需的时间:

uint32_t start = GetSomePlatformSpecificTimer();
RunSomeOtherCode();
uint32_t end = GetSomePlatformSpecificTimer();
uint32_t platformTicksTakenByCode = end - start;

或者,检查是否已达到某些时间限制:

uint32_t limit = GetSomePlatformSpecificTimer() + timeLimitInTicks;
while (true)
{
    bool finished = DoSomethingSmall();
    if (finished)
        break;
    if ((int32_t)(GetSomePlatformSpecificTimer() - limit) >= 0)
        return ERROR_TIMEOUT;
}

如果已知计时器的宽度为32位,则此方法非常有用。通过更改所使用的类型,也可以将其调整为16位或8位定时器。

在计时器大小与类型大小不匹配的情况下,是否有类似的简单方法可以执行相同的操作?例如,一个24位计时器或一个18位计时器。

假定位大小为<= 32,并且由#define COUNTER_WIDTH某些外部头中的a指定(并且可能会更改)。

最好的解决方案是将两个计数器的值从符号扩展COUNTER_WIDTH到32位,然后使用上面的代码吗?我可以看到可能适用于FF-> 00过渡,但我认为它将破坏7F-> 80过渡,因此大概必须对此进行某种检查(如果值接近零,则可能会扩展符号)和零扩展(如果值在中点附近)。我认为这也意味着两个值之间的差异不应超过计数器范围的四分之一,否则可能会引起问题。

还是有更好的方法来做到这一点?

托比·斯皮特(Toby Speight)

您可以乘以使其整个范围变成与算术类型相同的大小,而不是使用符号扩展。换句话说,使用定点算法来填充整数。在您的情况下,使用uint32_t,则看起来像

uint32_t start = GetSomePlatformSpecificTimer();
RunSomeOtherCode();
uint32_t end = GetSomePlatformSpecificTimer();
start <<= 32-COUNTER_WIDTH;
end <<= 32-COUNTER_WIDTH;
uint32_t platformTicksTakenByCode = end - start;
platformTicksTakenByCode >>= 32-COUNTER_WIDTH;

显然,您希望封装该算法:

const uint32_t start = GetScaledTimer();
RunSomeOtherCode();
const uint32_t end = GetScaledTimer();
const uint32_t platformTicksTakenByCode = RescaleDuration(end - start);

uint32_t GetScaledTimer()
{
    return GetSomePlatformSpecificTimer() << 32-COUNTER_WIDTH;
}
uint32_t RescaleDuration(uint32_t d)
{
    return d >> 32-COUNTER_WIDTH;
}

这样,您就具有了与全角计时器相同的行为,并且在必要时具有使用带符号类型的相同选项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有灵活数组成员的结构的大小

JSON解码具有灵活的类型

在UITableViewCell中检测具有灵活宽度的视图的最终布局大小

具有灵活大小的结构的MPI派生数据类型

散景 - 具有灵活映射的多线图

python中具有灵活参数的函数

使下拉菜单具有灵活的宽度

在C#中定义具有灵活尺寸的Func

具有灵活数组成员的结构的“数组”

具有灵活返回类型的C ++功能模板

Python Pandas:具有灵活列位置的 iloc

16 位定时器 PWM LED 调光器

具有开始和停止按钮逻辑的多定时器

具有8051 MCU(CC2541)的定时器基本中断

定时器服务:Bean 在 EJB3.1 中没有定时器

具有灵活长度的多维对象数组中的笛卡尔积(所有组合)

具有灵活高度和可滚动内容的对话框

具有灵活方向行和不同行高的Flex Gridlayout

如何均匀地分配具有灵活数组成员的结构体数组?

是否允许返回具有灵活数组成员的结构?

比较指向具有灵活数组成员的结构的 2 个指针

具有灵活后备值的java.time DateTimeFormatter解析

具有灵活聚合周期的按分组熊猫数据帧的均值

滚动片段中具有灵活内容的 Android 布局问题

在ScrollView中使用RecyclerView并具有灵活的Recycler项目高度

Symfony:具有灵活关系的实体及其(子)表单-如何设计?

使用具有灵活名称和库的PROC COPY创建表的副本

Android ImageView将较小的图像缩放为宽度,并具有灵活的高度,而不会裁剪或变形

Django中具有灵活URL模式的单元测试