3

我得到了一个带有嵌入式内部操作系统的基于 8051 的板。我正在使用 SDCC 在操作系统之上创建应用程序。而且 malloc 不可用,所以我必须静态分配内存。这是为什么?malloc 不应该在编译器中的动态库上吗?

4

3 回答 3

8

TL;博士:

为什么以及何时 malloc() 在 C 中不可用?

一般而言,唯一可以说的是malloc()它将由每个符合要求的托管 C 实现提供,但还有其他类型,包括另一种符合要求的类型。


malloc 不应该在编译器中的动态库上吗?

不完全是。 malloc()是 C 标准库的一部分,因此它由每个符合要求的托管 C 实现提供。AC 实现包括用于将 C 源代码转换为可执行程序的系统以及用于运行结果程序的机制和环境。前者通常围绕编译器展开。malloc后者包含与实现所提供的一样多的 C 标准库,如果可用,这部分就是驻留的地方。因此,不,malloc在技术上不是编译器的一部分。

我确定这不是您要调用的区别,但它确实与答案有关。请注意,我说过这malloc是由托管实现提供的。这些是您通常在通用操作系统上遇到的那种。它们创建通过主机操作系统以标准方式启动的程序,并结合操作系统提供 C 标准库的所有功能。但也有独立的实现。主要区别之一是独立实现不提供大多数标准库,包括malloc().

您通常会发现在嵌入式系统(例如您的系统)上使用的独立实现。它们还用于操作系统内核、引导加载程序和其他此类程序,而不是直接在裸机上运行。您的程序在操作系统之上运行使您的环境在嵌入式系统中有点像凯迪拉克,但并不能确保 C 实现是托管的。因为它不提供malloc,所以它不能是符合要求的托管实现,但它可以是符合要求的独立实现。它应该记录它声称是哪个,如果有的话。如果它是独立的但提供其他标准库函数,那么您可以认为这是一种奢侈。

于 2018-09-12T13:19:28.190 回答
2

(安全)关键系统的一些准则不允许动态内存分配。

例如MISRA C :2004 指南有以下规则:

20.4 - 不应使用动态堆内存分配。

遵循规则的一种方法是:不要malloc()为系统带来或实现其他动态内存分配功能。

这类系统通常是嵌入式系统,其中内存需求在编译期间或之前是众所周知的/有限的。因此可以毫无痛苦地避免动态内存分配。

于 2018-09-20T14:04:32.070 回答
-1

使用项目中包含的 C 库,您可以利用诸如 malloc、printf....等函数 了解 8051 是一个低内存占用的设备,仅几 KB。因此,包含 C 库会增加输出 .hex 文件的大小,并且您将耗尽内存。

于 2018-09-12T13:17:33.327 回答