kl25-ch05構(gòu)件化開發(fā)方法與底層驅(qū)動(dòng)封裝_第1頁(yè)
kl25-ch05構(gòu)件化開發(fā)方法與底層驅(qū)動(dòng)封裝_第2頁(yè)
kl25-ch05構(gòu)件化開發(fā)方法與底層驅(qū)動(dòng)封裝_第3頁(yè)
kl25-ch05構(gòu)件化開發(fā)方法與底層驅(qū)動(dòng)封裝_第4頁(yè)
kl25-ch05構(gòu)件化開發(fā)方法與底層驅(qū)動(dòng)封裝_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章構(gòu)件化開發(fā)方法與底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范主要內(nèi)容:5.1嵌入式硬件構(gòu)件與底層軟件構(gòu)件5.2基于硬件構(gòu)件的嵌入式系統(tǒng)硬件電路設(shè)計(jì)5.3基于硬件構(gòu)件的嵌入式底層軟件構(gòu)件的編程方法5.4底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范5.5本章小結(jié)5.1嵌入式硬件構(gòu)件與底層軟件構(gòu)件軟件產(chǎn)業(yè)的發(fā)展借鑒了機(jī)械、建筑等傳統(tǒng)產(chǎn)業(yè)先生產(chǎn)符合標(biāo)準(zhǔn)的構(gòu)件(零部件),然后將標(biāo)準(zhǔn)構(gòu)件按照規(guī)則組裝成實(shí)際產(chǎn)品的模式。而隨著微控制器及應(yīng)用處理器內(nèi)部RAM及Flash存儲(chǔ)器容量的增大,以及外部模塊內(nèi)置化程度的提高,嵌入式系統(tǒng)的設(shè)計(jì)復(fù)雜性、設(shè)計(jì)規(guī)模及開發(fā)手段已經(jīng)發(fā)生了根本變化。為此希望提高軟硬件設(shè)計(jì)可重用性與可移植性,構(gòu)件的制作與應(yīng)用是重用與移植的基礎(chǔ)與保障。5.1.1嵌入式硬件構(gòu)件的概念要提高硬件設(shè)計(jì)可重用性與可移植性,就必須有工程師們共同遵守的硬件設(shè)計(jì)規(guī)范。設(shè)計(jì)人員若憑借個(gè)人工作經(jīng)驗(yàn)和習(xí)慣的積累進(jìn)行系統(tǒng)硬件電路的設(shè)計(jì),往往每次都需從零開始,若在已有類似原理圖上修改又很麻煩,容易出錯(cuò)。因此把構(gòu)件的思想引入到硬件原理圖設(shè)計(jì)中。

嵌入式硬件構(gòu)件是指將一個(gè)或多個(gè)硬件功能模塊、支撐電路及其功能描述封裝成一個(gè)可重用的硬件實(shí)體,并提供一系列規(guī)范的輸入/輸出接口。據(jù)接口之間的生產(chǎn)消費(fèi)關(guān)系,接口可分為提供接口和需求接口兩類。根據(jù)所擁有接口類型的不同,硬件構(gòu)件分為核心構(gòu)件、中間構(gòu)件和終端構(gòu)件三種類型。5.1.2嵌入式底層驅(qū)動(dòng)構(gòu)件的概念

構(gòu)件(Component)是可重用的實(shí)體,它包含了合乎規(guī)范的接口和功能實(shí)現(xiàn),能夠被獨(dú)立部署和被第三方組裝。

軟件構(gòu)件(SoftwareComponent)是指,在軟件系統(tǒng)中具有相對(duì)獨(dú)立功能、可以明確辨識(shí)構(gòu)件實(shí)體。

嵌入式軟件構(gòu)件(EmbeddedSoftwareComponent)是實(shí)現(xiàn)一定嵌入式系統(tǒng)功能的一組封裝的、規(guī)范的、可重用的、具有嵌入特性的軟件構(gòu)件單元,是組織嵌入式系統(tǒng)功能的基本單位。

嵌入式軟件分為高層軟件構(gòu)件和底層軟件構(gòu)件(底層驅(qū)動(dòng)構(gòu)件)。高層軟件構(gòu)件與硬件無(wú)關(guān),而底層驅(qū)動(dòng)構(gòu)件與硬件密不可分,是硬件驅(qū)動(dòng)程序的構(gòu)件化封裝。5.2基于硬件構(gòu)件的嵌入式系統(tǒng)硬件電路設(shè)計(jì)5.2.1設(shè)計(jì)時(shí)需要考慮的基本問(wèn)題1.MCU的選擇選擇MCU時(shí)要考慮MCU所能夠完成的功能、MCU的價(jià)格、功耗、供電電壓、I/O口電平、管腳數(shù)目以及MCU的封裝等因素。

2.電源(1)考慮系統(tǒng)對(duì)電源的需求,例如系統(tǒng)需要幾種電估計(jì)各需要多少功率或最大電流(mA)。(2)考慮芯片與器件對(duì)電源波動(dòng)性的需求。一般允許電源波動(dòng)幅度在±5%以內(nèi)。對(duì)于A/D轉(zhuǎn)換芯片的參考電壓一般要求±1%以內(nèi)。(3)考慮工作電源是使用電源模塊還是使用電源電路。

3.普通I/O口(1)上拉、下拉電阻:考慮用內(nèi)部或者外部上/下拉電阻。(2)開關(guān)量輸入:一定要保證高低電壓分明。(3)開關(guān)量輸出:基本原則是保證輸出高電平接近電源電壓,低電平接近地電平。

