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.mzph.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…