c - 嵌入式应用程序中的内存管理资源

标签 c memory-management embedded malloc do178-b

我应该如何管理任务关键型嵌入式应用程序中的内存?

我用谷歌找到了一些文章,但找不到真正有用的实用指南。

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/

相关文章:

c - Tiva 上的 I2C 接口(interface)

c - C 与 scanf 中的变量赋值

c - 如何用 C 将位图作为框架写入 Ogg Theora?

objective-c - C和Objective-C中返回地址的内存分配

r - 以交互方式处理占用大量内存的列表对象

c - IAR 中的错​​误函数指针

c - 下面的操作是什么意思?

c - 如何在 C 中重用(倒带)重定向文件

c - C 中指针算术的意外结果

c++ - 哪些数据结构使用了多少内存