4.A/D電路與D/A電路(1)A/D電路:要清楚前端采樣基本原理,對(duì)電阻型、電流型和電壓型傳感器采用不同的采集電路。如果采集的信號(hào)微弱,還要考慮如何進(jìn)行信號(hào)放大。(2)D/A電路:考慮MCU的引腳通過(guò)何種輸出電路控制實(shí)際對(duì)象。

5.控制電路對(duì)外控制電路要注意設(shè)計(jì)的冗余與反測(cè),要有合適的信號(hào)隔離措施等。在評(píng)估設(shè)計(jì)的布板時(shí),一定要在構(gòu)件的輸入輸出端引出檢測(cè)孔,以方便排查錯(cuò)誤時(shí)測(cè)量。

6.考慮低功耗低功耗設(shè)計(jì)并不僅僅是為了省電,更多的好處在于降低了電源模塊及散熱系統(tǒng)的成本。要做到低功耗一般需要注意以下幾點(diǎn):(1)并不是所有的總線信號(hào)都要上拉。(2)不用的I/O口不要懸空,如果懸空的話,受外界的一點(diǎn)點(diǎn)干擾就可能成為反復(fù)振蕩的輸入信號(hào),而MOS器件的功耗基本取決于門電路的翻轉(zhuǎn)次數(shù)。(3)對(duì)一些外圍小芯片的功耗也需要考慮。

7.考慮低成本(1)正確選擇電阻值與電容值。(2)指示燈的選擇。(3)不要什么都選最好的。5.2.2硬件構(gòu)件化電路原理圖繪制的簡(jiǎn)明規(guī)則1.硬件構(gòu)件設(shè)計(jì)的通用規(guī)則(1)元器件命名格式:對(duì)于核心構(gòu)件,其元器件直接編號(hào)命名,同種類型的元件命名時(shí)冠以相同的字母前綴。對(duì)于中間構(gòu)件和終端構(gòu)件,其元器件命名格式采用“構(gòu)件名-標(biāo)志字符?”。當(dāng)構(gòu)件原理圖應(yīng)用到具體系統(tǒng)中時(shí),可借助原理圖編輯軟件為其自動(dòng)編號(hào)。(2)為硬件構(gòu)件添加詳細(xì)的文字描述,包括中文名稱、英文名稱、功能描述、接口描述、注意事項(xiàng)等,以增強(qiáng)原理圖的可讀性。(3)將前兩步產(chǎn)生的內(nèi)容封裝在一個(gè)虛線框內(nèi),組成硬件構(gòu)件的內(nèi)部實(shí)體。(4)為該硬件構(gòu)件添加與其他構(gòu)件交互的輸入/輸出接口標(biāo)識(shí)。接口標(biāo)識(shí)有兩種:接口注釋和接口網(wǎng)標(biāo)。

2.核心構(gòu)件設(shè)計(jì)規(guī)則設(shè)計(jì)核心構(gòu)件時(shí),需考慮的問(wèn)題是:“核心構(gòu)件能為其他構(gòu)件提供哪些信號(hào)?”。

核心構(gòu)件其實(shí)就是某型號(hào)MCU的最小系統(tǒng)。

核心構(gòu)件設(shè)計(jì)的目標(biāo)是:凡是使用該MCU進(jìn)行硬件系統(tǒng)設(shè)計(jì)時(shí),核心構(gòu)件可以直接“組裝”到系統(tǒng)中,無(wú)須任何改動(dòng)。為了實(shí)現(xiàn)這一目標(biāo),在設(shè)計(jì)核心構(gòu)件的實(shí)體時(shí)必須考慮細(xì)致、周全,包括穩(wěn)定性、擴(kuò)展性等,封裝要完整。在進(jìn)行接口設(shè)計(jì)時(shí),需將所有可能使用到的引腳都標(biāo)注上接口網(wǎng)標(biāo)(不要考慮:核心構(gòu)件將會(huì)用到怎樣的系統(tǒng)中去)。若同一引腳具有不同功能,則接口網(wǎng)標(biāo)依據(jù)第一功能選項(xiàng)命名。遵循上述規(guī)則設(shè)計(jì)核心構(gòu)件的好處是:當(dāng)使用核心構(gòu)件和其他構(gòu)件一起組裝系統(tǒng)時(shí),只要考慮其他構(gòu)件將要連接到核心構(gòu)件的哪個(gè)接口(不是考慮:核心構(gòu)件將要連接到其他構(gòu)件的哪個(gè)接口),這也符合設(shè)計(jì)人員的思維習(xí)慣。

3.中間構(gòu)件設(shè)計(jì)規(guī)則設(shè)計(jì)中間構(gòu)件時(shí),需考慮的問(wèn)題是:“中間構(gòu)件需要接受哪些信號(hào),以及提供哪些信號(hào)?”。

中間構(gòu)件是核心構(gòu)件與終端構(gòu)件之間通信的橋梁。一個(gè)中間構(gòu)件應(yīng)具有明確的且相對(duì)獨(dú)立的功能,它既要有接受其他構(gòu)件提供的服務(wù)的接口,即需求接口,又要有為其他構(gòu)件提供服務(wù)的接口,即提供接口。描述需求接口采用接口注釋,描述提供接口采用接口網(wǎng)標(biāo)。為直觀起見(jiàn),設(shè)計(jì)中間構(gòu)件時(shí),將構(gòu)件的需求接口放置在構(gòu)件實(shí)體的左側(cè),提供接口放置在右側(cè)。電源控制構(gòu)件、可變頻率產(chǎn)生構(gòu)件是常用的中間構(gòu)件。

4.終端構(gòu)件設(shè)計(jì)規(guī)則設(shè)計(jì)終端構(gòu)件時(shí),需考慮的問(wèn)題是:“終端構(gòu)件需要什么信號(hào)才能工作?”。

