我用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的值。
发布于 2012-09-21 02:43:15
嗯,在我发表评论后,我意识到你可能可以做一些事情;-)在你的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()循环的速度。这实际上完全取决于您的实际架构(下至内存控制器和缓存控制器的类型),我仍然认为,您最好通过汇编程序模式运行它,并查看编译器正在做什么。
https://stackoverflow.com/questions/12518658
复制相似问题