通用微控制器延迟功能

时间:2014-06-04 13:54:50

标签: c delay pic mplab

有人请告诉我这个功能是如何工作的?我在代码中使用它并知道它是如何工作的,但我并不完全确定。我理解输入变量N递减的概念,但它是如何工作的呢?另外,如果我在main()中反复使用它以获得不同的延迟(N的不同输入),那么如果我在其他地方使用它,我是否必须将其归零? 参考:MILLISEC是由Fcy / 10000或系统时钟/ 10000定义的常量。

提前致谢。

// DelayNmSec() gives a 1mS to 65.5 Seconds delay
/*  Note that FCY is used in the computation.  Please make the necessary
    Changes(PLLx4 or PLLx8 etc) to compute the right FCY as in the define
    statement above. */
void DelayNmSec(unsigned int N)
{
unsigned int j;
    while(N--)
        for(j=0;j < MILLISEC;j++);
}

3 个答案:

答案 0 :(得分:2)

这被称为busy waiting,这个概念只会烧掉一些CPU周期,从而通过让CPU“忙”做空循环来“等待”。您不需要重置该功能,如果重复调用,它将执行相同的操作。

如果你用N=3调用它,它会重复while循环3次,每次用j计数从0到MILLISEC,这应该是一个取决于CPU时钟。

答案 1 :(得分:2)

代码的原始作者已经定时并查看生成的汇编程序以获得每毫秒执行的指令的确切数量,并配置了一个常量MILLISEC以匹配for循环的{{3} }}

输入参数N就是调用者想要等待的毫秒数和执行for循环的次数。

如果

,代码将会中断
  • 用于不同或更快的微控制器(取决于Fcy的维护方式)或
  • 更改了C编译器的优化级别,或
  • c-compiler版本已更改(因为它可能生成不同的代码)

所以,如果编写它的人很聪明,可能会有一个校准程序来定义和配置MILLISEC常量。

答案 2 :(得分:2)

这就是所谓的忙等待,其中将特定计算所用的时间用作计数器以引起延迟。

这种方法确实存在问题,因为在不同速度的处理器上,需要调整计算。老游戏使用这种方法,我记得使用这种忙碌的等待方法进行的模拟,该方法针对旧的8086类型的处理器,使动画平滑移动。当游戏在奔腾处理器PC上使用时,而不是火箭在几秒钟内庄严地升起屏幕,整个动画在你眼前快速闪现,很难看出动画是什么。

这种繁忙的等待意味着在线程运行中,线程处于计算循环中,倒数计数毫秒。结果是线程除了倒计时之外没有做任何其他事情。

如果操作系统不是抢占式多任务操作系统,则在倒计时完成之前不会运行任何其他操作系统,这可能会导致其他线程和任务出现问题。

如果操作系统是抢先式多任务处理,则在切换回来之前控制切换到某个其他线程一段时间后,由此产生的延迟会有变化。

这种方法通常用于专用处理器上的小型软件,其中计算具有已知的时间量,并且具有专用于倒计时的处理器不会影响软件的其他部分。一个例子可能是一个小型传感器,它执行读取以收集数据样本,然后在进行下一次读取以收集下一个数据样本之前执行此类繁忙循环。