實時單片機(jī)通訊網(wǎng)絡(luò)中的內(nèi)存管理

在AUTO 2000 DCS系統(tǒng)中,我們采用了單片機(jī)實時通訊網(wǎng)絡(luò).這是一種具有不確定控制站監(jiān)控的主從式總線網(wǎng)絡(luò).大致的工作過程是:網(wǎng)絡(luò)系統(tǒng)上電,各站點進(jìn)行控制權(quán)爭奪確立控制站和非控制站;控制站輪詢各站點,被輪詢的站點若有數(shù)據(jù)發(fā)送即成為主站,執(zhí)行主機(jī)/從機(jī)的通訊;通訊結(jié)束后(無論成功與否)主站將控制權(quán)歸還給控制站;控制站然后輪詢下一個站點,周而復(fù)始。 

為了提高通訊效率,采取了一系列相應(yīng)的措施.例如,我們把站點集分為活動站點集和非活動站點集.這樣,單片機(jī)網(wǎng)中如有某站點出現(xiàn)故障,該站點被控制站詢問時響應(yīng)將超時,則該站點將從活動站點集轉(zhuǎn)到非活動站點集中.這樣,系統(tǒng)在下一次輪詢時就不再輪詢該站點.故障站點恢復(fù)正常后或有新的站點開機(jī)上線,控制站將在輪詢周期結(jié)束后的測試周期中將它們加入到活動站點集中.事實上,控制站輪詢的是活動站點,測試的是非活動站點.這無疑是一種提高網(wǎng)絡(luò)效率的方法。

另外還有一種更為重要的途徑即為本文將要介紹的動態(tài)內(nèi)存管理方法。DCS網(wǎng)絡(luò)系統(tǒng)所要傳輸?shù)臄?shù)據(jù)一般有下述幾種:較長的周期性數(shù)據(jù),較短的隨機(jī)上報數(shù)據(jù)及較短的命令/響應(yīng)數(shù)據(jù)。對周期性數(shù)據(jù),稍微的滯后甚至一兩次丟失都是允許的;而對隨機(jī)上報數(shù)據(jù)和命令/響應(yīng)數(shù)據(jù),則要求盡可能快地完成傳輸。在傳統(tǒng)的靜態(tài)內(nèi)存分配方式下,甲網(wǎng)卡接收到乙網(wǎng)卡的數(shù)據(jù)后在上傳至宿主機(jī)前宣布內(nèi)存緩沖區(qū)滿而不能接收其它站點的數(shù)據(jù)。這顯然是對內(nèi)存資源的一種浪費,同時也嚴(yán)重影響了網(wǎng)絡(luò)的通訊效率。采用動態(tài)內(nèi)存分配方式后,甲網(wǎng)卡每收到一批數(shù)據(jù),只從自己有限的空閑內(nèi)存中分配出合適的一塊來存放該批數(shù)據(jù),剩下的空閑內(nèi)存仍可接收其它網(wǎng)卡的數(shù)據(jù),并當(dāng)宿主機(jī)有空時,將所有接收的數(shù)據(jù)一并上傳至宿主機(jī)并清空內(nèi)存。因此通訊效率大為提高。

1 內(nèi)存表結(jié)構(gòu)

為了對網(wǎng)卡上單片機(jī)內(nèi)存進(jìn)行管理,設(shè)置了一張內(nèi)存狀況表(簡稱內(nèi)存表)來記錄當(dāng)前內(nèi)存的使用情況。所謂內(nèi)存管理,實際上即為內(nèi)存的分配和回收,主要解決兩個問題:

(1) 對需要申請的內(nèi)存長度,分配程序需從內(nèi)存表中尋找出合適的空閑區(qū).分配給該批數(shù)據(jù)使用,并對內(nèi)存表進(jìn)行更新。

(2) 進(jìn)程或作業(yè)釋放內(nèi)存資源時,和相鄰的空閑區(qū)進(jìn)行鏈接合并,更新可用表。

具體地,以某一基本容量(視系統(tǒng)通訊的數(shù)據(jù)量而定,在此為1K)對可用內(nèi)存區(qū)域(如0400H ~ 3FFFH)進(jìn)行劃分和編號(1~15),每一個實際的已分配內(nèi)存區(qū)和空閑內(nèi)存區(qū)在內(nèi)存表中占據(jù)一個表項位置,而每一表項結(jié)構(gòu)為:

