RTOS應用中耗用RAM空間最多的單位可能是每項任務所需的堆疊,其大小取決於任務需求。為了避免堆疊溢位,開發人員需要超額配置堆疊空間,但也不能太過以避免浪費RAM資源...
「即時作業系統」(real-time operating system;RTOS)包含開發人員為應用程式加入的一整組服務(意即功能),這些服務會耗用快閃記憶體(程式碼空間)與RAM (數據空間)的資源。
RTOS實際耗用的程式碼空間通常很小,約為8KB至24KB,對於現今32位元CPU與MCU而言,程式碼空間並不構成問題。另一方面,RTOS類型的應用需要比單執行緒應用(如super loop超級迴圈)更多的RAM記憶體。
RTOS使用內部變數來執行任務,其通常佔用數百個byte到1 KB左右的空間。應用中的每項任務還需要一種名為任務控制區塊(TCB)的資料結構,RTOS會用它來追蹤每項任務的狀態,依據RTOS提供的功能以及RTOS是否會蒐集每項任務的統計資料,TCB實際上會佔用50-250 bytes的RAM空間。
RTOS應用中耗用RAM空間最多的單位可能是每項任務所需的堆疊,其大小取決於任務需求(如巢狀函數呼叫、傳遞至函數的引數、局部變數等)。為了避免堆疊溢位,開發人員需要超額配置堆疊空間,但也不能太過以避免浪費RAM資源。
IAR Embedded Workbench的連結器具有一項便捷的功能來協助判斷每項任務需要多少堆疊空間。用戶只需點選連結器組態的核選方塊(見下圖所示),然後建置程式碼與檢查連結映射檔 (.MAP 檔案),就能看到應用每個函數的呼叫堆疊深度(單位為byte)。接著用戶必須為任務記下呼叫堆疊大小,因為還要為該數字加入一或兩個數值。
每項任務的堆疊必須具有足夠的儲存空間來容納任務的數據,其中包括CPU暫存器的複本,以及FPU暫存器的複本(如果用到FPU)。下面的簡單公式可用來判斷一項任務的堆疊大小(單位為byte),之後再加入額外的33%餘裕空間。 事實上,在大多數嵌入式應用中,理想的狀態是讓動態堆疊的使用率維持在70%水準以下。用戶當然也可以按自身需求增加更多餘裕空間。
舉例而言,假設應用中某個呼叫堆疊的深度為256 byte,而使用的核心為Cortex-M4。在這種情境下,CPU context內容為64位元組,而FPU又佔用另外132個位元組。因此上面的公式會算出下面的任務堆疊大小:
您可以確定在動態的實際堆疊用量,方法是使用IAR Embedded Workbench C-SPY除錯器(Debugger)提供的RTOS辨識功能,如下圖所示uC/OS-III應用的情況。
最後,任務之間可以經由名為RTOS物件透過其他資料結構來分享資源或相互通訊。RTOS物件很小,通常只佔用16至64位元組的空間。
舉例來說,假設某個應用有10個任務,平均一個任務的堆疊為1KB (一般的任務所需空間更少)。如果應用還有5個RTOS物件(每個物件64byte),那麼根據公式算出需要的RAM應該是:
或:
不過此處所指的RAM數據僅是RTOS需要的空間,並不包括應用程式碼本身需要的RAM空間。
本文作者:
Jean J. Labrosse,RTOS專家;目前擔任Weston Embedded Solutions首席諮詢顧問。
加入LINE@,最新消息一手掌握!