我正在使用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
的值“丢失”。
由于
答案 0 :(得分:1)
如果要测量一段时间,可以使用示波器。只需在输入要测量其时序的代码部分时将引脚设置为HIGH,然后在该部分结束时将引脚设置为LOW。
这是测量嵌入时间的最准确方法。
答案 1 :(得分:0)
如果你的_DO_SOMETHING_HERE_不是外部操作,它不包含易失性操作,如果不改变程序结果,允许编译器在易失性操作之前/之后移动它。
仅订购易失性操作。
我使用类似的代码进行基准测试,但我更喜欢全局不稳定的计数(它对我有用arm-none-eabi-gcc 4.6)
答案 2 :(得分:0)
如果您使用__root
(双下划线)声明变量,那么IAR将不会对其进行优化。
__root volatile int count = 0;
您可能还有其他问题。您的_DO_SOMETHING_HERE_
代码仍然可以优化。您可能还需要使用__root
进行其他声明。
我经常看到的另一个问题是调试器在使用优化时有时不显示局部变量值。您需要在“注册”窗口中打开“反汇编”窗口,然后查看用于存储R0-R12
的寄存器(count
之间的某个位置)。一个万无一失的方法是让函数返回你的计数值。 ARM Cortex使用R0
作为返回值,因此在函数完成后,R0
中的值是count的值。不幸的是,这是使用优化进行调试时必须执行的操作。