首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少While循环中的时钟周期计数以实现粒度

减少While循环中的时钟周期计数以实现粒度
EN

Stack Overflow用户
提问于 2012-09-21 02:27:07
回答 1查看 1.1K关注 0票数 1

我用C语言为MSP430处理器实现了一个while循环,目前看起来如下所示:

代码语言:javascript
复制
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的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-21 02:43:15

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

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

或者你可以变得很花哨,换一种方式来做,就像这样:

代码语言:javascript
复制
// signed and global (or you can pass it's address into your interrupt's routine)
volatile signed int sw_loop_count = 0;

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

代码语言:javascript
复制
while(++sw_loop_count) {}

在你的中断例程中:

代码语言:javascript
复制
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()循环的速度。这实际上完全取决于您的实际架构(下至内存控制器和缓存控制器的类型),我仍然认为,您最好通过汇编程序模式运行它,并查看编译器正在做什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12518658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档