終端構(gòu)件是嵌入式系統(tǒng)中最常見(jiàn)的構(gòu)件。

終端構(gòu)件沒(méi)有提供接口,它僅有與上一級(jí)構(gòu)件交付的需求接口,因而接口標(biāo)識(shí)均為斜體標(biāo)注的接口注釋。LCD(YM1602C)構(gòu)件、LED構(gòu)件、指示燈構(gòu)件以及鍵盤構(gòu)件等都是典型的終端構(gòu)件。

5.使用硬件構(gòu)件組裝系統(tǒng)的方法對(duì)于核心構(gòu)件,在應(yīng)用到具體的系統(tǒng)中時(shí),不必作任何改動(dòng)。具有相同MCU的應(yīng)用系統(tǒng),其核心構(gòu)件完全相同。對(duì)于中間構(gòu)件和終端構(gòu)件,在應(yīng)用到具體的系統(tǒng)中時(shí),僅需為需求接口添加接口網(wǎng)標(biāo),在不同的系統(tǒng)中,接口網(wǎng)標(biāo)名稱不同,但構(gòu)件實(shí)體內(nèi)部完全相同。使用硬件構(gòu)件化思想設(shè)計(jì)嵌入式硬件系統(tǒng)的過(guò)程與步驟是:(1)根據(jù)系統(tǒng)的功能劃分出若干個(gè)硬件構(gòu)件。(2)將所有硬件構(gòu)件原理圖“組裝”在一起。(3)為中間構(gòu)件和終端構(gòu)件添加接口網(wǎng)標(biāo)。5.2.3實(shí)驗(yàn)PCB板設(shè)計(jì)的簡(jiǎn)明規(guī)則印刷電路板(Printed-CircuitBoard,PCB)是由環(huán)氧樹脂粘合而成的鍍了銅的玻璃纖維板。蝕刻掉部分鍍銅,只留下以構(gòu)成電路互連通路的銅層走線。PCB可以是單層、雙層或者四層、六層、八層、十二層甚至更多。層數(shù)越多,連接的布線就越容易,但成本卻越高,調(diào)試也越難。

如果PCB有專用供電層和接地層,系統(tǒng)將會(huì)有更強(qiáng)的燥聲抗擾度。在使用電子設(shè)計(jì)自動(dòng)化軟件(如DXP)設(shè)計(jì)PCB時(shí)需注意以下幾個(gè)方面的問(wèn)題。

1.PCB板布局在正式走線之前要對(duì)PCB的大體格局進(jìn)行規(guī)劃。布局規(guī)劃應(yīng)遵循下列基本原則。(1)在PCB布板之前首先要打印出相應(yīng)的原理圖,然后根據(jù)原理圖確定整個(gè)PCB板的大體布局,即各個(gè)硬件構(gòu)件的位置安排。(2)PCB板的形狀如無(wú)其他要求,一般為矩形,長(zhǎng)寬比為4:3或3:2。(3)考慮面板上元件的放置要求。(4)考慮邊緣接口。

2.元件放置(1)元件放置要求整齊,盡可能正放,屬于同一硬件構(gòu)件內(nèi)的元件盡可能排放在一起。排列方位盡可能與原理圖一致,布線方向最好與電路圖走線方向一致。元器件在PCB上的排列可采用不規(guī)則、規(guī)則和網(wǎng)格等三種排列方式中的一種,也可同時(shí)采用多種。布局的元器件應(yīng)有利于發(fā)熱元器件散熱,高頻時(shí)要考慮元器件之間的分布參數(shù),高、低壓之間要隔離,隔離距離與承受的耐壓有關(guān)。(2)電容的位置要特別注意,其中電源模塊的濾波電容要求靠近電源,而IC的濾波電容要靠近IC的引腳。(3)考慮元件間的距離,防止元件之間出現(xiàn)重疊。還要考慮元器件的引腳間距,因?yàn)樗鼪Q定著焊盤放置間距。對(duì)于非標(biāo)準(zhǔn)器件的引腳間距的確定最直接的方法就是:使用游標(biāo)卡尺進(jìn)行測(cè)量。(4)PCB四周留有5-10mm空隙不布器件。(5)先放置占用面積較大的元器件,先集成后分立,先主后次,多塊集成電路時(shí)先放置主電路。(6)可調(diào)元件應(yīng)放置在便于調(diào)節(jié)的地方,質(zhì)量超過(guò)15g的元器件應(yīng)當(dāng)用支架,熱敏元件應(yīng)遠(yuǎn)離發(fā)熱元件。晶振應(yīng)平放,而不要豎直放置。(7)PLL濾波電路應(yīng)盡量靠近MCU。

3.有關(guān)設(shè)定(1)線寬。導(dǎo)線的最小寬度由導(dǎo)線與絕緣基板間的粘附強(qiáng)度和流過(guò)它們的電流值決定。一般地線寬度>電源線寬度>信號(hào)線寬度。(2)間距。導(dǎo)線間的間距由它們之間的安全工作電壓決定,相鄰導(dǎo)線之間的峰值電壓、基板的質(zhì)量、表面涂層、電容耦合參數(shù)等都影響導(dǎo)線的安全工作電壓(3)過(guò)孔大小。過(guò)孔大小設(shè)定要適中。4.布線布線時(shí),應(yīng)該首先對(duì)時(shí)鐘和高速信號(hào)進(jìn)行布線,以確保它們的走線盡可能直接。

石英晶振和對(duì)噪聲特別敏感的器件下面不要走線。

對(duì)總線進(jìn)行布線時(shí),盡可能地保持信號(hào)線平行走線,而時(shí)鐘信號(hào)線則要避免平行,且在這些導(dǎo)線之間最好加接地線。

