减少粒度的While循环中的时钟周期计数

时间:2012-09-20 18:27:07

标签: c performance while-loop msp430

我在C中为MSP430处理器实现了while循环,目前看起来像这样:

register unsigned int sw_loop_count = 0U;
...

while (TACCL0 & CCIE)
{
    ++sw_loop_count;
}

...
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
    // Disable the timer interrupt flag and enable.
    TACCTL0 &= ~CCIFG;
    TACCTL0 &= ~CCIE;
}

我正在使用这个循环进行校准,我不认为这个问题对我的问题太重要。我已经计算出循环的每次迭代,包括check TACCL0 & CCIE需要11个时钟周期。出于粒度的目的,我真的希望尽可能低这个数字,并尽可能以编程方式。我可能是一个完整的白痴,但我想不出一种减少循环循环次数的方法,所以任何建议都会受到赞赏。我需要sw_loop_count这个或那个值。

1 个答案:

答案 0 :(得分:1)

嗯,在我发表评论后,我意识到可能是你可以做的事情;-)在while()条件下,你正在检查两个值。从它的外观来看,这些值必须被定义为volatile,以便它们每次使用时都可以从内存中准备好......

你能将这两者合二为一吗?让你的中断处理程序进行必要的比较并设置一个 single 标志,你将在循环中检查它。

或者你可以真正看中并以另一种方式这样做:

// signed and global (or you can pass it's address into your interrupt's routine)
volatile signed int sw_loop_count = 0;

然后是你的“测量”循环:

while(++sw_loop_count) {}

并在你的中断例程中:

if(TACCL0 & CCIE)
{
  real_count = sw_loop_count; // save the value for future use before we destroy it
  sw_loop_count = -1; // this will turn into 0 in that while's pre-increment, ending the loop
}

OTOH ...介绍volatile可能会受到内存访问的影响,实际上可能会减慢 while()循环。它确实完全依赖于您的实际体系结构(归结为内存控制器和缓存控制器的类型),我仍然认为您最好通过汇编程序模式运行它并查看编译器正在执行的操作。