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

时间:2018-03-18 11:36:55

标签: c embedded malloc

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

问题是 - 当程序第一次运行时,一切正常。但是,如果处理器在执行期间重置,则pc返回到开始但程序存储器仍然具有上次执行时的堆。所以下次程序运行malloc失败时(因为前一次运行的malloc的分配表仍然存在,并认为已经分配了可用的堆空间)。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这里有一个主题就是这个问题:

https://forums.xilinx.com/t5/Welcome-Join/Microblaze-no-OS-heap-not-clean-after-reset/td-p/760996

不幸的是没有答案,但你不是第一个打到这个。我认为你必须从调试器中加载一步,看看init代码设置堆指针的位置。

答案 2 :(得分:-1)

你到底在做什么?

  • 在CPU重置时,您无法依赖任何,您需要在MCU中初始化所有,包括堆栈和RAM设置。这对于每个编写过的微控制器程序都是如此,特别是裸机程序。如果由于某种原因您正在使用堆,则需要在使用前将内存清零。
  • 在裸机嵌入式系统上使用malloc根本没有意义。如果之前有静态.data / .bss变量,则会有一个静态堆段。堆没有解决问题,它只是隐藏在地毯下的问题。

    这里最重要的是:要么你有足够的记忆来覆盖最坏的情况,要么就是你没有。期。 See this。或者,如果您正在编写一个允许失败并且意外错误的程序,您可以忽略它。