一、首先在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()实现精确延时