999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

用C語言“指針”實現(xiàn)平臺和應(yīng)用程序的獨立編譯

2012-09-21 10:43:38王國斌
關(guān)鍵詞:程序

王國斌

(福州大觀電子科技有限公司 研發(fā)部,福州 350003)

引 言

隨著嵌入式產(chǎn)品應(yīng)用環(huán)境和功能的日趨復(fù)雜,應(yīng)用工程師都希望能夠把更多的精力放在應(yīng)用層次上應(yīng)用功能的開發(fā)和穩(wěn)定,而花更少的精力來關(guān)注底層驅(qū)動軟件的實現(xiàn)和細(xì)節(jié)。基于此目的,一個比較好的實現(xiàn)方法就是在開發(fā)當(dāng)中能夠把已經(jīng)穩(wěn)定和充分測試的底層驅(qū)動軟件的平臺框架放在一個工程中編譯當(dāng)做“固化”,而把應(yīng)用程序的功能實現(xiàn)部分放在另外一個工程中編譯,從而減少驅(qū)動軟件和應(yīng)用軟件的耦合度。這就有點像在編寫PC軟件時,我們編寫一定的應(yīng)用功能,而底層的驅(qū)動等則通過調(diào)用DLL的方式去實現(xiàn)。

1 預(yù)備知識

1.1 指針和函數(shù)指針

在了解怎樣實現(xiàn)平臺程序和應(yīng)用程序的分開編譯之前,先來學(xué)習(xí)一個重要的知識——指針和函數(shù)指針。

1.1.1 指 針

C語言的指針概念是最令C語言初學(xué)者頭疼的問題,甚至一些有工作經(jīng)驗的程序員在平時的工作當(dāng)中也是害怕它和規(guī)避它的。然而,如果沒有指針,那C語言的效率和編程的樂趣將大打折扣。正由于此,C語言的指針問題也是很多公司面試時技術(shù)面試官必提的一個問題。指針,實際上應(yīng)該叫做“地址”比較合理,這個地址表明了你所需要的數(shù)據(jù)或者程序段在整個地址空間的位置。通過這個地址你可以找到你所需要的東西的位置。它就像我們實際生活中的門牌號,比如說我們的實驗樓在C區(qū)18號,那么只要找到了C區(qū)18號也就找到了我們的實驗樓。

指針就類似于一個地址編碼,那這個編碼當(dāng)然也是有規(guī)定長度的,或者說是有大小的。就像我們給倉庫的儲存格子來編碼,那么這個編碼的長度和內(nèi)容就決定了最多能描述多少個格子。當(dāng)然這個指針的長度越長,那么用它來描述的地址信息量就越多,也就是具有更大的選址空間。因此在16位MCU中指針的大小往往就是只有16位,而在32位MCU中指針的大小就往往是32位。一般來說在同一個地址空間內(nèi)指針的大小是固定的,而這就是為什么在同一個MCU(特別是馮·諾伊曼結(jié)構(gòu))上,無論指針指向什么類型的數(shù)據(jù),它總是占用固定的字節(jié)數(shù)。

(1)指針的類型

還是拿我們實驗樓地址為例子:C區(qū)18號它既可以代表是一系列實驗室的集合,也可以代表一堆房子的集合,而它具體可以代表什么樣的含義就看你使用的時候需要怎樣的信息。同樣在程序中的一個地址,我們可以看作是一個字節(jié)數(shù)組的集合的開始,也可以看作是一個自定義的結(jié)構(gòu)體的開始,當(dāng)然還可以看作是一段程序段的開始。這就是我們在編程的時候可以把不同數(shù)據(jù)類型的指針相互轉(zhuǎn)換的原因。

(2)指向指針的指針

很多人對指針已經(jīng)很頭痛了,對指向指針的指針可能就更加不知南北了。其實指向指針的指針在我們生活中運用得很多,比如說你要通過張三要找王五,但是他不知道王五在哪里,但是他知道李四知道王五在哪里,而他自己又知道李四在哪里,這樣你就可以通過張三這個指針指向李四,而通過李四這個指針來指向王五來找到王五,而張三就是一個指向王五的指針的指針。相應(yīng)的程序如下:

1.1.2 函數(shù)指針

