DPDK常用API合集三

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 函數將其取消,以避免觸發不再需要的回調函數。
  • 適用于需要在特定條件下取消定時器的場景

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719366.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024.03.03藍橋云課筆記——排序

sort簡介 #include<algorithm> 使用的是快速排序 時間復雜度為O(nlogn) sort使用(默認是從小到大) 1.sort(起始地址&#xff0c;結束地址的下一位&#xff0c;*比較函數&#xff09;&#xff1b; #include<iostream> #include<algorithm> using namesp…

HTTPS的實現原理

圖片來源&#xff1a;HTTPS 詳解一&#xff1a;附帶最精美詳盡的 HTTPS 原理圖 - 個人文章 - SegmentFault 思否 加密流程按圖中的序號分為&#xff1a; 客戶端請求 HTTPS 網址&#xff0c;然后連接到 server 的 443 端口 (HTTPS 默認端口&#xff0c;類似于 HTTP 的80端口)。…

Windows批處理:bat文件學習

目錄 第一章、快速了解Windows批處理1.1&#xff09;Windows批處理相關概念介紹1.1.1&#xff09;批處理的起源1.1.2&#xff09;bat文件介紹 1.2&#xff09;Demo1.2.1&#xff09;創建文件添加命令1.2.2&#xff09;bat腳本中的命令解釋 第二章、實例2.1&#xff09;點擊bat文…

navicat安裝11.3

一、安裝navicat 1、下載navicat 2、解壓壓縮包 3、點擊exe文件 4、輸入密鑰&#xff1a; NAVH-WK6A-DMVK-DKW3 5、點擊打開&#xff1a; 輸入連接參數&#xff1a; 6、查看連接好倉庫 7、 在使用navicat來編寫sql語句 8、編寫語句 連接不上問題&#xff0c;檢查問題&#…

[出錯]-RuntimeError: “slow_conv_transpose2d_out_cpu“ not implemented for ‘Byte‘

一開始我一直一維是torch版本的問題 輸入是用cv2讀出來的&#xff0c;數據類型dtype是默認是unit8&#xff0c;輸入到模型中&#xff0c;除了要將他轉為tenso以外&#xff0c;還要.float將數據類型轉為浮點數。

【Vue3】深入理解Vue中的ref屬性

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

Redis 之三:Redis 的發布訂閱(pub/sub)

概念介紹 Redis 發布訂閱 (pub/sub) 是一種消息通信模式&#xff0c;它允許客戶端之間進行異步的消息傳遞 Redis 客戶端可以訂閱任意數量的頻道。 模型中的角色 在該模型中&#xff0c;有三種角色&#xff1a; 發布者&#xff08;Publisher&#xff09;&#xff1a;負責發送信…

嵌入式中7個底層數據結構分解

在編程的世界里&#xff0c;數據結構是構建信息框架的骨架。就像現實生活中的建筑需要精心設計的結構一樣&#xff0c;我們的數據也需要合適的結構來保證程序的高效和穩定。今天&#xff0c;我們就像探險家一樣&#xff0c;一起去探索七大數據結構的奧秘&#xff0c;并揭開它們…

光路科技:工業以太網交換機引領工業互聯網新篇章

隨著全球范圍內工業4.0的浪潮不斷涌動&#xff0c;工業互聯網作為其核心驅動力&#xff0c;正引領著工業生產向智能化、網絡化的嶄新階段邁進。在這一轉型的浪潮中&#xff0c;光路科技憑借其卓越的工業互聯設備與創新解決方案&#xff0c;正為工業互聯網領域的發展注入新的活力…

Linux環境基礎開發工具使用

目錄 1.Linux軟件包管理器yum 什么是軟件包 關于 lrzsz 查看軟件包 2.Linux開發工具 2.1.vim的基本概念 2.2vim的基本操作 2.3vim命令模式命令集 1.插入模式 2.從插入模式切換為命令模式 3.移動光標 4.刪除文字 5.復制 6.替換 7.撤銷上一次的操作 8.更改 2.4v…

