malloc在嵌入式c中的应用

malloc在嵌入式c中的应用,c,embedded,C,Embedded,在嵌入式c编程语言中。 malloc在单任务嵌入式系统中有用吗 我在嵌入式系统工作了0.5年。我从未在8位控制器编程中使用malloc 有人能建议我在8位控制器编程中使用malloc吗 不,它没有用。malloc的全部目的是让多个进程在需要时动态共享系统的所有可用RAM内存。这反过来意味着您有一个多进程系统,可用RAM的数量是巨大的,但也可能是可变的或未知的 在“裸机”(无操作系统)或使用RTOS的小型嵌入式系统中,这种内存共享没有任何意义。与PC不同,这种嵌入式系统是完全确定的,因此您总是知道

在嵌入式c编程语言中。 malloc在单任务嵌入式系统中有用吗

我在嵌入式系统工作了0.5年。我从未在8位控制器编程中使用malloc


有人能建议我在8位控制器编程中使用malloc吗

不,它没有用。
malloc
的全部目的是让多个进程在需要时动态共享系统的所有可用RAM内存。这反过来意味着您有一个多进程系统,可用RAM的数量是巨大的,但也可能是可变的或未知的

在“裸机”(无操作系统)或使用RTOS的小型嵌入式系统中,这种内存共享没有任何意义。与PC不同,这种嵌入式系统是完全确定的,因此您总是知道最坏情况下需要多少RAM。您还确切地知道芯片上有多少RAM

在这样的系统上使用
malloc
的需求通常源于困惑的PC程序员,他们没有先学习嵌入式编程,就开始学习嵌入式编程


在嵌入式系统中,强烈反对使用动态分配。关键系统的行为应该是确定性的。许多用于嵌入式固件的库和操作系统避免使用动态分配

有关malloc不适合嵌入式系统的简要说明,请参阅:

关键系统的标准可能禁止使用malloc作为一种糟糕的编程实践

例如,MISRA C1和MISRA C2不允许使用malloc/calloc。见标准


问与答:

在这样的系统中,malloc没有任何意义。当您进行系统工程时,包括资源分配。作为单个任务,该任务拥有系统中的所有资源。所以,在设计阶段,您需要确定每个项目的需求量,包括内存。在运行之前很久,您就已经知道什么结构可以获得多少内存,因此没有理由为您已经知道答案的内容添加额外代码的风险。如果你已经这样做了5年,那么你已经知道这一点。如果您没有做过系统工程,那么您应该开始看到您过去的工作在该领域开始失败。

可以使用它。但是,既然你在嵌入式系统中工作了5年,你应该知道它的缺点。当你在单任务操作系统中拥有所有可用内存时,你就可以访问所有内存,而无需分配和释放内存。如果你想在记忆中的某个地方写东西,就拿着它写下来。@V.Kravchenko哦,这不是一个很好的方法。。我们是C程序员,不是汇编程序。而且动态分配的使用与单个或多个任务没有多大关系。
malloc
是有代价的。您需要担心在长期执行期间测试碎片和垃圾收集问题。如果你能在编译时分配你的内存结构,你就不会那么混乱了。你已经5年没有在你的8位控制器上使用过malloc了,这表明您不需要它,这部分回答了您的问题。我认为
malloc
在程序创建可变大小内存对象的单线程应用程序中非常有用。比如说保存字符串。如果可以从可用内存池中分配可变大小的块,则可以创建更多的对象,而不是所有对象都是固定大小的。但它确实会让你担心碎片、垃圾收集和内存泄漏。@infixed在确定性嵌入式系统中不存在“可变大小的内存对象”的情况。必须始终有一个上限。你们必须为最坏的情况设计,你们必须有足够的内存来处理最坏的情况,就是这样。请参阅我链接的帖子。@infixed Summary:如果你真的知道自己在做什么,那么你会得到比盲目调用malloc而不知道它实际在做什么更高效的程序。后者是PC程序员的思维方式,在设计嵌入式系统时只会带来悲伤和痛苦。您必须完全控制程序使用的内存量,句号。“交付可能突然耗尽内存的固件不是专业的工程,这只是骗人的把戏。”lundin。您知道,存储速度和权衡的层次结构并不是一个新概念。没有人主张盲目地调用
malloc
。随着嵌入式系统功能的增强,它们正进入不久前常规系统运行的领域。也许你想让你的确定性系统做一些事情,例如,每次使用数据时,通过SPI从SD卡获取相同的数据,而不是将数据缓存在RAM中。我不。是的,一个人必须处理最坏的情况。这并不意味着你必须100%地生活在它里面,它不是malloc的全部、唯一甚至主要用途。你不能那么强调它的有用性。有用性和明智性不是一回事。但是,这些标准永远无法解释为什么它在嵌入式系统中没有意义。MISRA-C现在是一个通用编程标准,可能在嵌入式系统分支之外使用,所以它只是说堆分配是危险的,因为存在泄漏、分段等(还请注意,有一个新的MISRA“C3”,正式名称是MISRA-C:2012).任务的数量实际上与动态内存分配的可能效用没有多大关系-相反,数据和条件的可变性确实如此。动态内存(重新)分配肯定有其危险性,但仅仅因为只有一个任务拥有所有内存,并不改变设计如何使用它的需要——没有任何东西说你必须拥有一个操作系统才能拥有malloc()。静态分配确实是最安全的,但是使用动态内存可以