UINT _tx_byte_pool_create(
//内存块池控制块指针
TX_BYTE_POOL *pool_ptr,
//内存块池名字指针
CHAR *name_ptr,
//内存块池固定块大小
ULONG block_size,
//内存块池内存的起始地址
VOID *pool_start,
//内存块池整个内存的大小
ULONG pool_size);
局部变量:
block_ptr | 当前块指针 |
tail_ptr | 指向created list尾部内存块池 |
流程:
1.内存块、整个内存块池大小4字节对齐
2.初始化BCB
(1) 初始化各字段、内存起始地址
(2) 计算内存池尾部地址
(3) 遍历内存块池,记录可使用的内存块 available list
1) 计算下一块首地址。//每个块头部预留sizeof(CHAR_PTR)字节作为控制字段,这时候还没有初始化,所以不能直接用头部的指针
2) 循环初始化所有块(除最后一块),并累加可用块(blocks)
//每个块的控制字段指向相邻下一块的首地址,构成单向链表,最后一块控制字段指向NULL
a) 每个块的控制字段指向相邻下一块的首地址
block_ptr指向当前块的首地址,该语句即将当前块的控制字段指向相邻下一块的首地址
b) 将block_ptr指向下一块首地址
c) next_block_ptr指向下下块
最后一次循环结束时,block_ptr指向内存块池最后一块的下一块
(4) 计算出最后一块的首地址,最后一块的控制字段指向NULL
//因为循环结束后,block_ptr指向内存块池最后一块的下一块,所以-block_size-sizeof(AHCR_PTR)
(5) tx_block_pool_available(可用块数量)、tx_block_pool_total(总块数)=blocks
(6) tx_block_pool_available_list指向第一个空闲块;如果blocks为0,指向NULL
3.将内存块池加入created list
(1) 禁止中断
(2) 设置内存池id //使其有效
(3) 将内存池插入_tx_block_pool_created list
1) 若created list不为空,加到尾部
2) 若空,直接加入
(4) created count++
(5) 恢复中断
(6) 返回TX_SUCCESS