如果看明白了上面這些描述,那也就應(yīng)該知道函數(shù)指針的含義了。函數(shù)指針就是一個指向一段程序的地址,它和數(shù)據(jù)指針在本質(zhì)上是沒有區(qū)別的。

通過函數(shù)指針調(diào)用函數(shù)和直接調(diào)用函數(shù)的區(qū)別就在于我們事先是否知道這個函數(shù)的地址。比如我要把一封信送給李四,但是我不知道李四住在哪里,然而我知道張三知道李四在哪里,這樣我就先把信轉(zhuǎn)交給張三,信里面的內(nèi)容就是我要傳遞給李四的信息(就是我們函數(shù)調(diào)用的參數(shù)),然后張三把信轉(zhuǎn)交給了李四,李四根據(jù)信里面的內(nèi)容進(jìn)行相應(yīng)的處理,并給我一個答案,而這個時候他已經(jīng)知道了我的地址,因此他就可以直接繞過張三把答案回復(fù)給我。利用函數(shù)指針調(diào)用函數(shù)的過程就和上面所舉的例子一樣,而它與直接調(diào)用函數(shù)的區(qū)別就在于多了張三這一道手續(xù)而已。

函數(shù)指針的舉例描述:

①uint8(*)(uint8,uint8)

表示一個函數(shù)指針。這個函數(shù)有兩個參數(shù),參數(shù)類型均為uint8,函數(shù)的返回類型是uint8。

②void(*const)(uint8,uint8(*)(void))

表示一個常量函數(shù)指針。這個函數(shù)有兩個參數(shù),第一個參數(shù)的類型是uint8,第二個參數(shù)的類型是一個函數(shù)指針,而這個函數(shù)指針的參數(shù)沒有,返回類型則是uint8,最外層的函數(shù)指針的返回類型則為void。

1.2 地址空間

前面講述了指針,下面我們講述指針的前提,也就是地址空間。在馮·諾依曼結(jié)構(gòu)的CPU中只有一個地址空間,無論是程序還是數(shù)據(jù)都可以在這個空間內(nèi)被找到,因此在編程的時候從嚴(yán)格意義上來講就只存在一種類型的指針,那就是void*。而對于哈佛結(jié)構(gòu)的CPU來說則要顯得復(fù)雜一些,程序空間和數(shù)據(jù)空間是隔離的,因此就存在指向程序空間和數(shù)據(jù)空間的兩種指針。51單片機(jī)這種哈佛結(jié)構(gòu)的增強(qiáng)則要顯得更加復(fù)雜,不但程序空間和數(shù)據(jù)空間不統(tǒng)一,而且數(shù)據(jù)空間還要分成幾種類型。因此從C語言編程的復(fù)雜度來講,馮·諾依曼結(jié)構(gòu)的CPU要簡單一些。

1.3 程 序

簡單地說,程序就是一段二進(jìn)制碼0和1的有序組合。而這種有序組合構(gòu)成了目標(biāo)CPU的一條條機(jī)器指令,這一系列的機(jī)器指令的有機(jī)組合則構(gòu)成了程序員為之驕傲的程序。當(dāng)我們的程序被目標(biāo)CPU開始執(zhí)行之后,它就按照預(yù)先安排的步驟去完成各種各樣的事情。而函數(shù)就是程序中的一個片斷,它在程序中的某一個位置完成一件或者幾件我們所需要完成的事情。

然而如果你調(diào)用的函數(shù)并不在你所編寫的程序段中,而已經(jīng)在目標(biāo)CPU的地址空間的某個地方了,那該怎么辦呢?這個時候我們就需要用函數(shù)指針來完成這件事情了,首先需要通過一種方式來獲得這個函數(shù)指針,然后通過函數(shù)指針來調(diào)用你所需要的函數(shù)。

2 實現(xiàn)平臺程序和應(yīng)用程序的分開編譯

程序的編譯就是把C語言文件編譯成機(jī)器碼,能讓目標(biāo)CPU通過這種方式和你交流。而編譯完的程序段放在目標(biāo)CPU地址空間的什么位置就需要由鏈接來決定。目前,絕大多數(shù)的編譯器都允許用戶自定義鏈接文件,因此通過這種方式我們就能按照意愿來安排代碼的位置了。如果某些代碼已經(jīng)很穩(wěn)定了,就可以事先把它固定在目標(biāo)CPU的地址空間的某些位置,從而減少后期的工作量。

