1. 程式人生 > >RTT之記憶體管理及異常中斷

RTT之記憶體管理及異常中斷

記憶體管理分靜態記憶體管理和動態記憶體管理(根據大小又分2種)

靜態記憶體管理:建立、刪除、初始化、解綁、申請和釋放。初始化記憶體池是屬於靜態記憶體管理,與建立記憶體池不同的是,此處記憶體池物件所使用的記憶體空間是由使用者指定的一個緩衝區空間,使用者把緩衝區的指標傳遞給記憶體池物件控制塊,其餘的初始化工作與建立記憶體池相同。

動態記憶體:在堆heap上分配。

小堆記憶體管理模組主要針對系統資源比較少(小於2M記憶體空間的系統):記憶體池中有不同的記憶體塊,申請時先查詢找到符合要求的(拆分),釋放時如果緊鄰的空閒則合併成一個。

 

而SLAB記憶體管理模組則主要是在系統資源比較豐富時。這兩種管理模組提供的API介面完全相同。分配、重新調整分配、釋放,以及分配和釋放的鉤子函式。

警告:因為動態記憶體管理器要滿足多執行緒情況下的安全分配,會考慮多執行緒間的互斥問題,所以請不要在中斷服務例程中分配或釋放動態記憶體塊。因為它可能會引起當前上下文被掛起等待。

RTT對中斷管理:專門為中斷設定中斷棧空間,在進入和退出時實現切換。中斷的前半段(取得資料和狀態並給執行緒同步資訊)和後半段(執行緒對資料的進一步處理)

相關的中斷操作函式:中斷掛載、某個中斷源的遮蔽和解開遮蔽,總中斷的開啟和關閉,此外進入和退出中斷有專門的2個函式提示系統進入和退出了中斷:

void rt_interrupt_enter(void);
void rt_interrupt_leave(void);
rt_uint8_t rt_interrupt_get_nest(void)//是否發生了中斷巢狀。
ARM Cortex-M系列處理器在從執行緒發生中斷或者在中斷時發生更高階級別的中斷巢狀,PSR R0~R3,R12的現場保護都是由硬體自動完成的。每個中斷都直接有一個確定的入口而不像ARM7/9先從統一的入口進去後在查詢具體中斷口。
中斷方式還是輪詢:比如串列埠傳送,如果每次傳送的量比較少(或波特率很高)此時輪詢效率最高,中斷時因為有任務切換開銷效率不高,在OS下用中斷方式要麼將每次傳送的資料量儘可能大,執行緒的優先順序設定為最低(防止一直執行其它低優先順序執行緒得不到執行機會)