这个问题涉及嵌入式系统的编程。我正在嵌入式设备上进行实验性通信栈。堆栈从底层通道接收流数据,检测到……
查看LwIP数据包缓冲区(pbuf),它可以解决您的方案中提到的情况。 http://www.nongnu.org/lwip/2_0_x/group__pbuf.html 为了增强ISR执行的代码,而不是malloc,您可以实现内存池。
在一个地方分配内存。由于它是嵌入式系统,因此您必须使用静态内存池。就像以opaque类型实现的经典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中。
buffer_copy
在多进程系统的情况下,如果允许多个进程同时分配缓冲区,则必须考虑重入。