當(dāng)平臺程序和應(yīng)用程序分離之后它們之間的接口就只能通過函數(shù)指針的方式來實現(xiàn)了。這里應(yīng)用程序需要把它的入口函數(shù)的地址放在固定的位置,而平臺程序則需要把它的API函數(shù)的地址放在固定的位置。

比如我們把應(yīng)用程序的函數(shù)入口地址放在0x10000這個位置,那么平臺程序運行的時候就從0x10000地址取出一個指針(地址),然后調(diào)用這個指針?biāo)赶虻某绦蚨蝸磉\行應(yīng)用程序。應(yīng)用程序通過同樣的方式能夠調(diào)用平臺程序的API函數(shù)來完成預(yù)先定義的功能。

結(jié) 語

本文主要是根據(jù)日常的工程項目應(yīng)用的實際需求,整理出了一套可以在設(shè)計嵌入式系統(tǒng)軟件時對平臺程序和應(yīng)用程序分開編譯的一種方法,希望對相關(guān)技術(shù)人員有所幫助。

[1] 陳建輝.C語言指針探討[J].莆田高等專科學(xué)校學(xué)報,2001,8(4).

[2] 趙森,李卓民.C程序設(shè)計[M].北京:冶金工業(yè)出版社,2005.

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
基于VMM的程序行為異常檢測
偵查實驗批準(zhǔn)程序初探
我國刑事速裁程序的構(gòu)建
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 91福利一区二区三区| 国产精品亚洲天堂| 蜜桃视频一区二区| 91国内在线观看| 亚洲自偷自拍另类小说| 国产免费一级精品视频 | 国产婬乱a一级毛片多女| 青青草国产在线视频| 国产福利拍拍拍| jizz国产在线| 毛片免费视频| 国产午夜精品一区二区三区软件| 欧美成人午夜影院| 永久天堂网Av| 污污网站在线观看| 欧洲极品无码一区二区三区| 亚洲V日韩V无码一区二区| 精品91视频| 最新无码专区超级碰碰碰| 无码福利日韩神码福利片| 91欧美亚洲国产五月天| 国产一区二区三区免费观看 | 国产成人高清精品免费软件| 在线观看国产精美视频| 欧美亚洲网| 中文字幕va| 国产成人免费| 99视频国产精品| 国产精品亚洲精品爽爽| 精品福利网| 91po国产在线精品免费观看| 福利国产在线| 国产激情影院| 日本欧美一二三区色视频| 波多野结衣视频一区二区 | 精品国产成人高清在线| 午夜啪啪福利| 国产门事件在线| 不卡无码h在线观看| 中文字幕 91| 91国内视频在线观看| 亚洲一区二区三区在线视频| 天天色天天综合| 欧美19综合中文字幕| 国产精品极品美女自在线| 毛片网站免费在线观看| av免费在线观看美女叉开腿| 国产一级视频久久| 一个色综合久久| 黄色在线网| 91久久精品日日躁夜夜躁欧美| 精品久久久久成人码免费动漫| 亚洲免费黄色网| 国产麻豆另类AV| 国产尤物在线播放| 亚洲青涩在线| 精品亚洲国产成人AV| 91无码视频在线观看| 2021国产乱人伦在线播放 | 色婷婷在线播放| 色综合成人| 日韩小视频在线观看| 国产精品福利尤物youwu| 在线观看无码av免费不卡网站 | 亚洲欧洲日产国码无码av喷潮| 亚洲女同一区二区| 久久免费视频6| 欧美午夜在线视频| JIZZ亚洲国产| 高清欧美性猛交XXXX黑人猛交| 国产成人8x视频一区二区| 国产SUV精品一区二区| 欧美中出一区二区| 国产成人高清亚洲一区久久| 毛片久久网站小视频| 在线视频精品一区| 激情無極限的亚洲一区免费 | 午夜国产在线观看| AV老司机AV天堂| 91毛片网| 亚洲综合专区| 亚洲国产成人无码AV在线影院L|