嵌入式project師們免不了和堆疊打交道,深入理解了這兩個東西,才幹從**編寫時就考慮清楚記憶體管理。避免到後期出現各種莫名其妙的問題。
近期在使用cc2530時也遇到了一些問題,懷疑跟棧空間溢位有關,於是做了一次梳理。可能有些理解還不到位,等了解了再修正。
所謂棧空間,就是一塊記憶體空間。而溢位,就是使用的記憶體區域超過了這塊空間。占用棧空間的是區域性變數。
ti的fae說cc2530的棧空間大小為223位元組左右。最好不要超出。
我實際測試。超過250就會崩潰,表現為列印函式出不來。能夠這麼理解,超過223位元組的時候,棧空間溢位了。此時有些記憶體區域出現了覆蓋等不良情況。但還沒影響到列印的這部分。但棧使用超過250位元組時,效果就非常明顯了,列印函式都被波及。
我把自己眼下覺得的可導致棧溢位的行為,給列了出來。1.1和1.2都非常easy理解。1.3可能會被忽視,但事實上理一理。發現並不難理解,由於子函式在占用棧空間時,其外部的函式並沒有釋放出棧空間。
void main(void)
;}
void main(void)
; uint8 tmp2[130] = ;
}
void fun(void);}
void main(void)
; fun();
}
void fun(struct para_t)
如上面的1.3,假設能夠優化成例如以下的多個子函式就能夠避免棧溢位了。每乙個子函式在作用域結束時,其申請的棧空間會做釋放。子函式處理是將區域性變數放在同級的函式裡,事實上是在時間上將棧空間使用給叉開。我的同事之前不懂這點。以為我們的程式有大問題。
void fun_120(void);}
void fun_130(void);}
void main(void)
在多級巢狀的時候,假設出現大的區域性變數的時候,一定要格外小心。子函式的棧使用是在母函式的使用基礎上新增的,空間上是累加的。必需要注意。
如1.3中,若fun()中的tmp[120]經常需要呼叫,最好還是能夠將其轉化為靜態變數。讓其轉為占用ram資源,避免其經常申請棧資源,冷不丁給你乙個溢位。
如1.4中,直接傳遞結構體,能夠改為傳遞結構體的指標。
void fun(struct *para_t)
大概就是這樣吧。
棧空間溢位
嵌入式project師們免不了和堆疊打交道,深入理解了這兩個東西,才幹從 編寫時就考慮清楚記憶體管理。避免到後期出現各種莫名其妙的問題。近期在使用cc2530時也遇到了一些問題,懷疑跟棧空間溢位有關,於是做了一次梳理。可能有些理解還不到位,等了解了再修正。所謂棧空間,就是一塊記憶體空間。而溢位,就是...
棧空間 棧又溢位了
執行程式後,異常發生了。對於程式崩潰,早就見怪不怪了。重啟程式,附加偵錯程式,再次執行相同的功能,果然中斷到偵錯程式中。有了上次的經驗 沒仔細看錯誤提示導致懵逼了很久,文章在這裡 仔細檢查了錯誤碼,又是0xc00000fd,stackoverflow。在vs2013中按ctrl alt c檢視呼叫棧...
棧溢位和棧記憶體溢位
棧記憶體溢位是指使用者棧的大小最多為8 10mb,分配超過棧大小的變數則會導致棧記憶體溢位。如char c 1024102411 11mb 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。如char c 10 memset c...