您的位置 首页 厂商

linux下ARM处理器对16位FPGA的拜访问题

有一个朋友在调试arm和FPGA接口的时候碰到了一个奇怪的问题,向我寻求帮助。问题描述:arm使用s3c2440,fpga和arm的接口为16位,使用地址线,片选线为ncs3,操作

  有一个朋友在调试arm和FPGA接口的时分碰到了一个古怪的问题,向我寻求协助。

  问题描绘:

  arm运用s3c2440,fpga和arm的接口为16位,运用地址线,片选线为ncs3,操作系统运用linux-2.4

  测验程序为:test.c

  #define FPGA_Address 0x18000000

  int main( )

  {

  unsigned char *sp;

  unsigned short mem;

  int memfd;

  memfd=open ("/dev/mem",O_RDWR);

  sp=(unsigned char *)mmap(0,10000,PROT_READ|PROT_WRITE,MAP_SHARED,memfd,FPGA_Address);

  *(unsigned short*)(sp+0x20c)=0x5678;

  *(unsigned short*)(sp+0x20e)=0x1234;

  munmap(sp,10000);

  close(memfd);

  }

  程序阐明:由于linux下对不能对物理肯定地址进行拜访,需求运用mmap函数进行内存映射;

  编译办法:arm-linux-gcc -o test test.c

  该程序在运转的时分不能正确的向fpga的地址内部写入16位的shor类型,经过逻辑分析仪调查,发现在向16位的地址空间写入0x5678的时分,实际上是向fpga内部写了两次,一次是:0x5656,别的一次是0x7878;同理,当写0x1234的时分,也是分为两次写入的:一次是0x1212,别的一次是0x3434。

  假如将上述程序修改一下,在ads下直接编译运转,程序能够成功。这阐明程序是没有问题的,fpga对arm的接口时序也应该是没有问题的。

  这让我困惑不已。

  分明是一个16位的short类型,arm和fpga的接口也是16位的,为什么要分为两次送入,看来是编译器的问题,预备运用反汇编的东西看看源代码。在ads下,能够直接看到反汇编后的代码,在linux下,

  发现arm-linux-objdump东西也能够对方针代码进行反汇编:用法为

  arm-linux-objdump -d -t test >aa

  运用>aa重定向将输出信息打印到文件中:

  841c: e50b0010 str r0, [fp, -#16]

  8420: e3a03f83 mov r3, #524 ; 0x20c

  8424: e51b2010 ldr r2, [fp, -#16]

  8428: e0833002 add r3, r3, r2

  842c: e3a02078 mov r2, #120 ; 0x78

  8430: e3a01056 mov r1, #86 ; 0x56

  8434: e5c32000 strb r2, [r3]

  8438: e5c31001 strb r1, [r3, #1]

  843c: e3a03f83 mov r3, #524 ; 0x20c

  8440: e2833002 add r3, r3, #2 ; 0x2

  8444: e51b2010 ldr r2, [fp, -#16]

  8448: e0833002 add r3, r3, r2

  844c: e3a02034 mov r2, #52 ; 0x34

  8450: e3a01012 mov r1, #18 ; 0x12

  8454: e5c32000 strb r2, [r3]

  8458: e5c31001 strb r1, [r3, #1]

  经过反汇编,公然看到了运用了两条strb的指令将一个16位的数据分为两个8bit的数据送出;

  strb指令:从源寄存器将一个8bit的数据送到存储器,该字节为源寄存器的低8位。

  问题找到了,如何将一个16位的数据一次性的输出呢,在网络查找了一下,发现有一篇文章也谈到了这个问题

  http://blog.csdn.net/liuqx/archive/2008/10/18/3094962.aspx

  只需在编译的时分指明-march=armv4选项即可:

  运用下面的指令从头编译:

  arm-linux-gcc -march=armv4 -o test test.c

  反汇编后得到的指令为:

  8494: e3a02c56 mov r2, #22016 ; 0x5600

  8498: e2822078 add r2, r2, #120 ; 0x78

  849c: e1a01002 mov r1, r2

  84a0: e1c310b0 strh r1, [r3]

  84a4: e3a03f83 mov r3, #524 ; 0x20c

  84a8: e2833002 add r3, r3, #2 ; 0x2

  84ac: e51b2010 ldr r2, [fp, -#16]

  84b0: e0833002 add r3, r3, r2

  84b4: e3a02c12 mov r2, #4608 ; 0x1200

  84b8: e2822034 add r2, r2, #52 ; 0x34

  84bc: e1a01002 mov r1, r2

  84c0: e1c310b0 strh r1, [r3]

  strh指令:从源寄存器将一个16bit的数据送到存储器,该字节为源寄存器的低16位。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/115153.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部