我应该如何管理任务关键型嵌入式应用程序中的内存?
我用谷歌找到了一些文章,但找不到真正有用的实用指南。
DO-178b
禁止动态内存分配,但是您将如何管理内存呢?提前预分配一切并发送指向每个需要分配的函数的指针?在栈上分配?使用全局静态分配器(但它与动态分配非常相似)?
答案可以是常规答案、对资源的引用或对良好的开源嵌入式系统的引用等形式。
澄清:这里的问题不是内存管理是否适用于嵌入式系统。但是,什么是嵌入式系统的良好设计,以最大限度地提高可靠性。
我不明白为什么静态预分配缓冲池并动态获取和删除它与动态分配内存不同。
最佳答案
作为处理过嵌入式系统的人,虽然到目前为止还没有那么严格(不过我已经阅读了 DO-178B):
- 如果您查看 u-boot 引导加载程序,您会发现很多都是通过全局放置的结构完成的。根据您的具体应用,您也许可以摆脱全局结构和堆栈。当然,那里有重入和相关问题,它们并不真正适用于引导加载程序,但可能适用于您。
- 预分配,预分配,预分配。如果您可以在设计时绑定(bind)数组/列表结构/等的大小,请将其声明为全局(或静态全局 - 看看 Ma,封装)。
- 堆栈非常有用,在需要的地方使用它——但要小心,因为很容易一直分配它直到没有剩余的堆栈空间。我曾经发现自己调试的一些代码会为多个函数中的字符串管理分配 1k 缓冲区...有时,缓冲区的使用会占用另一个程序的堆栈空间,因为默认堆栈大小为 4k。
- 缓冲池的情况可能完全取决于它的实现方式。如果您知道需要传递编译时已知大小的固定大小缓冲区,则处理缓冲池可能比完整的动态分配器更容易证明正确性。您只需要验证缓冲区不会丢失,并验证您的处理不会失败。这里似乎有一些不错的提示:http://www.cotsjournalonline.com/articles/view/101217
不过,我认为加入 http://www.do178site.com/ 可能会找到您的答案。
关于c - 嵌入式应用程序中的内存管理资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469904/