嵌入式行業(yè)需要什么樣的技術(shù)人才?
嵌入式行業(yè)需要什么樣的技術(shù)人才?仔細(xì)觀察各種招聘的崗位要求吧,無(wú)非是兩方面。1)通用要求比如什么學(xué)歷,多少年工作經(jīng)驗(yàn),有創(chuàng)新精神,抗壓能力強(qiáng),吃苦耐勞,善于溝通,態(tài)度認(rèn)真等等等等...2)專業(yè)要求這個(gè)可真的多了去了,但無(wú)非就是各種精通。什么精通控制理論,精通電路設(shè)計(jì),精通各種硬件驅(qū)動(dòng)開(kāi)發(fā),精通linux內(nèi)核,精通DSP,精通ARM,精通嵌入式數(shù)據(jù)庫(kù),精通多線程編程,精通各種網(wǎng)絡(luò)協(xié)議,精通各種總線協(xié)議,精通塞班/安卓/IOS平臺(tái)應(yīng)用開(kāi)發(fā)。精通匯編、編譯器、二進(jìn)制工具,精通各種媒體封裝格式、編解碼,精通通信技術(shù),精通硬件原理圖,精通PCB設(shè)計(jì),精通計(jì)算機(jī)結(jié)構(gòu),精通bootloader,精通……感覺(jué)只要是行業(yè)內(nèi)的就要精通。看完這些,尤其是專業(yè)要求,精通一門就得好久,頭大了吧?那么,我們來(lái)就分析一下上面的要求吧。各個(gè)公司就通用要求像是互相復(fù)制粘貼的一樣,比如學(xué)歷,個(gè)人認(rèn)為學(xué)歷明顯更重要;比如經(jīng)驗(yàn),是有n年的經(jīng)驗(yàn),還有n年前的經(jīng)驗(yàn)用了n年;還有個(gè)人秉性,我都不知道各個(gè)公司怎么在員工入職前考察。專業(yè)要求呢,其實(shí)精通其中幾樣就挺了不起了,很多技能一看就讓人頭暈,了解了嵌入式開(kāi)發(fā)的結(jié)構(gòu)可能就好理解些了。從技術(shù)實(shí)現(xiàn)上講,嵌入式的產(chǎn)品分為兩大類:一類簡(jiǎn)單的,沒(méi)有操作系統(tǒng)支持的;一類復(fù)雜的,有操作系統(tǒng)的。就目前發(fā)展方向看,后一種是趨勢(shì)。前一種從程序?qū)崿F(xiàn)上可以分為3層:硬件層、驅(qū)動(dòng)層、應(yīng)用層;后一種可以分為4層:硬件層、驅(qū)動(dòng)層、系統(tǒng)層、應(yīng)用層。所以,嵌入式的開(kāi)發(fā)大致需要這么從下到上四類工程師:嵌入式硬件開(kāi)發(fā)、嵌入式驅(qū)動(dòng)開(kāi)發(fā)、嵌入式系統(tǒng)開(kāi)發(fā)、嵌入式軟件開(kāi)發(fā)。
應(yīng)該會(huì)哪些技能?
01.嵌入式硬件開(kāi)發(fā)
這是硬件工程師來(lái)做,一般出身為自動(dòng)化,電子,通信等專業(yè),他們要求熟悉電路等知識(shí),非常熟悉各種常用元器件,掌握模擬電路和數(shù)字電路設(shè)計(jì)的開(kāi)發(fā)能力,熟悉硬件開(kāi)發(fā)模式和設(shè)計(jì)模式,熟悉各種芯片及外圍設(shè)備,熟悉8位16位32位處理器嵌入式硬件平臺(tái)開(kāi)發(fā)。有的要求有FPGA的開(kāi)發(fā)經(jīng)驗(yàn),精通常用的硬件設(shè)計(jì)工具:- Protel
- PADS(PowerPCB)
- Cadence
- OrCad
02.嵌入式驅(qū)動(dòng)開(kāi)發(fā)
這個(gè)可以硬件工程師來(lái)做,也可以軟件工程師來(lái)做,主要還是取決于設(shè)備。目前驅(qū)動(dòng)開(kāi)發(fā),除非是簡(jiǎn)單的設(shè)備驅(qū)動(dòng),實(shí)際上很多時(shí)候都是移植,所以更多的是需要掌握目標(biāo)平臺(tái)的硬件和系統(tǒng)特性。所以至少得掌握一些操作系統(tǒng)、系統(tǒng)結(jié)構(gòu)、計(jì)算機(jī)組成原理、數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)。熟悉嵌入式ARM/MIPS/PowerPC架構(gòu)。具有單片機(jī)、某種或多種32位嵌入式處理器的移植開(kāi)發(fā)能力,熟悉bootloader過(guò)程,具有扎實(shí)的硬件知識(shí),理解硬件原理圖,能獨(dú)立完成相關(guān)硬件驅(qū)動(dòng)調(diào)試,能夠根據(jù)芯片手冊(cè)編寫(xiě)軟件驅(qū)動(dòng)程序。如果涉及到網(wǎng)絡(luò)設(shè)備,或許還要掌握很多高層的網(wǎng)絡(luò)協(xié)議的原理。個(gè)人感覺(jué)這一塊雖然大部分不是很難,但卻是極為重要的。當(dāng)然如果要在這一層次提供對(duì)上層的多線程支持,某些驅(qū)動(dòng)也是很難寫(xiě)的。03.嵌入式系統(tǒng)開(kāi)發(fā)
這個(gè)沒(méi)聽(tīng)說(shuō)硬件工程師來(lái)做的。做這塊,熟悉操作系統(tǒng)的原理是必不可少的,比如內(nèi)存管理,比如線程調(diào)度,比如文件系統(tǒng)等等。還要精通處理器體系結(jié)構(gòu)、指令集、尋址方式、調(diào)試、匯編和混合編程等方面的內(nèi)容;熟悉操作系統(tǒng)啟動(dòng)流程。對(duì)于linux,要熟悉Linux配置文件的修改,掌握內(nèi)核裁減、內(nèi)核移植、交叉編譯、內(nèi)核調(diào)試、啟動(dòng)程序Bootloader編寫(xiě)、根文件系統(tǒng)制作和集成部署Linux系統(tǒng)等整個(gè)流程。這一塊要是真寫(xiě)起來(lái),困難程度那是相當(dāng)恐怖的,好在大多都是移植,很少聽(tīng)說(shuō)有公司要去開(kāi)發(fā)個(gè)操作系統(tǒng)的,沒(méi)Google的實(shí)力啊。04.嵌入式軟件開(kāi)發(fā)
這個(gè)嘛,沒(méi)有操作系統(tǒng)的話,程序一般不會(huì)特別復(fù)雜,如果有操作系統(tǒng)的支持,又和一般的軟件開(kāi)發(fā)很接近,所以盡可以看作是搞桌面開(kāi)發(fā)。這個(gè)要求就是熟悉系統(tǒng)的API,精通C語(yǔ)言的高級(jí)編程知識(shí),包括函數(shù)與程序結(jié)構(gòu)、指針、數(shù)組、常用算法、庫(kù)函數(shù)的使用等知識(shí)、數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)內(nèi)容;掌握面向?qū)ο缶幊痰幕舅枷?,以及C 語(yǔ)言的基礎(chǔ)內(nèi)容。精通嵌入式Linux下的程序設(shè)計(jì),精通嵌入式Linux開(kāi)發(fā)環(huán)境,包括系統(tǒng)編程、文件I/O、多進(jìn)程和多線程、網(wǎng)絡(luò)編程、GUI圖形界面編程、數(shù)據(jù)庫(kù)。熟悉常用的圖形庫(kù)的編程,如GTK、miniGUI、fltk、nano-x、QT等,掌握各種應(yīng)用層的網(wǎng)絡(luò)協(xié)議使用,以及各種音視頻技術(shù)等。05.通用技能
另外還有些以上四類都用得著的技能。1)基礎(chǔ)技能:搞嵌入式開(kāi)發(fā),還有一些必不可少的基礎(chǔ)技能
- 開(kāi)發(fā)平臺(tái)的熟悉。目前的嵌入式開(kāi)發(fā)大多數(shù)是在linux或者類linux下的環(huán)境下進(jìn)行的,那么linux的使用應(yīng)該熟悉吧,shell腳本得會(huì)寫(xiě)吧,配置文件得會(huì)改吧,GCC GDB得會(huì)用吧,Make工具得會(huì)吧?
- 比如項(xiàng)目管理工具的使用,都什么年代了,不會(huì)用CVS,也不會(huì)用SVN?請(qǐng)問(wèn),你還活在軟件時(shí)代的原始社會(huì)么?
- 數(shù)據(jù)結(jié)構(gòu)和算法。搞軟件開(kāi)發(fā),不懂?dāng)?shù)據(jù)結(jié)構(gòu),不會(huì)算法優(yōu)化,不會(huì)衡量復(fù)雜度,太不靠譜了吧?當(dāng)然,這個(gè)也不是要求啥算法都要會(huì),啥數(shù)據(jù)結(jié)構(gòu)都記得住,最起碼得知道有那么種東西,有什么作用,這樣用到的時(shí)候好歹也能查啊。
- 編程語(yǔ)言。關(guān)于JAVA,我知道現(xiàn)在JAVA的異軍突起,很是震動(dòng)了編程語(yǔ)言界,但是在嵌入式開(kāi)發(fā)下,不會(huì)C或者C 語(yǔ)言,實(shí)在說(shuō)不過(guò)去。當(dāng)然現(xiàn)在很多手機(jī)應(yīng)用完全用java寫(xiě)的,如果你只想搞嵌入式的上層軟件開(kāi)發(fā)又不想深入下去,只用JAVA也未嘗不可。關(guān)于匯編,嗯,這個(gè)可能挺難,畢竟跟具體的硬件架構(gòu)(主要是CPU)有關(guān),但是真的很有意思,而且在某些時(shí)候,它是不可替代的。
2)特殊技能:對(duì)于嵌入式開(kāi)發(fā)的某些部分必不可少,但對(duì)于有些(比如應(yīng)用開(kāi)發(fā))可能沒(méi)有多大用處
- 數(shù)字電路。這個(gè)主要是了解一些基本的電路知識(shí),如門電路、邏輯電路、存儲(chǔ)器、寄存器,為了更好的理解嵌入式芯片、存儲(chǔ)器、外圍設(shè)備等硬件的設(shè)計(jì),但往往在軟件開(kāi)發(fā)中未必能用的到。因?yàn)榇蟛糠钟布继峁┝撕芡暾能浖涌凇?/p>
- 操作系統(tǒng)。這個(gè)說(shuō)的是平臺(tái)上選用的操作系統(tǒng)。嵌入式產(chǎn)品操作系統(tǒng)實(shí)在是太多了。但操作系統(tǒng)的內(nèi)部設(shè)計(jì)原理都是殊途同歸。首先,要去學(xué)習(xí)的是操作系統(tǒng)原理,要去了解進(jìn)程通信、內(nèi)存管理、文件系統(tǒng)等等幾個(gè)重要的部分,因?yàn)檫@些在軟件開(kāi)發(fā)尤其是內(nèi)核驅(qū)動(dòng)開(kāi)發(fā)時(shí)會(huì)用到。接下來(lái),可以去熟悉至少一種主流的操作系統(tǒng),Linux是一個(gè)很好的選擇,去了解它的內(nèi)核架構(gòu),設(shè)備驅(qū)動(dòng)架構(gòu),如何去編譯、裁剪、編寫(xiě)應(yīng)用程序,以及如何使用在具體的嵌入式產(chǎn)品上。
- 計(jì)算機(jī)的組成/微機(jī)原理。主要是為了了解微型計(jì)算機(jī)的硬件工作原理,明白CPU、總線、I/O、存儲(chǔ)器等一些關(guān)鍵結(jié)構(gòu)是怎么工作的,雖然是很枯燥的知識(shí),但是對(duì)熟悉外圍設(shè)備硬件工作方式,及操作系統(tǒng),軟件架構(gòu)的設(shè)計(jì)及優(yōu)化相當(dāng)關(guān)鍵。
3)擴(kuò)展的能力:這些可能是要用到的
- 通信協(xié)議。對(duì)于非應(yīng)用層的通信協(xié)議,我實(shí)在不知道是不是該把它放入操作系統(tǒng)的范疇,因?yàn)楹芏嗖僮飨到y(tǒng)是沒(méi)有網(wǎng)絡(luò)部分的,但是在很多方面它又是由操作系統(tǒng)提供。當(dāng)然這些下層通信協(xié)議,貌似不太用關(guān)心,因?yàn)樘嗟拈_(kāi)源協(xié)議棧了。應(yīng)用層的網(wǎng)絡(luò)協(xié)議可能就要關(guān)心了,比如http、ftp、rtsp、rtmp、mms等等。
- 音視頻處理。比如文件封裝、音視頻的編解碼、各種音視頻的標(biāo)準(zhǔn),還有流媒體什么的。Ffmpeg是一個(gè)很好的東西,建議學(xué)習(xí)一下。
- 信息安全。嗯,這一塊貌似現(xiàn)在越來(lái)越受到重視了。
- 數(shù)據(jù)庫(kù)。唉,嵌入式設(shè)備能力越來(lái)越強(qiáng)啊!再搞搞,我看也不用交叉編譯了。
現(xiàn)有狀況分析
不少新人來(lái)到我們研發(fā)已近十幾年。這十幾年里,同一批人員,有的已經(jīng)很快適應(yīng)了環(huán)境,經(jīng)過(guò)自己的努力和付出,能為研發(fā)工作獨(dú)擋一面,成為某一方面的小專家;有的盡管前期不太適應(yīng),但是通過(guò)指導(dǎo)和修正,業(yè)已慢慢進(jìn)入了工作狀態(tài),相信經(jīng)過(guò)一段時(shí)間,會(huì)逐步擔(dān)當(dāng)起某一方面的研發(fā)工作。同一時(shí)期進(jìn)來(lái)工作,為什么他們現(xiàn)在的能力和狀態(tài)會(huì)產(chǎn)生如此大的差異呢?通過(guò)的相處和分析,我發(fā)現(xiàn)凡是進(jìn)步快的同志有如下特點(diǎn):- 勤奮,為了解決一個(gè)技術(shù)問(wèn)題經(jīng)常會(huì)主動(dòng)留下來(lái)加班。
- 鉆研,為了解決一個(gè)技術(shù)問(wèn)題會(huì)主動(dòng)學(xué)習(xí)各方面的資料,勤做實(shí)驗(yàn),用事實(shí)去驗(yàn)證;。
- 和領(lǐng)導(dǎo)和同事及時(shí)主動(dòng)溝通,集思廣益,爭(zhēng)取各方面的資源,充分利用已有的經(jīng)驗(yàn),避免走彎路,加快研發(fā)進(jìn)程。
- 有強(qiáng)烈的事業(yè)心和犧牲精神,不達(dá)目標(biāo)絕不停息。
- 工作沒(méi)有目標(biāo),精力分散,很多的時(shí)間花在網(wǎng)絡(luò)上,偷偷的看視頻。
- 工作推卸責(zé)任,把工作沒(méi)有進(jìn)展的原因推卸到工作難度太大,或者資源不夠,而自己卻又不主動(dòng)的去爭(zhēng)取資源。
- 沒(méi)有長(zhǎng)期為研發(fā)乃至個(gè)人的職業(yè)生涯有充分的打算,或者說(shuō)來(lái)研發(fā)的目標(biāo)比較低下只是為了混口飯吃;人無(wú)遠(yuǎn)慮,必有近憂,沒(méi)有遠(yuǎn)大的理想,外界任何一個(gè)小的干擾都會(huì)讓你三心二意,因而知識(shí)的學(xué)習(xí)沒(méi)有系統(tǒng)性。
- 和同事和領(lǐng)導(dǎo)的溝通不主動(dòng),甚至避讓,怕領(lǐng)導(dǎo)檢查工作。
- 更關(guān)注生活而不是工作。
- 比較在意自己的付出。
再論能力和勤奮及其他
笨鳥(niǎo)先飛早入林,對(duì)事物的認(rèn)知是和事物對(duì)大腦的刺激頻率和時(shí)間成正比的,一個(gè)事情經(jīng)常去做,時(shí)候經(jīng)常去琢磨,就能悟出其中的道理,對(duì)事物認(rèn)識(shí)深度是通過(guò)在實(shí)踐中不斷發(fā)現(xiàn)錯(cuò)誤,不斷修正才達(dá)到的。如果人不勤奮,把過(guò)多的時(shí)間和注意力放在工作之外的地方,那就自己切斷了實(shí)踐這個(gè)重要環(huán)節(jié),水平和經(jīng)驗(yàn)永遠(yuǎn)得不到提升,能力的提升更談不上了。接著就是職務(wù),收入上的提升,說(shuō)到底就是個(gè)人在社會(huì)上競(jìng)爭(zhēng)力的提升。不去提升你的核心競(jìng)爭(zhēng)力,成天沉迷于網(wǎng)絡(luò)還有其他事物,是否有點(diǎn)舍本逐末呢?以上就是本次的分享~往期推薦:分享幾個(gè)Ubuntu必裝的軟件常用的開(kāi)源協(xié)議有哪些?嵌入式編程中常用的宏定義有哪些?
一位程序員的十年工作總結(jié),需要注意這幾點(diǎn)!