布板完成后一定要進(jìn)行自動(dòng)與人工檢查。過(guò)孔數(shù)盡可能少。

最小系統(tǒng)中未使用的I/O口,可通過(guò)電阻接地。

走線盡量少拐彎,線寬不要突變,導(dǎo)線拐角應(yīng)≥90°,力求線條簡(jiǎn)單明了。

信號(hào)線的拐角應(yīng)設(shè)計(jì)成鈍角走向,為圓形或圓弧形,切忌畫成90°或更小角度形狀。

5.測(cè)量點(diǎn)考慮到硬件測(cè)試的方便,在PCB布板時(shí)要留下一些測(cè)量點(diǎn),以便調(diào)試之用。以下幾處需要留測(cè)量點(diǎn):(1)原理圖中模塊的輸入輸出引腳。(2)最小系統(tǒng)模塊中MCU的引腳。(3)各硬件功能模塊單元的輸入、輸出口;畫測(cè)量點(diǎn)的步驟是:引出、打孔、標(biāo)字??椎拇笮∫匀f(wàn)用表頭方便測(cè)量為原則,一般不要在線上直接打孔。

6.模塊標(biāo)示由于在整體布局時(shí),已經(jīng)將各個(gè)硬件構(gòu)件的組成元件放在一起,因而可在PCB板上用矩形框?qū)⒏鱾€(gè)硬件構(gòu)件區(qū)分開,并用漢字標(biāo)出構(gòu)件名(與原理圖一致),并注意字體字號(hào)。

7.鋪地在布板的最后都要鋪地,目的是減小干擾,提高PCB板的穩(wěn)定性。鋪地需注意:(1)在鋪地前,要設(shè)定地與導(dǎo)線、地與引腳之間的距離,并要求該距離盡可能大。(2)鋪地本應(yīng)該雙面鋪,作為實(shí)驗(yàn)用板,為了方便檢查,可只鋪反面地。(3)如果電路板中有數(shù)字地和模擬地,應(yīng)將它們隔離開,兩者間使用磁珠相連。8.空余位置的利用并標(biāo)注相關(guān)信息PCB板的空余位置可適度作如下用途:(1)電源、地??瞻滋幎嗔魩着烹娫春偷亍#?)雙排孔。留出幾排兩孔相連的排孔,以用來(lái)擴(kuò)展或試驗(yàn)時(shí)焊接其他元件。(3)固定孔。在PCB上畫固定板的固定孔,一般在板的四個(gè)角落。在完成PCB板的鋪地之后,要在板的正面適當(dāng)位置標(biāo)出以下信息:?jiǎn)挝弧⑷掌?、?zé)任人、PCB板的名稱、編號(hào)等。9.抗干擾問(wèn)題的特別考慮

1)熱干擾及抑制元器件在工作中都有一定程度的發(fā)熱,發(fā)出的熱量會(huì)對(duì)周邊比較敏感的器件產(chǎn)生干擾,若熱干擾得不到很好的抑制,整個(gè)電路的電性就會(huì)發(fā)生變化,最后造成短路.為了對(duì)熱干擾進(jìn)行抑制,可采取以下措施:(1)發(fā)熱元件的放置不要貼板放置,也可以單獨(dú)設(shè)計(jì)為一個(gè)功能單元,放在靠近邊緣容易散熱的地方。另外,發(fā)熱量大的器件與小熱量的器件應(yīng)分開放置。(2)大功率器件的放置應(yīng)盡量靠近邊緣布置,在垂直方向時(shí)應(yīng)盡量布置在板上方。(3)溫度敏感器件的放置對(duì)溫度比較敏感的器件應(yīng)安置在溫度最低的區(qū)域,千萬(wàn)不要將它放在發(fā)熱器件的正上方。(4)器件的排列與氣流非特定要求,一般設(shè)備內(nèi)部均以空氣自由對(duì)流進(jìn)行散熱,故元器件應(yīng)以縱式排列;若強(qiáng)制散熱,元器件可橫式排列。另外,為了改善散熱效果,可添加與電路原理無(wú)關(guān)的零部件以引導(dǎo)熱量對(duì)流。

2)共阻抗及抑制共阻干擾是由PCB上大量的地線造成,當(dāng)兩個(gè)或兩個(gè)以上的回路共用一段地線時(shí),不同的回路電流在共用地線上產(chǎn)生一定壓降,此壓降經(jīng)放大就會(huì)影響電路性能,當(dāng)電流頻率很高時(shí),會(huì)產(chǎn)生很大的感抗而使電路受到干擾。為了抑制共阻抗,可采取以下措施:(1)一點(diǎn)接地(2)就近多點(diǎn)接地(3)大面積接地(4)加粗接地線(5)D/A(數(shù)/模)電路的地線分開

