中斷調用方式的ARM二次開發接口設計
隨著信息技術的飛速發展,基于ARM芯片的可編程智能嵌入式設備在我們的日常生活中扮演著越來越重要的角色。由于程序的設計者在設計軟件程序和功能的時候,所針對的對象是社會上的通常情況,并沒有根據最終不同的使用者來加以設計,因此各個軟件的實際使用者在使用軟件時會根據自己的使用要求和市場需求預測,對軟件再加以開發,即俗稱的二次開發[1]。如今,Android系統和蘋果產品等都給用戶提供開發平臺,便于用戶開發自己的程序。為了適應用戶簡易嵌入式應用程序的開發,縮短二次開發周期,開發一種低成本的專用嵌入式二次開發工具就顯得十分必要。其中,二次開發工具最重要的部分就是二次開發接口的設計。
通過對現有嵌入式二次開發技術的研究發現3個問題。問題一,現有嵌入式二次開發技術主要是直接給用戶提供系統函數的OBJ中間文件,以及函數聲明的頭文件。用戶通過調用系統函數編寫自己的程序,進行編譯鏈接后直接燒錄進芯片進行使用,但是這樣會造成芯片存儲空間的浪費。問題二是系統程序函數的安全問題,它直接給用戶提供系統OBJ中間文件,通過反編譯能夠很容易地破解出原有系統函數,系統程序的保密性將大大地降低。問題三是用戶編寫程序的復雜性問題,一般專業的嵌入式工程師編寫的系統函數考慮到重用性,會把一些過程細分為多個子函數,普通用戶為實現一個功能也需要調用多個函數,對于二次開發十分不利。函數一般采用嵌入式專業術語進行命名,普通用戶很難通過函數名直接了解此函數具體的用途。
1 存在的問題與解決方法

圖1 基于嵌入式系統的二次開發程序結構示意圖
二次開發接口的構架如圖1所示,通過二次開發接口可以輕松地實現系統程序和用戶應用程序的分離。
通過這種應用程序和系統程序的分離方式,可以輕松地實現系統程序的升級和應用程序的通用。
1.1 Flash存儲問題
系統程序中自帶函數Funtion1實體、Funtion3實體,如果用戶自己定制的應用程序中還需使用到Funtion1和Funtion3這2個函數,則在編譯應用程序文件的時候,編譯器會從系統提供的OBJ文件中把Funtion1和Funtion3這2個函數的實體再次編譯鏈接進入bin文件,從而造成bin文件的冗余。當把應用程序的bin文件燒錄至Flash中時會浪費大量的空間資源。其結果如圖2所示。

圖2 Flash ROM存儲結構示意圖
針對Flash的冗余問題,筆者提出了一個方案,就是在應用程序中保存的不是系統函數本身,而是其地址,當運行到那個函數的時候則實現跳轉到指定地址,函數運行完成后跳轉回來,應用程序繼續執行下去。
1.2 系統函數的安全問題
因為使用基于1.1節中的地址直接跳轉方式,所以不需再向用戶提供函數體本身,而是提供函數體的地址,相對于原始方法來說進行反編譯更難。
1.3 簡化代碼編寫難度
可以針對用戶群進行函數的二次封裝,把一些實現整體動作的函數,重新打包成一個新的函數,函數名直接采用直譯方式命名,更易明白。比如顯示屏特定位置顯示字符的過程,可以直接把清屏、輸出指針移動、輸出字符這3個函數封閉在一起。
2 改進方案
在實現接口的設計過程中發現2個問題。第1個問題,在給用戶提供可用函數庫的時候需要提供所有函數的地址,對于二次接口的編寫者來說工作量比較大。第2個問題,在系統程序更新后,所有函數在Flash中存放的地址會發生變動,在更新以前編寫的應用程序都需要重新定義函數地址才可以再次使用。這一點不利于用戶應用程序的開發,沒有考慮到應用程序的通用性。
MOV AH 4CH
INT 21H
是返回DOS系統的通過給AH寄存器賦值4CH,然后調用INT 21H指令,計算機就會根據AH寄存器中的值執行相應的操作。其中,4CH返回DOS系統,還可以給AH寄存器賦其他值[2]。
同理這里提出了一種基于上面函數地址跳轉的改進方法,即通過設置一個中間跳轉函數(這里函數名設置為SysCallLib)來解決接口的設計過程中發現的 2個問題。改進的基于地址跳轉方法的實現效果如圖3所示。通過這種方法,把SysCallLib函數體固定在特定的地址,用戶只需要知道一個地址即可實現跳轉。SysCallLib函數體內部通過Case語句來實現內部函數的跳轉。

圖3 改進的基于地址跳轉方法的Flash ROM存儲結構示意圖
3 二次開發接口的建立
3.1 GCC開發環境的建立
而GNU的C編譯器則在以后支持CortexM3。和其他ARM開發工具相似,GNU工具鏈也包含了編譯器、匯編器和鏈接器,使得源代碼既可以使用C語言,也可以使用匯編完成,基于GNU工具鏈的開發模式圖如圖4 所示[3]。
c語言相關文章:c語言教程
評論