UINT _tx_byte_allocate(
//指向之前创建的内存块池的指针
TX_BYTE_POOL *pool_ptr,
// 指向目标内存指针的指针。 成功分配时,已分配内存区域的地址位于此参数所指向的位置
VOID **memory_ptr,
//请求的字节数
ULONG memory_size,
//定义此服务在没有足够内存可用时的行为方式
ULONG wait_option);
局部变量:
流程:
1.thread_ptr记录申请内存分配的当前线程
2.计算申请内存大小,4字节对齐
3.禁止中断
4.循环操作 //当内存申请失败或内存池拥有者不再是当前线程时,退出循环
(1) 标记内存池拥有者为当前线程
(2) 恢复中断 //后面的操作可能被高优先级打断,高优先级线程也可能在这个内存池申请分配内存
(3) 当前线程搜寻自由内存,work_ptr存储返回的内存地址
(4) 禁止中断
这个线程恢复后,循环继续,再次尝试内存申请
5.如果申请到了内存,memory_ptr指向返回的内存地址,修改状态为成功
6.如果内存不够申请失败
(1) 若wait_option不为0,挂起线程到suspension list,等其他线程释放内存后,在tx_byte_release中重新申请内存,恢复线程
1) 挂起线程
2) 记录内存池控制块指针
3) 记录需要申请分配内存大小
4) 挂起到suspension list,按照fifo
5) suspended count++
6) 修改状态为TX_BYTE_MEMORY
7) 设置suspending flag
8) 禁止抢占
9) 保存timeout
10) 恢复中断
11) 若wait_option有值,,开启定时器,定时器超时会清楚申请内存相关操作,并返回失败
12) 调用线程挂起函数
13) 返回线程状态
(2) 若wait_option为0,返回TX_NO_MEMORY
7.恢复中断
8.返回线程状态