3)電磁干擾及抑制電磁干擾是由電磁效應(yīng)而造成的干擾,針對(duì)由電源布線、信號(hào)布線產(chǎn)生的電磁干擾,可采取不同的措施。(1)電源布線可采用以下預(yù)防措施:布線要寬;加去耦電容(這種電容起到旁路濾波的作用,要在電源的輸入端并聯(lián)較大的和較小的濾波電容);地線環(huán)繞(地線要靠近供電電源母線和信號(hào)線,因電流沿路徑傳輸會(huì)產(chǎn)生回路電感,地線靠近,回路面積減小,電感量減小,回路阻抗減小,從而減小電磁干擾耦合)。(2)信號(hào)布線可采用以下預(yù)防措施:不同功能的單元電路(如數(shù)字電路與模擬電路,高頻與低頻)分開設(shè)置,布線圖形應(yīng)易于信號(hào)流通且使信號(hào)流向盡可能保持一致;合理使用屏蔽和濾波技術(shù),注意高低壓之間的隔離;盡量不選用比實(shí)際需要的速度更快的元件,在元件的位置安排上,易受電磁干擾的元器件不能相距太近,應(yīng)大于信號(hào)波長(zhǎng)的四分之一,輸入器件與輸出器件盡量遠(yuǎn)離;做到安全接地。5.3基于硬件構(gòu)件的嵌入式底層軟件構(gòu)件的編程方法5.3.1嵌入式硬件構(gòu)件和軟件構(gòu)件的層次模型嵌入式軟件構(gòu)件(EmbeddedSoftwareComponent,ESC)是實(shí)現(xiàn)一定嵌入式系統(tǒng)功能的一組封裝的、規(guī)范的、可重用的、具有嵌入特性的軟件單元,是組織嵌入式系統(tǒng)的功能單位。嵌入式軟件構(gòu)件分為高層軟件構(gòu)件和底層軟件構(gòu)件(以下簡(jiǎn)稱高層構(gòu)件和底層構(gòu)件)。高層構(gòu)件與硬件無(wú)關(guān)。通常,MCU內(nèi)部包含有GPIO(即通用IO)口和一些內(nèi)置功能模塊,而底層構(gòu)件與硬件密不可分,是硬件驅(qū)動(dòng)程序的封裝。可將通用I/O口的驅(qū)動(dòng)程序封裝為GPIO驅(qū)動(dòng)構(gòu)件,各內(nèi)置功能模塊的驅(qū)動(dòng)程序封裝為功能構(gòu)件,在硬件構(gòu)件層中,相對(duì)于核心構(gòu)件而言,中間構(gòu)件和終端構(gòu)件是核心構(gòu)件的“外設(shè)”。由這些“外設(shè)”的驅(qū)動(dòng)程序封裝而成的軟件構(gòu)件稱為底層外設(shè)構(gòu)件。注意,并不是所有的中間構(gòu)件和終端構(gòu)件都可以作為編程對(duì)象。由圖可看出,底層外設(shè)構(gòu)件可以調(diào)用底層內(nèi)部構(gòu)件,而高層構(gòu)件可以調(diào)用底層外設(shè)構(gòu)件和底層內(nèi)部構(gòu)件中的功能構(gòu)件,而不能直接調(diào)用GPIO驅(qū)動(dòng)構(gòu)件。另外,考慮到幾乎所有的底層內(nèi)部構(gòu)件都涉及到MCU各種寄存器的使用,因此將MCU的所有寄存器定義組織在一起,形成MCU頭文件,以便其他構(gòu)件頭文件中包含該頭文件。5.3.2底層構(gòu)件的實(shí)現(xiàn)方法與編程思想底層構(gòu)件是與硬件直接打交道的軟件,由頭文件和源程序文件兩部分組成。頭文件中的內(nèi)容主要有:包含下層構(gòu)件頭文件的#include語(yǔ)句、用以描述構(gòu)件屬性的宏定義語(yǔ)句以及對(duì)外接口函數(shù)原型說(shuō)明。

在頭文件中使用函數(shù)原型,對(duì)于建立代碼模塊和外部接口的規(guī)范,便于他人使用,都是很有幫助的。源程序文件中存放構(gòu)件的內(nèi)部函數(shù)和外部函數(shù)的定義,即函數(shù)的實(shí)現(xiàn)代碼,以完成函數(shù)所要實(shí)現(xiàn)的功能。在對(duì)底層構(gòu)件進(jìn)行設(shè)計(jì)時(shí),最關(guān)鍵的工作是要對(duì)構(gòu)件的共性和個(gè)性進(jìn)行分析,抽取出構(gòu)件的屬性和對(duì)外接口函數(shù)。盡量做到:當(dāng)一個(gè)底層構(gòu)件應(yīng)用到不同系統(tǒng)中時(shí),僅需修改構(gòu)件的頭文件,對(duì)于構(gòu)件的源程序文件則不必修改或改動(dòng)很小。在編寫構(gòu)件時(shí),一般應(yīng)注意以下幾方面的內(nèi)容:(1)構(gòu)件的頭文件名和源程序文件名一致,且為構(gòu)件名。(2)屬性和操作的命名統(tǒng)一以構(gòu)件名開頭。這樣做的好處是:當(dāng)使用底層構(gòu)件組裝軟件系統(tǒng)時(shí),避免構(gòu)件之間出現(xiàn)同名現(xiàn)象。(3)對(duì)MCU內(nèi)的模塊寄存器名和端口名進(jìn)行重定義,在其他的代碼里面都將使用宏名對(duì)模塊寄存器和端口進(jìn)行操作。這樣,當(dāng)?shù)讓域?qū)動(dòng)程序移植到其他MCU時(shí),只要修改重定義語(yǔ)句就可以了。(4)內(nèi)部函數(shù)與外部函數(shù)要設(shè)計(jì)合理,函數(shù)參數(shù)個(gè)數(shù)及類型要考慮全面。(5)應(yīng)用程序在使用底層構(gòu)件時(shí),嚴(yán)格禁止通過(guò)全局變量來(lái)傳遞參數(shù),所有的數(shù)據(jù)傳遞都要通過(guò)函數(shù)的形式參數(shù)來(lái)接收。這樣做不但使得接口簡(jiǎn)潔,更加避免了全局變量可能引發(fā)的安全隱患。5.3.3硬件構(gòu)件及底層軟件構(gòu)件的重用與移植方法

