一种嵌入式系统的内存分配方案
①尺寸对齐。
②调用bufPoolInitializeStorage初始化内存区和buf_pool_t结构。
③用传入参数填充buf_pool_t结构。
④将缓冲区添加到空闲链表中,最后的缓冲区在最前面。
◆BufPoolDestroy:删除缓冲池。参数为buf_pool_t指针。
①检查缓冲池结构中的MAGIC字段是否被个性。
②如果是本地分配的则翻放内存区。
◆BufPoolAlloc:从缓冲池中分配一个缓冲区,参数为缓冲池结构指针。如果存在空闲缓冲区,则从空闲链表中除并提供给调用者,执行创建时回调函数。如果回调函数返回错误,则将缓冲区返还给空闲链表。
①检查缓冲池结构中的MAGIC标记是否完好。
②从空闲链表中取出头一个节点。
③如果节点不为空,清空节点,以其地址为参数调用回调函数。
④如果回调函数返回错误,则将节点还给空闲链表。
⑤返回得到空闲缓冲区地址。
◆BufPoolFree:将缓冲区返回给缓冲池。如果定义了回调函数,将在归还缓冲之间调用回调函数。参数为缓冲池结构和缓冲区指针。
①缓冲池MAGIC标记是否完好。
②如果定义回调函数、调用之。如果返回错误,则设置错误号。
③将缓冲区添加到空闲链表中头部。
注意该函数有2点:①回调函数返回错误,照样归还缓冲区。②没有检查缓冲区是否二次释放,这一点与Intel的驱动程序不同。
另外,TMS的缓冲池没有BLOCK要领,不需要判断哪个CELL属于哪个BLOCK,简化 了操作。
5 小结
许多嵌入式应用在RTOS提供的malloc/free的基础上编写自己的内存管理方案。编写这样的内存管理方案,目的无非有两个:一是减少对malloc/free的依赖,从而避免由之带来的内存碎片、时间不确定等总是;另一个是增强程序的查错能力,送还内存使用错误。对于在嵌入式系统中广泛存在的数据库类型的内存需求,即分配多个固定尺寸的内存单元的要求,“一闪分配,多次使用”的方案无疑是一种很好的解决之道。文中介绍的2个例子很好地体现了它的优越性。