1.可包含多个内存字节池。每个内存字节池都是一个公用资源。 除了不能从 ISR 调用内存字节服务之外,没有任何限制。
2.内存字节池的分配与malloc类似,其中包含所需的内存量(字节)。 内存采用“首次适应”的方式从池中分配。
例如,使用满足请求的第一个可用内存块。 此块中多余的内存会转换为新块,并放回可用内存列表中。 此过程称为碎片。
相邻的可用内存块在后续的分配搜索过程中合并为一个足够大的可用内存块。 此过程称为碎片整理。
3.创建内存字节池
线程在初始化期间或运行时创建。 应用程序中内存字节池的数量没有限制。
4.池容量
可分配的字节数略小于创建期间指定的字节数。 这是因为可用内存区域的管理带来了一些开销。池中的每个可用内存块都需要相当于两个 C 指针的开销。
创建的池包含两个块:一个较大的可用块和在内存区域末端永久分配的一个较小的块。 这个分配块用于提高分配算法的性能。 这样就无需在合并期间持续检查池区域末端。
在运行时,池中的开销通常会增加。 如果分配奇数字节数,系统会加以填充,以确保正确对齐下一个内存块。 此外,随着池变得更加零碎,开销也会增加。
5.池的内存区域
在创建过程中指定。
如果目标硬件有高速内存区域和低速内存区域,用户可以通过在每个区域中创建池来管理这两个区域的内存分配。
6.线程挂起
在等待池中的内存字节时,应用程序线程可能会挂起。
当有足够的连续内存可用时,将为已挂起的线程提供其请求的内存,并且恢复线程。如果同一内存字节池中挂起多个线程,则按FIFO为其提供内存(恢复)。
tx_byte_pool_prioritize设置优先级将最高优先级的线程置于挂起列表的前面,让所有其他挂起的线程采用相同的FIFO 顺序。
7.运行时字节池性能信息
通过 tx_byte_pool_performance_info_get 和 tx_byte_pool_performance_system_info_get获得
(1) 整个系统的总数
分配数、版本、搜索的片段数、合并的片段数、创建的片段数、分配挂起数、分配超时数
(2) 每个字节池的总数
分配数、版本、搜索的片段数、合并的片段数、创建的片段数、分配挂起数、分配超时数
“分配挂起数”相对较高可能表明字节池太小。
8.内存字节池控制块 TX_BYTE_POOL
9.非确定性行为
内存字节池可能有2,000 字节的可用内存,但可能无法满足 1,000 字节的分配请求。 这是因为无法保证有多少可用字节是连续的。即使存在 1,000 字节可用块,也不能保证找到此块需要多长时间。 完全有可能需要搜索整个内存池来查找这个1,000 字节块。
10.覆盖内存块
确保已分配内存的用户不会在其边界之外写入。 如果发生这种情况,则会损坏其相邻的内存区域