【发布时间】: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