新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于gnuboy虛擬機的嵌入式實驗平臺的移植與優化

        基于gnuboy虛擬機的嵌入式實驗平臺的移植與優化

        作者: 時間:2011-02-15 來源:網絡 收藏
        提供Framebuffer支持

        本文引用地址:http://www.104case.com/article/151032.htm

          Framebuffer技術提供了一個訪問物理圖形設備的定義良好的接口,本文構建的下采用的是Qt系統的版本,它是Framebuffer的, Gnuboy要在該下運行,必須提供對Framebuffer的支持。通過訪問/dev/ fb0來取得系統framebuffer中用于顯示圖像的數據和進行處理。在Gnuboy中調用游戲畫面的Framebuffer地址和掃描方法也需要作響應的修改。

          修改Framebuffer地址,也就是獲得游戲畫面的開始地址在內存中的位置。針對采用的LCD 的分辨率, 需要在Gnuboy中計算Framebuffer地址處做出相應修改。對于本中采用的LCD, Gnuboy刷新處理方法是從第一行開始,逐行刷新,同時由于一個像素采用兩個字節,因此在逐行刷新時,每次寫兩個字節。

          數據存儲格式和字符串到64位整數轉換

          在ARM Linux下可配置成大數端或者小數端格式來保存和處理整數數值,在Gnuboy中與數值存儲字節順序有關的代碼需要與之對應。

          Linux明顯缺乏用來把整數字符串轉換為64位整數的函數,如果字符串參數突破32位的極限,就有可能出問題,因此在Gnuboy需要提供字符串到64位整數的的轉換函數。

          設置啟動模擬器路徑和編譯

          在用戶已經選擇好游戲Rom,點擊launch simulator按鈕觸發啟動模擬器,進入游戲功能,因此在Gnuboy代碼中需要獲得rom的絕對路徑,由于QT操作系統無法在代碼中直接運行qtop ia命令,因此需要給出該可執行文件的絕對路徑。

          源代碼修改好以后,在Makefile中設定交叉編譯器: CC= arm - linux - gcc, CXX = arm - linux - g + +。編譯時要用到針對ARM的函數庫可以把函數庫放在一個自己建的一個目錄,為了讓gcc 在搜索函數庫時到指定的目錄中尋找,可在Makefile的通過- L參數添加存放針對ARM函數庫的目錄。例如QTOP IA L IBS = - L $(QPED IR) / lib。

          經過交叉編譯后把得到的可執行文件qtop ia和qtop ial燒到系統中可以運行,然后不足之處是畫面速度有些慢,這正是下面要研究的問題。

          Gnuboy在ARM Linux下的

          概述

          如果說CISC的指導思想之一是為了減輕編譯的負擔,R ISC則向編譯提出了更高的要求,ARM作為一種R ISC體系結構,優化問題顯得非常重要。從圖4 的抽象層次可以知道,對Gnuboy的優化問題,概括來說是對它一些抽象代碼進行硬件相關代碼替代的過程,并且越是底層的代碼,速度越快,這里直接用ARM匯編語言來改寫一些原來的C函數。前面的運行結果已經顯示, Gnuboy的圖像顯示較慢。它的函數void lcd refreshline ( )的主要功能是使用已經解碼好的圖像數據來完成游戲畫面的顯示。對它的優化主要是對它里面調用的兩個用C語言所寫函數updatepatp ix ( )和bg scan color ( )函數的優化。

          本文采用了與機器相關優化的優化技術,與機器相關的優化這里主要是寄存器分配問題,一般寄存器分配算法是一種稱為圖著色技術的。給定一個無向圖G= (V , E ) ,V 是有限節點的集合,V = { v 1, v 2, ., v n} , E是邊的集合, E = { ( i, j ) | v i∈V , v j∈V , v i和v j相連} , 圖著色問題要求找到一個k盡量小的所有節點的賦值(也稱“完全賦值”) C: V — > {1.k } , 要求在該完全賦值中, 若( i,j ) ∈E , 則C ( v i) ≠C ( vj) 。

          簡化的圖著色技術應用

          針對本文的優化,第一階段是把C函數用偽ARM匯編指令(即用符號寄存器Ui替代真正ARM寄存器的ARM指令)改寫。

          第二階段對符號寄存器U1~Un ( n > 15)畫出相干圖并進行著色,所謂對圖進行著色是指給圖中的每個結點賦予一種顏色,而且所有相鄰的兩個結點都具有不同的顏色。這樣,每種顏色就對應于處理器中的一個實際的物理寄存器,如此著色保證了所有可能發生沖突的符號寄存器都被賦予不同的物理寄存器。

          假設n + 1個符號寄存器的相干圖如圖5 ( a)所示,其中結點是符號寄存器,而結點之間的弧線表示變量的生命周期有重疊,最少需要16種顏色才能避免相連結點顏色有重疊。由于ARM920T只有r0~r14等15個寄存器可用于存儲程序變量,小于16,也就是存在寄存器沖突問題,這個時候就可以通過選擇刪除一個結點(如圖中Un + 1) ,也就是把U6對應的數據存儲到存儲器中,以后再重裝入寄存器來達到對各寄存器進行釋放的目的,見圖5 ( b)所示,虛線圓圈表示符號寄存器U16對應的數據轉存到存儲器中。

          

          用上面介紹的方法對updatepatp ix和bg scan color函數進行處理,得到的ARM匯編函數,用它們替換掉gnuboy源代碼中原先的C函數并進行編譯生成可執行文件,可執行文件在構建的測試板上運行良好。下面對上面提到的優化來進行一些測試。

          測試評估

          用CodeWarrior forARM Developer Suite和AXD Debugger軟件測試優化前后函數的運行時間,結果如表1所示。圖著色技術強調實現活躍變量的100%分配,并且代碼需要寄存器數量越多,優化效果越明顯,這從updatapatp ix和bg scan color函數的優化中可以看出(前者代碼較后者復雜,需要存放的臨時變量也多) 。進一步優化gnuboy,可用類似的方法替換源代碼的另外一些影響速度較大的函數。

          

          總結

          本文構建了一個ARM920TLinux的平臺環境, gnuboy作為一種機,應用到這樣的嵌入式環境中遇到的問題具有一定的代表性,最需要解決的問題是速度問題,針對于此,本文實現了它在所構建的平臺上的和一些優化研究。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 玉屏| 凤山市| 海盐县| 昌乐县| 治多县| 罗源县| 乳源| 长兴县| 当阳市| 安宁市| 云南省| 小金县| 河东区| 赤峰市| 九龙坡区| 昌宁县| 西充县| 八宿县| 武鸣县| 北流市| 开化县| 睢宁县| 皮山县| 新津县| 郎溪县| 南宫市| 赫章县| 洪泽县| 德昌县| 海伦市| 清远市| 绥德县| 孟州市| 九寨沟县| 祁东县| 延川县| 翼城县| 吉林省| 会同县| 永仁县| 玛曲县|