[技術門診第230期] 走進嵌入式軟件開發高質高效殿堂
技術門診是51CTO社區品牌欄目,每周邀請一位客座專家,為廣大技術網友解答疑問。從熱門技術到前沿知識,從技術答疑到職業規劃。每期一個主題,站在***最熱的技術前沿為你引航!
本期特邀C/C++語言專家、軟件開發專家、系統架構師李云先生,將針對嵌入式軟件開發學習過程中遇到的問題給予解答。
本期專家:李云
擅長領域:嵌入式系統軟件開發、軟件平臺與框架設計、UML建模
專家簡介:摩托羅拉網絡部軟件架構師,資深軟件開發工程師、51CTO專家博主。專注于嵌入式系統開發、軟件平臺與框架設計和UML建模。早在2000年開始從事嵌入式軟件開發工作,包含:操作系統內核、文件系統和IP協議棧的移植,IDE硬盤、以太網芯片和PCI等外設的驅動開發。熟悉x86、PowerPC、XScale處理器,以及TI DSP。源碼級熟悉uC/OS、RTEMS和VxWorks實時操作系統的實現,并在這些操作系統和Linux操作系統上有著豐富的軟件開發經驗。著有《專業嵌入式軟件開發 — 全面走向高質高效編程》。
查看本期門診精彩實錄:http://doctor.51cto.com/develop-244.html
參與***技術門診:http://doctor.51cto.com/
精選本期網友提問與專家解答,以供網友學習參考。
Q:李老師,您好!我想請問下,現在常用的嵌入式開發工具有哪些?哪個比較好用常用,以前到了解用過RealView MDK 開發工具,不知它與別的工具有什么不同。
A:你好,從我的個人經驗來看,大型的嵌入式軟件開發大多采用的是基于命令行的開發方式,很少有采用GUI界面的。即使象VxWorks有那么好用的Workbench,我曾工作的團隊也是基于命令行進行開發工作的。至于RealView MDK,我想它更多地運用于基于ARM處理器的嵌入式系統開發中,是一款很好的開發工具。至于與其他工具的比較問題,我不能很好地回答。
大體說來,一個好的開發工具能極大地提高工作效率,但成為一個專業的嵌入式開發工程師這不是至關重要的一步。因為你會用這個別人也會用,對于我們的能力沒有什么區分度。就開發工具方面,成為專業的嵌入式開發工程師的關鍵點,在于我們能否理解和掌握開發工具背后的行為。比如,編譯器是如何編譯整個項目的?程序文件的結構是怎樣的?調試時斷點的原理又是什么?如何通過編寫Makefile來更好地完成項目編譯?等等。這也是我為什么會在《專業嵌入式軟件開發》中加入介紹程序結構和開發工具相關篇章的緣故。
Q: 李老師,你好,我是嵌入式初學者,嵌入式從應用層到驅動動層的一些實驗都走過了,然后覺得這個專業學的東西太多了,涉及太多的知識,即將畢業,不知道從應用層還是從底層入手進入這個行業,本人比較喜歡偏向底層開發,但是自己在這方面的知識和經驗還是不足,請問李老師有什么好的意見呢?
A:我相信這是很多新手都會面臨的問題,我也是曾經這樣走過來的。首先,正如您所說,真正的嵌入式軟件開發需要掌握很多的知識。從硬件方面,工程師需要完全理解計算機的體系結構;從軟件方面,工程師需要掌握各種開發工具、了解程序的結構、精通編程語言等等。正因如此,這決定了從事嵌入式軟件開發是一個艱難和長期的學習和成長過程,我們先要從思想上樹立這種觀念,這使得我們在成長的過程中不會因為畏懼而放棄。
短期來看,我覺得您需要從軟件基礎入手,掌握嵌入式軟件開發所需掌握的各種軟件開發技能。畢竟,我們一上手工作是以軟件作為切入點的。至于硬件方面的知識,雖然也很重要,但學習它的緊迫程度更低一點,我們可以邊工作邊積累。
如果您喜歡做底層開發,那我建議您跟著自己的興趣走。有興趣是很難能可貴的一件事!至于知識和經驗,每一個新手上路時都缺乏,這不是根本問題。對您最關鍵的,或許是能找到一個符合自己興趣的新工作,這樣就有機會成為一個真正的底層嵌入式軟件開發人才。
祝您進入職場有一個好的起點!也愿您能堅持自己的興趣!
Q:李老師,您好。嵌入式軟件開發相對而言與硬件結合更加緊密,但各種芯片又不可能全部掌握。作為軟件開發人員,您認為應該對硬件知識的掌握達到何種程度?另外需不需要研究算法呢?
A:你好,其實不論是什么芯片,我們掌握它們的方法都是一樣的:1)能看懂時序圖。2)能熟練地查閱芯片手冊。這也間接地回答了要掌握到什么程度。
我認為您是在問軟件算法對嗎?如果這樣,是否要研究算法取決于工作內容。在很多情形下,掌握《數據結構》這類書中的算法就夠用了。
Q:李老師,您好!我在學習嵌入式的過程中,發現總是不能專注于一種平臺來學習,今天學兩下Linux,明天就開始玩Android,老是無法專注,對此您有好的建議嗎?
A:這可能和我們自己的定位有關 — 不清楚以后到底要干什么。
我個人覺得學習Linux與學習Android是不大一樣的。前者側重于操作系統,后者則更側重于應用框架;前者是用C語言,后者則更多的是Java。相比之下,做Android應用(不是驅動等)的門檻更低。對于沒有多少工作經驗的人來說,從事Android是一件好事。從就業前景來講,移動互聯網是個大趨勢,因此Android所需的開發工程師數量會很大。
做軟件開發有一些內容我們要注意。比如,真正的高水平是指我們能掌握一定的開發方法、能理解軟件開發的困境、有很強的設計能力、熟悉計算機體系結構和操作系統實現原理等。可以說,這些內容與具體是Linux或Android是無關的(還可以是其它的VxWorks或iOS什么的),我更傾向于將Linux和Android開發理解為是一條幫助我們理解困境和掌握技能的一種途徑。
對于您的問題,我認為自己可以問幾個問題:1)我是新手嗎?如果是,我認為學Android應用開發是更好的選擇,畢竟我們需要有一份工作,以便以后獲得更多的學習機會。2)我是個能堅持的人嗎?如果是,則無論現在學什么都行。在工作中我們還是有很多機會去改變自己的選擇的,只要我們能堅持沒有什么學(做)不好的。
總而言之,請根據自己的性格特點和愛好去定位好自己要做什么。一旦定位好了,您現在不能專注的問題也就解決了。
Q:我現在有個困惑,你書中提到,對于軟件質量,軟件設計是根本,這個我也很有感觸。一個設計不良的軟件產品,不僅影響質量,也帶來很大的維護、擴展的困難,但設計好不好怎樣來考量呢?這是架構師的職責?還有你怎么看待工具和流程的關系,因為我發現在我的公司有很多工具可以讓我們使用,比如review board等,但我發現很少人將它用起來,很多時候很多低級錯誤我認為都是可以通過review的方式來控制的,但由于缺少這一環節硬性的流程控制,很少人用它。說了一堆,有點沒有頭緒一樣,因為這些都是我有疑惑,但又不知問題在哪,期待您能解答,也同時能幫忙理出一個頭緒來,謝謝!
A:正如我在書中所說,設計質量的度量是軟件行業的一個難點,所以設計好壞的考量很難用某種具體的指標去表示。真正了解設計質量的人正是一線的軟件工程師,盡管如此,也很難用某種具體的指標將工程師的這種“心知肚明”表達出來。
軟件的設計質量必須由軟件開發架構師去把控,就我的工作經驗,軟件行業的混亂很大程度上與缺乏高質量的軟件開發架構師有很大的關系。
對于工具與流程的使用習慣,這需要公司的文化去強化。我們的工作特點可能平時太隨意,只要工作做完就行,而沒有考慮讓自己專業做事。其實,對工具和流程的使用習慣能在某種程度上反映我們的專化化。形成使用習慣之前,需要公司領導層面鼓吹其重要性,并由各項目負責人帶頭去做好,否則很難真正落實。
Q:李老師您好,我是一名大一的學生,上的是專科,學的是計算機應用技術專業,課程是IT運維方面的,不過我想未來做嵌入式開發,現在在跟著學習數字電路和單片機,有C語言基礎,我想問下老師,對于我未來走進嵌入式領域,該怎樣學習,以及尋找實習單位時怎樣選擇?謝謝老師!
A:你好,如果有C語言和單片機的基礎,我建議自己可能先鞏固這兩門內容。可以說,學好這兩門對于嵌入式軟件開發的學習非常有幫助。第二步可以考慮做一些實際或虛擬的軟件項目,在此我推薦您看我的書。該書除了可以讓您對開發工具、開發環境和操作系統原理有深入的掌握外,書中所提供的學習環境也可以用于編程實踐。
第三步可以考慮選擇某一款處理器以對之進行深入的學習。比如,ARM就是很不錯的學習目標處理器。
有了以上三步后,我覺得您需要通過工作來加深各方面知識的理解,這是一個長期的過程。其中可能根據您的能力增長需要學習各方面的內容,這或許不是我在這里能簡單回答的了。
對于實習單位,以現在的就業形勢來看,我覺得只要單位愿意接收,且自己覺得有東西可學就行了。當然,如果實習單位與嵌入式系統開發有關就***了。剛開始我們要求不要太高,相比待遇,學習機會更重要。