【问题标题】:calculating code runtime in highly optimized code在高度优化的代码中计算代码运行时间
【发布时间】:2013-01-30 07:47:03
【问题描述】:

我正在开发 Cortex M3 并使用 IAR EWARM。我使用DWT_DYCCNT 进行时间计算。问题是当我优化代码以提高速度时(使用编译器选项),我在调试时丢失了DWT_DYCCNT 的值。代码采用 C 和 C++ 编写。我还尝试使用printf 打印变量的值,但这也会返回错误。

我尝试创建变量volatile,但这也无济于事。

在调试时,我总是为这个变量得到unknown value

我想知道如何计算已针对速度进行优化的代码中的代码时序,并且不会丢失变量的值。如何强制编译器保留这些变量的值?

编辑:

     volatile int count = 0;
        volatile unsigned int *DWT_CYCCNT = (unsigned int *)0xE0001004; //address of the register
        volatile unsigned int *DWT_CONTROL = (unsigned int *)0xE0001000; //address of the register
        volatile unsigned int *SCB_DEMCR = (unsigned int *)0xE000EDFC; //address of the register

        *SCB_DEMCR = *SCB_DEMCR | 0x01000000;
        *DWT_CYCCNT = 0; // reset the counter
        *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter

_DO_SOMETHING_HERE_

count = *DWT_CYCCNT;
         printf("\n COUNT!!!! = %d",*DWT_CYCCNT);

调试代码时count的值“丢失”。

谢谢

【问题讨论】:

  • 我认为您需要发布一些代码。尝试简化代码,使其只是代码中间的一个小 [也许是空的] 循环,而不是发布一些复杂的数学 - 因为无论如何这不是我们关心的这种情况。
  • 感谢您的回复。添加了代码块。 :)
  • 您确实意识到调试优化代码通常很棘手 - 特别是,如果不使用 count ,它可能会被优化为变量。我怀疑您可以做很多事情 - 也许将其设为全局变量,并确保它已初始化并在其他一些函数中读取。
  • 为什么不打印*DWT_CYCCNT
  • @DavidRodríguez-dribeas 已经尝试过了。当我这样做时也会发生同样的事情。

标签: c++ optimization iar


【解决方案1】:

如果要测量一段时间,可以使用示波器。只需在输入要测量其时序的代码部分时将引脚设置为 HIGH,然后在该部分结束时将引脚设置为 LOW。

这是测量嵌入式时序的最准确方法。

【讨论】:

    【解决方案2】:

    如果你用__root(双下划线)声明一个变量,那么 IAR 不会优化它。

    __root volatile int count = 0;
    

    您可能还有其他问题。您的_DO_SOMETHING_HERE_ 代码仍然可以优化。您可能还需要将__root 用于其他声明。

    我经常看到的另一个问题是调试器在使用优化时有时不显示局部变量值。您将需要打开 Disassemble 窗口和 Registers 窗口并查看用于存储 count 的寄存器(介于 R0-R12 之间)。一个万无一失的方法是让一个函数返回您的计数值。 ARM Cortex使用R0作为返回值,所以函数完成后R0中的值就是count的值。不幸的是,这是您在使用优化进行调试时必须做的事情。

    【讨论】:

      【解决方案3】:

      如果您的 _DO_SOMETHING_HERE_ 不是外部操作,不包含易失性操作,编译器可以在不改变程序结果的情况下在易失性操作之前/之后移动它。

      仅对 volatile 操作进行排序。

      我使用类似的代码进行基准测试,但我更喜欢使用全局 volatile 进行计数(它适用于 arm-none-eabi-gcc 4.6)

      【讨论】:

        猜你喜欢
        • 2014-05-22
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 2017-10-18
        • 2021-08-28
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多