1

我正在研究 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“丢失”。

谢谢

4

3 回答 3

1

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

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

于 2013-03-16T07:37:33.667 回答
0

If your _DO_SOMETHING_HERE_ is not external operation not it contains volatile operations compiler is allowed to move it before/after volatile operations if it does not change program result.

Only volatile operations are ordered.

I use similar code for benchmarking, but i prefer global volatile for count (it worked for me with arm-none-eabi-gcc 4.6)

于 2014-02-20T11:17:09.213 回答
0

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

__root volatile int count = 0;

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

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

于 2014-03-27T06:01:21.360 回答