1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      VxWorks中的地址映射

      更新時間: 2006-06-03 16:11:47來源: 粵嵌教育瀏覽量:1198

        在運用嵌入式系統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等)的地址映射,進行地址映射后,就可以象操作內存一樣對該地址進行讀寫了。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 日本一道本精品一区二区手机版 | 亚洲911国产户外 | 中文字幕1级乱日 | 中文字幕在线观看亚洲日韩 | 久久国产美女精品久久 | 亚洲三级视频在线观看 |