簡體   English   中英

嵌入式C程序任務堆棧中未使用的空白

[英]Unused gaps in Embedded C program's task stack

在運行帶有多個任務的RTOS的嵌入式C開發中,每個任務都有自己的堆棧,為什么堆棧在使用的部分之間會有未使用的間隙?

在啟動時使用已知模式填充堆棧,以確定最壞情況下的堆棧使用情況。 當在運行時使用IDE內存查看器查看堆棧內容時,可以在正常堆棧數據之間看到已知模式的間隙。

例如:

Stack top
-----------------
unused area
-----------
used area 2
-----------
unused area
-----------
used area 1
-----------------
Stack bottom

為什么正常使用堆棧會留下間隙而不是連續數據?

任何建議表示贊賞,謝謝

更新資料

為了回答這些問題,在總堆棧大小為0x400字節的單個堆棧上看到96個字節的間隙。

感謝您的所有評論,這里有一些很棒的建議。 在這種情況下,由於間隙的大小和一次出現,我可以裁定“對齊”。 未初始化的數組可能是引起問題的原因,因為所有其他RAM最初都使用與堆棧相同的模式進行填充。

我的另一個(有關)思想是堆棧指針損壞,但這似乎不太可能,因為該軟件可以正常運行。

簽名模式是一種確定堆棧使用情況的方法,但不是完美的機制-如果什么都沒有寫入變量,則該模式將不會被修改。

“未使用”是一個誤導性術語; 不是修改是一個更好的描述。

這通常發生在可能未充分利用的緩沖區實例中。 例如,如果您說過:

char string_buff[128] ;

sprintf( string_buf, "%s", "hello" ) ;

僅會寫入string_buff 6個字符,並顯示為122字節的“未使用”間隙。

如果代碼被修改為:

char string_buff[128] = {0} ;

sprintf( string_buf, "%s", "hello" ) ;

整個緩沖區將顯示為已使用,但需要初始化整個緩沖區。

我不確定我是否了解您。 堆棧之間的間隙可能來自鏈接器在每個堆棧的“頂部”(即,沿堆棧增加的方向)插入一個安全閾值,以防止任務例程和中斷完全耗盡任務堆棧的情況發生-在非托管狀態下,中斷(實際上是CPU的優先級協議允許的所有可能的中斷)可能會在每個任務的基礎上增加最大堆棧使用率。 在受管理的情況下(大多數RTOS管理中斷處理,或者至少可以配置為這樣做),至少一小部分中斷條目將臨時駐留在任務堆棧上,直到OS引導已移至將處理的系統堆棧堆疊當前和所有更高優先級的ISR。 因此,同樣在托管中斷方案中,每個堆棧頂部都需要有安全余量。

暫無
暫無

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

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