Timer 计时器值之间的差异不符合预期

Timer 计时器值之间的差异不符合预期,timer,microcontroller,Timer,Microcontroller,如果这是一个基本问题,我很抱歉。 我正在做一个嵌入式项目。在项目的某些驱动程序文件中,有一个名为_timereturntime()的函数,据说它以10微秒的分辨率返回mcu时间。我猜它读取mcu定时器模块的寄存器并返回它们,这个定时器的分辨率为10微秒 我还有一个用户定义的函数。我想测试执行这个函数需要多少时间。 因此,我决定在函数的第一条指令之前和最后一条指令之后调用函数returnTime来实现这一点 在我要测试执行所需时间的函数中,我执行以下操作: myFunction() {

如果这是一个基本问题,我很抱歉。 我正在做一个嵌入式项目。在项目的某些驱动程序文件中,有一个名为_timereturntime()的函数,据说它以10微秒的分辨率返回mcu时间。我猜它读取mcu定时器模块的寄存器并返回它们,这个定时器的分辨率为10微秒

我还有一个用户定义的函数。我想测试执行这个函数需要多少时间。 因此,我决定在函数的第一条指令之前和最后一条指令之后调用函数returnTime来实现这一点

在我要测试执行所需时间的函数中,我执行以下操作:

myFunction()   
{
    time1 = returnTime();
      ...
    time2 = returnTime();
    time_elapsed = time2 - time1;
 }

当我执行此函数时,时间_经过的值为5,有时为4。那有可能吗。由于
returnTime()
函数返回的时间分辨率为10微秒,因此经过的时间不应该是10的倍数(如0、10、20等)

计时器的分辨率可能为10微秒,但
returnTime()返回的值的单位是什么?可能
returnTime()
返回一个以“滴答”为单位的值,其中一个滴答等于10微秒。(硬件定时器模块通常按一个刻度计数。)

让我们假设函数的执行时间为42微秒。如果函数在计时器下一次滴答声前一微秒开始执行,则计时器将在函数完成前滴答五次。但是,如果函数在计时器滴答声后一微秒启动,那么在函数执行期间计时器将只滴答声四次。所以有时候
returnTime()
会返回5,有时候会返回4


以上是最简单的解释。此外,硬件定时器模块可能会针对MCU时钟速度设置错误。此外,如果中断被启用,那么在函数执行期间可能会发生中断,这使得函数执行时间看起来有所不同。

这里发生了许多事情。10毫秒分辨率还是准确度?这是一个通用的功能,可以在所有速度下为mcu工作,即使是在mcu可以有更好的精度比最坏的情况下?虽然使用计时器测试代码是您的工作方式,但不熟悉计时器意味着您不会得到好的结果,大多数基准测试失败是因为不了解计时器是如何测量时间的。然后由于其他原因失败,即使有一个好的计时器。所以,要根据你的实验仔细判断你的表现,这要视情况而定。如果
returnTime()。但是如果
returnTime()
返回类似于刻度数的值,则可以得到4或5。文档到底说了什么?如果中间没有代码,多次调用returnTime(),time1=returnTime(),time2=returnTime(),time3=returnTime(),那么在几个示例显示/保存这些值并查看它们之后,它们是否会跳10秒?你会得到重复的值吗?对于像这样的基准测试,你想自己控制时间,不要使用函数,找一个可以完成工作的计时器并直接使用它。仔细检查编译器的汇编输出,以确认没有任何优化会打乱时间测量,并了解同一mcu上的相同机器代码可能会根据某些因素占用不同的时间,即使时间测量良好,取决于处理器/产品。同一代码/构建可能在不同的运行中因时间单位而不同,这在某些情况下是可能的,在其他情况下是不可能的。到目前为止,这是一个过于宽泛的问题。