LIMIT_FC 方法最便于实现。用户应用会对每次允许的未完成的非转发请求的最大数量(即 MAX_NP)进行评估。要计算该值,请执行以下步骤:
- 判定 Max_Request_Size 包所需的 CplH 信用值数量:
Max_Header_Count = ceiling(Max_Request_Size / RCB)
- 假定完成包均为最大大小,则判定 CplD 信用值池所支持的此类完成包的最大数量:
Max_Packet_Count_CplD = floor(CplD / Max_Request_Size)
- 假定完成包均为最大大小,则判定 CplH 信用值池所支持的此类完成包的最大数量:
Max_Packet_Count_CplH = floor(CplH / Max_Header_Count)
- 使用步骤 2 和步骤 3 中两种数量中较小的值来获取未完成的非转发请求的最大数量:
MAX_NP = min(Max_Packet_Count_CplH, Max_Packet_Count_CplD)
已知 MAX_NP 后,用户应用可在复位时加载含零位的寄存器 NP_PENDING,并确保它始终处于 0 到 MAX_NP 的范围内。发射非转发请求后,NP_PENDING 减小 1。接收到未完成的非转发请求的所有完成包之后,NP_PENDING 增加 1。例如:
- Max_Request_Size = 128B
- RCB = 64B
- CplH = 64
- CplD = 15,872B
- Max_Header_Count = 2
- Max_Packet_Count_CplD = 124
- Max_Packet_Count_CplH = 32
- MAX_NP = 32
虽然此方法最易于实现,但它浪费的接收器空间最大,因为对于每个非转发请求,都会分配完成信用值的整个 Max_Request_Size 块,与实际请求大小无关。如果用户应用发出的简短的存储器读取(约为单个 DWORD)、I/O 读取和 I/O 写入所占比例增加,那么浪费的量会进一步增加。