c - 使用 ARM Cortex SysTick 计算运行时间;当 SysTick 计数器翻转时会发生什么?

标签 c arm embedded integer-overflow

我目前正在旁听有关嵌入式系统的在线 edX 类(class),并学习如何使用 SysTick 计时器计算耗时。

Picture of logic I'm referring to

Code of logic I'm referring to

但是,有一点让我很困惑。我理解从“最后”中减去“现在”以获得耗时的想法。但是,当 SysTick 定时器达到 0 并重新加载时“现在”翻转时你会怎么做,但“最后”是 SysTick 定时器翻转之前的值(所以“现在”> 比“最后”,通常什么时候它应该更小)?该值存储在一个无符号长整数中,所以它会破坏程序吗?还是这永远不会发生,如果是,为什么?如果能帮我解决这个问题,我将不胜感激!

我查看了我能找到的与我的问题类似的唯一其他链接:How to deal with a wrapping counter in embedded C但我没有从中找到我的问题的明确答案。

最佳答案

以一个 3 位计数器为例,它都相同地扩展到 24 或 32(我认为系统计时器是 24。

所以向上或向下计数都没有关系,您只需要正确调整操作数即可。所以说倒数 7,6,5,4 7 - 4 是 3 个计数。但是二进制 1 - 6 = 001 - 110 中的 1,0,7,6 呢

     1
   001
+  001
=======

并解决

   011
   001
+  001
=======
   011     

并将正确答案裁剪为 3 位。

为 4 位或 5 位计数器尝试随机大小的计数编写程序应该很简单。或者使用固定大小的计数,允许使用质数翻转

#include <stdio.h>
#define BITMASK 0xF
int main ( void )
{
    unsigned int now;
    unsigned int beg;
    unsigned int end;
    unsigned int ra;
    unsigned int rb;
    now=0;
    for(ra=0;ra<100000;ra++)
    {
        beg=now;
        for(rb=0;rb<13;rb++) now--;
        end=now;
        if(((beg-now)&BITMASK)!=13)
        {
            printf("Error 0x%X 0x%X\n",beg,end);
        }
    }
    printf("Done.\n");
    return(1);
}

这仅适用于根据方向从全零翻转到全一或从全一翻转到全零的计数器。我希望如果你设置一个假设的 3 位定时器从 5 开始并且它从零回滚到 5 设定点那么三个步骤可能是 1,0,5,4 并且 1-4 不是 3

    111
    001
+   011
=========
    101

另一种思考方式是在环绕点附近的二进制补码的另一个特征

101  -3
110  -2
111  -1
000  +0
001  +1
010  +2

就像我们小学时用的数轴一样。从位模式 110 到 010 是 4 个步骤 +2 - -2 = 4 或数轴上的 4 个单位。 基本上使用二进制补码的优点,我们知道二进制补码的加法和减法不是无符号或有符号特定的,相同的位模式导致相同的位模式。这就是我们解释它们的方式。所以我们有点作弊,采用有符号数学并将结果解释为无符号。

关于c - 使用 ARM Cortex SysTick 计算运行时间;当 SysTick 计数器翻转时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41775672/

相关文章:

c - 在GCC中编译C文件时出错(多个文件合而为一)

android-ndk - ARM clang : couldn't allocate output register for constraint 'w'

gcc - AARCH64 上的 memcpy 产生未对齐的数据中止异常、ARM GNU 工具链或 newlibc Bug?

c - 我想在USB上编写应用程序吗?

c - 为什么 C 编译器不捕获此错误?

c - 代码执行在子进程中从哪里开始?

arm - 使用 Eclipse CDT 和 IAR 插件进行 headless 构建

c - 一个简单的 8051 C 中断事件计数器演示,不递增。

c - ATmega8 加/减计数器计数不正确

无法使用 sqlite3_bind_text 插入数据库