VxWorks中的地址映射
作者Email: hnjinyuhe@163.net 在運(yùn)用嵌入式系統(tǒng)VxWorks和MPC860進(jìn)行通信系統(tǒng)設(shè)計(jì)開(kāi)發(fā)時(shí),會(huì)遇到一個(gè)映射地址不能訪問(wèn)的問(wèn)題。缺省情況下,VxWorks系統(tǒng)已經(jīng)進(jìn)行了如下地址的映射: memory地址、bcsr(Board Control and Status)地址、PC_BASE_ADRS(PCMCIA)地址、Internal Memory地址、rom(Flach memory)地址等,但是當(dāng)你的硬件開(kāi)發(fā)中要加上別的外設(shè)時(shí),如(falsh、dsp、FPGA等),對(duì)這些外設(shè)的訪問(wèn)也是通過(guò)地址形式進(jìn)行讀寫(xiě),如果你沒(méi)有加相應(yīng)的地址映射,那么是無(wú)法訪問(wèn)這些外設(shè)的。 和VxWorks缺省地址映射類似,你也可以進(jìn)行相應(yīng)的地址映射。 如下是地址映射原理及實(shí)現(xiàn): 1、 地址映射結(jié)構(gòu) 在Tornado\target\h\vmLib.h文件中 typedef struct phys_mem_desc { void *virtualAddr; void *physicalAddr; UINT len; UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC; virtualAddr:你要映射的虛擬地址 physicalAddr:硬件設(shè)計(jì)時(shí)定義的實(shí)際物理地址 len;要進(jìn)行映射的地址長(zhǎng)度 initialStateMask:可以初始化的地址狀態(tài):有如下?tīng)顟B(tài): #define VM_STATE_MASK_VALID 0x03 #define VM_STATE_MASK_WRITABLE 0x0c #define VM_STATE_MASK_CACHEABLE 0x30 #define VM_STATE_MASK_MEM_COHERENCY 0x40 #define VM_STATE_MASK_GUARDED 0x80 不同的CPU芯片類型還有其特殊狀態(tài) initialState:實(shí)際初始化的地址狀態(tài):有如下?tīng)顟B(tài): #define VM_STATE_VALID 0x01 #define VM_STATE_VALID_NOT 0x00 #define VM_STATE_WRITABLE 0x04 #define VM_STATE_WRITABLE_NOT 0x00 #define VM_STATE_CACHEABLE 0x10 #define VM_STATE_CACHEABLE_NOT 0x00 同樣不同的CPU芯片類型還有其特殊狀態(tài) 2、 初始化結(jié)構(gòu) 在 Tornado\target\config\ads860\sysLib.c 文件中: PHYS_MEM_DESC sysPhysMemDesc [] = { { (void *) LOCAL_MEM_LOCAL_ADRS, (void *) LOCAL_MEM_LOCAL_ADRS, LOCAL_MEM_SIZE , VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE }, { (void *) BCSR0, (void *) BCSR0, 0x00001000, /* 4 k - Board Control and Status */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_GUARDED, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT | VM_STATE_GUARDED }, …… { (void *) INTERNAL_MEM_MAP_ADDR, (void *) INTERNAL_MEM_MAP_ADDR, INTERNAL_MEM_MAP_SIZE, /* 64 k - Internal Memory Map */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_GUARDED, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT | VM_STATE_GUARDED }, { (void *) ROM_BASE_ADRS, (void *) ROM_BASE_ADRS, ROM_SIZE, /* Flach memory */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE , VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT } }; 上面結(jié)構(gòu)中是缺省地址映射。 3、 地址初始化 在Tornado\target\src\config\ usrMmuInit.c 文件中通過(guò)函數(shù)usrMmuInit使地址映射生效 4、 實(shí)現(xiàn)映射: 如你定義flash地址為0x04000000開(kāi)始的8Mbyte地址,則可以如下進(jìn)行地址映射 { (void *) 0x04000000, (void *) 0x04000000, 0x00800000, /* 8 m - Flash window 1 */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE, VM_STATE_VALID | VM_STATE_WRITABLE }, 5、 注意 地址映射最小單位為1頁(yè),4K大小,所以len值最小為:0x00010000。 按照如上步驟可以進(jìn)行你要訪問(wèn)的任何外設(shè)或芯片(諸如flash、DSP、PCI等)的地址映射,進(jìn)行地址映射后,就可以象操作內(nèi)存一樣對(duì)該地址進(jìn)行讀寫(xiě)了。