微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)
文章目录
- 1. 背景
- 2. 设置参数的主要流程
- 2.1 初始化
- 2.2 注册某个params的处理方式以及回调函数
- 2.4 定义好前面的params以及init指定config地点后start处理argv
- 3. 其他
- 4. DOCA ARGP包相关
- 4.1 主要接口
- 4.2 DOCA ARGP的2个rpm包
- 4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm
- 4.2.2 doca-sdk-argp-devel-2.9.0072-1.el8.x86_64.rpm
- 4.2.3 头文件和so库
- 5. 综述
1. 背景
DOCA: Data Center-on-a-Chip Architecture,片上数据中心架构。是NVIDIA针对DPU的软件框架。DOCA之于DPU,就相当于CUDA之于GPU。本文介绍的是DOCA SDK中的DOCA ARGP模块的机制原理,他是DOCA程序的一个标准参数处理框架。
DOCA ARGP (DOCA Arg Parser)是doca中给用户程序提供的一个处理用户参数的模块。基本原理是提供一个后端处理服务,将-v -vv这种参数以及遇到这种参数给一个回调函数(该回调函数用户提供),然后在回调函数中将用户输入数据存入正确的config数据中。
在doca argp中主要有2种内存,一个是config内存(就是用户在整个模块中的config参数);另一个是params内存,这个内存是用来给argp用的,它定义了多个参数匹配模式元组的表示,也就是后面提到的params的多个接口设置的目的。
然后doca argp使用多个API接口,注册用户期望的多个params,然后根据用户输入的多个参数一一的进入用户定制的处理函数将数据存入用户config空间。
要真正理解本文的流程建议拿一个实际的DOCA samples进行查看。本文使用的源码是doca sapmle中的\doca\samples\doca_devemu\devemu_pci_device_dma\dpu\devemu_pci_device_dma_dpu_main.c
全局关键点预览:
2. 设置参数的主要流程
- 先创建一个 param的句柄:
doca_argp_param_create
到struct doca_argp_param *param
。 doca_argp后端提供这个服务,让后端创建相关资源。这里doca后端应该仅仅是使用类似malloc创建资源,后面整整reg才会初始化。可以看到这些params的的本质是KV的方式,key就是前面几个set的key,v是存在通过param_create的内存中。 - 然后设置参数的几件套:包括-x,–xxx这些指定方式。其中 -x短模式用:
doca_argp_param_set_short_name
,长模式用:doca_argp_param_set_long_name
- 然后设置这个参数的description:
doca_argp_param_set_description
- 指定函数处理的调用函数:毁掉函数中从params中指定的参数,送到config中去。也就可以直接从输入参数拷贝到创建的params的资源中去。
- 设置param的参数类型
- 指定这些参数后,就能够使用
doca_argp_register_param
将指定的几个参数赋值到create的资源里面去。并且应该后台有一个-和–的全局链,然后给后面匹配的时候遍历对比。
那么接下来的问题是,在argp后端创建了资源,也给资源进行了赋值。用户程序如何将运行时刻的参数赋值到这些资源上呢?
答案是:doca_argp_start(argc, argv);
当程序运行后,指定了类似–vuid之后,doca_argp_start会从argc和argv中获取这些参数,然后判断比如和前面register的-或者–的参数对比,如果对比上了,就会调用对应的param注册的callback,然后callback中将参数给到用户程序的config里面。这里callback的函数调用的时候,因为有指定param的参数类型,会作为参数传入callback的第二个参数,另外就是前面
那么用户程序的config里面是如何存储到用户参数的呢?
也就是说当doca_argp_start执行后,从用户-等参数就设置到init指定的地址里面。
2.1 初始化
使用doca_argp_init会创建argp的资源
用法:
result = doca_argp_init("doca_devemu_pci_device_dma_dpu", &devemu_pci_cfg);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to init ARGP resources: %s", doca_error_get_descr(result));goto sample_exit;}
定义:
struct devemu_pci_cfg {char devemu_manager_pci_address[DOCA_DEVINFO_PCI_ADDR_SIZE]; /* Emulated device manager PCI address */char dma_dev_name[DOCA_DEVINFO_IBDEV_NAME_SIZE]; /* DMA device name */char vuid[DOCA_DEVINFO_REP_VUID_SIZE]; /* VUID of emulated device */uint64_t host_dma_mem_iova; /* IOVA of host DMA memory */char write_data[MEM_BUF_LEN]; /* Data to write to host memory */
};
2.2 注册某个params的处理方式以及回调函数
result = register_vuid_param("DOCA Devemu emulated device VUID.", vuid_callback);if (result != DOCA_SUCCESS)return result;doca_error_t register_vuid_param(const char *description, doca_argp_param_cb_t vuid_callback)
{struct doca_argp_param *param;doca_error_t result;/* Create and register VUID param */result = doca_argp_param_create(¶m);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(result));return result;}doca_argp_param_set_short_name(param, "u");doca_argp_param_set_long_name(param, "vuid");doca_argp_param_set_description(param, description);doca_argp_param_set_callback(param, vuid_callback);doca_argp_param_set_type(param, DOCA_ARGP_TYPE_STRING);result = doca_argp_register_param(param);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(result));return result;}return DOCA_SUCCESS;
}## 2.3 回调函数:
static doca_error_t vuid_callback(void *param, void *config)
{struct devemu_pci_cfg *conf = (struct devemu_pci_cfg *)config;const char *vuid = (char *)param;return parse_vuid(vuid, conf->vuid);
}
2.4 定义好前面的params以及init指定config地点后start处理argv
从入参中直接赋值到定义的参数中:
result = doca_argp_start(argc, argv);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to parse sample input: %s", doca_error_get_descr(result));goto argp_cleanup;}if (*devemu_pci_cfg.vuid == 0) {DOCA_LOG_ERR("The VUID parameter is missing");goto argp_cleanup;}
3. 其他
该文章中主要的主要流程的全流程代码
/** Sample main function** @argc [in]: command line arguments size* @argv [in]: array of command line arguments* @return: EXIT_SUCCESS on success and EXIT_FAILURE otherwise*/
int main(int argc, char **argv)
{struct devemu_pci_cfg devemu_pci_cfg;doca_error_t result;struct doca_log_backend *sdk_log;int exit_status = EXIT_FAILURE;/* Set the default configuration values (Example values) */strcpy(devemu_pci_cfg.devemu_manager_pci_address, "0000:03:00.0");strcpy(devemu_pci_cfg.dma_dev_name, "");strcpy(devemu_pci_cfg.vuid, "");strcpy(devemu_pci_cfg.write_data, "This is a sample piece of data from DPU!");devemu_pci_cfg.host_dma_mem_iova = 0x1000000;/* Register a logger backend */result = doca_log_backend_create_standard();if (result != DOCA_SUCCESS)goto sample_exit;/* Register a logger backend for internal SDK errors and warnings */result = doca_log_backend_create_with_file_sdk(stderr, &sdk_log);if (result != DOCA_SUCCESS)goto sample_exit;result = doca_log_backend_set_sdk_level(sdk_log, DOCA_LOG_LEVEL_WARNING);if (result != DOCA_SUCCESS)goto sample_exit;DOCA_LOG_INFO("Starting the sample");#ifdef DOCA_ARCH_DPUresult = doca_argp_init("doca_devemu_pci_device_dma_dpu", &devemu_pci_cfg);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to init ARGP resources: %s", doca_error_get_descr(result));goto sample_exit;}result = register_devemu_pci_params();if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to register sample command line parameters: %s", doca_error_get_descr(result));goto argp_cleanup;}result = doca_argp_start(argc, argv);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to parse sample input: %s", doca_error_get_descr(result));goto argp_cleanup;}if (*devemu_pci_cfg.vuid == 0) {DOCA_LOG_ERR("The VUID parameter is missing");goto argp_cleanup;}result = devemu_pci_device_dma_dpu(devemu_pci_cfg.devemu_manager_pci_address,devemu_pci_cfg.dma_dev_name,devemu_pci_cfg.vuid,devemu_pci_cfg.host_dma_mem_iova,devemu_pci_cfg.write_data);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("devemu_pci_device_dma_dpu() encountered an error: %s", doca_error_get_descr(result));goto argp_cleanup;}exit_status = EXIT_SUCCESS;argp_cleanup:doca_argp_destroy();#else // DOCA_ARCH_DPU(void)argc;(void)argv;DOCA_LOG_ERR("PCI Emulated Device DMA DPU can run only on the DPU");exit_status = EXIT_FAILURE;#endif // DOCA_ARCH_DPUsample_exit:if (exit_status == EXIT_SUCCESS)DOCA_LOG_INFO("Sample finished successfully");elseDOCA_LOG_INFO("Sample finished with errors");return exit_status;
}# 定义params的地方:
/** Register the command line parameters for the sample** @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise*/
static doca_error_t register_devemu_pci_params(void)
{doca_error_t result;result = register_devemu_manager_pci_address_param(pci_callback);if (result != DOCA_SUCCESS)return result;result = register_dma_device_name_param(device_name_callback);if (result != DOCA_SUCCESS)return result;result = register_vuid_param("DOCA Devemu emulated device VUID.", vuid_callback);if (result != DOCA_SUCCESS)return result;result = register_mem_address_param(mem_address_callback);if (result != DOCA_SUCCESS)return result;result = register_write_data_param(write_data_callback);if (result != DOCA_SUCCESS)return result;return DOCA_SUCCESS;
}# 将parmas存入到config中的回调函数(config是init函数的时候存入的)
/** ARGP Callback - Handle VUID parameter** @param [in]: Input parameter* @config [in/out]: Program configuration context* @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise*/
static doca_error_t vuid_callback(void *param, void *config)
{struct devemu_pci_cfg *conf = (struct devemu_pci_cfg *)config;const char *vuid = (char *)param;return parse_vuid(vuid, conf->vuid);
}
4. DOCA ARGP包相关
4.1 主要接口
4.2 DOCA ARGP的2个rpm包
4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm
4.2.2 doca-sdk-argp-devel-2.9.0072-1.el8.x86_64.rpm
4.2.3 头文件和so库
参考doca_argp.h
5. 综述
本文拆解了argp的编程模式。本质就是一个用户态命令输入流的pipe line。并且提出了2个内存块param和config,在pipe line里面通过param中的callback进入每个param的处理流程,处理流程中就是把用户输入的param存入config中
参考:
https://docs.nvidia.com/doca/api/2.9.0/pdf/doca-libraries-api.pdf
相关文章:

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)
文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…...
PostgreSQL高可用Patroni安装(超详细)
目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…...

