我有一个用 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;
}
我将这个循环用于校准目的,我认为它的上下文对我的问题来说并不重要。我计算出循环的每次迭代,包括检查 TACCL0 & CCIE
需要 11 个时钟周期。出于粒度的目的,我真的很想让这个数字尽可能低,如果可能的话以编程方式。我可能是个彻头彻尾的白痴,但我想不出减少循环周期数的方法,所以任何建议都将不胜感激。我需要 sw_loop_count
值,无论是哪种方式。
嗯,在我发表评论后,我意识到可能您可以做一些事情;-) 在您的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()
环形。它确实完全取决于您的实际架构(具体到内存 Controller 和缓存 Controller 的类型),我仍然认为您最好通过汇编程序模式运行它并查看编译器在做什么。
我是一名优秀的程序员,十分优秀!