打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
VxWorks中的地址映射
类别:嵌入式系统  
 
        

    

    

    来源:21IC中国电子网 作者:深圳中太多媒体 金雨和

    

    作者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_COHERENCY0x40

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