1

我有一个while用 C 语言为 MSP430 处理器实现的循环,目前看起来像这样:

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;
}

我将此循环用于校准目的,我认为它的上下文对我的问题不太重要。我计算出循环的每次迭代,包括检查TACCL0 & CCIE需要 11 个时钟周期。出于粒度的目的,我真的希望这个数字尽可能低,如果可能的话以编程方式。我可能是一个彻头彻尾的白痴,但我想不出减少循环周期数的方法,所以任何建议都将不胜感激。我需要sw_loop_count价值,一种或另一种方式。

4

1 回答 1

1

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

你能把这两个减少成一个吗?让您的中断处理程序进行必要的比较并设置一个将在循环中检查的标志。

或者您可以变得非常花哨并以另一种方式进行操作,例如:

// 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()。它确实完全取决于您的实际架构(取决于内存控制器和缓存控制器的类型),我仍然认为您最好通过汇编程序模式运行它并查看编译器正在做什么。

于 2012-09-20T18:43:14.870 回答