ucos內(nèi)存管理方法十分小巧,實時性好,非常值得借鑒。大致原理如下:
ucos把內(nèi)存初始化成相同大小的內(nèi)存塊,使用單向鏈表的方式連接起來,使用時從鏈表摘下,釋放時重新插入鏈表。
當(dāng)然可以存在多條鏈表,根據(jù)用戶需求配置,同一個鏈表內(nèi)內(nèi)存塊是相同大小的。比如,以100或200字節(jié)為內(nèi)存塊的內(nèi)存鏈表。
每條內(nèi)存鏈表使用一個結(jié)構(gòu)體(OS_MEM)控制,這個結(jié)構(gòu)體描述了這一條鏈表中的內(nèi)存屬性,比如內(nèi)存塊大小,剩余內(nèi)存塊的數(shù)量,內(nèi)存塊總數(shù)量等等。

1、

此函數(shù)由系統(tǒng)內(nèi)部調(diào)用,用戶不必理會,主要是一些初始化動作,前面說了每條鏈表都有一個結(jié)構(gòu)體OS_MEM控制。
ucos建立了一個OS_MEM結(jié)構(gòu)體數(shù)組,這個函數(shù)就是把這個結(jié)構(gòu)體數(shù)組成員使用單向鏈表連接起來,并且對結(jié)構(gòu)體進行初始化。
ucos使用一個全局指針指向表頭,方便結(jié)構(gòu)體取用。每一個結(jié)構(gòu)體都可以控制一個內(nèi)存鏈表。結(jié)構(gòu)體數(shù)量用戶可以通過宏定義配置。
2、

此函數(shù)初始化并創(chuàng)建內(nèi)存塊鏈表。主要過程是從結(jié)構(gòu)體鏈表中取下一個空閑結(jié)構(gòu)體。根據(jù)參數(shù)提供的內(nèi)存起始地址和內(nèi)存塊大小,把整個內(nèi)存分為大小一致的內(nèi)存塊,使用單向鏈表連接起來。
再把內(nèi)存塊鏈表的屬性信息填寫到結(jié)構(gòu)體中。此函數(shù)返回一個結(jié)構(gòu)體指針。找到這個結(jié)構(gòu)體就找到了這條鏈表。
3、

根據(jù)OS_MEM類型指針找到對應(yīng)的鏈表結(jié)構(gòu)體,如果空閑的內(nèi)存塊數(shù)量大于0,那么從鏈表中摘下一個內(nèi)存塊,然后修改OS_MEM結(jié)構(gòu)體信息,返回內(nèi)存首地址。
4、

這個簡單,獲得內(nèi)存塊鏈表的名稱。
5、

這個簡單,設(shè)置內(nèi)存塊鏈表的名稱。
6、

釋放內(nèi)存,把用完的內(nèi)存塊,插入pmem對應(yīng)的鏈表中,然后修改pmem結(jié)構(gòu)體信息。
7、

查詢指定的內(nèi)存鏈表中的內(nèi)存使用情況,查詢結(jié)果放在OS_MEM_DATA 結(jié)構(gòu)體中。
優(yōu)點:
仔細閱讀源碼就會發(fā)現(xiàn),每次取出內(nèi)存塊的時間是一樣的,速度非常快,放入內(nèi)存塊消耗的時間也是一樣,運行時間可控,實時性非常好,代碼量很小。
缺點:
每條鏈表中的內(nèi)存塊都是一樣大小,使用時會有些浪費。
-
控制器
+關(guān)注
關(guān)注
114文章
17787瀏覽量
193083 -
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
171瀏覽量
14878 -
ucos-ii
+關(guān)注
關(guān)注
1文章
11瀏覽量
3979
發(fā)布評論請先 登錄
FreeRTOS與uC/OS-II如何選擇?
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
如何去解決uC/OS-II中優(yōu)先級翻轉(zhuǎn)問題?
uC/OS-II源碼包的下載
為什么想學(xué)uc/OS-II
The uC/OS-II port for Keil C V
基于uc/os-ii 的嵌入式GUI研究與應(yīng)用
uC/OS-II—郵箱介紹
優(yōu)化MSP430上用于uC/OS-II的內(nèi)存
uC/OS-II內(nèi)存管理方法詳解
評論