1.硬件構(gòu)件的重用與移植對(duì)于以單MCU為核心的嵌入式應(yīng)用系統(tǒng)而言,當(dāng)用硬件構(gòu)件“組裝”硬件系統(tǒng)時(shí),核心構(gòu)件(即最小系統(tǒng))有且只有一個(gè),而中間構(gòu)件和終端構(gòu)件可有多個(gè),并且相同類型的構(gòu)件可出現(xiàn)多次。下面以終端構(gòu)件LCD為例,介紹硬件構(gòu)件的移植方法。

2.底層構(gòu)件的移植當(dāng)一個(gè)已設(shè)計(jì)好的底層構(gòu)件移植到另外一個(gè)嵌入式系統(tǒng)中時(shí),其頭文件和程序文件是否需要改動(dòng)要視具體情況而定。例如:系統(tǒng)的核心構(gòu)件發(fā)生改變(即MCU型號(hào)改變)時(shí),底層內(nèi)部構(gòu)件頭文件和某些對(duì)外接口函數(shù)也要隨之改變,例如模塊初始化函數(shù)。而對(duì)于外接硬件構(gòu)件,希望不改動(dòng)程序文件,而只改動(dòng)頭文件,那么,頭文件就必須充分設(shè)計(jì)。以LCD構(gòu)件為例,與前圖相對(duì)應(yīng)的底層構(gòu)件頭文件lcd.h可如下編寫。5.4底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范5.4.1構(gòu)件設(shè)計(jì)的基本原則良好的底層驅(qū)動(dòng)構(gòu)件具備如下特性:(1)封裝性。(2)描述性。(3)可移植性。(4)可復(fù)用性。構(gòu)件被組織成具有一定獨(dú)立性的功能模塊,由以構(gòu)件的名稱命名的頭文件(.h)和源文件(.c)文件兩部分組成。

構(gòu)件的頭文件中,主要包含引用必要的文件、描述構(gòu)件功能特性的宏定義語(yǔ)句以及聲明對(duì)外提供服務(wù)的函數(shù)接口。構(gòu)件的源文件中存放構(gòu)件的內(nèi)部函數(shù)和對(duì)外提供服務(wù)函數(shù)的定義,即函數(shù)的實(shí)現(xiàn)代碼,完成構(gòu)件所要實(shí)現(xiàn)的功能。調(diào)用者通過(guò)構(gòu)件接口獲取服務(wù),而不必關(guān)心服務(wù)函數(shù)的具體實(shí)現(xiàn)細(xì)節(jié)。這就是構(gòu)件設(shè)計(jì)的基本內(nèi)容。為了使構(gòu)件設(shè)計(jì)滿足封裝性、描述性、可移植性、可復(fù)用性的基本要求,嵌入式底層驅(qū)動(dòng)構(gòu)件的開發(fā),應(yīng)遵循層次化、易用性、魯棒性及對(duì)內(nèi)存的可靠使用原則。

1.層次化原則(1)針對(duì)應(yīng)用場(chǎng)景和服務(wù)對(duì)象,分層組織構(gòu)件。(2)在構(gòu)件的層次模型中,上層構(gòu)件可以調(diào)用下層構(gòu)件提供的服務(wù),同一層次的構(gòu)件不存在相互依賴關(guān)系,不能相互調(diào)用。2.易用性原則易用性在于讓調(diào)用者能夠快速理解的構(gòu)件提供服務(wù)的功能并進(jìn)行使用。遵循易用性原則設(shè)計(jì)底層驅(qū)動(dòng)構(gòu)件需要做到:函數(shù)名簡(jiǎn)潔且達(dá)意;接口參數(shù)清晰,范圍明確;使用說(shuō)明語(yǔ)言精煉規(guī)范,避免二義性。此外,在函數(shù)的實(shí)現(xiàn)方面,避免編寫代碼量過(guò)多。

3.魯棒性原則魯棒性在于為調(diào)用者提供安全的服務(wù),避免在程序執(zhí)行過(guò)程中出現(xiàn)異常狀況。遵循魯棒性原則設(shè)計(jì)底層驅(qū)動(dòng)構(gòu)件需要做到:在明確函數(shù)輸入輸出的取值范圍、提供清晰接口描述的同時(shí),在函數(shù)實(shí)現(xiàn)的內(nèi)部要有對(duì)輸入?yún)?shù)的檢測(cè),對(duì)超出合法范圍的輸入?yún)?shù)進(jìn)行必要的處理;使用分支判斷時(shí),確保對(duì)分支條件判斷的完整性,對(duì)缺省分支進(jìn)行處理。同時(shí),不能忽視編譯警告錯(cuò)誤。

4.內(nèi)存可靠使用原則遵循內(nèi)存可靠使用原則設(shè)計(jì)底層驅(qū)動(dòng)構(gòu)件需要做到:(1)優(yōu)先使用靜態(tài)分配內(nèi)存。(2)謹(jǐn)慎地使用變量。(3)檢測(cè)空指針。(4)檢測(cè)緩沖區(qū)溢出,并為內(nèi)存中的緩沖區(qū)預(yù)留不小于20%的冗余。(5)對(duì)內(nèi)存的使用情況進(jìn)行評(píng)估。5.4.2編碼風(fēng)格基本規(guī)范

1.文件、函數(shù)、變量、宏及結(jié)構(gòu)體類型的命名規(guī)范命名的基本原則是:(1)命名清晰明了,有明確含義,使用完整單詞或約定俗成的縮寫。命名中若使用特殊約定或縮寫,要有注釋說(shuō)明。(2)命名風(fēng)格要自始至終保持一致。(3)為了代碼復(fù)用,命名中應(yīng)避免使用與具體項(xiàng)目相關(guān)的前綴。(4)為了便于管理,對(duì)程序?qū)嶓w的命名要體現(xiàn)出所屬構(gòu)件的名稱。(5)使用英語(yǔ)命名。(6)除宏命名外,名稱字符串全部小寫,以下劃線“_”作為單詞的分隔符。首尾字母不用“_”。針對(duì)嵌入式底層驅(qū)動(dòng)構(gòu)件的設(shè)計(jì)需要,對(duì)文件、函數(shù)、變量、宏及數(shù)據(jù)結(jié)構(gòu)類型的命令特別進(jìn)行說(shuō)明。

