<ruby id="66w77"><video id="66w77"></video></ruby>
<ruby id="66w77"><option id="66w77"><thead id="66w77"></thead></option></ruby>
  • <ruby id="66w77"><table id="66w77"></table></ruby>

  • <ruby id="66w77"><table id="66w77"></table></ruby>
    <strong id="66w77"></strong>

    關(guān)于嵌入式軟件開(kāi)發(fā)的內容進(jìn)階詳述

    2019-02-22 10:00:28分類(lèi):嵌入式軟件開(kāi)發(fā)設計7320

      “嵌入式軟件”這個(gè)名詞很籠統,但一般業(yè)內的理解就是直接與硬件打交道的軟件。大部分嵌入式軟件工程師基本工作內容如下:裸機——RTOS——Linux,以及一些新生的概念。
     

    嵌入式軟件開(kāi)發(fā)
     

      1、裸機開(kāi)發(fā)

      裸機開(kāi)發(fā)看起來(lái)隨意性很大,因為沒(méi)有固定框架、固定接口,從驅動(dòng)、算法、界面、頂層應用都是自己做。但這往往就是初學(xué)者的心態(tài),或剛入行的格局。

      裸機開(kāi)發(fā)的平臺雖然不如隔壁互聯(lián)網(wǎng)那些千變萬(wàn)化的框架多,但數量還是有很多:STM32、AVR(MicroChip)、瑞薩、飛思卡爾(NXP)、新唐電子……開(kāi)發(fā)平臺大部分都由芯片廠(chǎng)規定。但這只是表面看起來(lái)豐富,對于嵌入式老司機而言,這些雜七雜八的所謂平臺都逃不出:編輯器、編譯器、鏈接器、燒寫(xiě)調試器、芯片電路板。在STM32上配置寄存器,難道在RH850上就不會(huì )了嗎?并不是,嵌入式軟件的開(kāi)發(fā)套路是比較固定的,開(kāi)發(fā)工具大同小易。比互聯(lián)網(wǎng)跳框架難度應該不會(huì )大,如果感覺(jué)很大,多看幾遍芯片的datasheet吧。這幾年隨著(zhù)芯片越來(lái)越統一化(比如ARM Cortex生態(tài)系統),有些廠(chǎng)推出了圖形化配置的工具比如STM32CubeMX,其實(shí)不過(guò)是做了層封裝和調用而已,而且僅僅限于引腳、時(shí)鐘配置、驅動(dòng)、加載協(xié)議棧,對于中間層、應用層幫助不大。但至少配置沒(méi)那么繁瑣和容易出錯了,但產(chǎn)生的程序代碼可能并不符合很多公司的代碼規范和框架。我知道有些公司是自己開(kāi)發(fā)這類(lèi)配置軟件的,當然要項目足夠大和穩定才行。

      裸機開(kāi)發(fā)的第一個(gè)套路是框架。合理的框架有助于程序閱讀、修改、移植。裸機程序的框架一般只有三層:驅動(dòng)、中間層、應用層。中間層往往被忽略,其實(shí)它作為應用和驅動(dòng)的對接層,寫(xiě)得好對于程序移植和理解好處多多。很多業(yè)內的很喜歡把三個(gè)攪在一起,因為趕項目所以不太在乎。而且大部分做嵌入式的都是硬件出身,沒(méi)有軟件出身人的滿(mǎn)腦子框架束縛。設計可變模塊用#ifdef來(lái)靈活使用,在應用模塊用回調函數控制被調用模塊改變。這些都是基本套路。嵌入式軟件本質(zhì)上還是軟件,軟件那套低耦合、強內聚、模塊化等概念是要一脈相承的。這里不拓展講,業(yè)內人士要多看看軟件相關(guān)書(shū)籍,雖然沒(méi)有幾本寫(xiě)的好的。很難找到單純討論嵌入式軟件的書(shū),那些掛名號的大都是結合硬件講的,且就講個(gè)驅動(dòng)設計,連框架、語(yǔ)法、構建都懶得說(shuō)。這或許還是大家都出身硬件的緣故。如有朋友知道有這方面寫(xiě)的好的書(shū),請推薦。嵌入式軟件工程師也要所學(xué)學(xué)軟件的理論,那些封裝、面向對象等軟件設計基本套路還是要掌握的。

      裸機開(kāi)發(fā)第二個(gè)套路是任務(wù)調度。因為沒(méi)有操作系統加持,任務(wù)調度要自主實(shí)現。嵌入式軟件任務(wù)調度要考慮硬件性能,放一個(gè)while(1)大循環(huán)、前后臺中斷,理想情況下看是所有任務(wù)都會(huì )即使執行的,實(shí)際上芯片壓根性能沒(méi)那么強勁,中斷多了任務(wù)就不執行了。一般這里有兩個(gè)分類(lèi),一類(lèi)是基于(中斷)事件、一類(lèi)是基于時(shí)間?;谑录径际抢硐胫髁x,認為美好的事總會(huì )發(fā)生,而基于時(shí)間則是物理規律——任一時(shí)間芯片只做一件事,并且認為外界的事件發(fā)生是有時(shí)間間隔的(瞬態(tài)無(wú)時(shí)間間隔的任務(wù),芯片只能說(shuō)臣妾做不到啊!)。當然一切都要基于需求,假設芯片就是只做一兩個(gè)任務(wù),那就是一個(gè)while(1)+前后臺有什么所謂。多任務(wù)程序框架就必須要考慮基于時(shí)間了。

      裸機開(kāi)發(fā)的第三個(gè)套路是狀態(tài)機。猶記得第一份工作時(shí),面試官的第一個(gè)問(wèn)題就是讓我談?wù)劆顟B(tài)機。狀態(tài)機在裸機程序設計里應用非常廣,也是一種優(yōu)秀的設計模式。狀態(tài)機集合了任務(wù)調度、程序框架的概念。甚至業(yè)內優(yōu)秀的狀態(tài)機框架被商業(yè)化了比如QT量子狀態(tài)機框架。狀態(tài)機不是程序流程圖,程序流程圖一般是基于用戶(hù)一步步操作的,狀態(tài)機是基于系統運行狀態(tài)的,所以流程圖一般用于做需求,狀態(tài)機用于做開(kāi)發(fā)。狀態(tài)機程序設計首先要用UML工具畫(huà)好程序狀態(tài)圖,要明確某一時(shí)刻系統智能處于某一狀態(tài),以及狀態(tài)跳轉的條件。把狀態(tài)機和任務(wù)調度結合,就是用時(shí)間輪詢(xún)不斷執行一個(gè)個(gè)狀態(tài)機。狀態(tài)機內部設計方法非常重要。當熟稔后,狀態(tài)機就是愉悅的switch case,if else了。

      業(yè)內一直有一些偏見(jiàn)認為做裸機程序的人軟件水平不行,甚至揚言在目前硬件性能爆炸的年代不應該在乎代碼量。這依舊是初出茅廬的人說(shuō)的,任何開(kāi)發(fā)都要基于明確的需求,那些能用少了幾塊錢(qián)的芯片、少了一兩個(gè)級別軟件復雜度做出產(chǎn)品的工程師才是公司需要的。一個(gè)發(fā)貨量十幾萬(wàn)的產(chǎn)品,能提前一周上市,公司盈利很可觀(guān)了。工程師要做的是用最快的速度滿(mǎn)足需求,而不是比較什么技術(shù)比較高超,那是象牙塔的理論。
     

    嵌入式軟件開(kāi)發(fā)
     

      2、RTOS

      RTOS本質(zhì)上僅僅是個(gè)任務(wù)內核,對于硬件驅動(dòng)僅僅涉及到RAM、時(shí)鐘等這些與任務(wù)調度直接相關(guān)的驅動(dòng)。這不就是裸機任務(wù)調度那套玩意放大版么。但RTOS任務(wù)調度更加復雜,涉及到任務(wù)切換、任務(wù)通信、內存管理等??雌饋?lái)RTOS好像內容很多,但其實(shí),其實(shí)也就只有這些內容了。作為實(shí)時(shí)操作系統,RTOS如果涉及太多會(huì )拖慢任務(wù)調度速度,因此實(shí)際上它僅僅扣出操作系統最基本的東西——任務(wù)管理和內存管理來(lái)實(shí)現。如果能結合操作系統知識來(lái)學(xué)習RTOS收獲應該更大,體會(huì )為了實(shí)現理論家口中的操作系統,RTOS做了怎樣的妥協(xié)和靈活。RTOS本質(zhì)上僅僅是個(gè)中間模塊,把它拿掉,自己設計一個(gè)任務(wù)管理和內存管理模塊,即使糙一點(diǎn)也還是能用的而且還能非常小心地把控硬件資源。但在經(jīng)過(guò)N多項目考驗的FreeRTOS、UC/OSII等優(yōu)異的RTOS面前,加上項目需求的多樣,恐怕很少工程師會(huì )抵制住誘惑。

      正是因為RTOS僅僅實(shí)現了操作系統一部分功能,因此設計一個(gè)RTOS好像不是那么難。于是RTOS市場(chǎng)風(fēng)起云涌,專(zhuān)用的、通用的、內部用的、開(kāi)源的……但是其實(shí)用什么RTOS只要你不是技術(shù)總監,選擇跟你沒(méi)有關(guān)系。當然DIY除外,筆主比較推崇FreeRTOS、UC/OSII、UcLinux,這些案例多,健壯的RTOS。

    嵌入式軟件開(kāi)發(fā)

      3、Linux

      本來(lái)起個(gè)通用操作系統的標題,但發(fā)現毫無(wú)意義,Windows不開(kāi)源、Android內核本來(lái)就是Linux,兜這么大個(gè)圈還不是只能講Linux,所以還是叫Linux好了。

      Linux作為通用操作系統,在業(yè)內是為實(shí)現任務(wù)種類(lèi)多、界面多、造價(jià)高這類(lèi)項目準備的。Linux完整實(shí)現了操作系統的所有理論,包括驅動(dòng)管理、文件管理、任務(wù)管理、內存管理、網(wǎng)絡(luò )協(xié)議、安全管理等等。雖然看起來(lái)好像內容好多,但僅僅就內核而已,除了開(kāi)發(fā)驅動(dòng)(還要去掉直接與CPU相關(guān)的驅動(dòng),這些內核已經(jīng)適配了)、做做中間包、做做應用程序,很多工程師無(wú)能為力。真正的內核開(kāi)發(fā)是Linus、intel公司那些大牛做的,我們只能用用。但就是這么少的一部分,已經(jīng)夠折騰人的了。

      對于Linux標準的要求就是會(huì )移植、會(huì )開(kāi)發(fā)驅動(dòng)和拼湊進(jìn)Linux去、會(huì )shell C開(kāi)發(fā)調用。做應用層的多的就是QT 環(huán)境開(kāi)發(fā)了,這玩意和Java JVM是差不多的邏輯,就是在shell上面再放一層解釋器或加入調用包一起編譯而已。
     

    嵌入式軟件開(kāi)發(fā)
     

      4、協(xié)議棧、中間包

      這幾年嵌入式領(lǐng)域因為硬件性能提升和任務(wù)多樣化,涌現了很多專(zhuān)一功能的協(xié)議棧、中間包。比如藍牙協(xié)議棧包、WIFI協(xié)議棧包、STemwin GUI包、安全棧、神經(jīng)網(wǎng)絡(luò )加速包等等。很多棧和包實(shí)際上已經(jīng)超出了傳統的嵌入式軟件領(lǐng)域了。比如無(wú)人機姿態(tài)控制的PID包、手機人臉識別NPU加速包等,這些對數學(xué)的要求高于代碼,也不是一般工程師能做的,要有數學(xué)功底。當然并不是高不可攀,再說(shuō)誰(shuí)不會(huì )調基本的PID呢。

    上一篇:下一篇:
    92视频在线精品国自产拍_乱色熟女综合一区二区_国产精品毛片久久久久久久_久天啪天天久久99久孕妇
    <ruby id="66w77"><video id="66w77"></video></ruby>
    <ruby id="66w77"><option id="66w77"><thead id="66w77"></thead></option></ruby>
  • <ruby id="66w77"><table id="66w77"></table></ruby>

  • <ruby id="66w77"><table id="66w77"></table></ruby>
    <strong id="66w77"></strong>