袁霞 李泽银
摘 要:在嵌入式领域,时常需针对应用调整存储设备大小及更换型号,如何保证更换后系统正常运行,是各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.
(责任编辑:何 丽)