国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

linux下ARM處理器對16位FPGA的訪問問題

發布時間:2016-8-10 13:41    發布者:designapp
關鍵詞: linux , ARM
  有一個朋友在調試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位。
                               
                                                               
                               
               
本文地址:http://m.qingdxww.cn/thread-171781-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区中文字幕 | a级亚洲片精品久久久久久久 | 精品一区中文字幕 | 成人在线视频免费看 | 嫩草影院永久在线一二三四 | 天天舔天天操天天干 | 国产亚洲福利精品一区二区 | 亚洲视频重口味 | 九九精品视频在线观看九九 | 国产黄色大片又色又爽 | 999热成人精品国产免 | 一区二区三区四区在线免费观看 | 青青青视频在国线观看伊人 | 精品日本亚洲一区二区三区 | 久久久国产一区二区三区 | 在线观看日韩欧美 | 福利社免费看 | 中国bdsm国语对白视频 | 色婷婷综合久久久久中文一区二区 | 99精品免费观看 | 国产五月婷婷 | 最新亚洲情黄在线网站无广告 | 91精品国产吴梦梦在线观看永久 | 久久精品国产曰本波多野结衣 | 天天操综 | 欧美视频第一区 | 2019国产开嫩苞视频 | 99久久免费国产精品热 | 手机国产看片 | 天堂中文字幕 | 欧美日韩亚洲视频 | 国产偷亚洲偷欧美偷精品 | 亚洲国产精品一区二区三区久久 | 91精品国产综合久久香蕉 | 国产一级特黄aa大片爽爽 | 小明天天看 | 久久这里只精品国产99热8 | 女人扒开腿让男人桶到爽 | 精品视频一区二区三区四区五区 | 精东影业果冻传媒蜜桃 | 草比网|