这个问题涉及嵌入式系统上的编程。
我正在嵌入式设备上开发实验性通信堆栈。
堆栈从底层通道接收流数据,检测离散数据包,重新组装碎片数据等......
每个功能都在单独的层中实现。
某些层延迟数据包的处理(因为数据到达中断处理程序并进一步
处理被卸载到主上下文上)。
某些层将多个传入数据包合并为转发到下一个上层的单个数据包(即碎片数据的重组)。
因此,一些层将一个传入数据包分成转发到下一个较低层的多个数据包。
当然,任何层都可能在任何时候丢弃数据包,而不另行通知,因为例如校验和与数据不匹配。
我的问题是关于这些数据包的内存分配。
目前,我在每一层都使用 malloc。具体来说,我为要转发到下一个上层的数据包分配内存,
将指针传递给下一层的处理程序,并在调用后再次释放内存。这是下一层处理程序的责任
复制所需的数据。因此,每一层都维护分配的数据的所有权,并且很难忘记释放分配的内存。
这非常有效,但会导致大量不必要的副本。
或者,我可以将缓冲区的所有权转发到下一层。然后下一层可以直接在缓冲区上完成工作并转发
相同的缓冲区到下一层,依此类推。我认为要避免内存泄漏,这有点棘手。
最终,因为它是嵌入式设备,所以我想找到一种无需动态内存分配的解决方案。如果每一层都保留自己内存的所有权,那么没有 malloc 的实现应该很容易。但如果所有权被传承的话,事情就显得更加复杂了。
你有什么意见吗?
查看 LwIP 数据包缓冲区 (pbuf),它可以解决您场景中提到的情况。http://www.nongnu.org/lwip/2_0_x/group__pbuf.html http://www.nongnu.org/lwip/2_0_x/group__pbuf.html为了增强 ISR 执行的代码,您可以实现内存池,而不是 malloc。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)