簡體   English   中英

嵌入式 c - 程序崩潰時如何釋放分配的內存

[英]Embedded c - how to free allocated memory when a program crashes

我正在嵌入式處理器上編寫一個簡單的裸機應用程序。 作為此應用程序的一部分,它必須使用 malloc 在大約 256kB 的堆上分配一些內存。 注意:最初這是在 main 中靜態分配的,但在一定的大小限制下,我們不得不轉向動態分配(gcc 悄然失敗)。

問題是 - 當程序第一次運行時一切正常。 但是,如果處理器在執行過程中被重置,pc 將返回到開始狀態,但程序內存仍然像上次執行時那樣具有堆。 所以下次程序運行 malloc 失敗(因為上次運行的 malloc 分配表仍然存在,並且它認為可用的堆空間已經分配)。

所以問題是 - 我如何確保每次運行時在 main 開始時清除 malloc 的表? 有沒有辦法可以使用堆的位置來清零一些內存(以清空表),或者訪問 malloc 先前返回的指針列表,以便我可以釋放它們?

堆應該在預主初始化代碼中設置。 在裸機系統中,沒有系統調用來為您的程序分配堆內存。 您可以嘗試讓調試器從第一個加載的指令而不是 main 開始,並查看它在哪里設置堆。 聽起來您的系統需要在重置時重新加載程序以初始化堆。 你用的是什么系統?

對於這個問題,這里有一個主題:

Microblaze(無操作系統) - 重置后堆不干凈

不幸的是沒有答案,但你不是第一個遇到這個問題的人。 我認為您必須從調試器中的加載單步執行並查看初始化代碼設置堆指針的位置。

你到底在做什么?

  • 在 CPU 重置時,您不能依賴任何東西,您需要初始化 MCU 中的所有內容,包括堆棧和 RAM 設置。 對於曾經編寫的每個微控制器程序都是如此,尤其是裸機程序。 如果您出於某種原因使用堆,則需要在使用前將內存清零。

  • 在裸機嵌入式系統上使用 malloc 根本沒有意義。 在你之前有靜態 .data/.bss 變量的地方,你有一個靜態堆段。 堆解決不了問題,它只是把問題隱藏在地毯下。

    這里的主要問題是:要么你有足夠的內存來覆蓋最壞的情況,要么你沒有。 時期。 看到這個 或者,如果您正在編寫一個允許意外失敗和錯誤的程序,您可以忽略這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM