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 |