1. 程式人生 > 其它 >FreeRTOS中的時間和tick之間的轉換

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));