Gnuboy是一種虛擬機機制,它對具體硬件的操作是通過操作系統(這里是L inux)來進行的,圖4 為它對基于ARMlinux平臺硬件操作的抽象層次。
這個抽象層次也適用于在ARM Linux平臺下用C語言編寫的一般虛擬技術應用。越是頂層越是抽象,代碼可移植性就越好;越是底層,越是硬件相關,代碼可移植性就越差,但代碼執行速度越快。這也是一般虛擬機移植和優化思想的體現,提高移植性,多運用抽象的接口,提高速度,多一些直接操作硬件的代碼。
移植
Gnuboy在此平臺上的正確運行需要解決中斷、提供Framebuffer支持、數據存儲格式、字符串到64位整數轉換等問題。
中斷問題
Gnuboy需要依賴宿主操作系統(這里是L inux)來提供輸入/輸出等基本服務,讓宿主操作系統作為它與硬件設備的中間人,這種游離于硬件通信細節之外的方法具有良好的可移植性,本文要解決的主要是提供對鍵盤輸入和游戲控制終端的中斷響應和處理。
在本文構建的平臺下,需要編寫相應的鍵盤和游戲控制終端的Linux驅動程序,以模塊方式加載后,在Gnuboy中打開該設備。對應鍵盤處理,在Gnuboy中需要調整相應的鍵盤設置代碼使之與系統一致。
提供Framebuffer支持
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 iagnuboy命令,因此需要給出該可執行文件的絕對路徑。
源代碼修改好以后,在Makefile中設定交叉編譯器: CC= arm - linux - gcc, CXX = arm - linux - g + +。編譯時要用到針對ARM的函數庫可以把函數庫放在一個自己建的一個目錄,為了讓gcc 在搜索函數庫時到指定的目錄中尋找,可在Makefile的通過- L參數添加存放針對ARM函數庫的目錄。例如QTOP IA L IBS = - L $(QPED IR) / lib。
經過交叉編譯后把得到的可執行文件qtop iagnuboy和qtop iagnuboyl燒到嵌入式系統中可以運行,然后不足之處是畫面速度有些慢,這正是下面優化要研究的問題。
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指令)改寫。
評論
查看更多