嵌入式c - 如何在程序崩溃时释放分配的内存



我正在嵌入式处理器上编写一个简单的裸机应用程序。作为此应用程序的一部分,它必须使用 malloc 在大约 256kB 的堆上分配一些内存。注意:最初这是在 main 中静态分配的,但在一定的大小限制下,我们不得不转向动态分配(gcc 明显失败)。

问题是 - 当程序第一次运行时一切正常。但是,如果处理器在执行过程中重置,则 pc 将返回到启动状态,但程序内存仍具有与上次执行时相同的堆。因此,下次程序运行时 malloc 会失败(因为上次运行的 malloc 分配表仍然存在,并且它认为可用的堆空间已经分配)。

所以问题是 - 如何确保每次运行时在 main 开始时清除 malloc 的表?有没有办法我可以使用堆的位置将一些内存清零(清空表),或者访问 malloc 之前返回的指针列表,以便我可以释放它们?

堆应该在 pre main init 代码中设置。在裸机系统中,没有系统调用来为程序分配堆内存。您可以尝试让调试器在第一个加载的指令而不是 main 开始,并查看它在何处设置堆。听起来您的系统需要在重置时重新加载程序以初始化堆。您使用什么系统?

这里有一个关于这个问题的主题:

微火焰(无操作系统) - 重置后堆不干净

不幸的是没有答案,但你不是第一个击中这个的人。我认为您必须从调试器中的加载中逐步执行,并查看 init 代码在哪里设置堆指针。

你到底在做什么?

  • 在 CPU 重置时,您不能依赖任何东西,您需要初始化 MCU 中的所有内容,包括堆栈和 RAM 设置。对于曾经编写的每个微控制器程序都是如此,尤其是裸机程序。如果您出于某种原因正在使用堆,则需要在使用前将内存清零。

  • 在裸机嵌入式系统上使用 malloc 根本没有意义。以前有静态 .data/.bss 变量的地方,取而代之的是静态堆段。堆没有解决问题,它只是将问题隐藏在地毯下。

    这里的主要事情是:要么你有足够的内存来覆盖最坏的情况,要么你没有。时期。看到这里。或者,如果您正在编写一个允许失败并意外错误的程序,则可以忽略这一点。

最新更新