librte_timer
此庫為 DPDK 執行單元提供定時器服務,提供異步執行函數的能力。它可以是周期性的函數調用,也可以是一次性調用。它使用環境抽象層(EAL)提供的定時器接口獲取精確的時間參考,并可以根據需要以每個核心為基礎進行初始化
1.1 rte_timer_subsystem_init
函數是 DPDK 中 librte_timer 模塊的初始化函數,用于初始化定時器子系統。
void rte_timer_subsystem_init(void);
該函數沒有參數,用于初始化 DPDK 的定時器子系統。
使用場景:
- 在需要使用 DPDK 定時器功能之前,通常需要先調用該函數進行初始化。
- 在 DPDK 應用程序的初始化階段調用該函數。
#include <rte_timer.h>int main(int argc, char *argv[]) {// 初始化 EALint ret = rte_eal_init(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Error initializing EAL\n");// 初始化定時器子系統rte_timer_subsystem_init();// 其他初始化操作...// 應用程序主邏輯...return 0;
}
1.2 rte_timer_init
該函數用于初始化一個指定的定時器結構體 struct rte_timer
int rte_timer_init(struct rte_timer *tim);
使用場景:
- 在需要使用定時器功能之前,通常需要先初始化定時器。
- 在 DPDK 應用程序的初始化階段調用該函數來初始化定時器
#include <rte_timer.h>int main(int argc, char *argv[]) {// 初始化 EALint ret = rte_eal_init(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Error initializing EAL\n");// 初始化定時器結構體struct rte_timer my_timer;ret = rte_timer_init(&my_timer);if (ret != 0)rte_exit(EXIT_FAILURE, "Error initializing timer\n");// 其他初始化操作...// 應用程序主邏輯...return 0;
}
1.3 rte_timer_reset
void rte_timer_reset(struct rte_timer *tim, uint64_t ticks, enum rte_timer_type type, uint16_t tim_lcore_id, rte_timer_cb_t fct, void *arg);
該函數用于重置指定的定時器,設置定時器的定時參數和回調函數。
- tim: 要重置的定時器結構體指針。
- ticks: 定時器的周期,以 CPU 的時鐘周期為單位。
- type: 定時器的類型,可以是 RTE_TIMER_SINGLE(單次觸發)或 RTE_TIMER_PERIODICAL(周期觸發)。
- tim_lcore_id: 定時器運行的 CPU 核心 ID。
- fct: 定時器超時時要調用的回調函數。
- arg: 回調函數的參數。
使用場景:
- 在需要設置定時器的超時事件和回調函數時調用該函數。
- 可以在程序中多次調用該函數,以便在不同的時間點設置不同的定時器參數和回調函數。
1.4 rte_timer_stop
void rte_timer_stop(struct rte_timer *tim);
該函數用于停止指定的定時器。
- tim: 要停止的定時器結構體指針。
使用場景:
- 在不需要定時器繼續工作時調用該函數,停止定時器的計時。
- 可以在程序中多次調用該函數,以停止不同的定時器。
#include <rte_timer.h>int main(int argc, char *argv[]) {// 初始化 EALint ret = rte_eal_init(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Error initializing EAL\n");// 初始化定時器結構體struct rte_timer my_timer;ret = rte_timer_init(&my_timer);if (ret != 0)rte_exit(EXIT_FAILURE, "Error initializing timer\n");// 啟動定時器rte_timer_reset(&my_timer, 1000000, RTE_TIMER_SINGLE, rte_lcore_id(), NULL, NULL);// 其他操作...// 暫停定時器rte_timer_stop(&my_timer);// 其他操作...return 0;
}
1.5 rte_timer_reset_sync
void rte_timer_reset_sync(struct rte_timer *tim, uint64_t ticks, enum rte_timer_type type, uint16_t tim_lcore_id, rte_timer_cb_t fct, void *arg);
該函數用于同步方式重置指定的定時器,設置定時器的定時參數和回調函數,并等待重置完成。
同步方式重置定時器時,是對一個已經存在的定時器實例進行重置,設置新的定時參數和回調函數
- tim: 要重置的定時器結構體指針。
- ticks: 定時器的周期,以 CPU 的時鐘周期為單位。
- type: 定時器的類型,可以是 RTE_TIMER_SINGLE(單次觸發)或 RTE_TIMER_PERIODICAL(周期觸發)。
- tim_lcore_id: 定時器運行的 CPU 核心 ID。
- fct: 定時器超時時要調用的回調函數。
- arg: 回調函數的參數。
使用場景: - 在需要設置定時器的超時事件和回調函數,并且需要等待定時器重置完成后再繼續執行后續操作時使用。
- 通常在初始化階段調用該函數來初始化定時器,確保定時器的狀態已經被完全重置。
#include <rte_timer.h>// 定時器超時時要調用的回調函數
void timer_callback(struct rte_timer *tim, void *arg) {printf("Timer callback function called\n");
}int main(int argc, char *argv[]) {// 初始化 EALint ret = rte_eal_init(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Error initializing EAL\n");// 初始化定時器結構體struct rte_timer my_timer;ret = rte_timer_init(&my_timer);if (ret != 0)rte_exit(EXIT_FAILURE, "Error initializing timer\n");// 同步方式重置定時器,并等待重置完成rte_timer_reset_sync(&my_timer, 1000000, RTE_TIMER_SINGLE, rte_lcore_id(), timer_callback, NULL);// 其他操作...return 0;
}
1.6 rte_timer_stop_sync
int rte_timer_stop_sync(struct rte_timer *tim);
該函數用于同步方式停止指定的定時器,并等待停止完成。
- tim: 要停止的定時器結構體指針。
使用場景:
- 在需要停止定時器的情況下,可以使用該函數來確保定時器被完全停止后再繼續后續操作。
- 通常在程序的運行時,當不再需要某個定時器時,可以調用該函數來停止定時器的計時
#include <stdio.h>
#include <rte_timer.h>// 定時器超時時要調用的回調函數
void timer_callback(struct rte_timer *tim, void *arg) {printf("Timer callback function called\n");// 執行一些操作...
}int main(int argc, char *argv[]) {// 初始化 EALint ret = rte_eal_init(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Error initializing EAL\n");// 初始化定時器結構體struct rte_timer my_timer;ret = rte_timer_init(&my_timer);if (ret != 0)rte_exit(EXIT_FAILURE, "Error initializing timer\n");// 啟動定時器rte_timer_reset(&my_timer, 1000000, RTE_TIMER_SINGLE, rte_lcore_id(), timer_callback, NULL);// 其他操作...// 暫停定時器,并等待停止完成ret = rte_timer_stop_sync(&my_timer);if (ret != 0)rte_exit(EXIT_FAILURE, "Error stopping timer\n");// 其他操作...return 0;
}
rte_timer_stop_sync
和 rte_timer_stop
是停止定時器的兩個不同函數,它們的區別在于:
同步方式停止 vs 異步方式停止:
rte_timer_stop_sync 是同步方式停止定時器,調用該函數會阻塞當前線程,直到定時器被完全停止后才會返回。
rte_timer_stop 是異步方式停止定時器,調用該函數會立即返回,不會等待定時器被停止。
1.7 rte_timer_manage
函數用于管理 DPDK 中的定時器,在主循環中周期性地檢查和處理定時器的到期事件
void rte_timer_manage(void);
-
函數定義: rte_timer_manage 函數沒有參數,返回值為 void,用于周期性地檢查和處理定時器的到期事件。
-
用法: 在主循環中調用 rte_timer_manage 函數以觸發定時器事件的處理。通常在主循環的適當位置調用此函數。
使用場景:
- 當需要使用定時器功能實現周期性任務或處理延時事件時,可以使用 rte_timer_manage 函數。
- 適用于需要實現輪詢定時器事件并在事件到期時執行相應操作的場景。
#include <rte_timer.h>// 定時器回調函數
static void timer_callback(struct rte_timer *tim, void *arg) {// 處理定時器事件printf("Timer event occurred!\n");
}int main(int argc, char *argv[]) {// 初始化 DPDK 庫rte_eal_init(argc, argv);// 創建定時器struct rte_timer timer;rte_timer_init(&timer);// 設置定時器參數rte_timer_reset(&timer, TIMER_INTERVAL, PERIODICAL, rte_lcore_id(), timer_callback, NULL);// 主循環while (1) {// 執行 DPDK 庫的主循環任務rte_timer_manage(); // 管理定時器事件// 其他主循環任務}return 0;
}
感覺雞肋,不如直接rte_eal_alarm_set
1.8 rte_eal_alarm_set
函數用于設置一個在指定時間后觸發的定時器,它可以在 DPDK 應用程序中用于執行延時操作
int rte_eal_alarm_set(uint64_t us_delay, rte_eal_alarm_callback cb, void *arg);
函數定義
: rte_eal_alarm_set 函數用于設置一個在指定時間后觸發的定時器,當定時器到期時,指定的回調函數將被調用。
參數:
- us_delay:定時器的延遲時間,以微秒為單位。
- cb:定時器到期時調用的回調函數。
- arg:傳遞給回調函數的參數。
返回值: 如果設置成功,則返回 0;如果出現錯誤,則返回負數。
使用場景:
- 當需要在一定延遲后執行某些操作時,可以使用 rte_eal_alarm_set 函數來設置延時觸發的定時器。
- 適用于需要在延時觸發時執行異步操作的場景。
1.9 rte_eal_alarm_cancel
void rte_eal_alarm_cancel(rte_eal_alarm_callback cb, void *arg);
函數定義:
rte_eal_alarm_cancel 函數用于取消之前設置的定時器,取消后不再觸發定時器到期時的回調函數。
參數:
- cb:要取消的定時器的回調函數。
- arg:傳遞給回調函數的參數。
返回值: 無。
使用場景:
- 當不再需要之前設置的定時器時,可以使用 rte_eal_alarm_cancel 函數將其取消,以避免觸發不再需要的回調函數。
- 適用于需要在特定條件下取消定時器的場景