都說(shuō)嵌入式軟硬結(jié)合,你知道該怎么做嗎?
部分信息來(lái)自網(wǎng)絡(luò),整理:付斌
嵌入式硬件工程師的工作是為軟件工程師搭建好硬件平臺(tái)和必要的開發(fā)環(huán)境。 嵌入式軟件工程師則是根據(jù)用戶的需要完善產(chǎn)品的軟件功能。硬件工程師就像是設(shè)計(jì)師和建筑師,負(fù)責(zé)整個(gè)建筑的設(shè)計(jì)和建設(shè)。軟件工程師則是負(fù)責(zé)房間的裝修,錦上添花。然而硬件設(shè)計(jì)需要一定的設(shè)計(jì)范例,這點(diǎn)對(duì)于軟件設(shè)計(jì)卻不那么適用。
嵌入式系統(tǒng)設(shè)計(jì)不僅要了解硬件還應(yīng)該了解它與軟件之間的相互影響和作用。目前國(guó)內(nèi)一個(gè)普遍被認(rèn)同的定義是:以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟件硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。形形色色的“高端產(chǎn)品”都離不開嵌入式技術(shù),離不開傳感器技術(shù),離不開軟件程序。
大多數(shù)嵌入式體系的硬件平臺(tái),包括兩部門:
1、以通用途理器為中心的協(xié)議處理模塊,用于網(wǎng)絡(luò)控制協(xié)議的處理;
2、以數(shù)字信號(hào)處理器(DSP)為中心的信號(hào)處理模塊,用于調(diào)制、解諧和數(shù)/模信號(hào)轉(zhuǎn)換。
從運(yùn)行平臺(tái)來(lái)分,嵌入式軟件可以分為:
1、運(yùn)行在開發(fā)平臺(tái)上的軟件:設(shè)計(jì)、開發(fā)、測(cè)試東西等
2、運(yùn)行在嵌入式體系上的軟件:嵌入式操作體系、應(yīng)用程序、驅(qū)動(dòng)程序及部門開發(fā)東西
同專業(yè)的人士從各自不同的角度思索和定位嵌入式體系,以是目前對(duì)嵌入式體系的定義非常多。
嵌入式體系根據(jù)目前業(yè)界和學(xué)術(shù)界對(duì)嵌入式體系的普遍見解,因此應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用體系對(duì)功效、牢靠性、成本、體積、功耗嚴(yán)酷要求的公用計(jì)算機(jī)體系。
那么問題來(lái)了,為什么嵌入式工程師要軟硬結(jié)合呢?
其一
軟硬結(jié)合,更好地實(shí)現(xiàn)用戶需求,比如輸入捕捉,如果是通過上升沿或者下降沿捕捉,加了不合適的濾波電容會(huì)造成對(duì)沿的破壞,不加濾波電容就會(huì)受困于各種空間干擾產(chǎn)生的雜波。
倘若硬件工程師搬來(lái)的是加了不合適電容的電路,搞得沿之間位寬失真,便會(huì)出現(xiàn)數(shù)據(jù)不正常的偶發(fā)故障,倘若硬件工程師搬來(lái)的是不加電容的電路,搞得軟件工程師必須進(jìn)行軟件濾波,把代碼搞得又復(fù)雜又難解,你說(shuō)這怨誰(shuí)來(lái)著?
其二
方便定位Bug。愛因斯坦曾經(jīng)說(shuō)過,“提出一個(gè)問題往往比解決一個(gè)問題更重要,因?yàn)榻鉀Q一個(gè)問題也許僅是一個(gè)數(shù)學(xué)上的或試驗(yàn)上的技能而已,而提出新的問題、新的可能性、從新的角度去看舊的問題需要有創(chuàng)造性的想象力,而且標(biāo)志著科學(xué)的真正進(jìn)步?!?/span>
鉆研硬件電路可以幫助軟件工程師提出更多解決問題的思路,發(fā)現(xiàn)導(dǎo)致Bug的更多可能性。一般來(lái)說(shuō),當(dāng)遇到Bug時(shí),對(duì)硬件一知半解的軟件工程師只在代碼層面上打轉(zhuǎn)轉(zhuǎn),基本不會(huì)在硬件方面提出問題,最終為了迎合蹩腳的硬件設(shè)計(jì)出別扭無(wú)比的代碼,卻不曾想,只要稍稍改變一下硬件設(shè)計(jì),就可以輕松且優(yōu)雅地完成代碼設(shè)計(jì)。
其三
藝多不壓身,求人不如求己。當(dāng)我們對(duì)硬件電路設(shè)計(jì)起了懷疑,倘若自己悄沒聲地拿起烙鐵飛個(gè)線、換個(gè)元件,驗(yàn)證了自己的思路,這時(shí)直起腰版、拿著板子理直氣壯地去找硬件工程師,豈不是順順利利,又送順?biāo)饲椋?/span>
倘若直接拿著板子,心底發(fā)虛面上露怯地去找硬件工程師理論,一場(chǎng)唇槍舌戰(zhàn)在所難免,腥風(fēng)血雨不說(shuō),到頭來(lái)硬件工程師硬著頭皮給你調(diào)調(diào)電路,真是解決了問題還好說(shuō),若是自己思路錯(cuò)了,那不是自找苦吃?上個(gè)班,掙點(diǎn)錢養(yǎng)家糊口而已,當(dāng)個(gè)老好人,和同事其樂融融多好,吵來(lái)吵去,搞得那么辛苦,何必來(lái)著?
那么如何從單純的硬件設(shè)計(jì)過渡到硬軟結(jié)合的設(shè)計(jì),在你著手開發(fā)軟件時(shí)需注意以下八個(gè)軟件設(shè)計(jì)技巧。
1、設(shè)計(jì)控制流程圖
工程師進(jìn)行到開發(fā)軟件這一步時(shí)會(huì)情不自禁地開始書寫代碼。這種思維定勢(shì)就像在原理圖還未完成之前就開始嘗試畫PCB。當(dāng)著手開發(fā)軟件時(shí),克制寫代碼的沖動(dòng),取而代之的應(yīng)該是軟件流程結(jié)構(gòu)圖表的設(shè)計(jì),這點(diǎn)非常重要。流程圖能清晰地呈現(xiàn)給開發(fā)人員軟件的各個(gè)需要的組成部件,正如電路圖列出硬件設(shè)計(jì)所需的各種元器件一樣。做到這點(diǎn)能很大程度上使程序整體更易于組織,而且也會(huì)減少占開發(fā)周期較長(zhǎng)的調(diào)試工作量進(jìn)而節(jié)省時(shí)間減少調(diào)試的繁瑣。
2、使用狀態(tài)機(jī)控制程序流程
狀態(tài)機(jī)是20世紀(jì)優(yōu)秀的軟件發(fā)明之一。應(yīng)用程序一般被分解為多個(gè)不同的狀態(tài),每一個(gè)狀態(tài)控制一個(gè)特定的程序分支。狀態(tài)機(jī)包括內(nèi)部狀態(tài)和依據(jù)不同激勵(lì)所控制的狀態(tài)轉(zhuǎn)換。使用狀態(tài)機(jī)機(jī)制設(shè)計(jì)軟件能夠使模塊化的可維護(hù)的軟件開發(fā)更加容易而且易于理解。狀態(tài)機(jī)原理與算法的示例隨處可見。
3、避免使用全局變量
在過去的函數(shù)式編程中,程序員使用函數(shù)編寫程序,他們的唯一目標(biāo)是使程序盡可能快的運(yùn)行而不考慮程序的結(jié)構(gòu)和重用性。這類程序風(fēng)格在使用全局變量時(shí)不注意變量的作用范圍引起其他函數(shù)修改的危險(xiǎn)性。這樣變量會(huì)被多次占用和重寫。如今面向?qū)ο蟮某绦蛟O(shè)計(jì)中,成員變量被定義在最小的作用范圍之內(nèi)并封裝起來(lái)避免被重新復(fù)值和濫用。所以建議盡量少地使用全局變量,實(shí)在需要的話,使用C語(yǔ)言中的關(guān)鍵字“extern”來(lái)修飾。
4、充分利用模塊化的設(shè)計(jì)理念
如果你問一位工程師項(xiàng)目的哪一部分最有可能會(huì)拖延交付并超出預(yù)估時(shí)間,那答案一定是軟件周期了。軟件通常是復(fù)雜而且不易開發(fā)和維護(hù)的,特別是當(dāng)項(xiàng)目應(yīng)用程序集中在一個(gè)單一的文件里,或者幾個(gè)結(jié)構(gòu)松散的文件中時(shí)。為了便于代碼重用和軟件可維護(hù)并減小軟件的復(fù)雜度,強(qiáng)烈建議發(fā)揮高級(jí)程序設(shè)計(jì)語(yǔ)言模塊化的特性,在程序的結(jié)構(gòu)中把公用的函數(shù)分離出來(lái)作為一個(gè)獨(dú)立的模塊。通過這種方式可以讓程序員開始創(chuàng)建包含有常用函數(shù)和常用的聲明定義,它可以很容易的被其他的代碼重用,這在以后的測(cè)試階段不僅可以節(jié)省時(shí)間代價(jià)還能提高代碼的質(zhì)量。
5、中斷服務(wù)事件保持簡(jiǎn)練
中斷服務(wù)事件是中斷處理器正在執(zhí)行的程序,轉(zhuǎn)而去處理觸發(fā)該中斷的外設(shè)的請(qǐng)求的一種機(jī)制。處理器響應(yīng)中斷請(qǐng)求需要大量的系統(tǒng)開銷,具體表現(xiàn)在保存被中斷程序的狀態(tài)(入棧下條指令的段地址、偏移地址和程序狀態(tài)寄存器,有時(shí)還會(huì)入棧若干寄存器的值),執(zhí)行中斷服務(wù)程序然后恢復(fù)中斷點(diǎn)繼續(xù)執(zhí)行(依次出棧各寄存器),雖然現(xiàn)在的處理器速度非常快但是這種系統(tǒng)開銷仍然需要考慮。一般來(lái)說(shuō),為了避免與主程序沖突程序員總想使中斷執(zhí)行時(shí)間減小到最小。這就意味著中斷服務(wù)事件應(yīng)該短小簡(jiǎn)單。不能在中斷程序中調(diào)用函數(shù)。另外,如果中斷需要處理的事件特別復(fù)雜或者需要花費(fèi)較長(zhǎng)的時(shí)間,這個(gè)時(shí)候中斷服務(wù)程序應(yīng)該滿足最小的需求,例如將數(shù)據(jù)載入到緩沖寄存器、設(shè)置標(biāo)志位,而讓主程序去處理讀入的數(shù)據(jù)。這樣處理器的工作大部分周期都在處理程序而不是中斷。
6、使用處理器示例代碼測(cè)試設(shè)備
對(duì)于硬件設(shè)計(jì),在畫板之前標(biāo)準(zhǔn)的測(cè)試電路有助于工程師理解電路的特性。同樣可以適用于軟件設(shè)計(jì),半導(dǎo)體廠商通常有測(cè)試微處理器各個(gè)部分的功能的示例程序提供工程師體驗(yàn)各部分是如何工作的。據(jù)此可以提前組織軟件的結(jié)構(gòu)并且預(yù)知在設(shè)計(jì)中的問題。提前確定在設(shè)計(jì)潛在的障礙遠(yuǎn)比在產(chǎn)品完成前幾個(gè)小時(shí)發(fā)現(xiàn)問題更加科學(xué)合理。而值得注意的是廠商提供的代碼通常不是模塊化而且不做必要的修改是很難直接用于實(shí)際的軟件中的。
7、控制函數(shù)的復(fù)雜度
在工程設(shè)計(jì)中有句俗語(yǔ)叫“KISS”,意思是“Keep It Simple Silly”。在處理一些復(fù)雜的任務(wù)時(shí)最簡(jiǎn)單有效的方法是把它分解成若干個(gè)簡(jiǎn)單的子任務(wù),當(dāng)任務(wù)或者功能很復(fù)雜時(shí),人們很難留意所有的細(xì)節(jié)也很難不出錯(cuò)。當(dāng)工程師寫了一個(gè)在當(dāng)時(shí)能夠理解的復(fù)雜函數(shù),可一段時(shí)間后需要維護(hù)程序了還能不能清晰的呈現(xiàn)出當(dāng)初的設(shè)計(jì)思想這是值得考慮的。有大量的技術(shù)來(lái)衡量函數(shù)的復(fù)雜度像“循環(huán)復(fù)雜度”。經(jīng)驗(yàn)告訴我們,函數(shù)的循環(huán)復(fù)雜度應(yīng)該低于10比較好。
8、詳細(xì)的文檔
在激烈的軟件開發(fā)競(jìng)爭(zhēng)中關(guān)注的焦點(diǎn)很容易就局限在代碼的書寫和調(diào)試而忽略文檔的編寫。有時(shí)迫于壓力要求寫文檔,開發(fā)人員通常把文檔安排在項(xiàng)目開發(fā)的最后的一個(gè)環(huán)節(jié)集中編寫。然而給代碼寫文檔應(yīng)該乘在頭腦里面還比較清晰的時(shí)候比較關(guān)鍵,這樣在后續(xù)的開發(fā)或者自己閱讀注釋的時(shí)候能很快的回憶起當(dāng)時(shí)的設(shè)計(jì)思想。
另外,優(yōu)秀的硬件工程師和軟件工程師分別如何通過軟硬結(jié)合完美進(jìn)階?
嵌入式硬件工程師
單純信號(hào)來(lái)分為數(shù)字和模擬。
模擬相對(duì)較難,一般需要很長(zhǎng)的經(jīng)驗(yàn)積累,單單一個(gè)阻值或容值的精度不夠就可能使信號(hào)偏差很大。因此年輕人搞的較少,隨著技術(shù)的發(fā)展,出現(xiàn)了模擬電路數(shù)字化,比如手機(jī)的Modem射頻模塊,都采用成熟的套片,而當(dāng)年國(guó)際上只有兩家公司有此技術(shù),自我感覺模擬功能不太強(qiáng)的人,不太適合搞這個(gè),如果真能搞定到手機(jī)的射頻模塊。
另一類就是數(shù)字部分了,在大方向上又可分為51/ARM的單片機(jī)類,DSP類、FPGA類, 國(guó)內(nèi)FPGA的工程師大多是在IC設(shè)計(jì)公司從事IP核的前端驗(yàn)證,這部分不搞到門級(jí),前途不太明朗,即使做個(gè)IC前端驗(yàn)證工程師,也要搞上幾年才能勝任。 DSP硬件接口比較定型,如果不向驅(qū)動(dòng)或是算法上靠攏,前途也不會(huì)太大。
而ARM單片機(jī)類的內(nèi)容就較多,業(yè)界產(chǎn)品占用量大,應(yīng)用人群廣,因此就業(yè)空間極大,而硬件設(shè)計(jì)最體現(xiàn)水平和水準(zhǔn)的就是接口設(shè)計(jì)這塊,這是各個(gè)高級(jí)硬件工程師相互PK,判定水平高低的依據(jù)。
而接口設(shè)計(jì)這塊最關(guān)鍵的是看時(shí)序,而不是簡(jiǎn)單 的連接,比如PXA255處理器I2C要求速度在100Kbps,如果把一個(gè)I2C外圍器件,最高還達(dá)不到100kbps的與它相接,必然要導(dǎo)致設(shè)計(jì)的失 敗。這樣的情況有很多,比如51單片機(jī)可以在總線接 LCD,但為什么這種LCD就不能掛在ARM的總線上,還有ARM7總線上可以外接個(gè)Winband的SD卡控制器,但為什么這種控制器接不到ARM9或 是Xscale處理器上,這些都是問題。因此接口并不是一種簡(jiǎn)單的連接,要看時(shí)序,要看參數(shù)。
一個(gè)優(yōu)秀的硬件工程師應(yīng)該能夠在沒有參考方案的前提下設(shè)計(jì)出一個(gè)在成本和性能上更加優(yōu)秀的產(chǎn)品,靠現(xiàn)有的方案,也要進(jìn)行適當(dāng)?shù)目尚行圆眉?,但不是胡亂的來(lái),我遇到一個(gè)工程師把方案中的5V變1.8V的DC芯片, 直接更換成LDO,有時(shí)就會(huì)把CPU燒上幾個(gè)。
前幾天還有人希望我?guī)兔Π阉麄円郧盎赑XA255平臺(tái)的手持GPS設(shè)備做下程序優(yōu)化,我問了一下情況,地 圖是存在SD卡中的,而SD卡與PXA255的MMC控制器間采用的SPI接口,因此導(dǎo)致地圖讀取速度十分的慢,這種情況是設(shè)計(jì)中嚴(yán)重的缺陷,而不是程序 的問題,因此我提了幾條建議,讓他們更新試下再說(shuō)。
因此想成為一個(gè)優(yōu)秀的工程師,需要對(duì)系統(tǒng)整體性的把握和對(duì)已有電路的理解,換句話說(shuō),給你一套電路圖你 終究能看明白多少,看不明白80%以上的話,說(shuō)明你離優(yōu)秀的工程師還差得遠(yuǎn)哪。其次是電路的調(diào)試能力和審圖能力,但最最基本的能力還是原理圖設(shè)計(jì)PCB繪 制,邏輯設(shè)計(jì)這塊。這是指的硬件設(shè)計(jì)工程師,從上面的硬件設(shè)計(jì)工程師中還可以分出ECAD工程師,就是專業(yè)的畫PCB板的工程師,和EMC設(shè)計(jì)工程師,幫 人家解決EMC的問題。
硬件工程師再往上就是板級(jí)測(cè)試工程師,就是C語(yǔ)功底很好的硬件工程師,在電路板調(diào)試過程中能通過自已編寫的測(cè)試程序?qū)τ布δ苓M(jìn)行 驗(yàn)證。然后再交給基于操作系統(tǒng)級(jí)的驅(qū)動(dòng)開發(fā)人員。
那么高級(jí)硬件件工程師技術(shù)技能都要具備那些東西哪,首先要掌握EDA設(shè)計(jì)的輔助工具類如 ProtelORCADPowperPCBMaplux2ISE、VDHL語(yǔ)言,要能用到這些工具畫圖畫板做邏輯設(shè)計(jì),再有就是接口設(shè)計(jì)審圖能力,再者就是調(diào)試能力,如果能走到總體方案設(shè)計(jì)這塊,那就基本上快成為資深工程師了。
高級(jí)硬件工程師不僅要有設(shè)計(jì)能力還有具有相當(dāng)深厚的基本功,就是EDA工具的使用,EDA工程師包括原理圖和PCB工具,邏輯設(shè)計(jì)工具和VHDL,SCH有Cadence下的Orcad 和Mentors公司pads下的powerpcb。
當(dāng)然AD也具有這兩部分功能但它在國(guó)際上不通用。只是國(guó)內(nèi)通用。如果想走得高些或到臺(tái)資、日資、美資公司及國(guó)內(nèi)需要對(duì)外交流的大公司的話,上面的硬件的原理圖工具和PCB工資必須掌握的。邏輯這塊,硬件工程師主要是負(fù)責(zé)CPLD這塊,涉及FPGA這塊時(shí)應(yīng)該會(huì)有專業(yè)FPGA人員來(lái)搞定的,因FPGA不太適合做邏輯的。因此硬件工程師只到CPLD為止。
嵌入式軟件工程師
嵌入式軟件工程師就是編寫嵌入式系統(tǒng)的工程師,一般來(lái)說(shuō)軟件工程師的人員流動(dòng)性要比硬件流動(dòng)性要大。
首先,我們都知道,產(chǎn)品是企業(yè)生存的命脈,如果產(chǎn)品的設(shè)計(jì)資料泄露,那么該企業(yè)的生存優(yōu)勢(shì)就不存在了。所以,企業(yè)會(huì)千方百計(jì)的留住產(chǎn)品設(shè)計(jì)的核心人員,尤其是硬件設(shè)計(jì)人員。
另外,培養(yǎng)一個(gè)硬件工程師比較難,而且時(shí)間也比較長(zhǎng)。所以企業(yè)一般不會(huì)主動(dòng)去培養(yǎng)一個(gè)硬件工程師,并且也不會(huì)輕易放棄一個(gè)硬件工程師。
由于目前軟件工程師居多,企業(yè)可供選擇的機(jī)會(huì)也多,所以軟件工程師的流動(dòng)性要高。不過相對(duì)來(lái)說(shuō),軟件工程師的起薪比硬件工程師要高的多,而經(jīng)驗(yàn)豐富的軟件工程師也是非常受到企業(yè)歡迎的。
嵌入式技術(shù)大體上可以分為以下幾個(gè)部分,編程語(yǔ)言,內(nèi)核技術(shù),操作系統(tǒng),總線接口,系統(tǒng)集成。
嵌入式軟件工程師的技術(shù)范圍分成下面幾個(gè)等級(jí):
1、初級(jí):8051或其他單片機(jī),UCOS,I2C,SPI,UART。匯編和C能力一般,系統(tǒng)集成能力弱。?
2、中級(jí):在初級(jí)的基礎(chǔ)上,ARM/MIPS,其他一些RTOS并了解Linux,SDIO,USB。匯編和C能力不錯(cuò),有一定系統(tǒng)集成能力。?
3、高級(jí):主要是對(duì)中級(jí)的進(jìn)階,這一個(gè)層面已經(jīng)不在于掌握具體的技術(shù),而是掌握當(dāng)前流行技術(shù)中的基本思想和構(gòu)成方式,所以任何流行的技術(shù),對(duì)于這一階段來(lái)說(shuō),都是手到擒來(lái)的。
ARM+LINUX路線,主攻嵌入式Linux操作系統(tǒng)及其上應(yīng)用軟件開發(fā)目標(biāo):
(1)掌握主流嵌入式微處理器的結(jié)構(gòu)與原理(初步定為arm9)
(2)必須掌握一個(gè)嵌入式操作系統(tǒng) (初步定為uclinux或linux,版本待定)
(3)必須熟悉嵌入式軟件開發(fā)流程并至少做一個(gè)嵌入式軟件項(xiàng)目。
嵌入式軟件工程師需要具有4個(gè)能力:
能力1:對(duì)C語(yǔ)言的深入掌握,不犯低級(jí)語(yǔ)法錯(cuò)誤。
能力2:對(duì)嵌入式芯片平臺(tái)熟悉,包括芯片各類外設(shè)的原理和使用方法,以及相應(yīng)的嵌入式操作系統(tǒng)。還包括芯片外圍電路的設(shè)計(jì)能力,包括AD采樣、IO電平變換,PWM輸出,電源電路等。
能力3:對(duì)算法的精通,包括常規(guī)的平均值、有效值計(jì)算法,低通、帶阻濾波器,PI、PR控制器,以及產(chǎn)品需要的專用控制算法等。
能力4:軟件架構(gòu)設(shè)計(jì)能力,能做到程序執(zhí)行時(shí)間短(時(shí)間復(fù)雜度低),占用數(shù)據(jù)空間少(空間復(fù)雜度低),以減少對(duì)中斷時(shí)間和芯片內(nèi)存的過分要求。能滿足程序封裝、繼承、健壯的要求。