如何在关键任务嵌入式应用程序中管理内存?

我在Google上找到了一些文章,但找不到确切有用的实用指南。
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/

    10-12 14:47