杰理mcu 超时函数整理 freertos

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慢一些
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值