首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式系统分层通信栈的内存管理

嵌入式系统分层通信栈的内存管理
EN

Stack Overflow用户
提问于 2019-03-05 08:11:09
回答 2查看 213关注 0票数 0

这个问题与嵌入式系统上的编程有关。我正在一个嵌入式设备上做一个实验通讯堆栈。堆栈从底层通道接收流数据,检测离散数据包,重新组装分段数据,等等。

每个功能都在一个单独的层中实现。一些层延迟对数据包的处理(因为数据到达中断处理程序,进一步的处理被卸载到主上下文中)。一些层将多个传入的数据包合并成一个转发到下一个上层的包(即碎片数据的重新组装)。因此,一些层将一个传入分组拆分为转发到下一个下层的多个分组。当然,任何层在任何时候都可以在没有进一步通知的情况下丢弃数据包,因为例如,校验和与数据不匹配。

我的问题是关于这些数据包的内存分配。

目前,我正在每一层使用malloc。具体来说,我为要转发到下一个上层的数据包分配内存,将指针传递到下一层的处理程序,并在调用后再次释放内存。下一层的处理程序负责复制所需的数据。因此,每个层都维护数据的所有权,并且很难忘记释放分配的内存。这是很好的工作,但导致了许多不必要的副本。

或者,我可以将缓冲区的所有权转发到下一层。然后下一层可以直接在缓冲区上工作,并将相同的缓冲区转发到下一层,依此类推。我认为这样做有点棘手,因为没有内存泄漏。

最终,因为它是一个嵌入式设备,我想找到一个没有动态内存分配的解决方案。如果每个层保留自己内存的所有权,那么没有malloc的实现应该很容易。但是,如果所有权被转移,那么它看起来就更复杂了。

你有什么意见吗?

EN

回答 2

Stack Overflow用户

发布于 2019-03-05 08:21:18

查看LwIP数据包缓冲区(pbuf),它解决了在您的场景中提到的情况。pbuf.html可以使您的代码健壮,而不是malloc,您可以实现内存池。

票数 1
EN

Stack Overflow用户

发布于 2019-03-05 09:26:03

在一个地方分配内存。因为它是嵌入式系统,所以您必须使用静态内存池。就像作为不透明类型实现的典型ADT一样:

//缓冲区.h

代码语言:javascript
复制
typedef struct buffer_t buffer_t;

buffer_t* buffer_create (/*params*/);

/* setter & getter functions here */

//缓冲区c

代码语言:javascript
复制
#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 */

现在,所有不同的应用程序层和进程只能传递指针的副本。如果您确实需要制作硬拷贝,则在上面的ADT中实现一个buffer_copy函数。

在多进程系统的情况下,如果允许多个进程同时分配缓冲区,则必须考虑重新进入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54998104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档