zyh_126

I/O空间寻址

0
阅读(2658)

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