RT-Thread之四種延時函數
在RT-Thread實時操作系統中,延時函數是實現任務調度的關鍵工具。它們允許任務在指定的時間間隔內掛起,釋放CPU資源供其他任務運行,從而提高系統響應性和資源利用率。RT-Thread提供了四種主要的延時函數:
- 絕對延時(精準延時)
rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick)
- 相對延時(基于當前時間)
rt_err_t rt_thread_delay(rt_tick_t tick)
- 毫秒級延時
rt_err_t rt_thread_mdelay(rt_int32_t ms)
- 微秒級硬件延時(可基于基于DWT或定時器)
RT_WEAK void rt_hw_us_delay(rt_uint32_t us)
注意:前三個函數受系統tick影響,tick = (1 / RT_TICK_PER_SECOND)秒,其中RT_TICK_PER_SECOND默認為1000,即默認tick = 1ms。
一、rt_thread_delay_until()函數
此函數提供一個固定周期的精準延時,其特點是基于預計算的絕對時間,而不是從調用時刻開始計時。這意味著它可以避免累積誤差,適用于需要嚴格定時周期性任務的場景(如PID控制、ADC采樣等)。
注意:在對時域算法離散化時,dt步長尤為重要,它關乎系統的穩定和精度!
/**
* @brief 線程2入口函數
* @param 無
* @retval 無
*/
void thread_2_entry(void* param)
{
while(1)
{
rt_tick_t now_tick = rt_tick_get(); /* 獲取當前時間,從此刻記時 */
sys_conrtol();
/* 再延時(ticks) = 1000 - sys_conrtol()執行時間 */
/* 保證sys_conrtol()執行周期為嚴格的1000個ticks */
rt_thread_delay_until(&now_tick, 1000);
}
}
關鍵點:
- 必須用
&last_tick(指針)傳輸上次延時結束時的時間,以實現精準循環。 - 適用于需要嚴格時間間隔的任務,如PWM控制、傳感器采樣等。
- 長時間運行也不會出現累積誤差。
二、rt_thread_delay()函數
該函數實現相對延時,即從當前時刻開始掛起線程 delay 個系統時鐘節拍(tick)。它的特點是計算簡單,但如果在任務中有其他耗時操作,可能導致周期不穩定。
/**
* @brief 線程2入口函數
* @param 無
* @retval 無
*/
void thread_2_entry(void* param)
{
while(1)
{
sys_conrtol();
/* 再延時時間(ticks) = 1000 */
/* sys_conrtol()函數執行時間不確定,實際執行周期 > 1000 ticks*/
rt_thread_delay(1000);
}
}
關鍵點:
- 適用于不要求嚴格周期的任務,如后臺日志打印、網絡輪詢。
- 如果任務本身的執行時間較長,會導致總周期不再是準確的
delay。 - RT-Thread的系統tick通常為1ms(默認配置),
delay=1000表示1000ms(1秒)。 - 用戶可通過修改RT_TICK_PER_SECOND調整tick分辨率,但需權衡系統性能。
三、rt_thread_mdelay()函數
由于 rt_thread_delay() 的延時單位是系統tick(默認1ms),而 rt_thread_mdelay() 直接指定毫秒(ms)單位,更方便開發者進行計算。
/**
* @brief 線程2入口函數
* @param 無
* @retval 無
*/
void thread_2_entry(void* param)
{
while(1)
{
sys_conrtol();
/* 再延時時間(ticks) = 1000 */
/* sys_conrtol()函數執行時間不確定,實際執行周期 > 1000 ms*/
rt_thread_mdelay(1000);
}
}
關鍵點:
- 本質上仍然是 基于
rt_thread_delay的封裝,適用于需要直接使用毫秒單位的情況。 - 常用于設備輪詢、IO等待等場景。
- 延時精度受限于tick分辨率。
四、rt_hw_us_delay()函數
這是基于CPU空循環實現的硬件級延時,精度遠高于 rt_thread_delay 或 rt_thread_mdelay,適用于短時間、高精度的任務(如SPI/I2C通信時序控制)。
注意:
- 不會觸發線程調度,適用于短延時,長時間延時應優先使用調度函數
- 依賴于CPU頻率,部分STM32/MCU可能需要調整
delay_us的計算方式。 - 部分芯片不支持需自己實現。
......
/* 拉低CS片選信號 */
rt_pin_write(SPI_CS_PIN, PIN_LOW);
/* 10us延時(確保SPI設備就緒) */
rt_hw_us_delay(10);
/* SPI數據傳輸 */
rt_spi_send(spi_dev, &data, 1);
/* 拉高CS */
rt_pin_write(SPI_CS_PIN, PIN_HIGH);
......
關鍵點:
- 適用于硬件驅動開發(如GPIO、SPI、I2C)。
- 慎用在主線程,否則會阻塞其他任務運行
RT-Thread提供了四種不同的延時方式,適用于不同精度的任務調度需求。合理選擇延時函數可以提高系統的實時性和穩定性。

在RT-Thread實時操作系統中,延時函數是實現任務調度的關鍵工具。它們允許任務在指定的時間間隔內掛起,釋放CPU資源供其他任務運行,從而提高系統響應性和資源利用率。
浙公網安備 33010602011771號