新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > uClinux下SDRAM數據交換區的生成和使用

        uClinux下SDRAM數據交換區的生成和使用

        ——
        作者:武漢理工大學自動化學院 郝艷杰 胡榮強 唐盛 時間:2007-01-26 來源:《世界電子元器件》 收藏

        引言

        數據交換區就是指程序執行中使用到的各種數據所存放的內存空間。本文提出了在uclinux操作統下為嵌入式工業網絡服務器開辟數據交換區的思想和解決方案。嵌入式工業網絡服務器項目的開發目的是構建一個以client/server模式工作的工業遠程監控系統,其前端是一個嵌入式服務器,它安裝在工業現場,可以與三菱plc組成的控制系統接口,對該系統實施實時監控。其中數據交換區部分起到承上啟下的樞紐作用,向上負責對客戶端交互現場設備數據,向下負責與接口緩沖區交互設備實時數據。系統以freescale公司的32位控制芯片cold fire 5307為cpu,使用兩片現代公司的hy57v641620 的4m 16bit的sdram拼成4m 32bit的sdram,使系統具有16m bytes的ram空間。

        本文引用地址:http://www.104case.com/article/20897.htm


        uclinux操作系統

        系統選取uclinux 操作系統為開發平臺,為有兩片4m 16bit的sdram的嵌入式工業網絡服務器開辟數據交換區。

        coldfire 5307微處理器上可以運行很多操作系統,但是uclinux是最合適、性價比最高的操作系統。目前商業實時操作系統,比如vxworks和nuclesus等價格比較昂貴,而且需要附加的c編譯器和相關的調試工具。而像ucos等免費的實時操作系統,又沒有很好的文件系統和tcp/ip協議的支持,就嵌入式工業網絡服務器的應用特點而言,uclinux是最適合的操作系統。我們在uclinux下面實現了jffs(journaling flash file system)文件系統,每次子模塊傳送回來的數據都可以像日志一樣記錄下來,非常方便。另外還在主系統中的nand flash接口中實現了fat32文件系統,與pc機上windows下面的fat32文件系統兼容,因此非常方便數據的備份和更新。使用uclinux的同時,主控制系統的所有軟件工作都在linux(red hat)系統下使用gcc交叉編譯器來編譯,使用gdb交叉調試器來調試工作。

        uclinux內核采用模塊化的設計,很多功能塊可以獨立地加載或卸載,在設計內核時可以把這些內核模塊作為可選項,在編譯系統內核時指定。一種較通用的做法是對uclinux內核重新編譯,在編譯時仔細選擇嵌入式系統所需要的功能支持模塊,同時刪除不需要的功能模塊。通過對內核的重新配置,可以使系統運行所需要的內核顯著減小,從而縮減需要的控制器ram和rom資源。

        uclinux同標準linux的最大區別就在于內存管理,對sdram數據交換區的管理就屬于內存管理范疇。標準linux使用虛擬技術,對于uclinux來說,其設計針對沒有mmu(memory management unit) 的處理器。但uclinux仍然采用的分頁管理,系統在啟動時把實際進行分頁。在加載應用程序時程序分頁加載。但是由于沒有mmu管理,所以實際上uclinux采用實存儲器管理策略(real memory management)。uclinux系統對于內存的訪問是直接的,它對地址的訪問不需要經過mmu,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址。 uclinux對內存的管理從編譯內核開始,從而系統將在啟動的初始化階段對內存進行分頁,并且標記已使用的和未使用的內存。系統將在運行應用時使用這些分頁內存。另外由于采用實存儲器管理策略,用戶程序同內核以及其他用戶程序在一個地址空間,程序開發時要保證不侵犯其他程序的地址空間,以使得程序不至于破壞系統的正常工作,或導致其他程序的運行異常。


        數據交換區硬件架構

        coldfire系列微處理器是freescale公司延續其m68k系列微處理器推出的新一代32位高性能嵌入式微處理器。coldfire系列微處理器繼承了m68k系列優秀的指令集設計和cisc架構的優點,融入了risc架構的優點,在速度和架構之間得到了很好的平衡。coldfire 5307微處理器運行在外部總線時鐘45mhz、內部總線時鐘90 mhz時,可以達到75mips。

        與flash存儲器相比較,sdram不具有掉電保存數據的特性,但其存取速度大大高于flash存儲器,且具有讀/寫的屬性。因此,sdram在系統中主要用于程序的運行空間、數據交換區及堆棧區。當系統啟動時,cpu首先從復位地址0x0處讀取啟動代碼,在完成系統初始化后,程序代碼一般應調入sdram中運行,以提高系統的運行速度,同時,系統及用戶堆棧、運行數據也都放在sdram中。sdram具有單位空間存儲容量大和價格便宜的優點,已廣泛應用在各種嵌入式系統中。sdram的存儲單元可以理解為一個電容,總是傾向于放電,為避免數據丟失,必須定時刷新(充電)。

        嵌入式工業網絡服務器項目中的數據交換區根據數據交換區配置文件生成,向上負責對客戶端交互現場設備數據,向下負責與接口緩沖區交互設備實時數據。每片sdram是由4m 16bit的內部bank組成,這個bank的選擇由sdram的外部引腳ba0和ba1來完成,在我們的系統中ba0和ba1都連接在coldfire5307的高端地址線上;其他信號和coldfire5307都一一對應。udqm和ldqm是sdram的高低字節片選信號,因為每片sdram都是16位架構,所以我們將兩片sdram拼在一起變成32位時,其他信號線對兩片sdram來說都是共用的,唯有數據線和這兩個信號不是共用的。這兩個信號分別接coldfire5307的cas0、1和cas2、3。sdram與mcf5307的連接關系如圖1所示。

        coldfire 5307可以支持兩個bank的sdram,在系統中只使用了第一個bank,另外一個bank的控制信號懸空不使用。其中,sdram和flash rom以及其他外設一同使用32位數據總線d0:31;sdram映射到內部物理地址,但是因為sdram的特殊性,并不需要所有的地址線信號a0:31,而是使用其中一部分信號線,這個地址映射的工作由dram控制器來完成;ras0:1是bank片選信號,我們只使用ras0來片選所使用的sdram bank;cas0:3是sdram 32位數據線中4個8位數據線(byte)獨立的片選信號;scas和sras分別是sdram的行、列地址鎖存信號;dramw是dram寫信號;bclko是系統時鐘輸出,連接到sdram的時鐘輸入引腳clk端;scke是sdram時鐘使能信號,來使能輸入給sdram的時鐘信號,高電平時sdram自動進入休眠狀態。


        數據交換區軟件實現

        服務器依據數據交換區配置文件生成設備數據交換區。數據交換區格式如表1所示。

        服務器進入運行模式之后首先檢查生成數據交換區與底層緩沖區的配置文件是否存在。如果不存在則打印錯誤信息,存在則依據配置文件在系統sdram區開辟數據交換區與底層緩沖區。接著系統檢查plc通信協議文件是否存在,不存在則打印錯誤信息,存在則將com2口置為plc通信端口。一切就緒之后,系統啟動任務調度,完成各種任務。

        數據交換區生成及使用流程圖如圖2所示。

        圖3是生成數據緩沖區子程序流程圖。
        在2.4版uclinux內核中,內核引導時,通過訪問系統所有的物理內存,然后調用各個子系統的初始化函數進行初始化,允許初始化代碼分配私有的緩沖區,并減少了留給常規系統操作的ram數量。在2.4版uclinux內核中,這種分配通過調用下列函數之一進行:

        # include< linux/ boot mem.h>
        void*alloc_bootmem(unsigned long size);
        void*alloc_bootmem_low(unsigned long size);
        void*alloc_bootmem_low-pages(unsignedlong size);

        分配內存空間所使用的函數調用如下:

        # include
        void*malloc(size_t size);
        void*calloc(size_t nmemb,size_t size);

        函數malloc和calloc都是用于分配動態內存空間的函數。
        函數malloc的參數size表示申請分配的內存空間的大小,以字節記。
        函數calloc的參數nmemb表示分配的內存空間占的數據項數目。參數size表示每一個數據項的大小,以字節記。也就是說,calloc函數分配大小為nmemb*size大小的內存空間。

        calloc函數與malloc函數最大的區別是calloc函數將初始化所分配的內存空間,置所有位置為0。調用成功時,malloc函數與calloc函數的返回值都為被分配的內存空間的指針;調用失敗時,返回值為null。動態內存被釋放在c中,指針是處理許多數據結構的關鍵。沒有指針,也許根本不能使用動態內存的諸多特性。在編寫程序的時候,它允許程序員建立復雜的內存系統,提高了處理未知內容或者類型數據的靈活性。在c中還有一點對字符串處理和數據的輸入輸出很重要。對指針的徹底了解有助于寫出更好、更高效的代碼。

        如果使用一種算法不夠,鏈表可以解決這個問題。當從未知大小的數據塊中讀入數據時,用戶不得不把數據讀到內存中。這是因為處理讀入數據的函數,必須把數據讀到一塊一定大小的內存中。在讀入以后,必須找到一種接合分離數據的辦法。 一般使用fgets( )把數據讀到n個字節大小的內存中。緩沖區是n+1個字節大,但是請注意必須使用1個字節放結束標記。然后使用了一個簡單的鏈表保存數據。這個鏈表有一個特殊項:一個名為iscontinuing的整型變量。如果這個變量有值,它表示當前結構中的數據不是字符串最后的部分,最后的部分將包含在以后的結構中。這個變量再把數據從內存中調出來,重新組裝的時候使用。
        還有一種更明智的保存數據的方法。逐步處理數據直到到達數據末尾。首先要修改的是結構的定義。在結構中包含字符串。在結構中定義一個指針,指向動態申請的內存區域。這樣做的好處是,字符串可以很長。
        現在產生輸出的代碼更簡單了。它做的所有的事情就是計算和顯示。不再需要合并字符串,因為它們已經被合并了。


        結束語

        數據交換區的生成和使用對嵌入式工業網絡服務器項目尤為重要,它是web服務器正常運行的先決條件,起到承上啟下的樞紐作用。向上負責對客戶端交互現場設備數據,向下負責與接口緩沖區交互設備實時數據。日前,該部分設計工作已經完成,并在試運行期間情況良好,達到預期效果。




        關鍵詞: 存儲器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 沅陵县| 嘉禾县| 信阳市| 龙门县| 长子县| 新疆| 于田县| 内乡县| 灵璧县| 淅川县| 东明县| 霍山县| 乌兰县| 汝城县| 阿克苏市| 阿坝县| 遂川县| 青龙| 清新县| 金溪县| 武宣县| 大连市| 长泰县| 孝义市| 孝昌县| 道真| 保德县| 金寨县| 确山县| 温宿县| 玛沁县| 东辽县| 通辽市| 郎溪县| 许昌县| 九寨沟县| 泽普县| 喀什市| 洱源县| 加查县| 长泰县|