通用微控制器延迟功能



谁来告诉我这个函数是怎么工作的?我在代码中使用它,并有一个想法,它是如何工作的,但我不是100%确定。我理解输入变量N递减的概念,但它到底是怎么工作的呢?此外,如果我在main()中重复使用它来处理不同的延迟(N的不同输入),那么如果我在其他地方使用它,我是否必须将函数"归零"?参考:毫秒是由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++);
}

这被称为忙等待,这个概念只是消耗一些CPU周期,因此通过保持CPU"忙"做空循环来"等待"。你不需要重置这个函数,如果重复调用,它会做同样的事情。

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

代码的原作者计时并查看了生成的汇编程序,以获得每毫秒执行的指令的确切数量,并配置了一个常数MILLISEC,以匹配for循环的忙等待。

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

如果

  • 在不同或更快的微控制器上使用(取决于Fcy的维护方式),或
  • 改变了C编译器的优化级别,或者
  • c编译器版本更改(因为它可能生成不同的代码)

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

这就是所谓的忙碌等待,其中特定计算所花费的时间被用作导致延迟的计数器。

这种方法确实存在问题,在不同的处理器和不同的速度上,需要调整计算。老游戏使用了这种方法,我记得有一款模拟游戏使用了这种忙碌等待方法,目标是老式8086处理器,以使动画流畅地移动。当游戏在Pentium处理器的PC上使用时,整个动画在你眼前闪过,以至于很难看清动画是什么,而不是火箭在几秒钟内庄严地上升。

这种忙碌等待意味着在线程运行时,线程处于计算循环中,倒计时毫秒数。结果是线程除了倒数之外什么也不做。

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

如果操作系统是抢占式的多任务,那么产生的延迟将具有可变性,因为在切换回之前,控制权将切换到其他线程一段时间。

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

最新更新