这个问题涉及到嵌入式系统编程。 我正在试验通信栈的嵌入式设备上。 堆栈从底层信道接收的流数据,检测离散分组,重新组合分段的数据,等等。
每个函数在一个单独的层实现。 一些层延迟的分组的处理(因为数据在中断处理程序到达,并进一步处理被卸载到主上下文)。 一些层的多个传入分组合并成转发到下一个上层(即分段的数据的重组)的单个数据包。 因此,一些层分割一个传入分组到转发到下一个较低层的多个数据包。 当然,任何层可在任何点丢弃数据包不进一步通知,因为,例如,校验和不匹配的数据。
我的问题是有关这些数据包的内存分配。
目前,我使用的每一层上的malloc。 具体地讲,我分配内存用于分组要被转发到下一个上层,所述指针传递到下一层的处理程序,并在调用后再次释放内存。 这是下一层的处理程序负责复制所需的数据。 因此,每一层维护数据的所有权分配,这是很难忘记释放分配的内存。 这工作得很好,但导致了很多不必要的副本。
或者,我可以转发缓冲的所有权到下一层。 然后,下一层可以直接做其工作,对缓冲区和相同的缓冲转发到下一层,依此类推。 我想这是有点棘手得到的权利,没有内存泄漏。
最终,因为它是一个嵌入式设备,我想找到没有动态内存分配的解决方案。 如果每一层保持它自己的内存的所有权,然后再执行不malloc的应该很容易。 但是,如果所有权上再传给它似乎更复杂。
你有什么输入?
考虑LwIP的数据包缓冲区(PBUF),它解决了您的场景中提到的情况。 http://www.nongnu.org/lwip/2_0_x/group__pbuf.html要强大的代码由ISR执行,代替的malloc可以实现存储池。
在一个地方分配内存。 因为它是一个嵌入式系统,你必须使用一个静态内存池。 像不透明类型实现了经典ADT:
// buffer.h
typedef struct buffer_t buffer_t;
buffer_t* buffer_create (/*params*/);
/* setter & getter functions here */
// buffer.c中
#include "buffer.h"
struct buffer_t
{
/* private contents */
};
static buffer_t mempool [MEMPOOL_SIZE];
static size_t mempool_size = 0;
buffer_t* buffer_create (/*params*/)
{
if(mempool_size == MEMPOOL_SIZE)
{ /* out of memory, handle error */ }
buffer_t* obj = &mempool[mempool_size];
mempool_size++;
/* initialize obj here */
return obj;
}
/* setter & getter functions here */
现在,所有的各种应用层和过程只得到绕过一个指针的副本。 如果你确实需要真正发挥硬拷贝,你实现一个buffer_copy
在上面ADT功能。
在一个多进程系统的情况下,你将不得不考虑重入的情况下,多个进程被允许在同一时间分配缓冲区。
文章来源: Memory management for layered communications stack on embedded system [closed]