ucos內(nèi)存管理方法十分小巧,實(shí)時(shí)性好,非常值得借鑒。大致原理如下:
ucos把內(nèi)存初始化成相同大小的內(nèi)存塊,使用單向鏈表的方式連接起來,使用時(shí)從鏈表摘下,釋放時(shí)重新插入鏈表。
當(dāng)然可以存在多條鏈表,根據(jù)用戶需求配置,同一個(gè)鏈表內(nèi)內(nèi)存塊是相同大小的。比如,以100或200字節(jié)為內(nèi)存塊的內(nèi)存鏈表。
每條內(nèi)存鏈表使用一個(gè)結(jié)構(gòu)體(OS_MEM)控制,這個(gè)結(jié)構(gòu)體描述了這一條鏈表中的內(nèi)存屬性,比如內(nèi)存塊大小,剩余內(nèi)存塊的數(shù)量,內(nèi)存塊總數(shù)量等等。
1、
此函數(shù)由系統(tǒng)內(nèi)部調(diào)用,用戶不必理會(huì),主要是一些初始化動(dòng)作,前面說了每條鏈表都有一個(gè)結(jié)構(gòu)體OS_MEM控制。
ucos建立了一個(gè)OS_MEM結(jié)構(gòu)體數(shù)組,這個(gè)函數(shù)就是把這個(gè)結(jié)構(gòu)體數(shù)組成員使用單向鏈表連接起來,并且對(duì)結(jié)構(gòu)體進(jìn)行初始化。
ucos使用一個(gè)全局指針指向表頭,方便結(jié)構(gòu)體取用。每一個(gè)結(jié)構(gòu)體都可以控制一個(gè)內(nèi)存鏈表。結(jié)構(gòu)體數(shù)量用戶可以通過宏定義配置。
2、
此函數(shù)初始化并創(chuàng)建內(nèi)存塊鏈表。主要過程是從結(jié)構(gòu)體鏈表中取下一個(gè)空閑結(jié)構(gòu)體。根據(jù)參數(shù)提供的內(nèi)存起始地址和內(nèi)存塊大小,把整個(gè)內(nèi)存分為大小一致的內(nèi)存塊,使用單向鏈表連接起來。
再把內(nèi)存塊鏈表的屬性信息填寫到結(jié)構(gòu)體中。此函數(shù)返回一個(gè)結(jié)構(gòu)體指針。找到這個(gè)結(jié)構(gòu)體就找到了這條鏈表。
3、
根據(jù)OS_MEM類型指針找到對(duì)應(yīng)的鏈表結(jié)構(gòu)體,如果空閑的內(nèi)存塊數(shù)量大于0,那么從鏈表中摘下一個(gè)內(nèi)存塊,然后修改OS_MEM結(jié)構(gòu)體信息,返回內(nèi)存首地址。
4、
這個(gè)簡單,獲得內(nèi)存塊鏈表的名稱。
5、
這個(gè)簡單,設(shè)置內(nèi)存塊鏈表的名稱。
6、
釋放內(nèi)存,把用完的內(nèi)存塊,插入pmem對(duì)應(yīng)的鏈表中,然后修改pmem結(jié)構(gòu)體信息。
7、
查詢指定的內(nèi)存鏈表中的內(nèi)存使用情況,查詢結(jié)果放在OS_MEM_DATA 結(jié)構(gòu)體中。
優(yōu)點(diǎn):
仔細(xì)閱讀源碼就會(huì)發(fā)現(xiàn),每次取出內(nèi)存塊的時(shí)間是一樣的,速度非??欤湃雰?nèi)存塊消耗的時(shí)間也是一樣,運(yùn)行時(shí)間可控,實(shí)時(shí)性非常好,代碼量很小。
缺點(diǎn):
每條鏈表中的內(nèi)存塊都是一樣大小,使用時(shí)會(huì)有些浪費(fèi)。
-
控制器
+關(guān)注
關(guān)注
112文章
16030瀏覽量
176648 -
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
168瀏覽量
14106 -
ucos-ii
+關(guān)注
關(guān)注
1文章
11瀏覽量
3575
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論