学海荡舟手机网

主页 > 实用文摘 > 教育文摘_02 > > 详细内容

VxWorks中的地址映射_嵌入式系统论文

作者email:   hnjinyuhe@163.net

   在运用嵌入式系统vxworks和mpc860进行通信系统设计开发时,会遇到一个映射地址不能访问的问题。
缺省情况下,vxworks系统已经进行了如下地址的映射:

    memory地址、bcsr(board control and status)地址、pc_base_adrs(pcmcia)地址、internal memory地址、rom(flach memory)地址等,但是当你的硬件开发中要加上别的外设时,如(falsh、dsp、fpga等),对这些外设的访问也是通过地址形式进行读写,如果你没有加相应的地址映射,那么是无法访问这些外设的。

    和vxworks缺省地址映射类似,你也可以进行相应的地址映射。

    如下是地址映射原理及实现:

1、 地址映射结构

在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:硬件设计时定义的实际地址
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\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
  }
};
上面结构中是缺省地址映射。

3、 地址初始化

在tornado\target\src\config\ 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等)的地址映射,进行地址映射后,就可以象操作内存一样对该地址进行读写了。