<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          linux下ARM處理器對(duì)16位FPGA的訪問(wèn)問(wèn)題

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

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

          本文引用地址:http://www.ex-cimer.com/article/201608/295294.htm

            問(wèn)題描述:

            arm使用s3c2440,fpga和arm的接口為16位,使用地址線,片選線為ncs3,操作系統(tǒng)使用-2.4

            測(cè)試程序?yàn)椋簍est.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ō)明:因?yàn)?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/linux">linux下對(duì)不能對(duì)物理絕對(duì)地址進(jìn)行訪問(wèn),需要使用mmap函數(shù)進(jìn)行內(nèi)存映射;

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

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

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

            這讓我困惑不已。

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

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

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

            使用>aa重定向?qū)⑤敵鲂畔⒋蛴〉轿募校?/p>

            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位的數(shù)據(jù)分為兩個(gè)8bit的數(shù)據(jù)送出;

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

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

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

            只要在編譯的時(shí)候指明-march=armv4選項(xiàng)即可:

            使用下面的命令重新編譯:

            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的數(shù)據(jù)送到存儲(chǔ)器,該字節(jié)為源寄存器的低16位。



          關(guān)鍵詞: linux ARM

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();