I/O空间寻址
0赞C55x处理器包含数据空间和I/O空间,为了在C/C++中对I/O空间进寻址,编译器给出了关键字ioport,以支持I/O寻址模式。Ioport关键字可以用在数组、结构、联合以及枚举类型当中。当用在数组中时,ioport可以作为数组中的元素;在结构中使用ioport,只能是指向ioport数据的指针而不能直接作为结构的成员。
Ioport类型只能用来声明全局或静态变量,如果在本地变量中使用ioport类型,则变量必须用指针声明。接下来给出指针声明ioport类型的例子:
Void foo(void)
{
Ioport int i;/* 无效的声明*/
Ioport int i;/* 有效声明*/
}
应当注意声明ioport类型的指针只有16位,这是因为I/O空间是16位寻址,而不受大/小存储器模式的限制。
在printf()中不能直接引用ioport指针,如果要引用,则必须进行强制类型转换“void*”,具体例子如下:
Ioport int *p;
Printf(“%p\n”,(void*)p);
接下来给出在本地变量中使用ioport类型的例子:
Int *ioport ioport_pointer;/*ioport 指针*/
Int I;
Int j;
Void foo(void)
{
Ioport_pointer =&I;
J =*ioport_pointer
}
这段代码的编译结果如下:
_foo:
MOV#_I,port(#_ioport_pointer) ; 存储i在I/O空间的地址
MOV port(#_ioport_pointer),AR3 ; 载入i的地址
MOV *AR3,AR1 ; 将i的内容存放到AR1中
MOV AR1,*abs16(#_j) ; 将i的内容保存到j
Return
接下来给出一个批向I/O空间数据指针的例子:
/*指向ioport数据:*/
Ioport int * ptr_to_ioport;
Ioport int i ;
Void foo(void)
{
Int j ;
I=10;
Prt_to_ioport=& i ;
J=*ptr_to_ioport;
}
上面代码编译结果如下:
_foo:
MOV#_I,*abs16(#_ptr_to_ioport) ; 存储_i的地址
MOV *abs16(#_ptr_to_ioport),AR3
AADD#_1, SP
MOV #10,port(#_i) ;向_i中存入10
MOV*AR3,AR1
MOV AR1,*SP(#0)
AADD#1,SP
Return
下面的例子是利用ioport指针向I/O空间的数据:
/*指向ioport数据的ioport指针:*/
Ioport int * ioport iop_ptr_to_ioport;
Ioport int i;
Ioport int j;
Void foo (void)
{
I =10
Iop_ptr_to_ioport=&I;
J=*iop_ptr_to_ioport;
}
编译结果如下:
_foo:
MOV#10,port(#_i) ; 将10存在_i中
MOV#_i port(#_iop_ptr_to_ioport) ;存储_i的地址
MOV port(#_iop_ptr_to_ioport),AR3 ;载入_i的地址
MOV*AR3,AR1 ; 载入_i
MOV AR1,port(#_j) ; 将10存在_i中
Return
