從事偏向軟體的嵌入式開發的學習步驟是什麼?要看哪些書?做哪些事?

請按學習的先後順序說一下。謝謝。


1. 編譯、鏈接載入編譯與體系相關:

程序員的自我修養 (豆瓣)

Computer Systems (豆瓣)、計算機組成與設計 (豆瓣)

The Definitive Guide to GCC (豆瓣)

GNU Make項目管理(第三版) (豆瓣)

2.驅動與環境構建:

嵌入式Linux基礎教程(第2版) (豆瓣)

Linux Device Drivers (豆瓣)

深入Linux設備驅動程序內核機制 (豆瓣)

3. C語言(autotools……, 有比較多的重複)

Linux C編程一站式學習 (豆瓣)

C語言程序設計 (豆瓣)

21st Century C, 2nd Edition - O"Reilly Media

4. 操作系統(μC/OS linux):

專業嵌入式軟體開發 (豆瓣)

基於嵌入式實時操作系統的程序設計技術 (豆瓣)

深入理解LINUX內核 (豆瓣)

5. 實踐開發的基本科普:

嵌入式系統開發之道 (豆瓣)

6. 數據結構與演算法:

演算法(第4版) (豆瓣): 接地氣,倒數章節有lzw數據壓縮演算法的講解,太實用了。

有很多書本會相互包含和重複但是並不影響閱讀與學習進度,如果是電氣專業方面的可以先看看μC/OS,再繼續Linux。當然直接上也可以,但是最好先學習OS課程。很多書籍可以先不學習,需要的時候參考用或者再完整學習,例如GNU Make。

20150601更新:

畫了一張圖,表示技能樹,沒有軟體工程部分:


補充:

近期,鄒欣老師應邀給廣州致遠電子做了三個小時的技術培訓講座(視頻)。

講座的摘要和問答匯總 :鄒欣講座:現代軟體工程--構建之法

在講座中,鄒老師談到了如下項目經理可能會關心的問題:

鄒欣:如何合理的使用全新的技術?老版本平台還是新平台,全部升級?老朋友熟悉,新朋友有坑! 謹慎升級,開發環境版本的一致性。

開發決策。用戶需求、 工程質量、開發時間評估——每一個開發階段不能僅僅只考慮增加功能,包括過程的改進工作,也需要計划進去。

鄒欣:微軟如何考核軟體工程師——最開始,半年一次,然後一年一次。這都是一維體系,後面覺得這不夠全面,引入二維體系。一,完成任務,沒有比例劃分 二,貢獻,有嚴格的比例劃分。後面,覺得比例不好,又改回一維。有很多約束情況下,如何激發把工作做的更好?一維是按照領導安排任務情況,好中差,不設名額。二維是按照對項目的貢獻評估,按名額劃分貢獻程度。

鄒欣:評估體系如何建立?技術和管理。技術等級和管理等級薪資明確是一樣,消除員工專心做技術的顧慮。員工對上級有年度評估,大數據,橫向與縱向,多維度比較。經理面對反饋報告,和平級,和其他國家團隊,橫向和縱向比較。

評估體系中的挑戰:*對貢獻度按比例有區分度。* 用歸併排序做績效考核。過程的糾結,有時是零和。 囚徒困境。

評估體系如何建立?技術和管理。技術等級和管理等級薪資明確是一樣,消除員工專心做技術的顧慮。員工對上級有年度評估,大數據,橫向與縱向,多維度比較。經理面對反饋報告,和平級,和其他國家團隊,橫向和縱向比較。

@劉鑫 去廣州聽了鄒老師的講座,並寫了系列專欄回顧講座內容:

人才選拔——履歷完美的人,可能會缺少開拓進取精神

初創團隊,需要借鑒和學習的,不是現在的微軟,而是初創階段的微軟

==下面是原來的回答

有一本書,3年前尚未出版,就被廣州周立功單片機公司創始人周立功先生預定了300本,他要讓他們的研發人員人手一本:

對,就是我在有哪些可以提高程序員技術檔次的書或博客?中重點推薦的好書:

構建之法 ——現代軟體工程 (作者:鄒欣老師)(多看版《構建之法》已上線)

今早,讀到了這篇由一位嵌入式開發工程師寫的讀後感

《構建之法》讀後感

他寫到:

我是網路工程專業畢業的,業餘時間喜歡研究Linux內核中的面向對象思想和設計模式,喜歡玩硬體,還有不能自拔的「工匠情懷」,所以畢業後,工作在嵌入式領域,希望能「軟硬兼施」

這位讀者朋友在讀後感中提到的「主治醫生模式」,是《構建之法 ——現代軟體工程》中的「第5章 團隊和流程」的內容,如圖:

這一章還介紹了「社區模式」、「業餘劇團模式」、「秘密團隊」、「特工團隊」、「交響樂團模式」、「爵士樂模式」、「功能團隊模式」,以及「官僚模式」。

讀後感中提到的「分而治之」的辦法,來自《構建之法 ——現代軟體工程》中的「第8章 需求分析」:

=========================

來自華中科技大學GET創新團隊的技術總監陳冰博士在第一時間就購買並閱讀了《構建之法 ——現代軟體工程》,他寫了這樣的書評:

構建之法,超越軟體 (評論: 構建之法)

==========

更多關於構建之法 的內容主題介紹,請參看這些回答:

1有哪些可以提高程序員技術檔次的書或博客?

