一.RT_TICK_PER_SENCOND 对rt_thread_mdelay延时的影响
- 一些基本的定义
任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳,中断之间的时间间隔取决于不同的应用,一般是 1ms–100ms,时钟节拍率越快,系统的实时响应越快,但是系统的额外开销(耗电量)就越大,从系统启动开始计数的时钟节拍数称为系统时间。
RT-Thread 中,时钟节拍的长度根据 RT_TICK_PER_SECOND 的定义来调整,等于 1/RT_TICK_PER_SECOND 秒。
由于全局变量 rt_tick 在每经过一个时钟节拍时,值就会加 1,通过调用 rt_tick_get 会返回当前 rt_tick 的值,即可以获取到当前的时钟节拍值。此接口可用于记录系统的运行时间长短,或者测量某任务运行的时间。接口函数如下:
rt_tick_t rt_tick_get(void);
- rt_thread_mdelay()函数的实现如下图:
转定义 rt_tick_from_millisecond();
以rt_thread_mdelay(1),rt_thread_mdelay(9)为例判断其在RT_TICK_PER_SECOND = 100情况下延时是否相等?
将1和9分别带入到rt_tick_from_millisecond()函数中
Tick = 100*(1/1000) //tick = 0
Tick+=(100*(1%1000)+999)/1000; //tick = (100+999)/1000 = 1099/1000 =1
Tick = 100*(9/1000) //tick = 0
Tick+=(100*(9%1000)+999)/1000; //tick = (900+999)/1000 = 1899/1000 =1
所以return的值都为1;
将tick=1带入到相同的return rt_thread_sleep(tick);
可以得出结论:RT_TICK_PER_SECOND 代表了rt_thread的时钟节拍,以及延时的精度 ,当RT_TICK_PER_SECOND = 100时 rt_thread_mdelay的延时精度为最小为10ms。
实测验证:
实验环境:GD32f303RCT6,
实验步骤:
1.将RT_TICK_PER_SECOND = 10 设置控制LED的引脚翻转时常为1ms
2.将RT_TICK_PER_SECOND = 1000 设置控制LED的引脚翻转时常为1ms.
实验现象:
步骤1实验现象为能明显观察到LED的亮灭;
步骤2实验现象为LED常亮。
已知;人眼能够识别LED亮灭的最小时间为20ms,小于这个时间人眼观察到的就为常亮。
将延时时间改为20ms,实验现象为微微能够有亮灭的感觉。
实验结论:RT_TICK_PER_SECOND决定着RT_thread的延时的精度。
目录
一.RT_TICK_PER_SENCOND 对rt_thread_mdelay延时的影响