專(zhuān)利名稱(chēng)::一種嵌入式平臺(tái)和在嵌入式平臺(tái)上動(dòng)態(tài)鏈接程序的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及嵌入式
技術(shù)領(lǐng)域:
,尤其涉及一種嵌入式平臺(tái)和在嵌入式平臺(tái)上動(dòng)態(tài)鏈接程序的方法。
背景技術(shù):
:眾所周知,程序鏈接技術(shù)分為靜態(tài)鏈接技術(shù)和動(dòng)態(tài)鏈接技術(shù)。采用靜態(tài)鏈接技術(shù)時(shí),在編譯階段,應(yīng)用程序的地址是確定的,如果當(dāng)前有多個(gè)應(yīng)用程序調(diào)用了函數(shù)庫(kù)里的函數(shù),則需要在內(nèi)存中拷貝的函數(shù)庫(kù)的份數(shù)與所述應(yīng)用程序個(gè)數(shù)相同,這將浪費(fèi)內(nèi)存空間。而動(dòng)態(tài)鏈接技術(shù)通過(guò)提供一種導(dǎo)入庫(kù)來(lái)定位函數(shù)庫(kù)中的函數(shù),這種導(dǎo)入庫(kù)中僅存儲(chǔ)對(duì)函數(shù)之間的調(diào)用關(guān)系的描述,并不存儲(chǔ)實(shí)際的代碼,從而能夠節(jié)約內(nèi)存空間。目前,在手機(jī)等嵌入式產(chǎn)品中,已經(jīng)實(shí)現(xiàn)了程序的動(dòng)態(tài)鏈接,其采用的是ELF動(dòng)態(tài)鏈接的方式,具體請(qǐng)見(jiàn)圖1。圖1是現(xiàn)有技術(shù)中采用可執(zhí)行和鏈接格式(ExecutableandLinkingFormat,ELF)方式實(shí)現(xiàn)程序動(dòng)態(tài)鏈接的示意圖。如圖1所示,采用ELF方式實(shí)現(xiàn)程序動(dòng)態(tài)鏈接時(shí),首先將應(yīng)用程序編譯成ELF格式文件,然后采用ELF加載(ELFLOADER)程序?qū)ι傻腅LF文件進(jìn)行函數(shù)重定位和變量重定位,再將重定位后的ELF文件加載至嵌入式操作系統(tǒng)(OS)中,最后,該嵌入式搡作系統(tǒng)根據(jù)該重定位后的函數(shù)和變量的位置鏈接各個(gè)函數(shù)和變量,從而實(shí)現(xiàn)程序的動(dòng)態(tài)鏈接。采用ELF方式實(shí)現(xiàn)程序動(dòng)態(tài)鏈接時(shí),ELF加載程序起著重要作用,其用于將應(yīng)用程序中的函數(shù)和變量的地址與嵌入式操作系統(tǒng)中的地址對(duì)接。具體地,ELF加載程序從ELF格式文件中提取有用信息,計(jì)算ELF格式文件中的各個(gè)函數(shù)和變量重定位后的地址,然后按照該地址對(duì)函數(shù)和變量進(jìn)行重定位??梢?jiàn),采用ELF方式實(shí)現(xiàn)程序的動(dòng)態(tài)加載時(shí),由于需要從ELF格式文件中提取有用信息,并對(duì)這些有用信息進(jìn)行計(jì)算,這一方面導(dǎo)致動(dòng)態(tài)鏈接程序速度較慢,另一方面,也浪費(fèi)計(jì)算資源。
發(fā)明內(nèi)容有鑒于此,本發(fā)明的目的在于提供一種可以廣泛應(yīng)用的在嵌入式平臺(tái)上動(dòng)態(tài)鏈接程序的方法,以提高動(dòng)態(tài)鏈接程序的速度。為達(dá)到上述目的,本發(fā)明的技術(shù)方案具體是這樣實(shí)現(xiàn)的一種嵌入式平臺(tái),該嵌入式平臺(tái)包括中間層;所述中間層包括一個(gè)或多個(gè)接口類(lèi),每個(gè)接口類(lèi)由嵌入式操作系統(tǒng)的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素與所述多個(gè)函彰:^接口——對(duì)應(yīng);所述中間層通過(guò)所述接口類(lèi)調(diào)用所述嵌入式才喿作系統(tǒng)的多個(gè)函數(shù)接口。一種在如上所述的嵌入式平臺(tái)上動(dòng)態(tài)鏈接程序的方法,待鏈接的應(yīng)用程序包括一個(gè)或多個(gè)接口類(lèi),每個(gè)接口類(lèi)由該應(yīng)用程序的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素分別與所述應(yīng)用程序的多個(gè)函數(shù)接口——對(duì)應(yīng),該方法包括將所述應(yīng)用程序編譯成位置獨(dú)立的代碼段、且由該應(yīng)用程序的不同的函數(shù)編譯出的代碼段的存儲(chǔ)位置互不相交,使得應(yīng)用程序能夠在任意存儲(chǔ)空間內(nèi)運(yùn)行、且應(yīng)用程序的各個(gè)函數(shù)能夠被獨(dú)立地調(diào)用;將編譯出的所有代碼段直接拷貝至嵌入式操作系統(tǒng)內(nèi)存;通過(guò)創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞實(shí)現(xiàn)程序動(dòng)態(tài)鏈接??梢?jiàn),本發(fā)明從嵌入式操作系統(tǒng)封裝出中間層,該中間層包括一個(gè)或多個(gè)接口類(lèi),每個(gè)接口類(lèi)由嵌入式操作系統(tǒng)的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素與所述多個(gè)函數(shù)接口——對(duì)應(yīng),待鏈接的應(yīng)用程序包括一個(gè)或多個(gè)接口類(lèi),每個(gè)接口類(lèi)由該應(yīng)用程序的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素分別與所述應(yīng)用程序的多個(gè)函^接口——對(duì)應(yīng),將所述應(yīng)用程序編譯成位置獨(dú)立的代碼段、且由該應(yīng)用程序的不同的函數(shù)編譯出的代碼段的存儲(chǔ)位置互不相交,使得應(yīng)用程序能夠在任意存儲(chǔ)空間內(nèi)運(yùn)行、且應(yīng)用程序的各個(gè)函數(shù)能夠被獨(dú)立地調(diào)用;將編譯出的所有代碼段直接拷貝至嵌入式操作系統(tǒng)內(nèi)存,通過(guò)創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞實(shí)現(xiàn)程序動(dòng)態(tài)鏈接。由于各個(gè)接口類(lèi)指針一旦被創(chuàng)建,則該接口類(lèi)指針對(duì)應(yīng)的虛擬函數(shù)表的各個(gè)元素對(duì)應(yīng)的函數(shù)接口則也被實(shí)例化,即,這些函數(shù)相應(yīng)地#1賦予實(shí)際的地址,此時(shí),中間層的接口類(lèi)對(duì)應(yīng)的各個(gè)函lt和應(yīng)用程序?qū)?yīng)的各個(gè)函數(shù)之間通過(guò)虛擬函數(shù)表實(shí)現(xiàn)了動(dòng)態(tài)鏈接。因此,本發(fā)明通過(guò)創(chuàng)建接口類(lèi)指針,將該接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞,可以實(shí)現(xiàn)程序的動(dòng)態(tài)鏈接。并且,由于程序的動(dòng)態(tài)鏈接是通過(guò)創(chuàng)建接口類(lèi)指針、并在中間層的接口類(lèi)和應(yīng)用程序的接口類(lèi)之間傳遞所述接口類(lèi)指針實(shí)現(xiàn)的,因此,在將由應(yīng)用程序編譯出的文件加載至內(nèi)存時(shí),無(wú)需從該文件中提取信息來(lái)重新計(jì)算各個(gè)編譯代碼在內(nèi)存中的位置,減少了實(shí)現(xiàn)程序動(dòng)態(tài)鏈接所需的時(shí)間,提高了程序動(dòng)態(tài)鏈接的速度。圖l是現(xiàn)有技術(shù)中采用ELF方式實(shí)現(xiàn)程序動(dòng)態(tài)鏈接的示意圖;圖2是本發(fā)明的嵌入式平臺(tái)結(jié)構(gòu)圖3是在圖2所示嵌入式平臺(tái)上動(dòng)態(tài)鏈接應(yīng)用程序的示意圖4是本發(fā)明中間層和應(yīng)用程序之間的交互示意圖5是以一種即時(shí)通訊(IM)工具為核心的無(wú)線動(dòng)態(tài)應(yīng)用程序開(kāi)發(fā)環(huán)境。具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對(duì)本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。圖2是本發(fā)明的嵌入式平臺(tái)結(jié)構(gòu)圖。如圖2所示,該嵌入式平臺(tái)包括中間層。本發(fā)明從嵌入式操作系統(tǒng)封裝出中間層,該中間層由接口類(lèi)組成,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,虛擬函數(shù)表的各個(gè)元素與操作系統(tǒng)的各個(gè)函數(shù)4妾口對(duì)應(yīng)。在從嵌入式操作系統(tǒng)封裝中間層時(shí),可以將嵌入式操作系統(tǒng)的所有函數(shù)中、應(yīng)用程序常用的函數(shù)接口封裝進(jìn)中間層,其中,將功能相關(guān)聯(lián)的函數(shù)的接口封裝為一個(gè)接口類(lèi)。例如將畫(huà)圖函數(shù)的接口、文字編輯函數(shù)的接口、網(wǎng)絡(luò)連接函數(shù)的接口和信息發(fā)送函數(shù)的接口封裝進(jìn)中間層,并將畫(huà)圖函數(shù)的接口和文字編輯函數(shù)的接口封裝為一個(gè)文檔處理接口類(lèi),將網(wǎng)絡(luò)鏈接函數(shù)的接口和信息發(fā)送函數(shù)的接口封裝為一個(gè)網(wǎng)絡(luò)接口類(lèi)。每個(gè)接口類(lèi)相當(dāng)于一個(gè)組件程序,因此,中間層實(shí)際上相當(dāng)于由多個(gè)組件程序組成。圖3是在圖2所示嵌入式平臺(tái)上動(dòng)態(tài)鏈接應(yīng)用程序的示意圖。如圖3所示,本發(fā)明動(dòng)態(tài)鏈接程序的過(guò)程包括BIN文件編譯生成、BIN文件下載存儲(chǔ)、BIN文件加載和程序動(dòng)態(tài)鏈接階段。本發(fā)明在圖2所示的操作系統(tǒng)上實(shí)現(xiàn)動(dòng)態(tài)鏈接的應(yīng)用程序也由一個(gè)或多個(gè)接口類(lèi)組成,每個(gè)接口類(lèi)由該應(yīng)用程序的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)了一個(gè)虛擬函數(shù)表,每個(gè)虛擬函數(shù)表的各個(gè)元素分別與所述應(yīng)用程序的多個(gè)函數(shù)接口——對(duì)應(yīng)。與中間層的接口類(lèi)的組成方式相同,應(yīng)用程序的接口類(lèi)中的各個(gè)接口對(duì)應(yīng)的函數(shù)也是彼此相關(guān)聯(lián)的函數(shù)。在應(yīng)用程序中,每個(gè)接口類(lèi)也相當(dāng)于一個(gè)組件程序。因此,通過(guò)接口類(lèi)來(lái)實(shí)現(xiàn)應(yīng)用程序,實(shí)際上相當(dāng)于將應(yīng)用程序劃分為多個(gè)組件程序。需要說(shuō)明的是,要在嵌入式平臺(tái)上實(shí)現(xiàn)程序的動(dòng)態(tài)鏈接,需要解決以下四個(gè)問(wèn)題函數(shù)導(dǎo)入問(wèn)題、函數(shù)引出問(wèn)題、子函數(shù)調(diào)用問(wèn)題和全局變量定位問(wèn)題。函數(shù)導(dǎo)入問(wèn)題是指,需要?jiǎng)討B(tài)鏈接的應(yīng)用程序如何通過(guò)中間層調(diào)用嵌入式操作系統(tǒng)的函數(shù);函數(shù)引出問(wèn)題是指,嵌入式操作系統(tǒng)如何通過(guò)中間層調(diào)用應(yīng)用程序的函數(shù);子函數(shù)調(diào)用問(wèn)題是指,應(yīng)用程序中的子函數(shù)是如何被該應(yīng)用程序或者中間層調(diào)用的;全局變量定位問(wèn)題是指,如果應(yīng)用程序中包含全局變量,如何實(shí)現(xiàn)在將應(yīng)用程序鏈接到嵌入式平臺(tái)后,將該應(yīng)用程序中的全局變量在所述嵌入式平臺(tái)中實(shí)現(xiàn)重定位。函數(shù)導(dǎo)入問(wèn)題和函數(shù)引出問(wèn)題主要涉及BIN文件編譯生成階段和程序動(dòng)態(tài)鏈接階段;子函數(shù)調(diào)用問(wèn)題和全局變量定位問(wèn)題主要涉及BIN文件編譯生成階段。下面以圖3所示的四個(gè)階段為順序,針對(duì)ARM嵌入式操作平臺(tái)的特性,介紹在圖2所示嵌入式平臺(tái)上實(shí)現(xiàn)程序動(dòng)態(tài)鏈接的方法。一、BIN文件編譯生成階^殳首先,應(yīng)用程序開(kāi)發(fā)人員需要采用接口類(lèi)的形式編寫(xiě)應(yīng)用程序,需保證應(yīng)用程序由接口類(lèi)組成,每個(gè)接口類(lèi)由該應(yīng)用程序的一個(gè)或多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)了一個(gè)虛擬函數(shù)表,每個(gè)虛擬函數(shù)表的各個(gè)元素分別對(duì)應(yīng)了不同的函數(shù)接口,即,相當(dāng)于將應(yīng)用程序劃分為多個(gè)組件程序,將每個(gè)組件程序編寫(xiě)成一個(gè)接口類(lèi)。然后,將應(yīng)用程序編譯成位置獨(dú)立(PositionIndependenceCode,IPC)的代碼,并且該代碼是BIN文件的形式。其中,位置獨(dú)立的代碼是指,其運(yùn)行不依賴于具體的存儲(chǔ)位置,而可以在任意存儲(chǔ)空間內(nèi)運(yùn)行的代碼。具體地,當(dāng)采用ARMADS1.2編譯器編譯應(yīng)用程序時(shí),可以通過(guò)編i奪選項(xiàng)ACPS/ROPI將應(yīng)用程序的代碼段編譯生成為位置獨(dú)立(PositionIndependenceCode,IPC)的代碼段,其中ROPI選項(xiàng)的作用是編譯出的只讀段的位置是獨(dú)立的。由于將應(yīng)用程序編譯成了位置獨(dú)立的代碼,因此,在BIN文件加載階段,可以將BIN文件加載至嵌入式平臺(tái)的內(nèi)存的任意存儲(chǔ)位置運(yùn)行。由于將應(yīng)用程序劃分為多個(gè)組件程序,而中間層也是由多個(gè)組件程序?qū)崿F(xiàn),因此,應(yīng)用程序和中間層可以通過(guò)組件程序之間的交互、或者說(shuō)通過(guò)接口類(lèi),來(lái)實(shí)現(xiàn)函數(shù)的導(dǎo)入和引出。關(guān)于應(yīng)用程序和中間層如何通過(guò)接口類(lèi)實(shí)現(xiàn)函數(shù)的導(dǎo)入和引出,將在程序動(dòng)態(tài)鏈接階段予以詳細(xì)說(shuō)明。對(duì)于子函數(shù)調(diào)用問(wèn)題,本發(fā)明通過(guò)在BIN文件編譯生成階段中,將該應(yīng)用程序中的各個(gè)函數(shù)編譯成彼此位置獨(dú)立、且互不交叉的代碼段,使得各個(gè)函數(shù)可以彼此獨(dú)立的運(yùn)行,從而方便調(diào)用各個(gè)不同的函數(shù)、而不會(huì)影響其他函數(shù)。具體地,當(dāng)采用ARMADS1.2編譯器編譯應(yīng)用程序時(shí),可以通過(guò)采用ZO編譯選項(xiàng)將該應(yīng)用程序中的各個(gè)函數(shù)編譯成彼此位置獨(dú)立、且互不交叉的代碼段。例如,,i設(shè)有如下的應(yīng)用程序intappMain(Ishell*ptr,void**ppobj)funl();return0;voidfun1(void)假設(shè)appMain函數(shù)始終被編譯在BIN文件的首地址0x00000000處,采用ACPS/ROPI和ZO編譯選項(xiàng)對(duì)該應(yīng)用程序進(jìn)行編譯,則編譯結(jié)果如表一<table>tableseeoriginaldocumentpage11</column></row><table>表一在表一中,PC是BIN文件的首地址;OxOA代表函數(shù)funl的偏移地址。由表一可見(jiàn),將應(yīng)用程序編譯成位置獨(dú)立、且各個(gè)函數(shù)彼此獨(dú)立互不交叉的代碼段后,各個(gè)函數(shù)之間的跳轉(zhuǎn)是相對(duì)跳轉(zhuǎn),具體跳轉(zhuǎn)到何處由偏移地該應(yīng)用程序外部的函it獨(dú)立地調(diào)用。對(duì)于全局變量定位問(wèn)題,可以采用兩種處理方式,其一是將全局變量放在應(yīng)用程序的結(jié)構(gòu)體中,因此,在將結(jié)構(gòu)體被編譯成位置獨(dú)立的代碼段時(shí),將結(jié)構(gòu)體中的全局變量也編譯進(jìn)了該位置獨(dú)立的代碼段,其二是全局變量編譯成位置獨(dú)立的數(shù)據(jù)段。采用前一種處理方式能夠同時(shí)將多個(gè)應(yīng)用程序加載在圖2所示的嵌入式平臺(tái)上,但是由于全局變量存儲(chǔ)在應(yīng)用程序的結(jié)構(gòu)體中,因此,在使用全局變量時(shí),需要到相應(yīng)的結(jié)構(gòu)體中取所述全局變量,操作較復(fù)雜。采用后一種處理方式時(shí),由于全局變量被編譯成位置獨(dú)立的數(shù)據(jù)段,因此,可以將全局變量存放在結(jié)構(gòu)體以外的位置,通常將全局變量存儲(chǔ)在代碼段所在的隨機(jī)存儲(chǔ)器(RAM)存儲(chǔ)空間之后的存儲(chǔ)空間內(nèi),以避免數(shù)據(jù)越界訪問(wèn)。當(dāng)采用ARMADS1.2編譯器編譯應(yīng)用程序時(shí),可以通過(guò)編譯選項(xiàng)ACPS/RWPI將應(yīng)用程序的數(shù)據(jù)段編譯生成位置獨(dú)立(PositionIndependenceCode,IPC)的數(shù)據(jù)段,位置獨(dú)立的數(shù)據(jù)段是指,可以拷貝至RAM的任意存儲(chǔ)空間內(nèi)運(yùn)行的數(shù)據(jù)段。編譯選項(xiàng)ACPS/RWPI將應(yīng)用程序的數(shù)據(jù)段編譯成位置獨(dú)立的數(shù)據(jù)段,該數(shù)據(jù)段存儲(chǔ)在([R9]+OFFSET)存儲(chǔ)空間內(nèi),其中表示寄存器R9的值,OFFSET是偏移地址的值。為了防止數(shù)據(jù)越界訪問(wèn),可以將寄存器R9的值設(shè)置為內(nèi)存緩沖(BUFFER)的首地址加上BIN文件大小的值,即,將全局變量存儲(chǔ)在有應(yīng)用程序編譯得到的BIN文件之后。由于將全局變量編譯成位置獨(dú)立的數(shù)據(jù)段時(shí),需要用到寄存器R9,因此,采用后一種全局變量定位方法時(shí),只能實(shí)現(xiàn)各個(gè)應(yīng)用程序的單加載,即,無(wú)法實(shí)現(xiàn)多個(gè)應(yīng)用程序同時(shí)加載。另外,在BIN文件編譯生成階段,需要將應(yīng)用程序的主函數(shù)、即應(yīng)用程序的函數(shù)入口編譯在BIN文件的首地址處,以保證日后動(dòng)態(tài)鏈接程序時(shí)可以定位到應(yīng)用程序的各個(gè)組件程序。具體地,在編譯應(yīng)用程序的過(guò)程中設(shè)置應(yīng)用程序的入口函數(shù)為-first即可。在采用ARMADS1.2編譯器編譯應(yīng)用程序時(shí),可以采用thumb模式將應(yīng)用程序編譯成BIN文件,采用thumb模式編譯出的代碼的函數(shù)地址比通常應(yīng)用arm模式編譯出來(lái)代碼的函數(shù)地址要往后偏移一個(gè)32位(即偏移4個(gè)字節(jié))的地址,在嵌入式操作系統(tǒng)首次通過(guò)中間層調(diào)用應(yīng)用程序時(shí),將應(yīng)用程序入口函數(shù)指針指向應(yīng)用程序BIN所在內(nèi)存緩沖區(qū)的首地址偏移4個(gè)字節(jié)的位置處并執(zhí)行應(yīng)用程序,例如,如果BIN文件的首地址是0x8000,則創(chuàng)建的入口函數(shù)指針應(yīng)該指向0x8004處。采用thumb模式編譯應(yīng)用程序時(shí),應(yīng)用程序中的每條指令被編譯成兩個(gè)字節(jié)(而采用arm模式編譯則是每條指令4個(gè)字節(jié)),能夠減小編譯出的BIN文件的大小,同時(shí)也能夠提高應(yīng)用程序運(yùn)行的速度,節(jié)省功耗。綜上,在BIN文件編_澤生成階,殳,將應(yīng)用程序編譯成BIN文件,該應(yīng)用程序的入口函數(shù)位于BIN文件的首地址處,將該應(yīng)用程序編譯成位置獨(dú)立的代碼段、且該應(yīng)用程序的不同函數(shù)編譯出的代碼段彼此之間的存儲(chǔ)空間不相交,將應(yīng)用程序中的全局變量編譯成位置獨(dú)立的數(shù)據(jù)段、或者將全局變量存放在應(yīng)用程序的結(jié)構(gòu)體中。二、BIN文件下載存儲(chǔ)階段在BIN文件下載存儲(chǔ)階段,直接將這些BIN文件拷貝至文件系統(tǒng)。三、BIN文件加載階^殳當(dāng)需要加載BIN文件時(shí),將該BIN文件從文件系統(tǒng)直接拷貝至內(nèi)存,而無(wú)需對(duì)BIN文件進(jìn)行解析、或利用BIN文件中的信息進(jìn)行計(jì)算。四、程序動(dòng)態(tài)鏈接階段在程序動(dòng)態(tài)鏈接階段,通過(guò)創(chuàng)建實(shí)際的接口類(lèi)指針,在中間層的接口類(lèi)和應(yīng)用程序的接口類(lèi)之間傳遞接口類(lèi)指針,來(lái)實(shí)現(xiàn)函數(shù)的導(dǎo)入和引出。對(duì)于函數(shù)導(dǎo)入問(wèn)題,應(yīng)用程序通過(guò)創(chuàng)建中間層的接口類(lèi)的指針,將創(chuàng)建的該接口類(lèi)指針指向嵌入式操作系統(tǒng)的函數(shù)所在的中間層接口類(lèi),通過(guò)該中間層接口類(lèi)對(duì)應(yīng)的虛擬函數(shù)表的相應(yīng)元素實(shí)例化相應(yīng)函數(shù),來(lái)調(diào)用嵌入式操作系統(tǒng)的函數(shù)。例如,假設(shè)中間層中包括一個(gè)IFastString接口類(lèi),該IFastString接口類(lèi)中包含虛擬函數(shù)表指針pvt,該虛擬函數(shù)表中包含三個(gè)子函數(shù)IFastString_Realase、IFastringString—GetLength和IfastString—Find。表二是IFastString接口類(lèi)的結(jié)構(gòu)示意表。虛擬函數(shù)表IFastStringIFastStringVtbl*pvt—char*m_pStringIntmnLen>IFastString一RleaseIFastString_GetLengthIFastString—Find表二應(yīng)用程序在調(diào)用IFastString接口類(lèi)的函數(shù)時(shí),創(chuàng)建IFastString接口類(lèi)指針,并為該指針指向的虛擬函數(shù)表的三個(gè)成員IFastString—Realase、IFastringString—GetLength和IfastString—Find賦予實(shí)際的函凄U也址,這才羊,應(yīng)用程序就可以定位到嵌入式4喿作系統(tǒng)中的IFastString—Realase、IFastringString—GetLength和IfastString—Find這三個(gè)函數(shù)。因此,應(yīng)用程序在調(diào)用嵌入式操作系統(tǒng)的函數(shù)時(shí),通過(guò)管理接口類(lèi)(例如Shell接口類(lèi))來(lái)創(chuàng)建中間層中各種不同的接口類(lèi)指針,并根據(jù)接口類(lèi)的標(biāo)識(shí)(ID)創(chuàng)建相應(yīng)的4妄口類(lèi)并實(shí)例化該接口類(lèi)里虛擬函數(shù)表里各元素對(duì)應(yīng)的接口函數(shù),應(yīng)用程序使用其創(chuàng)建的接口類(lèi)指針定位到該指針指向的虛擬函數(shù)表中相應(yīng)接口的函數(shù)。其中,中間層的接口類(lèi)ID是在編寫(xiě)中間層時(shí)確定的,應(yīng)用程序在調(diào)用中間層的接口類(lèi)時(shí),將待調(diào)用的接口類(lèi)的ID傳遞給管理接口類(lèi),管理接口類(lèi)根據(jù)該ID創(chuàng)建相應(yīng)的接口類(lèi)指針并傳回給應(yīng)用程序。因此,應(yīng)用程序的入口函數(shù)可以采用下述形式intappMain(Shell*ptr,void**ppobj)return0;應(yīng)用程序通過(guò)創(chuàng)建接口類(lèi)指針和虛擬函數(shù)表的各個(gè)元素對(duì)應(yīng)的函數(shù)接口ID,將該接口類(lèi)指針指向虛擬函數(shù)表,并通過(guò)所述函數(shù)接口ID調(diào)用虛擬函凄t表中相應(yīng)函數(shù)接口對(duì)應(yīng)的函數(shù)。對(duì)于函數(shù)引出問(wèn)題,由于應(yīng)用程序也是采用接口類(lèi)的形式編寫(xiě)的,即應(yīng)用程序由接口類(lèi)組成,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素與各個(gè)函數(shù)接口對(duì)應(yīng),因此,應(yīng)用程序通過(guò)創(chuàng)建該應(yīng)用程序自身4妻口類(lèi)指針,將該接口類(lèi)里的虛擬函數(shù)表的各元素實(shí)例化后傳遞給中間層保存,中間層需要調(diào)用應(yīng)用程序的函數(shù)時(shí),直接調(diào)用中間層保存的應(yīng)用程序的接口類(lèi)的相應(yīng)函數(shù)接口即可,這樣就完成了函數(shù)引出的過(guò)程。對(duì)于函數(shù)導(dǎo)入過(guò)程,應(yīng)用程序通過(guò)管理接口類(lèi)創(chuàng)建接口類(lèi)指針,指向中間層的接口類(lèi)。對(duì)于函數(shù)引出過(guò)程,由于在編寫(xiě)應(yīng)用程序時(shí)就將應(yīng)用程序的各個(gè)接口類(lèi)實(shí)例化了,因此,將由應(yīng)用程序編譯出的BIN文件加載到中間層時(shí)(即加載BIN文件),相當(dāng)于將應(yīng)用程序已經(jīng)實(shí)例化的接口類(lèi)直接拷貝到中間層中,嵌入式操作系統(tǒng)如果要調(diào)用應(yīng)用程序的接口類(lèi),即如果要實(shí)現(xiàn)函數(shù)引出,則直接調(diào)用拷貝到中間層的應(yīng)用程序接口類(lèi)即可。綜上,本發(fā)明通過(guò)從嵌入式操作系統(tǒng)封裝中間層、利用接口類(lèi)將應(yīng)用程序編劃分為多個(gè)組件程序,可以使得中間層和應(yīng)用程序之間,通過(guò)組件實(shí)現(xiàn)交互,具體請(qǐng)參見(jiàn)圖4。圖4是本發(fā)明中間層和應(yīng)用程序之間的交互示意圖。在圖4中,當(dāng)應(yīng)用程序需要通過(guò)中間層調(diào)用嵌入式操作系統(tǒng)時(shí),應(yīng)用程序通過(guò)創(chuàng)建接口類(lèi)指針指向中間層中相應(yīng)的接口類(lèi),實(shí)現(xiàn)組件交互;當(dāng)中間層需要調(diào)用應(yīng)用程序時(shí),中間層通過(guò)已保存的應(yīng)用程序接口類(lèi)指針來(lái)調(diào)用相應(yīng)的應(yīng)用程序,該應(yīng)用程序接口類(lèi)指針是由應(yīng)用程序自身創(chuàng)建并保存在中間層中的。從操作系統(tǒng)封裝出中間層后,由于中間層和應(yīng)用程序可以通過(guò)接口類(lèi)實(shí)現(xiàn)中間層和應(yīng)用程序中各個(gè)組件程序的交互,因此,可以在中間層上開(kāi)發(fā)相應(yīng)的應(yīng)用程序。圖5是以一種即時(shí)通訊(IM)工具為核心的無(wú)線動(dòng)態(tài)應(yīng)用程序開(kāi)發(fā)環(huán)境。如圖5所示,該開(kāi)發(fā)環(huán)境包括嵌入式操作系統(tǒng)、動(dòng)態(tài)應(yīng)用程序中間層平臺(tái)(SDK)和動(dòng)態(tài)應(yīng)用程序。其中的SDK即為前文所述由嵌入式#:作系統(tǒng)封裝出的中間層,動(dòng)態(tài)應(yīng)用程序即為前文所述以接口類(lèi)形式編寫(xiě)的應(yīng)用程序。圖5中的動(dòng)態(tài)應(yīng)用程序包括能夠?qū)崿F(xiàn)基礎(chǔ)的IM功能的組件A、實(shí)現(xiàn)IM游戲的組件B、實(shí)現(xiàn)IM寵物功能的組件C、實(shí)現(xiàn)IM^L頻功能的組件D、實(shí)現(xiàn)IM音樂(lè)功能的組件E、用于擴(kuò)展應(yīng)用的組件F和組件G。組件A、組件F和組件G通過(guò)接口類(lèi)與中間層交互,組件B至組件E在組件A被加載的基礎(chǔ)上再加載運(yùn)行,就是同時(shí)運(yùn)行多個(gè)組件的情況,組件B至組件E可以通過(guò)其接口類(lèi)與組件A的接口類(lèi)通信,實(shí)現(xiàn)應(yīng)用程序插件化的過(guò)程。圖5中,在編譯時(shí),將SDK和嵌入式操作系統(tǒng)同時(shí)編譯并下載到芯片中,而對(duì)于動(dòng)態(tài)應(yīng)用程序,則以接口類(lèi)形式編寫(xiě)能夠?qū)崿F(xiàn)具體應(yīng)用功能的動(dòng)態(tài)應(yīng)用程序,再采用圖3所示方法對(duì)動(dòng)態(tài)應(yīng)用程序單獨(dú)編譯,然后下載到芯片中的文件系統(tǒng),在需要加載應(yīng)用程序時(shí)將其直接拷貝至嵌入式操作系統(tǒng)內(nèi)存,最后SDK和動(dòng)態(tài)應(yīng)用程序通過(guò)4矣口類(lèi)進(jìn)行交互。由上述技術(shù)方案可見(jiàn),由于將應(yīng)用程序編譯成BIN文件下載后,在需要運(yùn)行應(yīng)用程序時(shí),只需直接將其拷貝至內(nèi)存,后續(xù)的函數(shù)導(dǎo)入和引出問(wèn)題則由中間層和應(yīng)用程序通過(guò)創(chuàng)建實(shí)際的接口類(lèi)指針、并在彼此之間傳遞接口類(lèi)指針來(lái)自動(dòng)實(shí)現(xiàn),無(wú)需對(duì)BIN文件進(jìn)行解析或計(jì)算,從而提高了動(dòng)態(tài)鏈接程序的速度。并且,由于將同一應(yīng)用程序編i奪成BIN文件與編譯成ELF文件相比,編譯出的BIN文件占用的存儲(chǔ)空間僅是ELF文件占用的存儲(chǔ)空間的三分之一,因此,將應(yīng)用程序編譯成BIN文件還可以節(jié)省內(nèi)存空間。另外,由于中間層和應(yīng)用程序之間是通過(guò)接口類(lèi)實(shí)現(xiàn)交互的,這種交互是組件級(jí)的,因此,有利于應(yīng)用程序組件化升級(jí)和更新,以及中間層的組件式更新,或者兩者同步更新,甚至可以有效利用中間層或應(yīng)用程序的已有組件程序構(gòu)建全新應(yīng)用,實(shí)現(xiàn)應(yīng)用程序插件化。通過(guò)搭建合理的應(yīng)用層平臺(tái),還可以簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)。這對(duì)于非智能手機(jī)操作系統(tǒng)的應(yīng)用程序開(kāi)發(fā)非常有益。以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi)所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1、一種嵌入式平臺(tái),其特征在于,該嵌入式平臺(tái)包括中間層;所述中間層包括一個(gè)或多個(gè)接口類(lèi),每個(gè)接口類(lèi)由嵌入式操作系統(tǒng)的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素與所述多個(gè)函數(shù)接口一一對(duì)應(yīng);所述中間層通過(guò)所述接口類(lèi)調(diào)用所述嵌入式操作系統(tǒng)的多個(gè)函數(shù)接口。2、一種在如權(quán)利要求1所述的嵌入式平臺(tái)上動(dòng)態(tài)鏈接程序的方法,其特征在于,待鏈接的應(yīng)用程序包括一個(gè)或多個(gè)接口類(lèi),每個(gè)接口類(lèi)由該應(yīng)用程序的;2:/v:5.*A+inJ=+d古-定-il入士i"來(lái)。+—入"k,.3,來(lái)A杰i'亡1:1、3,志夂夕'lta^^o^g丈一^^T^J^g,,'l"KC—W八J/工—I/里,'》ti=*,、4、,狄/肌'ctJ^rx入々、"v一口■個(gè)元素分別與所述應(yīng)用程序的多個(gè)函數(shù)4妄口——對(duì)應(yīng),該方法包括將所述應(yīng)用程序編譯成位置獨(dú)立的代碼段、且由該應(yīng)用程序的不同的函數(shù)編譯出的代碼段的存儲(chǔ)位置互不相交;將編譯出的所有代碼段拷貝至嵌入式操作系統(tǒng)內(nèi)存;通過(guò)創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞實(shí)現(xiàn)程序動(dòng)態(tài)鏈接。3、如權(quán)利要求2所述的方法,其特征在于,所述應(yīng)用程序包括全局變量,該方法進(jìn)一步包括將所述應(yīng)用程序中的全局變量編譯成位置獨(dú)立的數(shù)據(jù)段,將該數(shù)據(jù)段存儲(chǔ)在所述位置獨(dú)立的代碼段之后,實(shí)現(xiàn)程序動(dòng)態(tài)鏈接過(guò)程中的全局變量重定位。4、如權(quán)利要求2所述的方法,其特征在于,所述應(yīng)用程序包括全局變量和結(jié)構(gòu)體,該方法進(jìn)一步包括將所述應(yīng)用程序中的全局變量存^f諸在該應(yīng)用程序的結(jié)構(gòu)體中;所述編譯成位置獨(dú)立的代碼段包括將所述結(jié)構(gòu)體編譯成位置獨(dú)立的代碼段。5、如權(quán)利要求2所述的方法,其特征在于,將所述應(yīng)用程序編譯成位置獨(dú)立的代碼段、且由該應(yīng)用程序的不同的函數(shù)編譯出的代碼段的存儲(chǔ)位置互不相交為采用嵌入式操作系統(tǒng)ARMADS1.2編譯器中的編譯選項(xiàng)ACPS/ROPI和ZO編i奪所述應(yīng)用程序。6、如權(quán)利要求3所述的方法,其特征在于,將所述應(yīng)用程序中的全局變量編譯成位置獨(dú)立的數(shù)據(jù)段為采用嵌入式操作系統(tǒng)ARMADS1.2編譯器中的編譯選項(xiàng)ACPS/RWPI編譯所述應(yīng)用程序。7、如權(quán)利要求2所述的方法,其特征在于,所述創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞包括在所述應(yīng)用程序調(diào)用嵌入式操作系統(tǒng)的函數(shù)時(shí),應(yīng)用程序通過(guò)管理接口類(lèi)創(chuàng)建中間層的接口類(lèi)指針,該指針指向中間層的接口類(lèi),將該接口類(lèi)指針傳遞給應(yīng)用程序的接口類(lèi);應(yīng)用程序通過(guò)創(chuàng)建該應(yīng)用程序自身的接口類(lèi)指針,將該接口類(lèi)里的虛擬函數(shù)表的各元素實(shí)例化后傳遞給中間層保存,中間層需要調(diào)用應(yīng)用程序的函數(shù)時(shí),調(diào)用中間層保存的應(yīng)用程序的接口類(lèi)的相應(yīng)函數(shù)接口。8、如權(quán)利要求2所述的方法,其特征在于,所述位置獨(dú)立的代碼段為二進(jìn)制BIN文件。9、如權(quán)利要求8所述的方法,其特征在于,所述編譯為采用thumb才莫式編譯應(yīng)用程序;所述通過(guò)創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞實(shí)現(xiàn)程序動(dòng)態(tài)鏈接包括在嵌入式操作系統(tǒng)首次通過(guò)中間層調(diào)用應(yīng)用程序時(shí),創(chuàng)建應(yīng)用程序入口函數(shù)指針并將其指向應(yīng)用程序的BIN文件所在內(nèi)存緩沖區(qū)的首地址偏移4個(gè)字節(jié)的位置處,運(yùn)行入口函數(shù)。10、如權(quán)利要求2所述的方法,其特征在于,所述創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞包括當(dāng)應(yīng)用程序需要通過(guò)中間層調(diào)用嵌入式操作系統(tǒng)時(shí),應(yīng)用程序通過(guò)創(chuàng)建接口類(lèi)指針指向中間層中相應(yīng)的接口類(lèi);當(dāng)中間層需要調(diào)用應(yīng)用程序時(shí),中間層通過(guò)已保存的應(yīng)用程序接口類(lèi)指針調(diào)用相應(yīng)的應(yīng)用程序,該應(yīng)用程序接口類(lèi)指針是由應(yīng)用程序自身創(chuàng)建并保存在中間層中的。全文摘要本發(fā)明實(shí)施例公開(kāi)了一種嵌入式平臺(tái)和在嵌入式平臺(tái)上動(dòng)態(tài)鏈接程序的方法。該嵌入式平臺(tái)包括中間層;中間層包括接口類(lèi),每個(gè)接口類(lèi)由嵌入式操作系統(tǒng)的多個(gè)函數(shù)接口封裝得到,每個(gè)接口類(lèi)對(duì)應(yīng)一個(gè)虛擬函數(shù)表,該虛擬函數(shù)表的各個(gè)元素與所述多個(gè)函數(shù)接口一一對(duì)應(yīng)。待鏈接的應(yīng)用程序包括接口類(lèi)。將所述應(yīng)用程序編譯成位置獨(dú)立的代碼段、且由該應(yīng)用程序的不同的函數(shù)編譯出的代碼段的存儲(chǔ)位置互不相交,將編譯出的所有代碼段直接拷貝至嵌入式操作系統(tǒng)內(nèi)存;通過(guò)創(chuàng)建接口類(lèi)指針,將接口類(lèi)指針在中間層的接口類(lèi)和所述應(yīng)用程序的接口類(lèi)之間傳遞實(shí)現(xiàn)程序動(dòng)態(tài)鏈接。應(yīng)用本發(fā)明能夠提高動(dòng)態(tài)鏈接程序的執(zhí)行速度。文檔編號(hào)G06F9/44GK101441566SQ20081018093公開(kāi)日2009年5月27日申請(qǐng)日期2008年11月18日優(yōu)先權(quán)日2008年11月18日發(fā)明者佳古,吳志華,璇邱申請(qǐng)人:騰訊科技(深圳)有限公司