袁霞 李澤銀
摘 要:在嵌入式領域,時常需針對應用調整存儲設備大小及更換型號,如何保證更換后系統正常運行,是各BSP移植調試的核心。以運行Windows CE7.0操作系統的AM3352主板為開發平臺,詳細介紹了更換存儲芯片型號和大小后,WinCE7.0系統下的地址參數配置及修改虛擬地址映射關系的原理和方法。將DDR3 SDRAM芯片從H5TQ2G83DFR-G7C更換為H5TQ2G83DFR-H9C,NANDFlash芯片從H27U4G8F2DTR-BC更換為H27U1G8F2BTR-BC,通過測試驗證了該方法可行,主板能夠正常啟動進入操作系統桌面,系統各應用程序能正常運行。該方法可為不同物理內存大小和型號的SDRAM及NANDFlash芯片在WinCE7.0上移植與參數配置提供參考。
關鍵詞:WinCE7.0;內存管理;物理地址;虛擬地址;內存參數配置
DOI:10.11907/rjdk.173286
中圖分類號:TP301
文獻標識碼:A 文章編號:1672-7800(2018)006-0039-06
Abstract:In embedded domain, we often need to adjust the storage device size and replace models base on the application, and how to ensure that the system startup correctly is the core of BSP porting debugging.This paper is based on the AM3352 micro-processor and WinCE7.0 operating system, introduces the principle and method about resetting the memory parameters and changing the cached address-mapping based on WinCE7.0 operating system. We change the DDR3 SDRAM chip from H5TQ2 G83DFR-G7C to H5TQ2G83DFR-H9C,and changes the NANDFlash chip from H27U4G8F2DTR-BC to H27U1G8F2bTR-BC.The feasibility of above method is proved by the test,and the device starts successfully and logsin the OS desktop, solving the problems about transplanting the different SDRAM and NANDFlash chips which contain defferent physical address size or type on WinCE7.0, and resetting the memory parameters exactly.
Key Words:WinCE7.0; memory-mapping; physical address; cached address; reset the memory parameters
0 引言
在嵌入式處理器領域,存儲設備大小和型號調整是軟件調試的一大難題,如何使調整后的SDRAM和NANDFlash芯片在系統中正常穩定運行,是移植的核心。本文以某數控縫制設備主板為開發平臺,該主板在英蓓特提供的Devkit8600評估板基礎上進行應用適配,以 AM3352處理器為核心,集成USB、以太網、串口、觸摸屏等外圍設備,運行WinCE7.0操作系統[1]。為節約成本,提高資源利用率,將評估板提供的512MB SDRAM和512MB NANDFlash芯片更換,調整SDRAM大小為256MB,NANDFlash為128MB。當內存大小改變時,尤其是內存變小時,各MEMORY段的物理地址及虛擬地址映射關系都需要進行相應修改,否則內核被放在兩個內存片上,系統將無法啟動。
本文簡要介紹相關硬件開發平臺,闡述并分析WinCE7.0系統內存管理技術,得到內存調整及地址映射方法,并在WinCE7.0 BSP包基礎上進行SDRAM與NANDFlash參數配置,修改對應的虛擬地址映射關系,進行詳細測試,以使主板成功啟動且各程序正常運行。
1 WinCE7.0內存管理
Windows Embedded Compact 7簡稱WinCE7.0,是一種安全可靠的實時高性能嵌入式操作系統,將最新的網絡、多媒體與通信技術結合在一起封裝于小型設備中,具有搶占式多任務執行特性和強大的通訊能力。WinCE7擁有Windows 7的特點,支持虛擬內存機制,按需分配內存和內存映射文件[2]。
在WinCE7.0中,RAM(如SDRAM)、ROM(如EPPROM)和Flash Memory(如nand flash或nor flash)都被看成物理內存。RAM在WINCE中像傳統的物理內存一樣,為操作系統和應用程序提供運行及緩存空間,對于WINCE來說,BSP包通常使用配置文件config.bib定義物理內存片含義、用途及大小。名字為RAM的段分配SDRAM給WINCE操作系統及應用程序,提供運行和緩存空間,其大小需要根據系統的SDRAM大小決定,在物理上必須是連續的。如果系統的SDRAM被分成幾片,則RAM 片只能聲明在其中一片上。而用于存儲操作系統鏡像的NK 片則沒有此限制,但當NK 跨越兩個以上物理內存片時,系統啟動會顯示這個OS 包跨越了多個物理內存片,認為是錯誤的,但不影響系統的執行與穩定性,因為系統啟動之時便會打開MMU 而使用虛擬地址,從而看到連續的內存空間。但是如果內核被放在兩個內存片上,系統將無法啟動。其它保留起來的內存片一般是給驅動程序DMA 用,由于DMA 直接用物理地址,必須保證它們在物理上的連續性。
WINCE是32位操作系統,虛擬尋址能力可達4GB,所有進程共享一個4GB的虛擬地址空間。WINCE的內存基于頁式管理, 4GB虛擬內存空間被分為若干個頁,不同處理器支持的頁大小通常不一樣, WINCE操作系統支持1KB和4KB兩種頁大小。WINCE虛擬內存的申請分為保留(reserve)和提交(commit)兩個過程。虛擬地址空間的保留以64KB為單位,任何一次虛擬內存申請都會返回一個64KB整數倍的地址,而把虛擬內存提交到物理內存是以頁為單位的[3]。
MMU是WinCE中重要的模塊,它把進程申請的內存映射到物理內存,并且提供系統4GB的尋址能力。在程序啟動時,虛擬內存按照需要及時地申請程序代碼空間所需要的物理內存,而不是在程序啟動時就把它完全加載到物理內存中[1]。如果物理內存是連續的,OEMAddressTable 中只需要一項就可以完成對內存的地址映射。但如果BSP 運行在SDRAM 物理上不連續的系統中時,OEMAddressTable 中需要更多項將SDRAM 映射到連續的虛擬地址上,否則會大大增加尋址難度。尤其當物理地址不連續時系統需要做更多工作[4]。因此在修改內存地址參數時,一個原則是保證各片物理內存不要重疊,中間不要留空洞,以節約內存,且映射的虛擬地址連續。
WINCE的虛擬地址空間被分為2個2GB區域:低地址2GB是用戶空間,供應用程序使用;高地址2GB是內核空間,供WINCE操作系統本身使用。從0x80000000開始是WINCE內核使用的虛擬地址空間。虛擬地址0x80000000~0x9FFFFFFF一段用來靜態映射所有物理內存。也就是說WINCE會把所有物理內存1∶1地映射到這段虛擬地址上,而這段地址一共有512M,這也就是WINCE支持物理地址最大值是512MB的由來[3]。而虛擬地址0xA0000000~0xBFFFFFFF會重復映射所有的物理內存,該段對物理內存映射與0x80000000一段最大的不同是,0x80000000開始的一段物理內存有緩沖,而從0xA0000000開始的一段是沒有緩存。通常,緩沖可以提高系統的I/O效率,但是對于一些OAL或者bootloader中的設備驅動程序來說,緩沖有可能會更改人們對設備的寫操作順序從而造成災難性后果。因此在驅動程序中如果直接訪問設備I/O或寄存器,那么通常使用0xA0000000開始的那段虛擬地址[3]。
2 硬件平臺
DevKit8600評估套件是深圳市英蓓特科技有限公司推出的基于德州儀器(TI)AM3359處理器的評估套件。處理器集成了高達720MHz的ARM CortexTM-A8 內核,并提供了豐富的外設接口[5]。本文以某數控縫制設備主板為開發平臺,該主板在英蓓特提供的Devkit8600評估板基礎上進行應用適配,以 AM3352處理器為核心,集成USB、以太網、串口、觸摸屏等外圍設備,運行WinCE7.0操作系統。更換了SDRAM與NANDFlash存儲芯片型號及大小,并增加了相關應用。
2.1 AM335X處理器
AM335X德州儀器(TI)基于 ARM CortexTM-A8內核的32位 RISC微處理器,主頻可高達720MHZ[6],并提供豐富的外設接口,在圖像、圖形處理、外設以及諸如etherCAT和PROFIBUS的工業接口選項方面具備較強優勢,并支持Linux、WinCE、Android等高級操作系統[7]。本文選用AM3352處理器作為平臺核心。
2.2 H5TQ2G83DFR SDRAM芯片
DevKit8600的DDR3 SDRAM芯片為H5TQ2G83DFR-G7C,每片大小為256MB,Devkit8600由2片H5TQ2G8 3DFR-G7C芯片構成,共512MB。內存芯片更換為H5TQ2G83DFR-H9C, 每片大小為128MB,共256MB。H5TQ2G83DFR是8位同步DDR3芯片,采用分頁存儲,每頁大小為1KB,支持動態分配和自動刷新[8]。
2.3 H27U1G8F2BTR NAND Flash芯片
H27U4G8F2DTR-BC是DevKit8600的NAND Flash芯片,大小為512M。更換H27U1G8F2BTR-BC大小為128MB。與H27U4G8F2DTR-BC芯片除了設備ID和Block個數(存儲空間總大小)不一樣外,其它參數及原理完全一樣。H27U1G8F2BTR-BC容量為128M*8bit,包含1 024個block,每個block分為64個page,支持燒寫、擦除、ECC校驗等操作[9]。
3 內存研究與應用
3.1 WINCE7.0內存配置
WINCE的內存(包括SDRAM 及FLASH)配置包含兩個方面:源代碼(包括C和匯編)中的定義、系統配置文件CONFIG.BIB 中的定義[10]。
3.1.1 源代碼內存設置
源代碼中需要定義內存的物理和虛擬地址與內存大小,對應文件為image_cfg.h,image_cfg.inc,以及初始化名為OEMAddressTable 的結構數組,以告知系統物理地址與虛擬地址的對應關系,系統根據其設置生成MMU 頁表,對應文件為addrtab_cfg.inc。
OEMAddressTable 用來初始化系統中各種設備的虛擬地址與物理地址的對應關系。OEMAddressTable 為一個結構數組,每項的第一個成員為虛擬地址,第二個成員為對應的物理地址,最后一個成員為該段空間的大小。數組最后一項必須全部為0,以示整個數組結束。內核啟動時會讀取這個數組的內容初始化MMU 頁表,啟用MMU,從而使程序可以用虛擬地址訪問設備[11]。當然,OEMAddressTable 中所用到的每個物理地址及虛擬地址都需要在頭文件中定義,每個BSP 中定義該值的文件不盡相同,圖1為DevKit8600 BSP包中的OEMAddressTable定義。
3.1.2 系統配置文件內存設置
系統配置文件CONFIG.BIB中一般會將內存定義成不同的段,各段用作不同用途。CONFIG.BIB文件分兩個部分,即MEMORY段(見圖2)和CONFIG段(見圖3)[12]。MEMORY段定義內存的分片方法,CONFIG段定義系統其它一些屬性。
ROMIMAGE 通過一個內存片的屬性判斷其用途。RESERVE屬性表明該內存供BSP自己使用,系統不必關心其用途;RAMIMAGE 說明它是一片存放OS IMAGE 的內存;而RAM 則表示該內存為RAM,系統可以在其中分配空間運行程序[13]。但存放ROM的該片內存名稱即NK 一般不要改動,因為BIB 文件中定義將一個文件加入到哪個ROM 片(WINCE 支持將ROM IMAGE 存放在不連續的幾個內存片中)中時會用到該名稱。
其它保留起來的內存片如DISPLAY段用于WINCE系統顯示,DRIVERS段一般是給驅動程序DMA 用,DMA 是直接用物理地址,應該保證它們在物理上的連續性。因此,為了保證系統的正確性和穩定性,在調整內存時,RESERVED標識的內存區域地址和大小均不在調整范圍內,只能根據實際選用的內存芯片大小調整NK段和RAM段的大小,并修改物理地址與虛擬地址映射關系。
CONFIG 段中還有幾點需要格外注意,見表1。
3.2 SDRAM參數配置
根據SDRAM的調整規則,RESERVED標識的內存區域地址和大小均不在調整范圍內,只能根據實際選用的內存芯片大小調整RAMIMAGE段和RAM段的大小,即調整NK段和RAM段大小,對應代碼為wince700\bsp\AM33X_BSP\AM33X_BSP\SRC\INC\image_cfg.h中的IMAGE_WINCE_CODE_SIZE和IMAGE_WINCE_RAM_SIZE。在本WinCE7.0 BSP包中,SDRAM物理地址參數定義如表2。
XLDR程序段位于SRAM中,其物理地址起始位置為0x402F 1000,也不在調整范圍內。
將內存芯片更換后,SDRAM總大小為256MB, DEVICE_RAM_SIZE設置為0x10000000。經表2和式(1)計算,括號中(RESERVED標識段)總大小需占48.1MB,如按表2參數分配內存,總大小需占254MB ,SDRAM幾乎無余量,系統無法啟動,因此需對NK段和RAM段大小進行調整,從而對應的物理地址也需要調整,SDRAM大小計算公式如下:
修改原則為:所有物理地址不超過0x90000000,各段地址不重復,各段總和不超過256MB,RESERVED標識段與EBOOT段不作調整,保證各片內存不重疊,而且中間不留空洞,以節約內存。NK段大小根據實際應用中NK.bin大小決定(本文需要的nk.bin約為30MB),調整NK段和RAM大小后,各段的起始地址會依次調整.在\WINCE700\platform\AM33X_BSP\SRC\inc\image_cfg.h中修改以下參數:
#define DEVICE_RAM_SIZE0x10000000 //SDRAM總大小
#define IMAGE_WINCE_CODE_SIZE0x03FFE000//64MB,NK段(NK.BIN大小)
#define IMAGE_WINCE_RAM_PA0x84200000
#define IMAGE_WINCE_RAM_CA0x84200000
#define IMAGE_WINCE_RAM_SIZE0x03000000 //48MB,RAM段
#define IMAGE_WINCE_RAM_DISK_SIZE_HEX03000000 // RAMDISK 48 MB, RESERVED
#define IMAGE_WINCE_DISPLAY_PA0x8C000000
#define IMAGE_WINCE_DISPLAY_CA0x8C000000
#define IMAGE_WINCE_DISPLAY_PALETTE_PA0x8DF00000
#define IMAGE_WINCE_DRAM_EXT_PA0x8e000000 //0x96000000-->0x8e000000
#define IMAGE_WINCE_DRAM_EXT_SIZE 0x01000000 //0x0a000000-->0x01000000
其虛擬地址映射修改見下文。
3.3 NANDFlash參數配置
(1)添加nandflash設備信息。NANDFlash更換芯片后,需添加新的芯片參數,根據芯片手冊定義設備ID、block個數、扇區數、扇區大小等參數。修改內容如下:
在WINCE700\platform\AM33X_BSP\SRC\bsp_common\BSPCFG\bspcfg.c文件中以下位置添加新nandflash的配置參數。
//---------------------------------------------------
// NAND Flash
//---------------------------------------------------
NAND_INFO SupportedNands[]= {
{ // MT29F2G08ABAEA --( MT29F2G16AADWP THAT IS FROM HW MANUAL )
0xEC, //manufacturerID
0xF1, //deviceID
1024, //blocks
64, //sectorsPerBlock
2048, //sectorSize - pageSize
1 //wordData
},
{ //
0xAD, //manufacturerID
0xDC, //deviceID
4096, //blocks
64, //sectorsPerBlock
2048, //sectorSize - pageSize
1 //wordData
},
{ // add H27U1G8F2B nandflash
0xAD, //manufacturerID
0xF1, //deviceID
1024, //blocks
64, //sectorsPerBlock
2048, //sectorSize - pageSize
1 //wordData
}
};
(2)修改NANDflash大小。內容如下:
WINCE700\platform\AM33X_BSP\SRC\inc\bsp_def.h
#define GPMC_NAND_SIZE GPMC_SIZE_32M//GPMC_SIZE_128M
(3)修改nand存儲bootloader大小。WINCE700\platform\AM33X_BSP\SRC\inc\image_cfg.h根據GPMC_NAND_SIZE大小修改如下:
#define IMAGE_XLDR_BOOTSEC_NAND_SIZE (4 * 32 * 1024) // Needs to be equal to four NAND flash blocks due to boot ROM requirements,change (4 * 128 * 1024) to (4 * 32 * 1024)
#define IMAGE_EBOOT_BOOTSEC_NAND_SIZE IMAGE_EBOOT_CODE_SIZE // Needs to be a multiple of flash block size
#define IMAGE_XLDR_BOOTSEC_ONENAND_SIZE (4 * 32 * 1024) // Needs to be equal to four OneNAND flash blocks due to boot ROM requirements, change (4 * 128 * 1024) to (4 * 32 * 1024)
3.4 虛擬地址映射
在X86和ARM處理器中,WINCE的靜態內存映射是由OAL層中OEMAddressTable數組決定的[14],其代碼位于\WINCE700\platform\AM33X_BSP\SRC\inc\addrtab_cfg.inc,修改情況如下:
; Table format: cached address, physical address, size
g_oalAddressTable
DCD 0x87654321, g_oalCE7DeviceTable,0 ; Flag to use new CE7 mapping scheme
DCD 0x80000000, 0x80000000, 240 ; SDRAM
DCD 0x98000000, 0x87400000, 48 ; SDRAM for RAMDISK on second bank, change 0x90000000, 96 to 0x87400000, 48
DCD 0x00000000, 0x00000000, 0 ; end of table
其中第一行為SDRAM地址映射關系,虛擬地址和物理地址的起始地址均為0x80000000,size為240MB是因為DRIVER段占用16MB,但是DRIVER段虛擬地址映射從0xA0000000開始。第二行為RAMDISK地址映射關系,虛擬地址0x98000000對應image_cfg.h 中參數IMAGE_WINCE_RAM_DISK_CA_HEX[15],size (48MB)對應參數IMAGE_WINCE_RAM_DISK_SIZE_HEX,為0x03000000,物理地址起始地址必須位于0x8720 0000(RAM段結束地址) 到0x8C00 0000(DISPLAY段起始地址)之間,本次修改定義物理起始地址為0x87400000。
4 測試結果及分析
為保證系統正常啟動,在硬件更換SDRAM和NANDFlash芯片后,對不調整內存參數、按任意方法調整參數及按前文描述的修改原則及方法修改參數進行測試,測試結果如下:
4.1 不修改參數
啟動情況:啟動失敗,如圖4所示。
4.2 不按修改方法修改參數
減小NK.BIN鏡像段IMAGE_WINCE_CODE_SIZE(98MB)和wince 程序運行內存段大小IMAGE_WINCE_RAM_SIZE(110MB),不用減小EBOOT段,即IMAGE_EBOOT_DATA_SIZE。但未修改虛擬地址映射關系:修改IMAGE_WINCE_CODE_SIZE = 0x320 0000(50MB),IMAGE_WINCE_RAM_SIZE= 0x05000000 (80MB)其它鏡像位置依次向前移動。系統啟動失敗,測試結果如圖5所示。
4.3 按第三章修改方法修改參數
設計依據:nk.bin實際大小約30MB,display:32MB,driver:16MB,NK.BIN鏡像+RAM大小= SDRAM總大小-(DISPLAY大小+ DRIVER加載大小+ARG大小+CPU_INFO大小+EBOOT大小+RAMDISK大小)=0x73FE000(約115MB),因此內存改小后,此NK段與RAM段總和不大于115MB。本文定義如下:
#define IMAGE_WINCE_CODE_SIZE 0x03FFE000//64MB,NK段(NK.BIN大小)
#define IMAGE_WINCE_RAM_SIZE 0x03000000 //48MB,RAM段
測試結果如圖6。
系統啟動成功,進入操作系統界面。
5 結語
以某數控縫制設備主板為開發平臺,該主板在英蓓特提供的Devkit8600評估板基礎上進行應用適配,以AM3352處理器為核心,集成USB、以太網、串口、觸摸屏等外圍設備,運行WinCE7.0操作系統。為降低成本和提高系統資源利用率,更換SDRAM與NANDFlash存儲芯片型號和大小,并針對新存儲芯片進行BSP內存配置,使系統內核能夠成功啟動進入操作系統界面。本文闡述了WinCE7.0系統的內存管理機制,介紹了內存和NANDFlash移植及參數配置的可行性方法并通過應用驗證,可為ARM嵌入式WinCE7.0平臺設計開發人員內存管理配置提供參考。
參考文獻:
[1] EMBEST.DevKit8600 User Manual[R].英蓓特科技有限公司,2012.
[2] 周建設.Windows CE 設備驅動及BSP開發指南[M].北京:中國電力出版社,2009.
[3] LOONG E. WINCE內存管理[DB/OL].http://blog.csdn.net/loongembedded/article/details/7842041,2012.
[4] 尹成,黃永兵,胡耀文,等.Windows CE 7開發實戰詳解[M].北京:人民郵電出版社,2012.
[5] 吳宇生. Windows Embedded CE 6.0的內存管理(一)[DB/OL].http://blog.csdn.net/bjtuzdq/article/details/3759546.
[6] AERNOUTS J, AERTS J.AM335X ARM Cortex-A8 Microprocessors (MPUs) Technical Reference Manual [R]. Texas Instruments,2012.
[7] JUNREN Q J. AM335X ARM CORTEX-A8 微處理器技術參考手冊 (中文版詳解)1 [DB/OL]. https://blog.csdn.net/u012106397/article/details/17657075.
[8] HYNIX .H5TQ2G83DFR-2Gb DDR3 SDRAM[R]. SK Hynix,2011.
[9] HYNIX. H27(U_S)4G8_6F2D -4 Gbit (512M x 8 bit) NAND Flash[R]. SK Hynix,2011.
[10] 吳宇生. Wince——配置文件. [DB/OL]http:∥blog.csdn.net/wuyusheng314/article/details/55667294.
[11] 劉洪濤,鄒南.ARM處理器開發詳解[M].北京:電子工業出版社,2012.
[12] 徐青陵.WINCE內存管理[DB/OL]. https://wenku.baidu.com/view/25a1ca23ccbff121dd36830b.html.
[13] 王亮.WINCE的內存配置-config.bib文件的解析[DB/OL]. http:∥www.cnblogs.com/liang123/archive/2012/09/16/6325660.html.
[14] FLANDY.WINCE6.0配置BSP內存映射[DB/OL].http:∥download.csdn.net/download/FLandY1982/2641117.
[15] SLDEMORT.AM335x 啟動流程[DB/OL]. http:∥blog.csdn.net/psvoldemort/article/details/42454331.
(責任編輯:何 麗)