μClinux下SDRAM數(shù)據(jù)交換區(qū)的生成和使用
引言
本文引用地址:http://butianyuan.cn/article/20796.htm數(shù)據(jù)交換區(qū)是指程序執(zhí)行中使用到的各種數(shù)據(jù)所存放的內(nèi)存空間。本文提出了在μclinux操作系統(tǒng)下為嵌入式工業(yè)網(wǎng)絡(luò)服務(wù)器開辟數(shù)據(jù)交換萄思想和解決方案。嵌入式工業(yè)網(wǎng)絡(luò)服務(wù)器項目的開發(fā)目的是構(gòu)建一個以client/server模式工作的工業(yè)遠程監(jiān)控系統(tǒng),其前端是一個嵌入式服務(wù)器,它安裝在工業(yè)現(xiàn)場,可以與三菱plc組成的控制系統(tǒng)接口,對該系統(tǒng)實施實時監(jiān)控。其中數(shù)據(jù)交換區(qū)部分起到承上啟下的樞紐作用,向上負責對客戶端交互現(xiàn)場設(shè)備數(shù)據(jù),向下負責與接口緩沖區(qū)交互設(shè)備實時數(shù)據(jù)。系統(tǒng)以motorola公司的32位控制器cold fire5307為cpu,使用2個現(xiàn)代公司的hy57v641620型(4m×16bit)的sdram拼成4m×32位的sdram,使系統(tǒng)具有16 bytes的ram空間。
1 μclinux操作系統(tǒng)
系統(tǒng)選取μclinux操作系統(tǒng)為開發(fā)平臺,為有2個sdram(4m×16bit)的嵌入式工業(yè)網(wǎng)絡(luò)服務(wù)器開辟數(shù)據(jù)交換區(qū)。
cold fire 5307微處理器上可以運行很多操作系統(tǒng),但是可以說μclinux是最合適、性價比最高的操作系統(tǒng)。目前商用的實時操作系統(tǒng),如vxworks和nuclesus等價格比較昂貴,而且需要附加的c編譯器和相關(guān)的調(diào)試工具。而μcos等免費的實時操作系統(tǒng)又沒有很好的文件系統(tǒng)和tcp/ip協(xié)議的支持,就嵌入式工業(yè)網(wǎng)絡(luò)服務(wù)器的應(yīng)用特點而言,μclinux內(nèi)核采用模塊化設(shè)計,很多功能塊可以獨立地加載或卸載,在設(shè)計內(nèi)核時可以把這些內(nèi)核模塊作為可選項,編譯系統(tǒng)內(nèi)核時指定。一種較通用的做法是對μclinux內(nèi)核重新編譯,在編譯時仔細的選擇嵌入式系統(tǒng)所需要的功能支持模塊,同時刪除不需要的功能模塊。通過對內(nèi)核的重新配置,可以使系統(tǒng)運行所需要的內(nèi)核顯著減小,從而縮減需要的控制器ram和rom資源。
μclinux同標準linux的最大區(qū)別在于內(nèi)存管理,對sdram數(shù)據(jù)交換區(qū)的管理就屬于內(nèi)存管理范疇。標準linux使用虛擬存儲器技術(shù),對于μclinux來說,其設(shè)計針對沒有mmu(memory management unit)的處理器。但μclinux仍然采用存儲器的分頁管理,系統(tǒng)在啟動時把實際存儲器進行分頁。在加載應(yīng)用程序時程序分頁加載。但是由于沒有mmu管理,所以實際上μclinux采用實存儲器管理策略(real memory management)。μclinux系統(tǒng)對于內(nèi)存的訪問是直接的,它對地址的訪問不需要經(jīng)過mmu,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址。μclinux對內(nèi)存的管理從編譯內(nèi)核開始,從而系統(tǒng)將在啟動的初始化階段對內(nèi)存進行分頁,并且標記已使用的和未使用的內(nèi)存。系統(tǒng)將在運行應(yīng)用時使用這些分布內(nèi)存。另外由于采用實存儲器管理策略,用戶程序同內(nèi)核以及其他用戶程序在一個地址空間,程序開發(fā)時要保證不侵犯其他程序的地址空間,以使得程序不至于破壞系統(tǒng)的正常工作,或?qū)е缕渌绦虻倪\行異常。 2 數(shù)據(jù)交換區(qū)硬件架構(gòu)
系統(tǒng)采用motorola公司的cold fire 5307型32位控制電路為cpu,用2個現(xiàn)代公司的hy57v641620型的sdram(4m×16bit)拼成4m×32位的sdram,使系統(tǒng)具有16m bytes的ram空間。
clod fire系列微處理器是motorola公司繼其m68k系列微處理器之后推出的新一代內(nèi)核的32位高位能嵌入式微處理器。clod fire系列微處理器繼承了m68k系列優(yōu)秀的指令集設(shè)計和cisc架構(gòu)的優(yōu)點,融入了risc架構(gòu),在速度和架構(gòu)之間得到了很好的平衡。cold fire 5307型微處理器運行在外部總線時鐘45mhz,內(nèi)部總線時鐘90mhz,速率可達75mips。
與flash存儲器相比較,sdram不具有掉電保存數(shù)據(jù)的特性,但其存取速度大大高于flash存儲器,且具有讀/寫的屬性。因此,sdram在系統(tǒng)中主要用于程序的運行空間、數(shù)據(jù)交換區(qū)及堆棧區(qū)。當系統(tǒng)啟動時,cpu首先從復(fù)位地址0x0處讀取啟動代碼,在完成系統(tǒng)初始化后,程序代碼一般應(yīng)調(diào)入sdram中運行 ,以提高系統(tǒng)的運行速度,同時,系統(tǒng)及用戶堆棧、運行數(shù)據(jù)也都放在sdram中。sdram具有單位空間存儲容量大價格便宜的優(yōu)點,已廣泛應(yīng)用在各種嵌入式系統(tǒng)中。sdram的存儲單元可以理解為一個電容器,總是傾向于放電,為避免數(shù)據(jù)丟失,必須定時刷新(充電)。
嵌入式工業(yè)網(wǎng)絡(luò)服務(wù)器項目中的數(shù)據(jù)交換區(qū)根據(jù)數(shù)據(jù)交換匹配置文件生成。向上負責與客戶端交互現(xiàn)場設(shè)備數(shù)據(jù),向下負責與接口緩沖區(qū)交互設(shè)備實時數(shù)據(jù)。每個sdram由4m×16bit的內(nèi)部bank組成,這個bank的選擇由sdram外部引腳ba0和ba1來完成,筆者將ba0和ba1都連接在cold fire 5307的高端地址線上;其他信號和cold fire 5307都一一對應(yīng)。udqm和ldqm是sdram的高低字節(jié)片選信號,因為每個sdram都是16位架構(gòu),所以將二片sdram拼成32位時,除數(shù)據(jù)線和這二個片選信號之外,其他信號線對二個sdra來說都是共用的。這二個信號分別接cold fire 5307的cas0、cas1和cas2、cas3。sdram與mcf5307的連接如圖1所示。
cold fire 5307可以支持二個bank的sdram,在本系統(tǒng)中只使用了第一個bank,另外一個bank的控制信號懸空不使用。其中,sdram和flashrom以及其他外設(shè)一同使用32位數(shù)據(jù)總線d0-d31;sdram映射到內(nèi)部物理地址,但是因為sdram的特殊性,并不需要所有的地址線信號a0-a31,而是使用其中一部分信號線,這個地址映射的工作由dram控制器來完成;ras0-ras1是bank片選信號,本設(shè)計中只使用ras0來片選所使用的sdram bank;cas0-cas3是sdram 32位數(shù)據(jù)線中4個8位數(shù)據(jù)線(byte)獨立的片選信號;scas和sras分別是sdram的行、列地址鎖存信號;dramw是dram寫信號;bclk0是系統(tǒng)時鐘輸出,連接到sdram的時鐘輸入引腳clk端;scke是sdram時鐘使能信號,來使能輸入給sdram的時鐘信號,高電平時sdram自動進入休眠狀態(tài)。3 數(shù)據(jù)交換區(qū)軟件實現(xiàn)
服務(wù)器依據(jù)數(shù)據(jù)交換區(qū)配置文件生成設(shè)備數(shù)據(jù)交換區(qū)。服務(wù)器進入運行模式之后,首先檢查生成數(shù)據(jù)交換區(qū)與底層緩沖區(qū)的配置文件是否存在。如果不存在則打印錯誤信息,存在則依據(jù)配置文件在系統(tǒng)sdram區(qū)開辟數(shù)據(jù)交換區(qū)與底層緩沖區(qū)。接著系統(tǒng)檢查plc通信協(xié)議交換是否存在,不存在則打印錯誤信息,存在則將com2口置為plc通信端口。一切就緒之后,系統(tǒng)啟動任務(wù)調(diào)度完成各種任務(wù)。數(shù)據(jù)交換區(qū)生成及使用流程圖如圖2所示,數(shù)據(jù)緩沖區(qū)生成子程序流程如圖3所示。
在2.4片μclinux內(nèi)核中,內(nèi)核引導(dǎo)時,通過訪問系統(tǒng)所有的物理內(nèi)存,然后調(diào)用各個子系統(tǒng)的初始化函數(shù)進行初始化,允許初始化代碼分配私有的緩沖區(qū),并減少了留給常規(guī)系統(tǒng)操作的ram數(shù)量。在2.4版μclinux內(nèi)核中,這種分配通過調(diào)用下列函數(shù)之一進行:
分配內(nèi)存空間所使用的函數(shù)調(diào)用如下:
(1)函數(shù)malloc和calloc都用于分配動態(tài)內(nèi)存空間的函數(shù)。
(2)函數(shù)malloc的參考size表示申請分配的內(nèi)存空間的大小,以字節(jié)計算;
(3)函數(shù)calloc的參數(shù)nmemb表示分配的內(nèi)存空間占的數(shù)據(jù)項數(shù)目。參數(shù)size表示每一個數(shù)據(jù)項的大小,以字節(jié)計算。也就是說,calloc函數(shù)分配大小為nmemb*size大小的內(nèi)存空間。
calloc函數(shù)與malloc函數(shù)最大的區(qū)別是calloc函數(shù)被初始化所分配的內(nèi)存空間,把所有位置為0。調(diào)用成功時,malloc函數(shù)為calloc函數(shù)的返回值都為被分配的內(nèi)存空間的指針;調(diào)用失敗時,返回值為null。動態(tài)內(nèi)存被釋放。
在c語言中,指針是處理許多數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵。沒有指針,也許根據(jù)不能使用動態(tài)內(nèi)存的諸多特性。在編寫程序的時候,它允許程序員建立復(fù)雜的內(nèi)存系統(tǒng)。提高了處理未知內(nèi)容或者類型數(shù)據(jù)的靈活性。在c中還有一點對字符串處理和數(shù)據(jù)的輸入輸出很重要。對指針的徹底了解有助于我們寫出更好、更高效的代碼。
如果使用一種算法不夠,鏈表可以解決這個問題。當從未知大小的數(shù)據(jù)塊中讀入數(shù)據(jù)時,用戶不得不把數(shù)據(jù)讀到內(nèi)存中。這是因為處理讀入數(shù)據(jù)的函數(shù)必須把數(shù)據(jù)讀到一塊一定大小的內(nèi)存中。在讀入以后,必須找到一種接合分離數(shù)據(jù)的辦法。一般使用fgets()把數(shù)據(jù)讀到n個字節(jié)大小的內(nèi)存中。緩沖區(qū)是n+1個字節(jié)大,但是請注意必須使用1個字節(jié)放結(jié)束標記。然后使用了一簡單的鏈表保存數(shù)據(jù)。這個鏈表中一個特殊項:一個名為iscontinuing的整型變量。如果這個變量有值,表示當前結(jié)構(gòu)中的數(shù)據(jù)不是字符串最后的部分,最后的部分將包含在以后的結(jié)構(gòu)后。這個變量再把數(shù)據(jù)從內(nèi)存中調(diào)出來,重新組裝的時候使用。
還有一種更明智的保存數(shù)據(jù)的方法。逐步處理數(shù)據(jù)直到達到數(shù)據(jù)末尾。首先要修改的是結(jié)構(gòu)的定義。在結(jié)構(gòu)中包含字符串。在結(jié)構(gòu)中定義一個指針,指向動態(tài)申請的內(nèi)存區(qū)域。這樣做的好處是,字符串可以很長?,F(xiàn)在產(chǎn)生輸出的代碼更簡單了。它做的所有的事情就是計算和顯示。不再需要合并字符串。因為已經(jīng)被合并。
4 結(jié)束語
數(shù)據(jù)交換區(qū)的生成和使用對嵌入式工業(yè)網(wǎng)絡(luò)服務(wù)器項目尤為重要,它是web服務(wù)器正常運行的先決條件,起到承上啟下的樞紐作用。向上負責對客戶端交互現(xiàn)場設(shè)備數(shù)據(jù),向下負責與接口緩沖區(qū)交互設(shè)備實時數(shù)據(jù)。目前,該部分設(shè)計工作已經(jīng)完成,并在試運行期間情況良好,達到預(yù)期效果。
評論