fpga arm跑linux,linux下ARM处理器对16位FPGA的访问问题

有一个朋友在调试arm和FPGA接口的时候碰到了一个奇怪的问题,向我寻求帮助。本文引用地址:http://www.eepw.com.cn/article/201608/295294.htm

问题描述:

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位。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值