2在移動互聯網小型項目/產品調研設計開發發布這個過程中有沒有風險管理?

3從事偏向軟體的嵌入式開發的學習步驟是什麼?要看哪些書?做哪些事? -

4單元測試應該誰來做?怎樣才算是一個好的單元測試?

5國內為何很少有人做結對編程呢?是確實不好還是屬於中國特色?

=========

BTW,我們正在籌建嵌入式軟體開發微信交流群,有興趣的朋友請私信我。


(1)學會用Linux。這個很多,鳥哥私房菜。(嵌入式開發只需要你使用,不需要過多研究伺服器配置)。

(2)C語言。精通。要相當精通。嵌入式工程師的面試就是C為基礎。參考零基礎學習C語言 視頻

(3)基本的數據結構與演算法,嵌入式那個性能受限的系統,必須非常考慮性能,內存大小。數據結構與演算法剖析 視頻

(4)操作系統的應用。先學Linux的系統編程 linux高級程序設計(第3版)視頻

(5)操作系統的內核。ucosII是一個不錯的起步,你搜索一下《ucosII標準教程》。但最終要回到Linux。要了解操作系統的驅動原理,內核機制。你搜索一下陳莉君的《Linux內核設計與實現》

(6)對處理器的理解。對介面及外設原理的理解。例如ARM,或許我們並不需要去製作硬體電路,但一定要看得懂硬體電路。《嵌入式ARM系統原理與實例開發》,對中斷,指令,啟動這些必須熟悉。

(7)結合以上,寫驅動以及應用。如果涉及具體的領域,還需要相應領域的知識,例如圖像,機電等等,這個時間,你完全 知道學什麼了。Linux開源項目參考


Embedded Linux Primer: A Practical Real-World Approach (2nd Edition)

The Linux Programming Interface: A Linux and UNIX System Programming Handbook

Making Embedded Systems: Design Patterns for Great Software

Linux Kernel Development (3rd Edition)

Embedded Firmware Solutions: Development Best Practices for the Internet of Things

Embedded Linux Projects Using Yocto Project Cookbook


Linux技術手冊-- &> C語言- &> C指針- &> C陷阱與缺陷- &> Unix環境高級編程- &> Linux設備驅動程序- &> TCP/IP協議- &> Linux內核- &> ARM彙編


嵌入式首先確保自己的C語言過關,然後可以從系統編程入手,在深入到裸機開發、系統移植、驅動開發 等。這是大致的學習方向。嵌入式是屬於今年開始火爆起來, 嵌入式需要懂得的一些基本有,Linux,C語言,數據結構,文件IO,並發程序設計,進程間通信,網路編程,資料庫開發,在線詞典,ARM-4412,系統移植,驅動開發,Android系統開發。還可以在群里20103091多交流,等你理解這麼些關鍵詞的時候,那麼你嵌入式相對也是懂得了差不多的地步。嵌入式目前比較用的最多的就是智能小車的領域。深入人們的生活。以後也是一種朝陽的行業。 下面是學習的步驟。大致如下。

一、 嵌入式的學習第一階段首先的c語言,C語言是嵌入式領域最重要也是最主要的編程語言,然後在c語言的基礎上學習C語言的高級編程知識,包括結構體、共用體、內存管理等;然後學習數據結構的核心內容,包括順序表、鏈表、隊列、棧、樹、各種查找和排序演算法等。

二、學習是關於Linux文件下應用層開發,並發程序設計,Linux應用開發中的網路編程,資料庫之sqlite3。

第三階段包括Zigbee系統開發,低功耗wifi網路開發,藍牙4.0BLE開發,RFID開發,mbed 開發平台(cortex_M4單片機),6LoWPAN、Contiki系統的移植,OneNET開放雲平台。

第四階段就可以選擇做智能家居系統、智能農業檢測、智能物流倉儲系統、安防監控系統、智能穿戴、智能機器人小車、無人機等項目。


下面是詳細的學習路線:


如果做嵌入式。

第一,C語言一定過關,嵌入式都是靠C、C++吃飯的。

第二,如果偏底層,就去玩玩單片機,玩上層,就玩玩linux,ARM評估板。

第三,最重要的,認真做項目。只有認真做不同的項目,做項目的不同部分,才能學到、玩到不同的更多的東西,嵌入式是接觸實際設備的行業,很多東西是通的,也有很多東西是太過專業的,認真做好每一個點,把所有點拼湊到一起,聯繫到一起,系統的概念就有了。


C語言,ARM體系架構,ARM彙編,uCos/Linux。。。要學的很多,不一一列舉。自己去了解。


最好講一下具體是為什麼設備進行嵌入式開發。

假設是從零開始,我覺得最開始你得打好編程語言的基礎,從C開始吧,然後了解一些簡單的演算法知識,練習是必須的;然後開始了解嵌入式開發的目標設備,以及開發所用的語言的語法和性能方面的特性,如果有了第一步的基礎,這些都不困難;之後就是實際的開發了。


推薦閱讀:

如何把一本很難的書看懂?
對於錯題本的一些困惑?
優秀的程序員在學習方法上有哪些奇技淫巧?
錯題本是用來看還是用來做?
如何學習才會不再似懂非懂?

TAG:書籍推薦 | iOS | 軟體開發 | WindowsPhone7 | iOS開發 | Android開發 | 嵌入式系統 | 學習方法 | 學習規劃 | Linux軟體 | Android |