[STM32]

立创商城STM32F系列——delay_ms函数

[复制链接]
1195|1
手机看帖
扫描二维码
随时随地手机跟帖
小乐Tzz|  楼主 | 2018-8-25 13:16 | 显示全部楼层 |阅读模式
delay_ms函数
/**********************************************************/
该函数同 delay_xms 一样,也是用来延时指定的 ms 的,其参数 nms 为要延时的毫秒数。
该函数有使用OS和不使用OS 两个版本,这里我们分别介绍,首先是不使用OS的时候,实现函数如下:
//延时nms   
//nms:0~65535
void delay_ms(u16 nms)
{         
  u8 repeat=nms/540;  //这里用 540,是考虑到某些客户可能超频使用,
          //比如超频到 248M的时候,delay_xms最大只能延时 541ms左右了
  u16 remain=nms%540;
  while(repeat)
  {
    delay_xms(540);
    repeat--;
  }
  if(remain)delay_xms(remain);
}
该函数其实就是多次调用前面所讲的 delay_xms 函数,来实现毫秒级延时的。注意下,这里以 540ms为周期是考虑到MCU超频使用的情况。
再来看看使用OS的时候,delay_ms的实现函数如下:
//延时nms
//nms:要延时的 ms数
//nms:0~65535
void delay_ms(u16 nms)
{   
  if(delay_osrunning&&delay_osintnesting==0)//如果OS已经在跑了,且不是在中断里面
{      
    if(nms>=fac_ms)          //延时的时间大于OS的最少时间周期   
    {   
          delay_ostimedly(nms/fac_ms);  //OS延时
    }
    nms%=fac_ms;    //OS已经无法提供这么小的延时了,采用普通方式延时      
  }
  delay_us((u32)(nms*1000));  //普通方式延时
}      
该函数中,delay_osrunning 是OS正在运行的标志,delay_osintnesting 则是OS中断嵌套次数,必须 delay_osrunning 为真,且 delay_osintnesting为 0的时候,才可以调用OS 自带的延时函数进行延时(可以进行任务调度),delay_ostimedly函数就是利用OS 自带的延时函数,实现任务级延时的,其参数代表延时的时钟节拍数(假设 delay_ostickspersec=200,那么delay_ostimedly (1),就代表延时 5ms)。
当 OS 还未运行的时候,我们的 delay_ms 就是直接由 delay_us 实现的,OS 下的 delay_us可以实现很长的延时(达到 204 秒)而不溢出!,所以放心的使用 delay_us 来实现 delay_ms,不过由于 delay_us的时候,任务调度被上锁了,所以还是建议不要用delay_us来延时很长的时间,否则影响整个系统的性能。
当 OS 运行的时候,我们的 delay_ms 函数将先判断延时时长是否大于等于 1个 OS 时钟节拍(fac_ms),当大于这个值的时候,我们就通过调用 OS 的延时函数来实现(此时任务可以调度),不足1 个时钟节拍的时候,直接调用delay_us函数实现(此时任务无法调度)。
/**********************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

lihui567| | 2018-8-29 09:42 | 显示全部楼层
怎么是立创商城啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