這樣在某一時刻,可能有1~15個獨立的內(nèi)存區(qū)(空閑的或已分配的)。也就是說,可用內(nèi)存表表項的最大數(shù)目為15。但在某一時刻,卻可能只有1個區(qū)(如初始化后只有1個空閑內(nèi)存區(qū))。為了查找某時刻實際內(nèi)存的分配情況,我們設(shè)計了逆向搜索鏈,該鏈由內(nèi)存表項的后兩欄組成,如圖1所示。

該圖中,第15表項的結(jié)束塊號肯定為15,表示編號為15的內(nèi)存區(qū)域(3C00H~3FFFH)肯定是某個已分配區(qū)域(或空閑區(qū)域)的一部分。但該區(qū)域究竟有多大,要看第15表項的第3欄(塊數(shù)),設(shè)為5。這就表明其相鄰的上一區(qū)域的結(jié)束塊號為15減去5。然后查找內(nèi)存表的第10表項 ,可知其大小為8。接下來查找第2表項,得到其分配塊大小為2。從而可得該時刻內(nèi)存中實際分配3個區(qū),大小分別為5,8,2。至于內(nèi)存表中的其它表項在該時刻是無用的。 運行初始化程序init_table后,內(nèi)存表的結(jié)構(gòu)如圖2所示。

其中,00C0H~00C2H和00F0H的地址用來存放表頭和表尾的標(biāo)志,內(nèi)存表的主要內(nèi)容有15項,每一項3個欄目,每一個欄目占用一個實際內(nèi)存單元.初始化后的0400H到3FFFH的15K內(nèi)存均為空閑,故從終止塊號15逆推15塊,1~15塊均為空閑塊,即內(nèi)存表中只有一個內(nèi)存區(qū).在內(nèi)存表的結(jié)構(gòu)圖中反映為表中主要內(nèi)容的第15項的標(biāo)志位為free, 內(nèi)存區(qū)的終止塊號為15,塊數(shù)為15,其它表項則是無用的。

2 內(nèi)存的分配

那么,如何利用這張內(nèi)存表進(jìn)行內(nèi)存分配呢?動態(tài)分區(qū)分配方法采用最先適應(yīng)法。用一個例子來說明這個問題。例如經(jīng)過若干次分配和空閑區(qū)回收后,甲站點內(nèi)存表的主要情況如圖3所示(卡上還有一批數(shù)據(jù)未傳入宿主機(jī))。

在這種情況下,乙站點申請分配4塊內(nèi)存,則先把地址指針定位00EDH處(第15項的標(biāo)志欄處),由于該項的標(biāo)志為free但大小不夠,故需向前查找.用該項的終止塊號(15)減去該項的塊數(shù)(1)得到數(shù)字14,故將地址指針定位到第14項處的標(biāo)志欄處,雖塊數(shù)大小夠但該內(nèi)存區(qū)為busy,故仍需往前找.此時用第14項處的終止塊號(14)減去該項的塊數(shù)(4)得到數(shù)字10,所以將地址指針定位到第10項的標(biāo)志欄處。第10項的塊數(shù)大于需分配的內(nèi)存塊數(shù),故可以在此處分配.分配后的內(nèi)存表的主要情況如圖4所示。

來源:電子技術(shù)應(yīng)用


微信掃描分享本文到朋友圈
掃碼關(guān)注5G通信官方公眾號,免費領(lǐng)取以下5G精品資料
  • 1、回復(fù)“YD5GAI”免費領(lǐng)取《中國移動:5G網(wǎng)絡(luò)AI應(yīng)用典型場景技術(shù)解決方案白皮書
  • 2、回復(fù)“5G6G”免費領(lǐng)取《5G_6G毫米波測試技術(shù)白皮書-2022_03-21
  • 3、回復(fù)“YD6G”免費領(lǐng)取《中國移動:6G至簡無線接入網(wǎng)白皮書
  • 4、回復(fù)“LTBPS”免費領(lǐng)取《《中國聯(lián)通5G終端白皮書》
  • 5、回復(fù)“ZGDX”免費領(lǐng)取《中國電信5GNTN技術(shù)白皮書
  • 6、回復(fù)“TXSB”免費領(lǐng)取《通信設(shè)備安裝工程施工工藝圖解
  • 7、回復(fù)“YDSL”免費領(lǐng)取《中國移動算力并網(wǎng)白皮書
  • 8、回復(fù)“5GX3”免費領(lǐng)取《R1623501-g605G的系統(tǒng)架構(gòu)1
  • 本周熱點本月熱點

     

      最熱通信招聘

      最新招聘信息