嵌入式開發中堆疊溢位導致程式異常退出

2021-07-03 17:20:49 字數 812 閱讀 6449

在嵌入式開發中,曾遇到程式出現莫名其妙的錯誤導致程式無法執行,各種折騰之後,終於確定是由棧溢位導致程式掛掉。

例如,有一次,定義了乙個函式 my_func1,(struct a param1, struct b param2),在主程序中呼叫該函式,一切ok,但是在子執行緒中呼叫該函式時,程式卻出現了段錯誤。

還有一次,定義了函式my_func2(struct a param1, struct b param2),程式在執行到該函式時總是會出現莫名其妙的錯誤導致無法繼續執行,遮蔽該函式//my_func2(...),之後,程式正常執行,但是使用如下方式遮蔽該函式時,程式仍舊無法執行

my_func2(......)

之所以會出現上面的錯誤,是因為在呼叫函式時,會將函式的引數入棧,導致棧溢位,引起程式出錯。

當未顯式指定程式的棧空間時,系統會使用預設的棧空間大小,該大小可通過ulimit -a檢視(也可用ulimit-s直接檢視):

查到的是子執行緒的棧空間,主線程的棧空間遠大於該數值,所以棧溢位一半出現在子執行緒中。所以在主線程中呼叫時沒有問題,而在子執行緒中就可能出現段錯誤!

要解決該問題,可使用如下方法

2、使用ulimit -s size將執行緒棧空間臨時修改為size大小。或

將ulimit -s size寫入啟動指令碼中

3、修改/etc/security/limits.conf檔案,如下可將執行緒棧空間設定為10mb (需重啟): #

* soft stack 102400

嵌入式應用程式開發

嵌入式應用程式開發 實驗目的 1.編寫程式,用交叉工具鏈編譯連線 實驗原理 1.嵌入式應用程式的開發一般都在宿主機平台上進行,利用交叉編譯器編譯,生成可以在目標平台上執行的可執行 本實驗使用的交叉編譯器是arm linux gcc 實驗內容 l include include int main l2...

嵌入式開發中串列埠問題

用筆記本,往往沒有串列埠,一般用usb轉串列埠,總結了下,首先一般這個轉換器都是pl2303的,可以在配套的驅動資料夾下看到乙個pl2303.dat的資料夾,就是它了。window下,用dnw或者securecrt,有時會出現不通,或者不能從pc鍵盤輸入,現在就是這樣 這個時候,確認線是接好的,然後...

高效率嵌入式程式開發

日期 2006 12 13 字型 大 中 小 引言 在多 通訊等計算複雜度高的應用中,為了滿足製造費用 功耗 效能以及實時性等諸多限制條件的要求,嵌入式系統程式往往需要特殊設計。這使得設計師在設計面向特定應用的嵌入式軟體時,需要有一套切實可行的程式設計準則。而在實際程式設計中,工程師尤其需要考慮對變...