【发布时间】:2015-02-06 14:16:20
【问题描述】:
我必须用 C 编写嵌入式设备的白色复杂应用程序。运行时 (libc) 不支持 malloc/calloc/realloc/free 或任何其他类型的动态内存管理。
此类情况的最佳做法是什么?
编辑:
应用程序很复杂。例如,它应该进行公钥加密。 设备是特定的基于 ARM-M0 的模块。 C99 模式下的编译器是 4.6.0。它是裸机(无操作系统),64K 内存。我不在乎便携性。
【问题讨论】:
-
您正在编写什么类型(和大小)的应用程序?适用于什么设备?用什么编译器和什么标准? (独立式 C99?)什么操作系统(或者它在裸机上)?多少内存?你关心便携性吗?请编辑您的问题以改进它...这真的太模糊了(对于具有 4 KB RAM 的 16 位微控制器和 Raspberry PI,或者对于人工心脏驱动器,答案会非常不同与一些花哨的家具小工具)
-
真的很简单。对临时数据使用堆栈,对非临时变量和大缓冲区使用全局变量。或者如果你能负担得起大堆栈,你甚至可以在那里分配临时缓冲区。
-
如果您有很多大型数据结构的使用来来去去,实际上可能首选将它们放在堆栈上。使用更少的空间。此外,另一种非常常见且强大的技术是使用通过链表或类似方式管理的缓冲区/结构池来处理通常使用 malloc 的许多情况。并且一定要标记你的“全局”变量
static,但不管内存策略/限制如何,这都不言而喻。 -
@BasileStarynkevitch - 如果他在使用 Raspberry PI 之类的东西,他几乎肯定有可用的动态内存分配,如果他正在研究人造心脏,“最佳实践”将由项目负责人和 QA 严格执行。我猜是 cortex-m0/m3/m4 之类的东西。但同意,需要澄清。
-
如果应用程序很复杂,您可能需要考虑使用 RTOS。面向硬件的不错选择包括:CooCox、FreeRTOS、uC/OS-II 或 uC-OS-III(非免费用于商业应用)。如果不出意外,它可以简化“主循环”和 ISR 之间的通信。我所做的任何“裸机”工作最终都会在低优先级 ISR 中完成大量工作,而这些工作真的可以由另一项任务更好地处理。