【rdam data flow疑惑小结】

1.bth.psn作用

–1.数据包顺序标识:接收方按PSN顺序重组报文;
–2.丢包检测与重传:通过ACK/NAK反馈机制
–3.流控:防止接收方缓冲区溢出;

2.tx_psn_manager在rdma中的一个流程:

--1.驱动填充WQE:填充操作类型、sge等;
--2.psn分配与发送:分配psn并写入bth头;WQE信息存入wqe_linklist,记录PSN范围(PSN=100~103)
--3.ACK处理:接收方返回ACK(PSN=103), 标记psn<=103的报文确认;
--4.NAK/超时处理:若收到NAK(PSN=101)或超时,从wqe_linklist中取出wqe>=101的WQE重新发送;

----为什么需要保存WQE信息?
重传可靠性:需要保证数据可靠传输,重传依赖原始WQE信息;
零拷贝优化:重传时无需驱动再次参与,由硬件直接处理;

3 rq_doorbell机制是什么?以及如何产生的?

Rq_doorbell作用:host driver通过写入doorbell寄存器(在网卡的PCIE BAR空间),通知网卡:接收队列-Rq中已新增了N个WQE(即内存注册区域),用他们来存储即将达到的数据包;
RQ_doorbell_handle:是只有需要用到rq_wqe时,才会采取拉rq_wqe;

4.requester端的qp_id和respond端的qp_id是同一回事吗?

Requester 的QPN和respond端的QPN不需要相同,不是同一回事;通信中,请求端(Requester)的QP_ID不会直接传递给响应端(Responder),且两端的QP_ID通常是不同的,各自独立管理。
requester端在发送rdma操作时,会在报文头(bth)中携带des qpn来进行指定;(requester自身QPN不会直接传递给respond端,除非在连接建立阶段通过CM协议显示交换信息);Respond根据des QPN找到本地对应的QPC;
在这里为什么requester端会拿到respond的qpn即dest qpn,是因为在建立rdma通信时,会首先QP建立;所以会填充respond端的dest qpn;
简单示例流程:
–1.Requester端(QP=100):
填充WQE(Work Queue Entry),指定操作类型(RDMA_WRITE)、目标GID和QP=200。
报文发送时,BTH头中写入 Dest QP=200;
–2.Responder端(QP=200):
解析报文头,确认目标QP=200,查找本地QP上下文(如内存权限、PSN状态)。
执行DMA写入,将Payload写入主机内存。
–3.ACK返回:
Responder生成ACK报文,目标QP为Requester的QP=100(通过连接映射关系确定),但该QP_ID仅在Requester本地有效。

5.respond端在发送ack报文时,如何知道requester端的qpn来进行填充bth?

在rdma(RoCEv2)通信中,requester端的qpn不会显示包含在发送的报文中,respond端在发送ack报文时,获得requester的qpn流程如下:
1.在QP连接建立阶段:
在RDMA通信开始前,Requester和Responder通过 CM(Connection Manager)协议 建立连接,主要完成:
–1.requester端和respond端在软件层通过CM协议交换各自的GID和QPN;GID(Global Identifier) 是用于 全局唯一标识网络中节点或接口的地址,类似于IP地址的概念;
–2.映射表维护:
双方在本地维护QP映射表,记录“GID和QPN”来映射QP;
* requester记录:GID_B + QPN_Resp ➔ 本地QP_Req;
* responder记录:GID_A + QPN_Req ➔ 本地QP_Resp;
2.ACK报文的目标QPN获得:查找本地映射表;

6.requester端和respond端网卡通信?

先明确的是:在网卡与网卡之间的通信是以以太网口来物理连接,传输的是标准的以太网报文;
其封装格式:
| Ethernet | IP | UDP | BTH (Base Transport Header) | RETH (RDMA Extended Transport Header) | Payload |

* Bth: 包含opcode,目标QP号,PSN等信息;
* RETH: 包含远程dest remote_Vaddr, length,rkey; requester中的这个地址具体指的的是接收端预先注册的内存地址;需要在经过本地注册的MR(Memory Region)和PD(Protection Domain)来进行地址转换和权限检查;  具体有MPT和MTT表格;如果接收端没有预先注册对应的内存区域,或者rkey验证失败,操作会被拒绝。 
    这会具体涉及到内存注册和地址转换机制;
在RDMA通信建立中的预分配的缓冲区地址--即内存注册区:
	--1.内存注册(MR: Memory Registration)
		接收端在通信前需预先分配内存缓冲区,并通过驱动将其注册到网卡。这一过程会生成 内存区域(Memory RegionMR) 和 保护密钥(rkey/lkey)。名词概念:
		• MR:描述内存的物理地址范围和访问权限;
		• Rkey:供远端remote dma验证权限;
		• Lkey:供本地验证DMA操作权限;
	--2.接收队列
		接收端在驱动下通过RQ(receive queue)来放置WQE,每个WQE来描述内存注册区的地址addr、长度和key;
		网卡在接收数据时,从RQ中获取可用的WQE,来确定写入的目标地址;

在涉及取rq_cqe时,必须生成rq_CQE并触发中断MSI-X来通知主机,这样上层能释放rq_cqe;
传输路径:是requester端通过以太网发送RoCEv2报文,经过标准的交换机和路由器来到达respond端;
respond端网卡处理流程:
1.链路层解析:剥离以太网帧头(MAC地址、VLAN标签等),验证FCS(Frame Check Sequence)确保数据完整性;
2.网络层解析:剥离IP头部,确认目标IP地址是否为本机。检查UDP端口号(默认为4791),识别为RoCEv2流量。
3.RoCEv2协议处理:解析BTH头,获取目标QP号和操作类型;
4.数据写入内存(TLP):根据qpc以及addre、length,再验证key和VA–>PA,然后发起一个pcie MemWR TLp,将payload直接写入主机内存;
5.完成通知:在respond端涉及取rq_wqe,需要生成rq_cqe并触发中断MSI-X来通知主机;同时也是发送ack报文来返回requester端;

内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值