STM32 GD32上記憶體堆疊溢位探測研究

2021-09-07 14:35:13 字數 1350 閱讀 6682

無數次遭受堆疊溢位折磨,隨著系統變得複雜,故障點越來越難以查詢!

主要溢位情況如下:

1,一般ram最後兩塊空間是堆heap和棧stack,堆從下往上用,棧從上往下用,任意乙個用完,都會進入對方的空間

2,如果棧用完,進入堆的空間,這個時候系統是不會有任何異常的,也就是說,棧底沒有什麼意義。除非堆和棧指標重疊,否則大家相安無事,儘管棧用了堆的

3,如果棧用完進入堆,並且還碰到了堆的空間,這個時候系統仍然沒有異常,但是堆疊會相互修改資料。最悲劇的就是棧裡面儲存的然會位址lr,一旦被堆指標修改,返回的時候就會跳到別的位址空間去了。絕大多數時候是這種情況,並且大多數跳到無效空間去。你應該感謝它跳到無效空間,讓你馬上發現錯誤。否則堆疊互相穿透而不報錯,然後系統工作出現資料錯亂,到時候看你想撞頭還是想跳樓!

4,使用keil的微庫,malloc要用到堆空間,如果堆空間用完,再malloc的時候得到空指標,但是不會報錯。然而,如果使用c++的new,這個時候會報錯!

因為主線程和中斷處理的存在,隨時可能分配釋放記憶體,這就導致了問題隨時可能發生!非常難檢查問題所在!

因此,smartos v2.5增加了記憶體堆疊溢位探測模組

宣告:

#ifdef debug

void* operator

new(uint

size);

void* operator

new(uint

size);

void

operator

delete(void *p);

void

operator

delete (void *p);

#endif

實現:

extern

uint

__heap_base;

extern

uint

__heap_limit;

void* operator

new(uint

size)

assert_param(p);

returnp;}

void* operator

new(uint

size)

assert_param(p);

returnp;}

void

operator

delete(void *p)

void

operator

delete(void *p)

通過過載new/delete實現,並且帶有64位元組提前**功能!在堆即將用完之前預警!

stm32記憶體分配

原文 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似 於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配 方式類似於資料結構中的鍊錶。3 全域性區 靜態區 static 全域性變數和靜...

STM32記憶體管理

這是我的第一篇文章,寫的不好請多多見諒 針對stm32f429來進行講解,其他型號的也可以參照學習 相信很多新手在記憶體管理這個程式中比較疑惑,為什麼分配那麼大,可不可以更改大小?但是改大了編譯會錯誤又是為什麼?這裡將對大家心中的疑惑進行講解,並且教大家進行計算。當該項值為 0 的時候,代表對應的記...

STM32之記憶體

記憶體的分類 1 動態記憶體 dram。為什麼稱之為動態記憶體呢?是與他的硬體構成有關。動態隨機儲存器dram 的記憶體單元是以電容的電荷來表示資料。有電荷表示1,無電荷表示0,但是隨著時間的推移,代表1的電荷會放電,代表0的電荷會吸收電荷,因此它需要定期重新整理,所以就有了動態記憶體之稱。重新整理...