一种嵌入式系统的内存分配方案
STATUS(*destroyFn)(void*,ulong_targl);/*释放缓冲区时的回调函数指针*/
Ulong_t argVal;/*回调函数的参数*/
} buf_pool_t;
结构中的参数包括检查标记MAGIC、是否本地分配、空闲链表、内存指针、创建缓冲池的回调函数指针、释放时的回调函数指针、回调函数参数。
(2)相关函数
◆BufPoolInitializeStorage:分配和初始化存储区。参数包括存储区地址(如为NULL,则本地分配)、缓冲区大小、缓冲区个数。
①根据缓冲区大小和个数获得所需的内存大小。
②如果指针为NULL,则调用calloc分配内存。设置本地分配标志。
③初始化内存为0。
④初始化指针。分配的内存块最前面为缓冲池结构buf_pool_t。实际的存储区紧随其后。Buf_pool_t包含参数检查标记、是否本地分配、存储区地址、分配时回调函数、释放时回调函数、回调函数变量。此时只设置存储区指针。
◆BufPoolCreate:创建缓冲池。参数为内存制止。缓冲区尺寸和个数,创建时回调函数、释放时回调函数、回调函数参数。
①尺寸对齐。
②调用bufPoolInitializeStorage初始化内存区和buf_pool_t结构。
③用传入参数填充buf_pool_t结构。
④将缓冲区添加到空闲链表中,最后的缓冲区在最前面。
◆BufPoolDestroy:删除缓冲池。参数为buf_pool_t指针。
①检查缓冲池结构中的MAGIC字段是否被个性。
②如果是本地分配的则翻放内存区。
◆BufPoolAlloc:从缓冲池中分配一个缓冲区,参数为缓冲池结构指针。如果存在空闲缓冲区,则从空闲链表中除并提供给调用者,执行创建时回调函数。如果回调函数返回错误,则将缓冲区返还给空闲链表。
①检查缓冲池结构中的MAGIC标记是否完好。
②从空闲链表中取出头一个节点。
③如果节点不为空,清空节点,以其地址为参数调用回调函数。
④如果回调函数返回错误,则将节点还给空闲链表。
⑤返回得到空闲缓冲区地址。
◆BufPoolFree:将缓冲区返回给缓冲池。如果定义了回调函数,将在归还缓冲之间调用回调函数。参数为缓冲池结构和缓冲区指针。
①缓冲池MAGIC标记是否完好。
②如果定义回调函数、调用之。如果返回错误,则设置错误号。
③将缓冲区添加到空闲链表中头部。
注意该函数有2点:①回调函数返回错误,照样归还缓冲区。②没有检查缓冲区是否二次释放,这一点与Intel的驱动程序不同。
另外,TMS的缓冲池没有BLOCK要领,不需要判断哪个CELL属于哪个BLO
CK,简化 了操作。
5 小结
许多嵌入式应用在RTOS提供的malloc/free的基础上编写自己的内存管理方案。编写这样的内存管理方案,目的无非有两个
《一种嵌入式系统的内存分配方案(第5页)》