1,os_time_dly(),//为非阻塞函数,会引起系统调度
a,基于节拍的延时函数,时间片时任务运行调度的最小时间,又称为节拍,freertos系统由configTICK_RATE_HZ表示;
节拍= (1/configTICK_RATE_HZ)*1000 ms ,杰理为10ms
b,中断函数或者关闭系统总中断的情况下不能调用此函数
2,delay_2ms(int conut); //阻塞函数,不会引起系统调度
3,user_udelay(u32 usec) //基于硬件定时器的计时延时,为非阻塞,会引起系统调度
static void udelay_unit(u32 usec){
YT_TIMER0->CON = BIT(14);
YT_TIMER0->CNT = 0;
YT_TIMER0->PRD = clk_get("lsb") / 1000000L / 4 * usec;
// (usec/1000000L)划算成秒 1/(主频clk_get("lsb")/4(四分频)) = 震动一次的秒数
//需要震动多少次 (usec/1000000L) / 1/(clk_get("lsb")/4) = usec/1000000L * clk_get("lsb")/4
YT_TIMER0->CON = BIT(0) | BIT(4);
while ((YT_TIMER0->CON & BIT(15)) == 0);
YT_TIMER0->CON = BIT(14);
}
static void user_udelay(u32 usec)
{
u32 count = 0;
u8 i = 0;
if(usec <= DELAY_US_MAX){
udelay_unit(usec);
}
else {
count = usec / DELAY_US_MAX;
for(i = 0; i < count; i++){
udelay_unit(DELAY_US_MAX);
}
udelay_unit(usec - count * DELAY_US_MAX);
}
}
延时情况会存在偏差,偏差取决于三个因素:
a,高优先级的中断干扰,在执行前需要将总中断关闭,执行后再打开
b,硬件定时器基于的时钟源,选择更稳定的时钟源std12 std24 std48
c,程序运行在flash还是ram,将延时函数放在ram中执行,flash代码执行效率会比ram慢一些