关于UCOSIII的时钟节拍定时精度

一、首先在os_cfg_app.h中找到系统时钟节拍设置,一般设置为1-1000,及最小节拍为1ms最大为1s,一般设置200(5ms)或者500(2ms)。其实可以理解为一个计数器,计数到这个OS_CFG_TICK_RATE_HZ值记为1s,自然而然设置为1000就有1000次计数一次计数就是1ms其他也是这样。

二、获取当前时钟节拍计数值的函数为OSTimeGet(),函数原型为

OS_TICK  OSTimeGet (OS_ERR  *p_err)

三、了解ucosiii的两个重要延时函数

void  OSTimeDly (OS_TICK   dly,
                 OS_OPT    opt,
                 OS_ERR   *p_err)
void  OSTimeDlyHMSM (CPU_INT16U   hours,
                     CPU_INT16U   minutes,
                     CPU_INT16U   seconds,
                     CPU_INT32U   milli,
                     OS_OPT       opt,
                     OS_ERR      *p_err)

四、编写测量延时程序

主要程序

    cpu_clk_freq = BSP_CPU_ClkFreq();
	while(1)
	{
		ts_start = OSTimeGet(&err);

		OSTimeDly(4000, OS_OPT_TIME_DLY, &err);//系统时钟节拍为200,延时4000个时钟节拍也就是20s
    
		ts_end = OSTimeGet(&err)-ts_start;  
 
		sprintf(buff,"\r\nDelay 1000 clock beats (1s) %d, test the delay %d us by timestamp, ie %d ms\n",cpu_clk_freq,(ts_end*1000*1000)/200,(ts_end*1000)/200);
		OS_CRITICAL_ENTER();
		HAL_UART_Transmit(&USART3_Handler,(uint8_t*)buff,strlen(buff),1000);	//发送串口接收到的数据
		while(__HAL_UART_GET_FLAG(&USART3_Handler,UART_FLAG_TC)!=SET);		//等待串口数据发送结束
		OS_CRITICAL_EXIT();
		ts_start=0;
		ts_end=0;
        }

得到的测试结果:


可以看到延时20ms延时误差为0.163-0.158s=0.005s=5ms即为一个时钟节拍时间的误差,如果时钟节拍设置大一些那这个误差还会更小。

这里关于UCOS时钟节拍设置问题,还可以参考UCOS 的延时函数OSTimeDlyHMSM()实现精确延时




  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值