This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TM4C1231H6PM:测量函数执行所需的时间

Guru**** 2527070 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/753274/compiler-tm4c1231h6pm-measuring-the-time-it-takes-for-a-function-to-execute

器件型号:TM4C1231H6PM

工具/软件:TI C/C++编译器

大家好、这是我的代码:

int main ()

{

while (1)

get_inputs();

some _condition_function();

} 

我想知道"so_mand_dfunction()"在 TI Launchpad 上执行所需的时间。

我知道的唯一方法是使用微控制器的定时器外设之一在函数被调用前开始计数一行、并在函数返回时读取计数值。

是否有更好/更简单的方法?   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您使用计时器的方法将起作用、许多人使用此方法。 您还可以在调用 so_mand_function 之前切换 GPIO 引脚、在函数之后切换 clear 引脚。 您可以在范围内测量时间。 如果您希望基于增量时间在代码流中做出决定、则需要使用计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否发布计时器方法的示例代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下代码来自 TivaWare 外设驱动程序库用户指南。 您可以在第28.3节中找到相同的内容。 只需在 SysTickValueGet ()之前添加函数即可。

    uint32_t ui32Value;
    //
    配置并启用 SysTick 计数器。
    //
    SysTickPeriodSet (1000);
    SysTickEnable();
    //
    //延迟一段时间...
    //
    //
    ////读取当前 SysTick 值。
    //
    ui32Value = SysTickValueGet ();
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    似乎此代码使用内部 ARM CPU 计时器-而不是外设计时器之一-我是否正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是使用 ARM CPU 的系统计时器。 如果需要、您可以使用通用定时器、但我认为 SysTick 设置更容易、可以满足您的需求。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    假设我调用以下2个函数:
    SysTickPeriodSet (1000);
    SysTickEnable();
    在(例如) 400个周期之后,我调用 SysTickValueGet ()-我想我得到的值将是600,这是正确的... 但计时器将继续递减、我不想这么做。
    如何使其停止并将其返回到1000以便再次使用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果要停止计数器、可以调用 SysTickDisable。 但是、这仅意味着当前计数器停止。 在您的示例中、计数器将保持在600。 重新启用后、在重新加载1000之前、它将继续从600向下计数到0。 如果要立即重新加载、则需要直接向 NVIC_ST_CURRENT 寄存器写入重新加载的值。

    28.2.2.2 SysTickEnable
    启用 SysTick 计数器。
    原型:
    无效
    SysTickEnable (空)
    描述:
    此函数启动 SysTick 计数器。 如果已注册中断处理程序、则会调用它
    计数器回滚时的值。
    注:
    调用此函数会使 SysTick 计数器从其当前值开始(重新)计数
    值。 计数器不会自动重新加载上一次调用中指定的周期
    SysTickPeriodSet()。 如果需要立即重新加载、则使用 NVIC_ST_CURRENT 寄存器
    必须写入以强制重新加载。 对该寄存器的任何写入操作都会将 SysTick 计数器清零
    并在下一个时钟上使用提供的周期进行重新加载。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次澄清。 写入 NVIC_ST_CURRENT 将使用存储在重装寄存器中的值强制重新加载计数器。 您实际上可以向 NVIC_ST_CURRENT 写入任意值以强制重新加载。 我建议您只写入0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "如果要立即重新加载、则需要直接向 NVIC_ST_CURRENT 寄存器写入重新加载的值。"
    您能否发布如何使用初始重新加载值重置计时器的语法?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在上一次答复中已经提到您可以写入任意值、但我建议您写入零。 请参见下面的。

    HWREG (NVIC_ST_CURRENT)= 0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、代码应如下所示:

    int main
    
    {
    
    uint32_t ui32Value;
    
    while (1)
    
    SysTickPeriodSet( 1000 );
    
    SysTickEnable ();
    
    function_for_interest ();//这是我们要进行基准测试的函数。
    
    ui32Value = SysTickValueGet ();
    
    SysTickDisable ();
    
    HWREG ( NVIC_ST_CURRENT )= 0;//将计数器重置为其默认值,即= 1000。
    
    sore_other _function ();//我们对基准标记不感兴趣的其他应用程序代码
    
    。} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、没错。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当尝试重置计数器时-我收到以下错误:
    #20标识符"NVIC_ST_CURRENT_"未定义

    这些是我的包-是不是缺少的东西?
    #include
    #include
    #include "driverlib/debug.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/pwm.h"
    #include "driverlib/rom.h"
    #include "driverlib/sysctl.h"
    #include "inc/hw_gpio.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您也需要在下方进行。
    #include "inc/hw_NVIC.h"