mcu之,armv7架构,contex-M4系列,时钟树,中断,IO架构(一)
写这篇文章的目的,是记录一下arm架构的32mcu,方便记忆芯片架构原理,方便我展开对,BootLoader的研究。 arm架构,时钟树,先做个记录,有空写。...
论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区)
目录 论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区) 基于区块链的去中心化云制造服务选择方法 一、核心内容概述 二、核心创新点及原理与理论 三、实验与理论分析 PBFT(实用拜占庭容错) 论文解析:基于区块链的去中心化服务选择,用于QoS感知的…...

详细解析STM32 GPIO引脚的8种模式
目录 一、输入浮空(Floating Input):GPIO引脚不连接任何上拉或下拉电阻,处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉(Inpu…...

【hacker送书第16期】Python数据分析、挖掘与可视化、AI全能助手ChatGPT职场工作效率提升技巧与案例
解锁数据分析与AI应用的双重秘密:全面推广《Python数据分析、挖掘与可视化从入门到精通》与《AI全能助手ChatGPT职场工作效率提升技巧与案例》 前言Python数据分析、挖掘与可视化从入门到精通💕内容简介获取方式 AI全能助手ChatGPT职场工作效率提升技巧与…...

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践
引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版…...
WebGIS开发中不同坐标系坐标转换问题
在 JavaScript 中,使用 proj4 库进行坐标系转换是一个非常常见的操作。proj4 是一个支持多种坐标系的 JavaScript 库,提供了从一种坐标系到另一种坐标系的转换功能。 以下是使用 proj4 进行坐标系转换的基本步骤: 1. 安装 proj4 你可以通过…...

【青牛科技】视频监控器应用
1、简介: 我司安防产品广泛应用在视频监控器上,产品具有性能优良,可 靠性高等特点。 2、图示: 实物图如下: 3、具体应用: 标题:视频监控器应用 简介:视频监控器工作原理是光&#x…...

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS
MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦,主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以,我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉,也不熟悉 Cocoa 框架,在 ChatGPT…...

PgSQL即时编译JIT | 第1期 | JIT初识
PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…...
Go小记:使用Go实现ssh客户端
一、前言 SSH(Secure Shell)是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务,保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …...
Nginx Spring boot指定域名跨域设置
1、Nginx配置跨域: server {listen 80;server_name your-backend-service.com;location / {proxy_pass http://localhost:8080; # Spring Boot应用的内部地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-F…...

深入理解Redis(七)----Redis实现分布式锁
基于Redis的实现方式 1、选用Redis实现分布式锁原因: (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 2、使用命令介绍: (1)SETNX SETNX …...
Database Advantages (数据库系统的优点)
数据库管理系统(DBMS)提供了一种结构化的方式来存储、管理和访问数据,与传统的文件处理系统相比,数据库提供了许多显著的优点。以下是数据库系统的主要优势: 1. Data Integrity (数据完整性) 概念:数据完整…...

Qt桌面应用开发 第五天(常用控件)
目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…...

初识Linux · 信号处理 · 续
目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…...

【Linux】虚拟地址空间,页表,物理内存
目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…...
C++ 并发专题 - 线程安全的单例模式
一:概述: 在C编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中,std::call_once 是由标准库提供的…...

Spring Boot汽车世界:资讯与技术的交汇
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...