藍橋杯 2020 第一輪省賽 A 組 F 題(B 組 G 題)解碼

藍橋杯 2020 第一輪省賽 A 組 F 題&#xff08;B 組 G 題&#xff09;解碼 題目描述 小明有一串很長的英文字母&#xff0c;可能包含大寫和小寫。 在這串字母中&#xff0c;有很多連續的是重復的。小明想了一個辦法將這串字母表達得更短&#xff1a;將連續的幾個相同字母寫成…

[動態規劃]---part1

前言 作者&#xff1a;小蝸牛向前沖 專欄&#xff1a;小蝸牛算法之路 專欄介紹&#xff1a;"蝸牛之道&#xff0c;攀登大廠高峰&#xff0c;讓我們攜手學習算法。在這個專欄中&#xff0c;將涵蓋動態規劃、貪心算法、回溯等高階技巧&#xff0c;不定期為你奉上基礎數據結構…

Java基礎 - 模擬醫院掛號系統

模擬醫院掛號系統功能 1. 科室管理:新增科室,刪除科室(如果有醫生在,則不能刪除該科室),修改科室 2. 醫生管理:錄入醫生信息以及科室信息,修改醫生信息(主要是修改個人信息和科室) 3. 坐診信息設置:可以設置醫生當天和未來6天的坐診情況,包括上午和下午的坐診時…

Linux設備模型(九) - bus/device/device_driver/class

一&#xff0c;設備驅動模型 1&#xff0c;概述 在前面寫的驅動中&#xff0c;我們發現編寫驅動有個固定的模式只有往里面套代碼就可以了&#xff0c;它們之間的大致流程可以總結如下&#xff1a; 實現入口函數xxx_init()和卸載函數xxx_exit() 申請設備號 register_chrdev_r…

Spring源碼:手寫SpringDI

我們是在實現了SpringIOC的基礎上&#xff0c;進行拓展&#xff0c;IOC實現源碼可以查看&#xff1a;手寫SpringIOC 文章目錄 一、分析二、實現1、構造注入1&#xff09;分析2&#xff09;版本1BeanReferenceBeanDefinitionGenericBeanDefinitionDefaultBeanFactory1、改造構造…

install Ubuntu again

參考鏈接&#xff1a;Windows 下安裝 Ubuntu 雙系統(更新) - duan22677 - 博客園 這里的總的空間是120G 它里面指出雙系統的時候&#xff0c;/boot 應該是主分區 參考鏈接&#xff1a;win10下安裝Ubuntu16.04雙系統_windows10安裝引導ubuntu-CSDN博客 這里面講到了&#xf…

ES入門六:Suggesters Api實踐

都是負擔在很多app上&#xff0c;當我們輸入某些內容時候&#xff0c;它會立即做一些補全操作&#xff0c;如果我想實現上述的需求&#xff0c;我們就可以使用ES提供的Suggesters Api。那Suggesters是如何做到的那&#xff1f;簡單來說&#xff0c;Suggesters會將輸入的文本拆分…

【網站項目】167固定資產管理系統

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

誰才是“內卷”之王?眾多洗地機品牌哪家清潔力最強?清潔最干凈?

在如今快節奏的生活中&#xff0c;家庭清潔工作愈發顯得繁瑣而耗時。添可洗地機憑借其高效的一體化清潔功能和智能化操作&#xff0c;為現代家庭生活帶來了極大的便利。面對眾多款品牌洗地機型號&#xff0c;消費者不禁會問&#xff1a;哪家洗地機清潔力最強&#xff1f;在性能…

解決tomcat雙擊startup.bat一閃而過的問題

這種問題可能是tomcat找不到你的jdk環境配置路徑 1、首先在tomcat的bin文件夾找到startup.bat 和catalina.bat兩個文件 2、startup.bat用記事本打開 在末尾添加pause 3、保存修改&#xff0c;雙擊startup.bat如果出現這種問題&#xff0c;就是找不到jdk路徑 4、用記事本打開ca…