中斷調(diào)用方式的ARM二次開(kāi)發(fā)接口設(shè)計(jì)
隨著信息技術(shù)的飛速發(fā)展,基于ARM芯片的可編程智能嵌入式設(shè)備在我們的日常生活中扮演著越來(lái)越重要的角色。由于程序的設(shè)計(jì)者在設(shè)計(jì)軟件程序和功能的時(shí)候,所針對(duì)的對(duì)象是社會(huì)上的通常情況,并沒(méi)有根據(jù)最終不同的使用者來(lái)加以設(shè)計(jì),因此各個(gè)軟件的實(shí)際使用者在使用軟件時(shí)會(huì)根據(jù)自己的使用要求和市場(chǎng)需求預(yù)測(cè),對(duì)軟件再加以開(kāi)發(fā),即俗稱的二次開(kāi)發(fā)[1]。如今,Android系統(tǒng)和蘋(píng)果產(chǎn)品等都給用戶提供開(kāi)發(fā)平臺(tái),便于用戶開(kāi)發(fā)自己的程序。為了適應(yīng)用戶簡(jiǎn)易嵌入式應(yīng)用程序的開(kāi)發(fā),縮短二次開(kāi)發(fā)周期,開(kāi)發(fā)一種低成本的專用嵌入式二次開(kāi)發(fā)工具就顯得十分必要。其中,二次開(kāi)發(fā)工具最重要的部分就是二次開(kāi)發(fā)接口的設(shè)計(jì)。
通過(guò)對(duì)現(xiàn)有嵌入式二次開(kāi)發(fā)技術(shù)的研究發(fā)現(xiàn)3個(gè)問(wèn)題。問(wèn)題一,現(xiàn)有嵌入式二次開(kāi)發(fā)技術(shù)主要是直接給用戶提供系統(tǒng)函數(shù)的OBJ中間文件,以及函數(shù)聲明的頭文件。用戶通過(guò)調(diào)用系統(tǒng)函數(shù)編寫(xiě)自己的程序,進(jìn)行編譯鏈接后直接燒錄進(jìn)芯片進(jìn)行使用,但是這樣會(huì)造成芯片存儲(chǔ)空間的浪費(fèi)。問(wèn)題二是系統(tǒng)程序函數(shù)的安全問(wèn)題,它直接給用戶提供系統(tǒng)OBJ中間文件,通過(guò)反編譯能夠很容易地破解出原有系統(tǒng)函數(shù),系統(tǒng)程序的保密性將大大地降低。問(wèn)題三是用戶編寫(xiě)程序的復(fù)雜性問(wèn)題,一般專業(yè)的嵌入式工程師編寫(xiě)的系統(tǒng)函數(shù)考慮到重用性,會(huì)把一些過(guò)程細(xì)分為多個(gè)子函數(shù),普通用戶為實(shí)現(xiàn)一個(gè)功能也需要調(diào)用多個(gè)函數(shù),對(duì)于二次開(kāi)發(fā)十分不利。函數(shù)一般采用嵌入式專業(yè)術(shù)語(yǔ)進(jìn)行命名,普通用戶很難通過(guò)函數(shù)名直接了解此函數(shù)具體的用途。
1 存在的問(wèn)題與解決方法
圖1 基于嵌入式系統(tǒng)的二次開(kāi)發(fā)程序結(jié)構(gòu)示意圖
二次開(kāi)發(fā)接口的構(gòu)架如圖1所示,通過(guò)二次開(kāi)發(fā)接口可以輕松地實(shí)現(xiàn)系統(tǒng)程序和用戶應(yīng)用程序的分離。
通過(guò)這種應(yīng)用程序和系統(tǒng)程序的分離方式,可以輕松地實(shí)現(xiàn)系統(tǒng)程序的升級(jí)和應(yīng)用程序的通用。
1.1 Flash存儲(chǔ)問(wèn)題
系統(tǒng)程序中自帶函數(shù)Funtion1實(shí)體、Funtion3實(shí)體,如果用戶自己定制的應(yīng)用程序中還需使用到Funtion1和Funtion3這2個(gè)函數(shù),則在編譯應(yīng)用程序文件的時(shí)候,編譯器會(huì)從系統(tǒng)提供的OBJ文件中把Funtion1和Funtion3這2個(gè)函數(shù)的實(shí)體再次編譯鏈接進(jìn)入bin文件,從而造成bin文件的冗余。當(dāng)把應(yīng)用程序的bin文件燒錄至Flash中時(shí)會(huì)浪費(fèi)大量的空間資源。其結(jié)果如圖2所示。
圖2 Flash ROM存儲(chǔ)結(jié)構(gòu)示意圖
針對(duì)Flash的冗余問(wèn)題,筆者提出了一個(gè)方案,就是在應(yīng)用程序中保存的不是系統(tǒng)函數(shù)本身,而是其地址,當(dāng)運(yùn)行到那個(gè)函數(shù)的時(shí)候則實(shí)現(xiàn)跳轉(zhuǎn)到指定地址,函數(shù)運(yùn)行完成后跳轉(zhuǎn)回來(lái),應(yīng)用程序繼續(xù)執(zhí)行下去。
1.2 系統(tǒng)函數(shù)的安全問(wèn)題
因?yàn)槭褂没?.1節(jié)中的地址直接跳轉(zhuǎn)方式,所以不需再向用戶提供函數(shù)體本身,而是提供函數(shù)體的地址,相對(duì)于原始方法來(lái)說(shuō)進(jìn)行反編譯更難。
1.3 簡(jiǎn)化代碼編寫(xiě)難度
可以針對(duì)用戶群進(jìn)行函數(shù)的二次封裝,把一些實(shí)現(xiàn)整體動(dòng)作的函數(shù),重新打包成一個(gè)新的函數(shù),函數(shù)名直接采用直譯方式命名,更易明白。比如顯示屏特定位置顯示字符的過(guò)程,可以直接把清屏、輸出指針移動(dòng)、輸出字符這3個(gè)函數(shù)封閉在一起。
2 改進(jìn)方案
在實(shí)現(xiàn)接口的設(shè)計(jì)過(guò)程中發(fā)現(xiàn)2個(gè)問(wèn)題。第1個(gè)問(wèn)題,在給用戶提供可用函數(shù)庫(kù)的時(shí)候需要提供所有函數(shù)的地址,對(duì)于二次接口的編寫(xiě)者來(lái)說(shuō)工作量比較大。第2個(gè)問(wèn)題,在系統(tǒng)程序更新后,所有函數(shù)在Flash中存放的地址會(huì)發(fā)生變動(dòng),在更新以前編寫(xiě)的應(yīng)用程序都需要重新定義函數(shù)地址才可以再次使用。這一點(diǎn)不利于用戶應(yīng)用程序的開(kāi)發(fā),沒(méi)有考慮到應(yīng)用程序的通用性。
通過(guò)研究中斷過(guò)程發(fā)現(xiàn),可以借鑒DOS中斷響應(yīng)時(shí)的跳轉(zhuǎn)原理來(lái)解決以上2個(gè)問(wèn)題。比如21號(hào)DOS的中斷調(diào)用:
MOV AH 4CH
INT 21H
是返回DOS系統(tǒng)的通過(guò)給AH寄存器賦值4CH,然后調(diào)用INT 21H指令,計(jì)算機(jī)就會(huì)根據(jù)AH寄存器中的值執(zhí)行相應(yīng)的操作。其中,4CH返回DOS系統(tǒng),還可以給AH寄存器賦其他值[2]。
同理這里提出了一種基于上面函數(shù)地址跳轉(zhuǎn)的改進(jìn)方法,即通過(guò)設(shè)置一個(gè)中間跳轉(zhuǎn)函數(shù)(這里函數(shù)名設(shè)置為SysCallLib)來(lái)解決接口的設(shè)計(jì)過(guò)程中發(fā)現(xiàn)的 2個(gè)問(wèn)題。改進(jìn)的基于地址跳轉(zhuǎn)方法的實(shí)現(xiàn)效果如圖3所示。通過(guò)這種方法,把SysCallLib函數(shù)體固定在特定的地址,用戶只需要知道一個(gè)地址即可實(shí)現(xiàn)跳轉(zhuǎn)。SysCallLib函數(shù)體內(nèi)部通過(guò)Case語(yǔ)句來(lái)實(shí)現(xiàn)內(nèi)部函數(shù)的跳轉(zhuǎn)。
圖3 改進(jìn)的基于地址跳轉(zhuǎn)方法的Flash ROM存儲(chǔ)結(jié)構(gòu)示意圖
3 二次開(kāi)發(fā)接口的建立
3.1 GCC開(kāi)發(fā)環(huán)境的建立
GNU 工具鏈在ARM產(chǎn)品開(kāi)發(fā)中使用的很廣泛,有些為ARM打造的開(kāi)發(fā)工具也是基于GNU 工具鏈的。在目前,支持CM3的GNU工具鏈可以由CodeSourcery網(wǎng)站免費(fèi)下載。
而GNU的C編譯器則在以后支持CortexM3。和其他ARM開(kāi)發(fā)工具相似,GNU工具鏈也包含了編譯器、匯編器和鏈接器,使得源代碼既可以使用C語(yǔ)言,也可以使用匯編完成,基于GNU工具鏈的開(kāi)發(fā)模式圖如圖4 所示[3]。
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論