FreeRTOS中的时间和tick之间的转换

在FreeRTOS中,有时候需要阻塞task一段时间,或者是队列等需要等待一定的时间,通常这些函数中的相关的参数,都是使用tick数来表示的,显然tick数和时间之间还存在不一致。即使同样的tick,如果系统工作的频率不同,那么其时间也是不一样的,如果A配置的频率是B的两倍,则使用相同tick时,B实际的时间是A的两倍。

但是我们更多的是使用物理时间,例如一个简单的翻转,可能需要500ms,而不关心系统到底被配置为多少的频率,这个情况下,我们可以使用FreeROS提供的宏来实现,通常有两种方法,但是本质上是一样的。。

1. portTICK_RATE_MS

这个在FreeROS.h中被定义为:

#define portTICK_RATE_MS              portTICK_PERIOD_MS

然后跟踪portTICK_PERIOD_MS发现在portmacro.h中被定义为:

#define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

然后继续跟踪可以知道configTICK_RATE_HZ是在FreeRTOSConfig.h中定义的:

#define configTICK_RATE_HZ                    ((TickType_t)1000)

configTICK_RATE_HZ其含义是1秒钟TICK中断产生的次数,因为FreeRTOS使用Tick终端进行调度,这个频率越高则定时的精度越高,但是由此带来的系统开销也越大。

知道了这个宏定义以后,我们就可以进行时间的换算了,例如我们想演示500ms,则可以使用:

vTaskDelay(500/portTICK_RATE_MS);

 

2. pdMS_TO_TICKS
这是一个带参数的宏,其实本质上就是把上面的那个公式进行了一次封装,将毫秒数换算成了tick数,projdefs.h中的宏定义:

#ifndef pdMS_TO_TICKS
    #define pdMS_TO_TICKS( xTimeInMs )    ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) )
#endif

例如我们上面把500/portTICK_RATE_MS进行展开,其实就是500*configTICK_RATE_HZ/1000了。

所以上面的延时也可以写成:

vTaskDelay(pdMS_TO_TICKS(500));

 

posted @ 2022-03-30 17:33  castor_xu  阅读(5206)  评论(1编辑  收藏  举报