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