FreeRTOS中的時間和tick之間的轉換
阿新 • • 發佈:2022-03-30
在FreeRTOS中,有時候需要阻塞task一段時間,或者是佇列等需要等待一定的時間,通常這些函式中的相關的引數,都是使用tick數來表示的,顯然tick數和時間之間還存在不一致。即使同樣的tick,如果系統工作的頻率不同,那麼其時間也是不一樣的,如果A配置的頻率是B的兩倍,則使用相同tick時,B實際的時間是A的兩倍。
但是我們更多的是使用物理時間,例如一個簡單的翻轉,可能需要500ms,而不關心繫統到底被配置為多少的頻率,這個情況下,我們可以使用FreeROS提供的巨集來實現,通常有兩種方法,但是本質上是一樣的。。
1. portTICK_RATE_MS
這個在FreeROS.h中被定義為:
#defineportTICK_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));