<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > linux下ARM處理器對16位FPGA的訪(fǎng)問(wèn)問(wèn)題

linux下ARM處理器對16位FPGA的訪(fǎng)問(wèn)問(wèn)題

作者: 時(shí)間:2016-08-10 來(lái)源:網(wǎng)絡(luò ) 收藏

  有一個(gè)朋友在調試arm和FPGA接口的時(shí)候碰到了一個(gè)奇怪的問(wèn)題,向我尋求幫助。

本文引用地址:http://dyxdggzs.com/article/201608/295294.htm

  問(wèn)題描述:

  arm使用s3c2440,fpga和arm的接口為16位,使用地址線(xiàn),片選線(xiàn)為ncs3,操作系統使用-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);

  }

  程序說(shuō)明:因為下對不能對物理絕對地址進(jìn)行訪(fǎng)問(wèn),需要使用mmap函數進(jìn)行內存映射;

  編譯方法:arm--gcc -o test test.c

  該程序在運行的時(shí)候不能正確的向fpga的地址內部寫(xiě)入16位的shor類(lèi)型,經(jīng)過(guò)邏輯分析儀觀(guān)察,發(fā)現在向16位的地址空間寫(xiě)入0x5678的時(shí)候,實(shí)際上是向fpga內部寫(xiě)了兩次,一次是:0x5656,另外一次是0x7878;同理,當寫(xiě)0x1234的時(shí)候,也是分為兩次寫(xiě)入的:一次是0x1212,另外一次是0x3434。

  如果將上述程序修改一下,在ads下直接編譯運行,程序能夠成功。這說(shuō)明程序是沒(méi)有問(wèn)題的,fpga對arm的接口時(shí)序也應該是沒(méi)有問(wèn)題的。

  這讓我困惑不已。

  明明是一個(gè)16位的short類(lèi)型,arm和fpga的接口也是16位的,為什么要分為兩次送入,看來(lái)是編譯器的問(wèn)題,準備使用反匯編的工具看看源代碼。在ads下,可以直接看到反匯編后的代碼,在linux下,

  發(fā)現arm-linux-objdump工具也可以對目標代碼進(jìn)行反匯編:用法為

  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]

  通過(guò)反匯編,果然看到了使用了兩條strb的指令將一個(gè)16位的數據分為兩個(gè)8bit的數據送出;

  strb指令:從源寄存器將一個(gè)8bit的數據送到存儲器,該字節為源寄存器的低8位。

  問(wèn)題找到了,如何將一個(gè)16位的數據一次性的輸出呢,在網(wǎng)絡(luò )搜索了一下,發(fā)現有一篇文章也談到了這個(gè)問(wèn)題

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

  只要在編譯的時(shí)候指明-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指令:從源寄存器將一個(gè)16bit的數據送到存儲器,該字節為源寄存器的低16位。



關(guān)鍵詞: linux ARM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>