1)文件的命名底層驅(qū)動(dòng)構(gòu)件在具體設(shè)計(jì)時(shí)分為兩個(gè)文件,其中頭文件命名為“<device>.h”,源文件命名為“<device>.c”,其中<device>表示具體的硬件模塊的名稱。

2)函數(shù)的命名底層驅(qū)動(dòng)構(gòu)件的函數(shù)從屬于驅(qū)動(dòng)構(gòu)件,驅(qū)動(dòng)函數(shù)的命名除要體現(xiàn)函數(shù)功能外,還需要使用命名前綴和后綴標(biāo)識(shí)其所屬的構(gòu)件及不同的實(shí)現(xiàn)方式。

函數(shù)名前綴:底層驅(qū)動(dòng)構(gòu)件中定義的所有函數(shù)均使用“<device>_”前綴表示其所屬的驅(qū)動(dòng)構(gòu)件模塊。函數(shù)名后綴:對(duì)同一服務(wù)的不同方式的實(shí)現(xiàn),使用后綴加以區(qū)分。

3)函數(shù)形參變量與函數(shù)內(nèi)局部變量的命名對(duì)嵌入式底層驅(qū)動(dòng)構(gòu)件進(jìn)行編碼的過(guò)程中,需要考慮對(duì)底層驅(qū)動(dòng)函數(shù)形參變量及驅(qū)動(dòng)函數(shù)內(nèi)部局部變量的命名。函數(shù)形參變量:函數(shù)形參變量名是使用函數(shù)時(shí)理解形參的最直觀印象,表示傳參的功能說(shuō)明。局部變量:局部變量的命名與函數(shù)形參變量類似。

4)宏常量及宏函數(shù)的命名宏常量及宏函數(shù)的命名全部使用大寫字符,使用下劃線“_”為分隔符。例如,在構(gòu)件公共要素中定義的開關(guān)中斷的宏如下:5)結(jié)構(gòu)體類型的命名、類型定與變量聲明(1)結(jié)構(gòu)體類型名稱使用小寫字母命名(<defined_struct_name>),定義結(jié)構(gòu)體類型變量時(shí),全部使用大寫字母命名(<DEFINED_STRUCT_NAME>)。(2)對(duì)結(jié)構(gòu)體內(nèi)部字段全部使用大寫字母命名(<ELEM_NAME>)。(3)定義類型時(shí),同時(shí)聲明一個(gè)結(jié)構(gòu)體變量和結(jié)構(gòu)體指針變量。模板如下:2.排版對(duì)程序進(jìn)行排版是指,通過(guò)插入空格與空行,使用縮進(jìn)、斷行等手段,調(diào)整代碼的書面版式,使代碼整體美觀、清晰,從而提高代碼的可讀性。

1)空行與空格關(guān)于空行:相對(duì)獨(dú)立的程序塊之間須加空行。關(guān)于空格:在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí),它們之間的操作符之前、之后或者前后要加空格,必要時(shí)加兩個(gè)空格;進(jìn)行非對(duì)等操作時(shí),如果是關(guān)系密切的立即操作符(如->),其后不應(yīng)加空格。

2)縮進(jìn)使用空格縮進(jìn),不使用Tab鍵,這樣代碼復(fù)制打印是不會(huì)造成錯(cuò)亂。代碼的每一級(jí)均往右縮進(jìn)4個(gè)空格的位置。3)斷行(1)較長(zhǎng)的語(yǔ)句(>78字符)要分成多行書寫,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。(2)循環(huán)、判斷等語(yǔ)句中若有較長(zhǎng)的表達(dá)式或語(yǔ)句,則要進(jìn)行適應(yīng)的劃分,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首。(3)若函數(shù)或過(guò)程中的參數(shù)較長(zhǎng),則要進(jìn)行適當(dāng)?shù)膭澐?。?)不允許把多個(gè)短語(yǔ)句寫在一行中,即一行只寫一條語(yǔ)句。特殊情況可用,例如“if(x>3)x=3;”可以在一行。(5)if、for、do、while、case、switch、default等語(yǔ)句后的程序塊分界符(如C/C++語(yǔ)言的大括號(hào)‘{’和‘}’)應(yīng)各獨(dú)占一行并且位于同一列,且與以上保留字左對(duì)齊。

3.注釋在程序代碼中使用注釋,有助于對(duì)程序的閱讀理解,說(shuō)明程序在“做什么”,解釋代碼的目的、功能和采用的方法。(1)一般情況源程序有效注釋量在30%左右。(2)注釋語(yǔ)言必須準(zhǔn)確、易懂、簡(jiǎn)潔。(3)編寫和修改代碼的同時(shí),處理好相應(yīng)的注釋。(4)C語(yǔ)言中采用“//”注釋,不使用段注釋“/**/”。段注釋用于調(diào)試,便于注釋不用的代碼。為規(guī)范嵌入式底層驅(qū)動(dòng)構(gòu)件的注釋,特別對(duì)文件頭注釋、函數(shù)頭注釋、行注釋與邊注釋進(jìn)行特別說(shuō)明。

