TCP/IP 堆栈网络缓冲区分配方案
及其对简单性、CPU 负载和吞吐量性能的影响
网络数据缓冲区
发送到网络或从网络接收的数据放置于
网络缓冲区。 网络缓冲区描述符保存有关网络缓冲区的
信息。 描述符是预先分配的,网络缓冲区
则根据需要进行分配。
描述符的总数由
ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS 设置,
该常量位于 FreeRTOSIPConfig.h 中。 预先分配描述符使
应用程序编写者得以限制 能同时存在的网络缓冲区的
最大数量,以防止内存耗尽。
不同的缓冲区 分配方案适合不同的嵌入式应用程序。
因此 FreeRTOS-Plus-TCP 保留缓冲区分配方案,作为 TCP/IP
堆栈可移植层的一部分。 在写入时,将提供两个示例缓冲区
分配方案,两个方案在简单性、
RAM 使用效率和性能上都有不同的权衡。 本页详细介绍了
这两个方案。
实现缓冲区分配方案的 C 源文件位于
FreeRTOS-Plus/FreeRTOS_Plus_TCP/portable/BufferManagement
目录中。 一次只能使用一个方案。
缓冲区分配方案
方案 1: 由 BufferAllocation_1.c 实现
说明
|
|
属性
|
-
运行时性能高。
-
以太网缓冲区可从
中断分配和释放,让嵌入式
以太网外设驱动程序变得更加高效。
-
RAM 使用效率低——所有缓冲区都
大小相同,使的 BufferAllocation_1.c 不适合
某些 RAM 受限的嵌入式系统。
-
与
由 BufferAllocation_2 实现的方案相比,此方案在配置和调整上更复杂。
-
更容易实现
嵌入式以太网
外设 DMA 提出的任何特殊的缓冲区对齐要求。
-
需要网络接口驱动程序的支持
(请参阅上文的要点说明部分)。
|
用法
|
-
ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS
常数(在
FreeRTOSIPConfig.h 中)
定义描述符的总数和
缓冲区总数。
-
ipconfigNETWORK_MTU constant(在
FreeRTOSIPConfig.h 中定义)
定义了每个以太网缓冲区的大小
(以太网帧的总大小就是所定义的 MTU 大小加上
以太网标头所需的字节数)。
|
方案 2: 由 BufferAllocation_2.c 实现
说明
|
|
属性
|
-
非常容易使用。
-
与由 BufferAllocation_1.c 实现的方案相比,
动态分配导致运行时性能更低
。
-
不能从中断中分配和释放以太网缓冲区,
必须在嵌入式以太网外设驱动器中使用
延迟中断处理任务
。
-
RAM 使用效率很高——精确分配所需的
RAM 大小,使得 BufferAllocation_2.c
特别适合 RAM 受限的小型嵌入式
系统而打造。
|
用法
|
-
以太网缓冲区从
FreeRTOS 堆中分配。 为了避免
内存碎片化问题,BufferAllocation_2.c
只有与
结合了堆内存空闲块的方案
(合并算法)一起使用才可靠。 在 heap_4.c 中实现 FreeRTOS 内存分配
方案是合适的。
如果标准库的 malloc() 和 free() 能够处理碎片,
那么也可以使用在 heap_3.c 中实现的内存分配方案。
-
由于堆内存太少,TCP/IP 堆栈会在尝试分配
网络缓冲区 失败后恢复,然而,由于使用了
标准堆实现,这样的失败将导致
内存分配失败钩子被调用(如果
configUSE_MALLOC_FAILED_HOOK
在 FreeRTOSConfig.h 中设置为 1)。
|
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.