| 
 | 
 
VxWorks中的地址映射 
 
 在运用嵌入式系统VxWorks和MPC860进行通信系统设计开发时,会遇到一个映射地址不能访问的问题。 
缺省情况下,VxWorks系统已经进行了如下地址的映射:    memory地址、bcsr(Board Control and Status)地址、PC_BASE_ADRS(PCMCIA)地址、Internal Memory地址、rom(Flach memory)地址等,但是当你的硬件开发中要加上别的外设时,如(falsh、dsp、FPGA等),对这些外设的访问也是通过地址形式进行读写,如果你没有加相应的地址映射,那么是无法访问这些外设的。 
    和VxWorks缺省地址映射类似,你也可以进行相应的地址映射。 
    如下是地址映射原理及实现: 
1、 地址映射结构 
在Tornado        argethvmLib.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:硬件设计时定义的实际物理地址 
len;要进行映射的地址长度 
initialStateMask:可以初始化的地址状态: 
有如下状态: 
#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芯片类型还有其特殊状态 
initialState:实际初始化的地址状态: 
有如下状态: 
#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芯片类型还有其特殊状态 
2、 初始化结构 
在 Tornado        argetconfigads860sysLib.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  
  } 
}; 
上面结构中是缺省地址映射。 
3、 地址初始化 
在Tornado        argetsrcconfig usrMmuInit.c 文件中 
通过函数usrMmuInit使地址映射生效 
4、 实现映射: 
如你定义flash地址为0x04000000开始的8Mbyte地址,则可以如下进行地址映射 
    { 
    (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页,4K大小,所以len值最小为:0x00010000。 
按照如上步骤可以进行你要访问的任何外设或芯片(诸如flash、DSP、PCI等)的地址映射,进行地址映射后,就可以象操作内存一样对该地址进行读写了。 |   
 
 
 
 |