在嵌入式系统上使用动态数据接口有多糟糕?

Lyn*_*ite 14 queue stack avr list

因此,在嵌入式系统部门,我明年将参加大学,我们将了解到动态数据结构在嵌入式系统程序中是一件坏事.但讲义没有说明原因.

现在我正在开发一个中等规模的嵌入式系统LURC控制器,主要是利用AVR169MEGA的"Butterfly"演示板的外围设备.产生4个PWM信号来控制伺服和ESC.并提供9 seg液晶屏.

现在我想不出任何更好的存储指令的方法,因为它们是收到的小瓶USART序列,而不是队列.尤其是我需要等待收到未知数​​量的数据的东西:例如,要在LCD屏幕上显示的字符串.

那你为什么不在嵌入式系统的微控制器上使用动态数据结构呢?只是你在一个严重的内存限制环境中,并且必须确保你的mallocs成功吗?

Dip*_*ick 21

有许多理由不在嵌入式系统中使用malloc(或等效的).

  • 正如你所提到的,重要的是你不要突然发现自己内存不足.
  • 碎片 - 嵌入式系统可能会运行多年,这可能会因碎片而导致严重的内存浪费.
  • 不是真的需要.动态内存分配允许您重用相同的内存,以便在不同的时间执行不同的操作.嵌入式系统往往会一直做同样的事情(启动时除外).
  • 速度.动态内存分配要么相对较慢(并且随着内存碎片化而变慢),要么相当浪费(例如伙伴系统).
  • 如果要为不同的线程和中断使用相同的动态内存,则分配/释放例程需要执行锁定,这可能导致中断服务的问题足够快.
  • 动态内存分配使调试变得非常困难,特别是对于嵌入式系统上可用的一些有限/原始调试工具.如果你静态地分配东西,那么你就知道东西在哪里,这意味着更容易检查某些东西的状态.

最重要的是 - 如果你不动态分配内存,那么就不会出现内存泄漏.

  • "动态分配的内存可以很容易地覆盖cpu堆栈." - 这不是真的.实际上,它是*stack*本质上是动态的,并且可能会增长以覆盖其他分配的内存.非堆栈内存将具有动态和静态分配的上限集,但是当堆栈增长超出预期时,它只是覆盖它不应该的数据,无论是静态分配还是其他方式.使用动态分配时,堆栈不会受到更多威胁. (3认同)

T.E*_*.D. 5

好吧,许多小型微控制器没有像MMU那样的东西,也没有像你这样好的堆栈的操作系统.

对于那些那样做的人,只要你对你所要求的内存量保持理智,我就不会发现它存在很大的问题.

但是,许多嵌入式系统也是实时系统.如果您的应用程序有很长的运行时间,那么您将无法进行动态分配.大多数堆实现都使用没有非常有限运行时的算法.在某些(可能是罕见的)情况下,他们将花费更长的时间来运行比正常情况.有一些实时堆实现,但它们没有广泛使用.一般规则是在初始化之后避免硬实时系统中的任何动态分配或释放.


Mat*_*att 5

这取决于我认为“嵌入”的含义在过去 4 年中扩大了。

传统上,嵌入式设备上装有微控制器,通常没有操作系统。没有受保护的内存,并且是单线程的。您必须非常小心地使用 malloced 内存,因为例如当您只有 32KB 可用内存时,它很容易用完。所以一般来说,我们会用固定大小的缓冲区编写我们的代码,并且从不使用 malloc 或者 at 如果每个人都使用它 - 非常谨慎。

在过去的几年里,我们看到了本质上是单芯片 PC 或微型板的产品,它们很容易与我们的旧 Pentium PC 一样强大。RAM 价格现在如此便宜,而且如此之小,以至于内存限制与以前完全不同。它们还经常运行嵌入式 linux 或 wince,因此现在我们能够更自由地使用动态内存。

这样就可以使用更广泛的语言,包括 Java、C++、许多脚本语言和其他提供缓冲区溢出保护和异常处理的语言以及其他高级语言。所以说真的,那些老问题已经不像以前那样了。

我怀疑所有这些新的可用硬件都会带来一系列新问题。