1)文件頭注釋底層驅(qū)動(dòng)構(gòu)件的接口頭文件和實(shí)現(xiàn)源文件的開始位置,使用文件頭注釋,如:2)函數(shù)頭注釋在驅(qū)動(dòng)函數(shù)的接口聲明和函數(shù)實(shí)現(xiàn)前,使用函數(shù)頭注釋詳細(xì)說(shuō)明驅(qū)動(dòng)函數(shù)提供的服務(wù)。在構(gòu)件的頭文件中必須添加完整的函數(shù)頭注釋,為構(gòu)件使用者提供充分的使用信息。構(gòu)件的源文件對(duì)用戶是透明的,因此,在必要時(shí)可適當(dāng)簡(jiǎn)化函數(shù)頭注釋的內(nèi)容。例如:

3)整行注釋與邊注釋整行注釋文字,主要是對(duì)至下一個(gè)整行注釋之前的代碼進(jìn)行功能概括與說(shuō)明。邊注釋位于一行程序的尾端,對(duì)本語(yǔ)句或至下一邊注釋之間的語(yǔ)句進(jìn)行功能概括與說(shuō)明。5.4.3公共要素文件同一芯片中不同的構(gòu)件存在公共使用的內(nèi)容,將這些內(nèi)容以構(gòu)件的形式組織起來(lái),成為構(gòu)件公共要素。所有底層驅(qū)動(dòng)構(gòu)件都包含對(duì)構(gòu)件公共要素的引用。

構(gòu)件公共要素文件放在工程文件夾的“\Common”文件夾下,分別名為common.h和common.c。1.芯片寄存器映射文件在common.h文件中包含了描述芯片寄存器映射的頭文件,當(dāng)?shù)讓域?qū)動(dòng)構(gòu)件引用common.h文件時(shí),即可使用片內(nèi)寄存器映射文件中定義訪問(wèn)各自相關(guān)的特殊功能寄存器。除包含芯片片內(nèi)寄存器映像文件,還需要將與芯片內(nèi)核相關(guān)的內(nèi)容引用到公共要素中,如開關(guān)總中斷。但C語(yǔ)言的編譯器無(wú)法為具體的芯片生成開關(guān)總中斷的語(yǔ)句。一般使用宏語(yǔ)句映射內(nèi)嵌匯編的方式定義宏開關(guān)中斷的語(yǔ)句:

2.位操作宏函數(shù)將編程時(shí)經(jīng)常用到的寄存器位操,即對(duì)寄存器的置位、清位及獲得寄存器某一位狀態(tài)的操作,定義成宏函數(shù)。綜合利用“<<”、“>>”、“|”、“&”、“~”等位運(yùn)算符,可以實(shí)現(xiàn)置位與清位,且不影響其他位的功能。為了方便使用,把這種方法改為帶參數(shù)的“宏函數(shù)”,并且簡(jiǎn)明定義,放在公共頭文件(common.h)中。使用該“宏”的文件,可以包含“common.h”文件。這樣就可以使用BSET、BCLR、BGET這些容易理解與記憶的標(biāo)識(shí),進(jìn)行寄存器的置位、清位及獲得寄存器某一位狀態(tài)的操作。3.重定義基本數(shù)據(jù)類型在編寫嵌入式程序時(shí)使用的基本數(shù)據(jù)類型多以8位、16位、32位數(shù)據(jù)長(zhǎng)度為單位,且要明確使用變量的字長(zhǎng)。但不同的編譯器為基本整型數(shù)據(jù)類型分配的位數(shù)存在不同,因此,需根據(jù)具體編譯器重新定義嵌入式基本數(shù)據(jù)類型。重新定義后,不僅書寫方便,也有利于軟件的移植。例如:通常有一些數(shù)據(jù)類型不能進(jìn)行優(yōu)化處理。不優(yōu)化數(shù)據(jù)類型的修飾關(guān)鍵字是volatile。它用于通知編譯器,對(duì)其后面所定義的變量不能隨意進(jìn)行優(yōu)化,因此,編譯器會(huì)安排該變量使用系統(tǒng)存儲(chǔ)區(qū)的具體地址單元,編譯后的程序每次需要存儲(chǔ)或讀取該變量時(shí),都會(huì)直接訪問(wèn)該變量的地址。

若沒(méi)有volatile關(guān)鍵字,則編譯器可能會(huì)暫時(shí)使用CPU寄存器來(lái)存儲(chǔ),以優(yōu)化存儲(chǔ)和讀取,這樣,CPU寄存器和變量地址的內(nèi)容很可能會(huì)出現(xiàn)不一致現(xiàn)象。常用的volatile變量使用場(chǎng)合有:設(shè)備的硬件寄存器、中斷服務(wù)例程中訪問(wèn)到的非自動(dòng)變量、操作系統(tǒng)環(huán)境下多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量。4.臨界區(qū)訪問(wèn)函數(shù)在主程序的運(yùn)行過(guò)程中,開放中斷可響應(yīng)外部事件,但當(dāng)中斷到來(lái)之時(shí),主程序的運(yùn)行將被打斷轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。有些情況下,一些程序段是需要連續(xù)執(zhí)行而不能被打斷的,此時(shí),程序?qū)PU資源的使用是獨(dú)占的,這種狀態(tài)稱為“臨界狀態(tài)”,不能被打斷的過(guò)程稱為對(duì)“臨界區(qū)”的訪問(wèn)。為防止在執(zhí)行關(guān)鍵操作時(shí)被外部事件打斷,一般通過(guò)關(guān)中斷的方式使程序訪問(wèn)臨界區(qū),屏蔽外部事件的影響。執(zhí)行完關(guān)鍵操作后退出臨界區(qū),打開中斷恢復(fù)對(duì)中斷的響應(yīng)能力。但直接執(zhí)行開關(guān)中斷管理

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論