导 航┆主 站┆文 章┆资 料┆下 载┆美 食┆读 书┆笑 话┆博 客┆论 坛
>> Tony嵌入式开发论坛静态版首页
查看完全版本:Tony嵌入式开发论坛

 

    [转帖]VxWorks中的地址映射
    作者:searcher827 时间:2006-5-30 22:09:09

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

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------



查看完全版本:Tony嵌入式开发论坛
Copyright 2006-2008 Cevx.Com Cevx.Net 制作 版权所有
网友发帖仅代表个人观点,与本论坛立场无关