直播推薦
企業(yè)動(dòng)態(tài)
- 紛享銷(xiāo)客發(fā)布首個(gè)企業(yè)級(jí)智能CRM平臺(tái)ShareAI
- 揭秘西企業(yè)數(shù)字化+低碳化轉(zhuǎn)型“工具箱”:西門(mén)子X(jué)celerator
- 企業(yè)AI賦能數(shù)智制造,用友U9 cloud世界級(jí)云ERP煥新升級(jí)
- 《“智“領(lǐng)石化,“質(zhì)“造未來(lái)——威圖石化行業(yè)數(shù)智化實(shí)踐白皮書(shū)》隆重發(fā)布
- 攜手共贏!德國(guó)Agfa搭載瑞典IPCO鋼帶,實(shí)現(xiàn)印刷設(shè)備振動(dòng)銳減6倍,提升印刷速度與精度
- 創(chuàng)四方集團(tuán)榮獲“知名商標(biāo)品牌閃亮”證書(shū),助力品牌戰(zhàn)略升級(jí)
- 皇冠CAD(CrownCAD)2025 R3版本來(lái)了,率先開(kāi)啟C“Ai”D時(shí)代!
- 電費(fèi)砍半!中國(guó)制冷展:海爾發(fā)布AI建筑最新成果
推薦展會(huì)
按照我的開(kāi)發(fā)過(guò)程想分以下幾部分逐一介紹。
1.開(kāi)發(fā)平臺(tái)的選擇和論證
2.開(kāi)發(fā)環(huán)境的建立
3.一般程序的開(kāi)發(fā)
4.Linux程序向ARM+uClinux平臺(tái)的移植
5.剩下的問(wèn)題
希望諸位多多補(bǔ)充自己的想法,以利于大家共同提高。
1. 開(kāi)發(fā)平臺(tái)的選擇和論證
一個(gè)項(xiàng)目拿到手,如何選擇開(kāi)發(fā)平臺(tái)(主要是指CPU和操作系統(tǒng)以及開(kāi)發(fā)環(huán)境和工具)應(yīng)該說(shuō)至關(guān)重要,有時(shí)這不光影響進(jìn)度,產(chǎn)品質(zhì)量,可維護(hù)性等一般問(wèn)題,甚至涉及到方案的可實(shí)現(xiàn)性。本人結(jié)合自己的網(wǎng)絡(luò)監(jiān)控系統(tǒng)簡(jiǎn)單歸納了一些對(duì)平臺(tái)的考慮,還請(qǐng)各位補(bǔ)充。
從系統(tǒng)功能實(shí)現(xiàn)考慮:
(1) 是否有片上外設(shè),指令或配套的軟件模塊直接實(shí)現(xiàn)系統(tǒng)功能要求。 感 覺(jué)這一條對(duì)很多人的決策影響很大
(2) 價(jià)格
這一點(diǎn)應(yīng)通過(guò)CPU提供的資源綜合考慮,它提供了多少有用的資源,多少?zèng)]用的資源(那可都是銀子呀?。?,還是那三個(gè)字,性?xún)r(jià)比,另一方面,是要抓主要矛盾,是不是有些特性是必須的,什么特性是用戶(hù)需求里的亮點(diǎn)(就靠這些亮點(diǎn)往上抬價(jià)),這時(shí)該花的就得花了。
(3) 功耗
本系統(tǒng)對(duì)CPU功耗要求不高,但對(duì)移動(dòng)設(shè)備,這一點(diǎn)可是致命,而且這一點(diǎn)不是僅針對(duì)CPU,所有幾乎器件都要勒緊褲腰帶運(yùn)行。
(4) 處理速度
這項(xiàng)不用多說(shuō),大家都明白重要性,但具體算起來(lái)可是一門(mén)學(xué)問(wèn),一方面是自己需要多快的速度,如果加上非實(shí)時(shí)操作系統(tǒng)這事就不好控制,余量還是大點(diǎn)穩(wěn)妥,另一方面,CPU指令周期多少,有沒(méi)有流水,有沒(méi)有并行,什么體系結(jié)構(gòu),有沒(méi)有指令(看人家DSP多牛,干這事*),對(duì)外部存儲(chǔ)器和外設(shè)的存取速度等等,哪一個(gè)慢了都叫瓶頸。
(5) 需要的硬件支持(如外部存儲(chǔ)器,雙電源等)
這算是雜項(xiàng),但會(huì)增加額外的價(jià)格,系統(tǒng)體積等,不容忽視。
從的角度考慮:
(1) 是否有足夠的包括demo版及原理圖,demo程序,操作系統(tǒng)和BSP,測(cè)試開(kāi)發(fā)工具等。
(2) 自身?xiàng)l件;包括對(duì)項(xiàng)目開(kāi)發(fā)周期的要求,開(kāi)發(fā)人員對(duì)器件和開(kāi)發(fā)模式的熟悉程度以及掌握的難易程度。
(3) 可用資源是否豐富(書(shū)籍,網(wǎng)絡(luò)等)
以上三點(diǎn)主要考慮迅速開(kāi)發(fā)出穩(wěn)定的系統(tǒng)。
(4) 系統(tǒng)的可繼承性,可移植性和可擴(kuò)展性。
(5) 是否有現(xiàn)貨。
(6) 方案提供商的素質(zhì)。(包括技術(shù)水平和服務(wù)意識(shí))。
根據(jù)以上考慮選擇了s3c4510b(ARM7TDMI)+uClinux開(kāi)發(fā)模式
(1) 以下是該平臺(tái)對(duì)我的系統(tǒng)的滿(mǎn)足情況:(和上面幾點(diǎn)對(duì)應(yīng))
本監(jiān)控系統(tǒng)硬件部分主要要求以下部分:
a.以太網(wǎng)接口 (s3c4510b自帶網(wǎng)絡(luò)控制器)
b.串口 (自帶)
c.與數(shù)據(jù)采集芯片的接口(8位數(shù)據(jù)線,小于8位地址總線)。(自帶)
本系統(tǒng)軟件部分主要要求以下部分:
a. 硬件接口驅(qū)動(dòng)程序 (uClinux提供串口和網(wǎng)絡(luò)控制器驅(qū)動(dòng))
b. 網(wǎng)絡(luò)協(xié)議棧支持(uClinux提供TCPIP,UDP等的協(xié)議棧)
c. 應(yīng)用層程序(如果算上可以從linux移植的程序來(lái)看,那就太多了,我就用到了一個(gè)現(xiàn)成的)
(2) 本應(yīng)用系統(tǒng)不是那種批量的東西,對(duì)價(jià)格要求不苛刻,而且這款CPU*可以到55左右,可以接受。
(3) 本應(yīng)用系統(tǒng)有固定電源,功耗要求不高。當(dāng)然,據(jù)說(shuō)ARM在節(jié)省功耗上很有特點(diǎn)。
(4) 本應(yīng)用系統(tǒng)速度方面要滿(mǎn)足兩方面:1。串口:115200bps 2。網(wǎng)絡(luò)速度 能到10Mbps就行,所以對(duì)系統(tǒng)速度要求也不高。這款A(yù)RM內(nèi)部可以到50M。
(5) 系統(tǒng)對(duì)體積要求也不高,加片flash和RAM還是沒(méi)問(wèn)題(到目前為止感覺(jué)我的系統(tǒng)真是無(wú)欲無(wú)求?。?/p>
從的角度考慮:
(1) 因?yàn)闀r(shí)間很緊(一個(gè)半月),所以支持越多越好。目前從開(kāi)發(fā)商那里拿到了開(kāi)發(fā)板,原理圖,uClinux,相應(yīng)驅(qū)動(dòng),bootloader,拿來(lái)就可以用了。軟件硬件并行開(kāi)發(fā)。(bootloader和網(wǎng)絡(luò)控制器驅(qū)動(dòng)沒(méi)提供原碼,比較可惜:-(
(2) 當(dāng)時(shí)我對(duì)嵌入式系統(tǒng)的開(kāi)發(fā)模式和ARM都是只有耳聞,linux接觸過(guò)一個(gè)月左右?,F(xiàn)在想起來(lái)有些后怕。
(3) 網(wǎng)上的資源,非常多。
提供一些我常用的。
/ uClinux的大本營(yíng)。
/ 里面有些技術(shù)文章非常不錯(cuò)。
/
/ 這是國(guó)產(chǎn)的linux站點(diǎn)。
uClinux-dev@ 這是uClinux的郵件列表,回答問(wèn)題的都是大牛,非常有幫助,記住把你的郵件設(shè)置成純文本格式。 申請(qǐng)是在:
::URL::http://mailman./mailman/listinfo/uClinux-dev web方式。
(4) 采用以上開(kāi)發(fā)模式,軟件的可維護(hù)性,可移植性和可擴(kuò)展性都不錯(cuò)。
(5) 目前該CPU使用還是比較普遍,現(xiàn)貨沒(méi)問(wèn)題。
(6) 方案提供商的素質(zhì)嗎……..還算可以吧:-)
根據(jù)以上考慮和目前的開(kāi)發(fā)情況,這套方案還是比較令人滿(mǎn)意。
今天先回家了,下回介紹具體開(kāi)發(fā)步鄹吧。
2.開(kāi)發(fā)環(huán)境的建立。
先說(shuō)兩句廢話為和我以前一樣對(duì)操作系統(tǒng)(尤其是嵌入式操作系統(tǒng))迷惑的弟兄解釋些概念。因?yàn)榭偸怯腥嗽趩?wèn)是不是一定要用操作系統(tǒng),我的CPU能不能移植操作系統(tǒng),可以移植什么操作系統(tǒng),有了操作系統(tǒng)可不可以運(yùn)行某些程序。
從我的個(gè)人經(jīng)歷來(lái)講,這其實(shí)就是許多硬件出身的弟兄對(duì)操作系統(tǒng)這個(gè)東西有神秘感(和我一年前一樣)。說(shuō)白了,操作系統(tǒng)就是一段設(shè)計(jì)非常巧妙的程序,和你自己的程序從本質(zhì)講沒(méi)有區(qū)別,于是,以上問(wèn)題轉(zhuǎn)為,我是不是一定要用這段程序,我的CPU能不能運(yùn)行這段程序,可以跑什么樣的程序。這個(gè)程序可以跑,調(diào)用這個(gè)程序接口的另一個(gè)程序能不能跑!
答案也就變得簡(jiǎn)單,操作系統(tǒng)對(duì)任何一個(gè)CPU都不是必須的(對(duì)嵌入式系統(tǒng)更是如此),你可以自己編些程序在沒(méi)有操作系統(tǒng)的PC裸機(jī)上跑(BIOS就是這樣的),像玩C51一樣,(雖然的讓人有些心痛),或者移植UCOS到上面。另一方面,現(xiàn)代操作系統(tǒng)大多需要一些硬件的支持,(像保護(hù)模式的實(shí)現(xiàn)),反過(guò)來(lái)說(shuō),CPU中專(zhuān)門(mén)有針對(duì)支持操作系統(tǒng)的體系結(jié)構(gòu),這樣,許多操作系統(tǒng)的實(shí)現(xiàn)是挑剔硬件平臺(tái)的。其實(shí)其它程序也一樣,你編的程序使用的片上外設(shè)另一CPU上沒(méi)有,那這段程序就無(wú)法移植了。這就是話粗理不粗。書(shū)歸正傳,還是聊聊ARM+uClinux開(kāi)發(fā)模式下開(kāi)發(fā)環(huán)境的建立(其實(shí)下面說(shuō)到的東西不于這種硬件平臺(tái)和操作系統(tǒng))
很久以前就在介紹嵌入式系統(tǒng)開(kāi)發(fā)的書(shū)上見(jiàn)過(guò)“交叉編譯環(huán)境”這詞,當(dāng)時(shí)覺(jué)得很玄,用了以后才知道,其實(shí)就是解決在誰(shuí)的地盤(pán)上用誰(shuí)的工具編誰(shuí)的代碼問(wèn)題。
編譯的zui主要的工作就在將你的程序轉(zhuǎn)化成運(yùn)行該程序的CPU所能識(shí)別的機(jī)器代碼,不同的CPU有相應(yīng)的編譯器,另一方面。編譯器本身也是程序,當(dāng)然也要在某一個(gè)CPU平臺(tái)上運(yùn)行。于是交叉編譯的交叉點(diǎn)就在那個(gè)編譯器本身是CPU1上的一個(gè)程序,卻在為CPU2編譯代碼(整個(gè)一個(gè)吃里扒外?。?。這么一想,以前用51和dsp的開(kāi)發(fā)軟件(大部分都是IDE-集成開(kāi)發(fā)環(huán)境)開(kāi)發(fā)程序時(shí),都算是交叉編譯啦。當(dāng)然,假如在你的ARM系統(tǒng)上,操作系統(tǒng)已經(jīng)正常運(yùn)行,并且你的資源足夠多,你可以把PC機(jī)上運(yùn)行的ARM編譯工具移植到ARM上,然后所有該系統(tǒng)的應(yīng)用程序都直接在ARM系統(tǒng)上編譯,這就不算交叉編譯,但如果有條件這么作,程序的開(kāi)發(fā)或者移植就方便多了,因?yàn)檎麄€(gè)開(kāi)發(fā)過(guò)程又回到在自己PC機(jī)上編應(yīng)用程序的那種模式了,那就是在自己的地盤(pán)上用自己的編譯器編自己的應(yīng)用程序。
與不使用操作系統(tǒng)的開(kāi)發(fā)模式不同(此處的操作系統(tǒng)尤其指提供了專(zhuān)門(mén)的接口函數(shù)庫(kù)的操作系統(tǒng),目前的UCOS就不算),在目標(biāo)板(就是實(shí)現(xiàn)系統(tǒng)的板子)使用操作系統(tǒng)的開(kāi)發(fā)模式下,交叉編譯環(huán)境中還需要該對(duì)應(yīng)該操作系統(tǒng)的庫(kù)。比如uClinux提供的uClibc。此時(shí),開(kāi)發(fā)用的主機(jī)上不光要有目標(biāo)板CPU所需的編譯工具,還要有對(duì)應(yīng)操作系統(tǒng)的庫(kù),又因?yàn)橐话銕?kù)文件還要在開(kāi)發(fā)機(jī)上拿目標(biāo)CPU的編譯器重新編譯一下,所以還要把操作系統(tǒng)的原碼也放到開(kāi)發(fā)機(jī)上。(唉,跟目標(biāo)板沒(méi)什么關(guān)系,卻要幫它背這么多東西,真是上輩子欠它的?。。?br />雖然操作系統(tǒng)的接口庫(kù)至關(guān)重要,但大家似乎已經(jīng)淡忘了它的存在。這些多是因?yàn)榇蠹乙呀?jīng)遠(yuǎn)離了刀耕火種的年代(需要告訴編譯器需要的include路徑, lib路徑,以及l(fā)ib的名稱(chēng)),集成的編譯環(huán)境讓我們編譯鏈接的所有繁瑣工作化作對(duì)BUILD按鈕的瀟灑一擊。而且不論是windows環(huán)境,還是 linux環(huán)境,都有環(huán)境變量去記錄這些參數(shù)。。但嘗試將/usr/lib目錄改一個(gè)名字,你就會(huì)知道你不能無(wú)視他們的存在,因?yàn)椴僮飨到y(tǒng)的功能都是通過(guò)這些庫(kù)來(lái)交給應(yīng)用層程序使用的。當(dāng)然如果你的系統(tǒng)不依靠任何操作系統(tǒng),像zui原始的那種*自己實(shí)現(xiàn)所有代碼,就只需要一個(gè)編譯工具,少了這些羅嗦事。
以上的東西一般時(shí)候是沒(méi)有必要仔細(xì)研究,但交叉環(huán)境下開(kāi)發(fā)或移植比較大的程序時(shí),你可能就需要了解編譯器,鏈接器等開(kāi)發(fā)工具的幾乎所有重要參數(shù)。
我在開(kāi)發(fā)時(shí),主機(jī)*使用的是linux,如果有條件,建議大家這樣作,linux的使用沒(méi)有想象的復(fù)雜(雖然我現(xiàn)在身邊還要放一本關(guān)于linux使用的書(shū)籍),而且開(kāi)發(fā)程序可以先在主機(jī)上調(diào)通,然后用交叉編譯工具為目標(biāo)系統(tǒng)重新編譯一遍,可以這樣做是因?yàn)橹鳈C(jī)是linux,目標(biāo)系統(tǒng)跑uClinux,兩個(gè)操作系統(tǒng)提供的應(yīng)用程序接口幾乎是一樣的,所以程序幾乎不用修改。
在我的系統(tǒng)上,建立基本的開(kāi)發(fā)環(huán)境過(guò)程如下。
(1) 安裝gnu開(kāi)發(fā)工具鏈(是GNU開(kāi)發(fā)的針對(duì)ARM CPU的一組編譯開(kāi)發(fā)程序(是linux程序)。包括arm-elf-gcc,arm-elf-ld等
(2) 將uClinux源代碼源代碼解壓到相應(yīng)路徑下,按照編譯內(nèi)核的步鄹編譯一遍(此時(shí)使用的編譯工具已經(jīng)是上面提到的ARM編譯工具了,因?yàn)樗贏RM CPU上運(yùn)行,另外,和編譯linux內(nèi)核一樣,此時(shí)可以通過(guò)menuconfig來(lái)對(duì)內(nèi)核提供的功能進(jìn)行裁減
(3) 將庫(kù)(uClibc)解壓到相應(yīng)路徑下,用以上工具編譯一遍。
這樣zui基本的環(huán)境就算搭建好了。
以上工作對(duì)于做過(guò)的人來(lái)說(shuō)比較簡(jiǎn)單,這里介紹一下幫助沒(méi)有使用或剛開(kāi)始使用這種開(kāi)發(fā)模式的弟兄們理清一下思路。
3.應(yīng)用程序的開(kāi)發(fā)
因?yàn)槟繕?biāo)板上用uClinux,它提供的程序接口和linux下的基本一致,不一致的部分主要在于uClinux不支持MMU(應(yīng)該說(shuō)是uClinux是為不帶MMU的cpu定制的),*的就是fork函數(shù)要用vfork函數(shù)替代,這也是編程時(shí),感覺(jué)zui不爽的一點(diǎn)(沒(méi)辦法,誰(shuí)讓咱們的CPU有生理缺陷)。另一個(gè)不易覺(jué)察的差異在于uClinux提供的庫(kù)uClibc是經(jīng)過(guò)裁減的。更適合于資源緊張的嵌入式系統(tǒng)(上回分解已經(jīng)說(shuō)了,應(yīng)用程序很大一部分是在和庫(kù)函數(shù)打交道,而且大家zui終是鏈在一起,所以庫(kù)函數(shù)大了,你的程序也小不了)。
于是基于這種開(kāi)發(fā)模式的應(yīng)用程序開(kāi)發(fā)變成了linux下的程序開(kāi)發(fā)。而且在實(shí)際中一般是編好了程序先在主機(jī)上拿主機(jī)平臺(tái)上的編譯器編譯并且調(diào)試一下(linux下的編譯器就是gcc了),當(dāng)然前提是被調(diào)試的程序中需要的硬件條件主機(jī)具備,例如我的程序中有一段是針對(duì)串口的,于是先在主機(jī)編一個(gè)串口程序,調(diào)通以后拿目標(biāo)板的編譯器重新編譯一下(如果看了上一章“交叉編譯環(huán)境”,這里就不會(huì)暈了),下載到目標(biāo)板上運(yùn)行,一般來(lái)說(shuō)就可以直接用了。
以上也是為什么我認(rèn)為開(kāi)發(fā)嵌入式linux 程序主機(jī)應(yīng)該選用 linux環(huán)境。對(duì)于以前沒(méi)用過(guò)linux的人來(lái)說(shuō)(比如我),開(kāi)發(fā)程序前應(yīng)該花3,4天時(shí)間熟悉linux環(huán)境,尤其是它的編輯器,用慣集成編譯環(huán)境的人有時(shí)連編譯器和編輯器的概念都模糊了,所以一般是直接進(jìn)入集成編譯環(huán)境,連寫(xiě)帶編一氣呵成,殊不知有些集成編譯器提供的編輯器弱智的一塌胡涂,如果用熟了linux下的emacs,你就會(huì)發(fā)現(xiàn)他們之間的差距大概……要像我和蓋茨那么大吧。所以編程序時(shí)應(yīng)該選一款的編輯器,linux下,我當(dāng)然選 emacs,雖然剛看見(jiàn)它的感覺(jué)是外表丑陋,使用復(fù)雜。但只要多用多練,對(duì)提率很有幫助。(將你的程序用兩個(gè)編輯器完成,一半是用emacs的,一半是不用emacs的,看看效果:-)
對(duì)具體的linux編程我就不板門(mén)弄斧了,需要提個(gè)醒的是咱硬件出身的人作軟件應(yīng)該養(yǎng)成良好的編程習(xí)慣,別讓作軟件的笑話咱。因?yàn)樽髁诵┚W(wǎng)絡(luò)應(yīng)用,所以介紹一些網(wǎng)絡(luò)編程時(shí)要用到的和書(shū)籍;
<>w.Richard.Stevens. 這可是linux網(wǎng)絡(luò)編程的圣經(jīng)級(jí)的書(shū)籍
::URL::/a4/b7/ 適合于網(wǎng)絡(luò)編程的入門(mén)。
還有IBM中國(guó)上關(guān)于linux的教程和文章,都是翻譯過(guò)來(lái)的,有很多寫(xiě)非常不錯(cuò)。
其實(shí)類(lèi)似的資源不計(jì)其數(shù),遇到問(wèn)題時(shí)應(yīng)該先到google上狂搜一圈。
重點(diǎn)想說(shuō)些關(guān)于編譯器的東西,不了解它,在交叉編譯環(huán)境下編譯程序就寸步難行了,這無(wú)非是因?yàn)榻徊婢幾g環(huán)境下目標(biāo)板編譯器所處的寄人籬下的悲慘環(huán)境。想想在 linux下將myprogram.c編譯鏈接成應(yīng)用程序myprogram,zui簡(jiǎn)單的一句 gcc –o myprogram myprogram.c 就可以了。(其實(shí)在諸如VC下你也可以找到類(lèi)似的命令,集成開(kāi)發(fā)環(huán)境只不過(guò)替你來(lái)調(diào)用它了)。一切看起來(lái)天經(jīng)地義。
但試著把/usr/include路徑改一個(gè)名字(比如改成stupid_include),再這樣編譯一下,會(huì)發(fā)現(xiàn)程序中被< >引用的頭文件(比如#Include)都找不到了。因?yàn)榫幾g器看見(jiàn)這樣的頭文件會(huì)到系統(tǒng)的路徑下尋找,而這個(gè)路徑是由環(huán)境變量保存的(linux和windows下都是這樣的)。針對(duì)以上情況,不將路徑名字改回去,但是給編譯器加一個(gè)參數(shù)如下:
gcc –I/usr/stupid_include –o myprogram myprogram.c 會(huì)發(fā)現(xiàn)錯(cuò)誤信息沒(méi)了,一切又恢復(fù)了往日的寧?kù)o,頓時(shí)明白,不用環(huán)境變量,通過(guò)參數(shù),同樣可以將這些信息告訴編譯器。返回來(lái)說(shuō)說(shuō)你的目標(biāo)編譯器,雖然占用了人家的地盤(pán),編譯器,頭文件,庫(kù)文件,一個(gè)都不少,但你要編一個(gè)程序編譯器照樣發(fā)暈,因?yàn)闆](méi)有環(huán)境變量告訴它自己需要的頭文件和庫(kù)文件在哪里??磥?lái)只有兩種辦法,一個(gè)是搶占了主機(jī)的環(huán)境變量改成自己的(整個(gè)兒一個(gè)土匪),或者在編譯時(shí)加上必要參數(shù)(還是這樣紳士一些),告訴編譯器需要的文件的位置。(除此之外,還有其他一些參數(shù)也是如此)。
從源程序到可執(zhí)行文件根據(jù)情況不同可能分好幾步,一般每一步可能都會(huì)有一個(gè)應(yīng)用程序?qū)崿F(xiàn),像gnu提供的arm開(kāi)發(fā)工具鏈其實(shí)就是這么一組程序。提供從編譯到鏈接到格式轉(zhuǎn)化的全套服務(wù)。你可以用arm-elf-gcc命令一步到底直接產(chǎn)生可執(zhí)行文件(其實(shí)也是在自己的任務(wù)完成后調(diào)用下一個(gè)程序),也可以每一步加上自己的參數(shù),只作自己的事。
編譯器的主要參數(shù)的使用下次將程序的移植時(shí)再講。這里想說(shuō)一下編譯器產(chǎn)生應(yīng)用程序的幾個(gè)主要步鄹,講這個(gè)問(wèn)題的原因還是很多人無(wú)法區(qū)分諸如編譯和鏈接,不用問(wèn),這一切還是IDE集成開(kāi)發(fā)環(huán)境惹的禍。有人會(huì)說(shuō),IDE招你惹你了,你老貶它。其實(shí)不然,首先以上說(shuō)的東西一般在IDE的project菜單下的 option或build option中找到,只是一般不用管罷了。另一個(gè)方面,IDE就像是傻瓜照相機(jī),很多工作他都幫你完成了,使用簡(jiǎn)單。但如果要做攝影師的話,你就少不了要對(duì)每一個(gè)細(xì)節(jié)都了解。其實(shí)編譯程序也是一樣。(你可以對(duì)優(yōu)化,警告級(jí),宏定義等諸多選項(xiàng)進(jìn)行自己的選擇)。以下是幾個(gè)主要步鄹:(以下有些我也不確認(rèn),如發(fā)現(xiàn)問(wèn)題,請(qǐng)及時(shí)糾正。
(1) 預(yù)編譯。主要工作就是處理所有#開(kāi)頭的,包括頭文件。以前搞不清頭文件和可執(zhí)行文件有沒(méi)有什么(因?yàn)榭偪匆?jiàn)兩個(gè)文件名字取一樣的),現(xiàn)在知道,他們之間沒(méi)有任何。在預(yù)編譯結(jié)束后,頭文件的使命就結(jié)束了。在下一次介紹不同平臺(tái)程序移植時(shí)可以看到,預(yù)編譯有時(shí)非常有用。
(2) 編譯。編譯應(yīng)該是zui主要的一步,就是將源文件生成CPU能識(shí)別的語(yǔ)言,一般是后綴為.o的目標(biāo)文件,應(yīng)該說(shuō),此時(shí)的文件就已經(jīng)可以執(zhí)行了。當(dāng)然這個(gè)時(shí)候外部函數(shù)等外部符號(hào)都沒(méi)有引入,對(duì)于被編譯程序來(lái)說(shuō),這些外部符號(hào)還只是留一個(gè)倩影,壓根兒不知它在不在。你可以在你的程序里調(diào)用一個(gè)不存在的函數(shù),甚至都不用聲明,在編譯階段,很多編譯器只是給個(gè)警告。只有在鏈接時(shí)才會(huì)報(bào)錯(cuò)。(呵呵,夠弱智?。?br />(3) 鏈接:鏈接才是清帳的時(shí)候,以前在程序里用到的外部符號(hào)都要把真正的東西交出來(lái)。你可以需要連接在一起的目標(biāo)文件,也可以告訴編譯器庫(kù)文件的名字和路徑(方法下次講)。編譯器會(huì)去找,需要注意的是,庫(kù)的需要注意順序。首先,如果不同的庫(kù)里有同名函數(shù),并且該函數(shù)被調(diào)用,那么在前面的就被鏈接進(jìn)去了,這一點(diǎn)對(duì)于頭文件路徑的也適用,如果你自己的頭文件和系統(tǒng)頭文件相同,并且你的頭文件路徑在系統(tǒng)頭文件路徑前面,你的頭文件就會(huì)代替頭文件。庫(kù)文件是由相應(yīng)的程序(linux下是ar命令)將需要被添加到庫(kù)里的目標(biāo)文件(該文件是編譯階段生成的)組織起來(lái)生成檔案文件,同時(shí)可以建立一個(gè)檢索,檢索內(nèi)容為所包含的目標(biāo)文件中定義的符號(hào)。也就是說(shuō),庫(kù)文件并不是必須的,但它為經(jīng)常使用的目標(biāo)文件中的函數(shù)提供了快速的檢索機(jī)制。
以上就是主要的步鄹,當(dāng)然除此之外,還有一些用于格式轉(zhuǎn)換的工具等。不一一介紹。知道編譯器的細(xì)節(jié)對(duì)于程序的開(kāi)發(fā)和移植都是很有好處的。
程序開(kāi)發(fā)過(guò)程中調(diào)試也是至關(guān)重要,因?yàn)榭梢韵仍谥鳈C(jī)上調(diào)試,所以可以使用linux下的gdb,(有點(diǎn)像dos 下的debug)。但是只是用到了皮毛,還有一個(gè)于宿主機(jī)模式的調(diào)試工具gdbserver,一直沒(méi)時(shí)間研究,希望用過(guò)的大俠多發(fā)些文章鋪路。
另外還會(huì)遇到如何作ramdisk,如何讓系統(tǒng)啟動(dòng)自己的程序,這些都太linux了,沒(méi)接觸過(guò)linux的人會(huì)暈,為了大家的健康,就不講了,遇到問(wèn)題可以給我,大家一起討論。
免責(zé)聲明
- 凡本網(wǎng)注明"來(lái)源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://towegas.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
- 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
- 本網(wǎng)轉(zhuǎn)載并注明自其它來(lái)源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。
- 如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
2025第十一屆中國(guó)國(guó)際機(jī)電產(chǎn)品交易會(huì) 暨先進(jìn)制造業(yè)博覽會(huì)
展會(huì)城市:合肥市展會(huì)時(shí)間:2025-09-20