[英]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.