嵌入式軟體開發需要學習哪些內容?
本人是普通一本的電信專業大一學生,對軟體感興趣,畢業後想從事嵌入式軟體的工作,請問需要著重學習哪些內容?目前只學完c語言。
六年前我也跟你一樣,大一,電信專業,不過那個時候我還沒有像你這樣就明確了自己以後想幹嘛,想做哪個方向,所以很佩服題主你才大一就如此目標明確,哪像我那個時候還帶著些迷茫。
本來今天下午在地鐵上看見邀請我回答這個問題,想晚上回來再好好答一答的,不過晚上看了其它人的回答,發現他們已經把我想說的給說了。那就是基礎一點要打好。
高數能學多紮實就學多紮實,工作以後你可能會遇到有時候需要實現某些演算法,這個時候你不需要厚著臉皮去請教大牛給你解釋某個論文里的演算法推導過程。雖然敢於請教也是一種好的習慣。
把英語學紮實了,因為你是做嵌入式的,你需要閱讀晶元手冊,遇到難題,你可能需要查閱英文書籍、網站、論文等去尋找答案,你會用到github,stack overflow。
把電路,數模電也重視起來,雖然你是搞軟體的,可是你一定要能看的懂電路圖,不然搞什麼嵌入式。
還有一個我當年很不喜歡的一門課程,因為老師上課極其無聊,每節課都是睡過去的。現在想想,這個鍋得我自己背。那就是數據結構,現在覺得真的是挺重要的,做單片機的時候還沒啥感覺,現在偶爾搞搞演算法,真的發現這玩意真的能決定你的軟體最終能搞到什麼程度。軟體等於數據結構加演算法,這話是很有道理的。
其他的話,就是這個專業只學是不行的,必須多動手,多寫寫代碼,多混混實驗室,自己動手做出些東西出來,電賽什麼的能參加一定要參加,而且最好拿拿獎,對於我們這些普通本科出來的人,這些獎項會在你找工作的時候很有幫助,即使考研,導師也會更喜歡有豐富項目經驗的。本科階段設置的每一門課,對以後的工作或多或少都是有用的。個人覺得好好學好基礎課(數學)和專業課,打好基礎,比看在線視頻實在的多。
先推薦本很出名的書吧——《深入理解計算機系統》。這本書主題涉及的比較廣泛,從計算機編碼、處理器體系結構、存儲結構到操作系統、系統、網路編程等等,是學習、理解計算機和軟體的基礎原理和方法的非常好的一本書。這本書比較厚,而且是實打實的教材(本來就是來自卡內基梅隆大學的教材),但不必因此產生畏懼情緒。題主有些c語言的基礎已經可以開始閱讀,而且不必追求一下子全部看完或看懂。靜心一點點的讀,有餘力做一些其中的習題,相信會有不小的收穫。
部分同意前面一個匿名回答的觀點,題主目前才大一,不必把自己的方向限定住,而應該廣泛涉獵,多方面嘗試。既然是對軟體感興趣,軟體方面基礎性的東西都可以嘗試了解、學習。甚至不僅僅是軟體方面,不要把正常課程體系中的知識太忽略。嵌入式方面,需要C的基礎打牢,有一定硬體方面的基礎知識,可以多了解學習一下Linux。其實做嵌入式軟體可能會涉及到的知識也是很多的。
從兩個方面給一點建議吧。
一是打牢基礎,包括認真學習自己的課程,選一些自己感興趣的課程;多讀書;通過互聯網了解多方面的知識。二是做一點動手實踐,可以玩一玩單片機,樹莓派這些,或者加入一些實驗室組織。實踐主要是為了給自己增加感性認識,從中找到還需要學習的東西。代碼這個東西也是自己親手寫一點東西才學得會的。以後找機會加入到實際的項目中。作為大一的學生,建議學習(打基礎)為主,實踐為輔。但其實二者相輔相成,哪一方面多做一點也都可以,不致太過偏廢某一方面就好。除了推薦了本書,後面可能說的比較泛泛,但無論如何我不打算給題主列出一份『學習清單』。重要的是要有興趣驅動,心中有疑惑的地方就去網上查,書里找,多掌握計算機和軟體中的基礎概念,基本原理。高年級後積極加入一些實驗室/項目,或是某個老師,再做一些專門方面的學習/研究可能會更好。
首先你要知道你自己要做什麼,以後的發展方向如何,可以參考我的這個答案,為自己選擇一個培養方式:嵌入式要怎麼選擇方向呀? - 知乎
下面說所有這些方嚮應該具備的基礎。我簡單的繪製了思維導圖,總體上就是這樣的。
(一)我的背景
我在讀本科的時候沒有一個完整的歸類,一直都在不斷的常識,不斷的學習,在高考完的假期學的C語言(可以做一個科學計算器)就這個基礎,學單片機,學MATLAB,學資料庫,甚至學Java,那個時候每天處於一種繁忙的狀態,可這些如果不親自體會去學一學,就不知自己喜歡什麼。後來大二下學期,我告別了這樣繁忙的生活,開始鑽研DSP,我的嵌入式之路就是從DSP開始的。那時候也是不斷查資料,去試圖理解這個行業。上圖,每個嵌入式人可能都有自己的理解和歸類,但站在我現在的角度我就是這樣理解的。嵌入式的學習體系十分龐大,軟、硬和理論基礎都要掌握。除了演算法工程師,還沒見過一個可以脫離硬體單獨開發軟體的嵌入式工程師,即便是學習軟體,也要掌握相應的硬體規則,我們的編程不同於CS的,我們要依託硬體,可能在硬體構造中,用了一個不同的小小的電容,我們的程序都可能會發生改變。
(二)解釋一下思維導圖
我把嵌入式分為三個大支柱,你需要三大支柱來支撐整個嵌入式理論體系。不是每一個分之都是重點,但有一些你需要掌握,需要了解,需要自己親手去實驗,這樣有助於你做好充分的工作對接。你未來的工作,可能僅僅是某個分支上的一個的深化。
有疑問的可以在評論問我,歡迎討論問題。
以前從來沒有想過今天以嵌入式軟體工程師的身份來回答問題。
青春,有懵懂。不知道是正常的,就算是走過幾十年的老頭也有犯迷糊的時候。所以你可以不要求自己有多麼清晰,只需要知道你是學生,未來想從事的是技術即可。
因為大學還有四年,未來還有很多變數改變你的想法,但有一顆從事技術的心,請深藏,請保留,請珍惜,請敬畏。
看不見的分割線,那就說說如何學習嵌入式軟體開發吧。
1. 初現:先說說動手部分,我覺得學生還是先得把實踐作為第一步,然後反過來推敲理論,有助理解
做嵌入式軟體,編程語言是工具,目前主流是C(熟練使用),彙編看得懂就行。作為學生,語言不求多,求一門熟練即可,關鍵在練。
開發板+開發文檔,這個是動手的基礎,從控制一個LED燈,到星火燎原整個系統,大部分底層嵌入式軟體工程師,都是在調試硬體的功能,在調試過程中融會貫通
以上資源,請與貴校實驗室溝通。
等你有能力根據文檔和需求,完成任何的一個調試,你就可以真正進入第2步學習,也許在很多高校第二步是第一步的基礎,我列在第二步,是因為很少人能真正理解。
2. 分界:管理軟體or硬體驅動
這時候你可能會有疑惑,到底嵌入式軟體是什麼?
管理軟體:內存怎麼管理,文件系統怎麼管理存儲設備,驅動模型是啥
看《Linux設備驅動程序》,《深入理解Linux內核》及類似書籍,建議前期看通俗易懂的。
牛人創造,初學仿造,見Linux源碼:https://github.com/torvalds/linux
硬體驅動:中斷到底是什麼,硬碟到底如何讀寫,鍵盤怎麼運作,WIFI怎麼通信數據
這個我推薦一個網站:https://www.jedec.org/
找你感興趣的外圍模塊開始研究,四年你能深入研究一個就行,比如USB或 Flash或I2C等,其他的了解即可,不用深入研究。
3. 修鍊:數電和模電
要成為大神,這個必經之路,也許你學後就不願意做嵌入式軟體了,因為它的淫技奇巧可以美稱為神來之手。如果你能把這兩個走上王者之路,我拜大神。
經過這三步,加上多多實踐,你在一家公司可以利於不敗之地,至少也有口像樣的飯吃。找不到,我可以推薦。
以上,對以上三步僅僅是理想狀態。
因為在人生道路上,你會發現各種可能性:
還要有良好的各種數學基礎,技術的基礎
還要讀文檔,才會發現你得有英語基礎
還要紮實的物理電路的知識
還要掌握邏輯思維能力
還要提高情商
還要鍛煉身體
還要談戀愛
首先嵌入式是屬於軟體與硬體的相結合,所以說如果自學的話,一定要按照系統性的學習下,這樣避免走彎路,除了書籍以外還有就是看一些視頻講解,這樣自己學習起來也順手,我先給你說下學習的順序,嵌入式首先確保自己的C語言過關,然後可以從系統編程入手,在深入到裸機開發、系統移植、驅動開發 等。還可以在群里20103091多交流,這是大致的學習方向。嵌入式是屬於今年開始火爆起來, 嵌入式需要懂得的一些基本有,Linux,C語言,數據結構,文件IO,並發程序設計,進程間通信,網路編程,資料庫開發,在線詞典,ARM-4412,系統移植,驅動開發,Android系統開發。等你理解這麼些關鍵詞的時候,那麼你嵌入式相對也是懂得了差不多的地步。嵌入式目前比較用的最多的就是智能小車的領域。深入人們的生活。以後也是一種朝陽的行業。 下面是學習的步驟。大致如下。
一、 嵌入式的學習第一階段首先的c語言,C語言是嵌入式領域最重要也是最主要的編程語言,然後在c語言的基礎上學習C語言的高級編程知識,包括結構體、共用體、內存管理等;然後學習數據結構的核心內容,包括順序表、鏈表、隊列、棧、樹、各種查找和排序演算法等。
二、學習是關於Linux文件下應用層開發,並發程序設計,Linux應用開發中的網路編程,資料庫之sqlite3。
第三階段包括Zigbee系統開發,低功耗wifi網路開發,藍牙4.0BLE開發,RFID開發,mbed 開發平台(cortex_M4單片機),6LoWPAN、Contiki系統的移植,OneNET開放雲平台。
第四階段就可以選擇做智能家居系統、智能農業檢測、智能物流倉儲系統、安防監控系統、智能穿戴、智能機器人小車、無人機等項目。
課程學習系統性的學習如下:
嵌入式基礎課程 26課時140小時2分
L1 9天輕鬆掌握C語言
D1 必備Linux命令和C語言基礎
D2 數據類型、常量、變數及運算符
D3 C語言輸入輸出專題
D4 C語言控制語句
D5 C語言數組和字元串
D6 指針專題一
D7 指針專題二
D8 函數專題1
D9 函數專題2
L2 Linux 及C語言高級開發
D1 軟體包管理及shell命令
D2 Linux shell命令
D3 Linux shell腳本編程
D4 Linux C語言高級編程
D5 Makefile
L3 數據結構全攻略
D1 數據結構順序表
D2 單鏈表上
D3 單鏈表下
D4 循環鏈表及線性表的應用
D5 棧及其實現
D6 隊列實現及應用舉例上
D7 隊列實現及應用舉例下
D8 樹和二叉樹上
D9 樹和二叉樹下
D10 查找上
D11 查找下
D12 排序
嵌入式應用層核心課程 25課時86小時3分
L4 嵌入式Linux下文件I/O精講
D1 標準I/O上
D2 標準I/O下
D3 Linux下文件I/O
D4 庫的製作及使用
L5 Linux並發程序設計你該這麼學
D1 進程編程及守護進程
D2 進程編程及守護進程2
D3 線程專題
D4 Unix進程間通信方式上
D5 Unix進程間通信方式下
D6 System V IPC對象上
D7 System V IPC對象下
L6 Linux網路編程必修篇
D1 網路基礎上
D2 網路基礎下
D3 TCP編程
D4 並發伺服器
D5 UDP編程
D6 IO多路復用
D7 TCP、IP協議原理
D8 網路編程擴展上
D9 網路編程擴展下
L7 嵌入式資料庫之sqlite3
D1 嵌入式資料庫之sqlite3上
D2 嵌入式資料庫之sqlite3下
L8 在線詞典綜合實戰
D1 在線詞典項目介紹及框架搭建
D2 在線詞典項目註冊登錄的實現
D3 在線詞典項目功能實現
嵌入式底層核心課程 39課時208小時31分
L9 精通ARM體系結構及介面技術(基於4412開發板)
D1 ARM基礎(基於4412開發板)
D2 ARM指令(基於4412開發板)
D3 ARM異常處理
D4 ARM裸機開發
D5 ARM通訊介面
D6 ARM中斷機制
D7 ARM波形控制
L10 全面掌握嵌入式系統移植
D1 系統移植概述及環境搭建上
D2 系統移植概述及環境搭建下
D3 Bootloader移植上
D4 Bootloader移植下
D5 Linux內核分析
D6 Linux內核移植及網卡移植
D7 第三方驅動移植
D8 根文件系統製作
L11 嵌入式內核及驅動開發初級
D1 設備驅動環境搭建
D2 驅動模塊開發上
D3 驅動模塊開發下
D4 字元設備驅動基礎上
D5 字元設備驅動基礎中
D6 字元設備驅動基礎下
D7 中斷編程1
D8 中斷編程2
D9 中斷編程3
D10 中斷編程5
D11 中斷編程4
D12 平台匯流排專題1
D13 平台匯流排專題2
D14 平台匯流排專題3
D15 平台匯流排專題4
L12 嵌入式內核及驅動開發高級
D1 高級驅動學習方法
D2 輸入子系統1
D3 輸入子系統2
D4 輸入子系統3
D5 輸入子系統4
D6 I2C子系統上
D7 I2C子系統下
D8 設備樹(上)
D9 設備樹(下)
Android系統開發 6課時21小時7分
L13 一起學Android系統開發
D1 Android系統開發之系統概述及開發環境搭建
D2 Android系統開發之系統編譯過程詳解
D3 Android系統開發之模塊編程及fastboot使用
D4 Android系統啟動流程分析上
D5 Android系統啟動流程分析下
D6 Android系統開發之HAL硬體抽象層的開發
嵌入式項目實戰 16課時58小時18分
L14 嵌入式項目
D1 ARM概述(基於210開發板)
D2 彙編指令集及MDK環境安裝
D3 GCC開發環境搭建
D4 異常處理機制
D5 中斷處理實現
D6 時鐘系統
D7 ARM GPIO編程
D8 ARM串口編程
D9 ARM nand flash編程
D10 從0編寫Bootloader從0編寫Bootloader(上)
D11 從0編寫Bootloader從0編寫Bootloader(下)
D12 四軸飛行器開發技術解析
D13 小米體重秤技術開發解析
D14 智能WiFi小車開發技術大揭秘
D15 小米手環軟硬體開發技術解析
綜合性的學習範圍如下:
首先題主是大一學生沒必要這麼早把自己方向定死慢慢來不急的
我給題主推薦一些書吧
階段一
《The C Programming Language》【美】Brian W. Kernighan David M. Rithie;《UNIX 環境高級編程》(沒必要一口氣看完當字典使也是不錯的);《UNIX 網路編程》(同上);以上兩本書重點:進程,線程,IPC以及基於socket的網路編程章節是重點,要掌握基於select/poll/epoll的高並發伺服器模型;
看完這兩本之後寫一些小軟體玩玩,天氣預報,計算器(逆波蘭),網路聊天室之類的,此外看一些開源庫,推薦libevent(對於初學者來說難度很大,不過這不是不看的理由),以此強化C語言,加深對網路編程和線程相關概念的理解及應用。階段二
此時,題主可以買個STM32的開發板玩玩(基於庫開發和寄存器開發都要會),一定要熟讀datasheet以及STM32參考手冊,這期間一定要將常見的介面與匯流排搞明白了,如:串口,IIC,SPI,CAN,乙太網介面,SD和SDIO等,然後題主可以用其做一些小玩意,如:體溫計,平衡車,小四軸等等;一定要多動手,多練,多動手,多練,多讀晶元datasheet,別做伸手黨……
然後嵌一個uCOS或者FreeRTOS玩玩,了解一下這些輕量級操作系統的原理,網上有一些電子書籍,題主可以自行查找,推薦邵貝貝的書。
階段三
這一階段題主需要買一個ARM開發板了,可以選擇ARM+FPGA或者ARM+DSP,題主可以自行上網了解一下具體買哪一個這時需要的書籍如下:
《鳥哥的linux私房菜》(linux平台下的各種命令一定要熟爛於心啊);
《Linux與Unix Shell編程指南》(此書已絕版可以買二手,影印或者下電子版);《ARM體系結構與編程》(杜春雷著,一定要配合UBOOT看);《Linux設備驅動開發》(LDD);《Linux設備驅動開發詳解》(宋寶華);《深入理解Linux內核》;《Linux內核源代碼情景分析》(毛德操著);還有一些只要是編程就需要掌握的理論基礎:
《演算法導論》;《數據結構與演算法分析》;《深入理解計算機系統》;《操作系統:精髓與設計原理》;《編譯原理》;為了紮實C語言還有如下不錯的書:
《C和指針》;《高質量C++/C編程指南》;順路看一下林銳博士寫的《大學十年》給自己打打雞血;PS.推薦一個閱讀源代碼的軟體Source Insight(特別棒)
PPS.C++也要學啊
==================================
最後給題主說一下方向問題,嵌入式方向挺多的,我給題主舉一些例子吧:
比如說演算法,由於我們從感測器中讀出來的數據不可以直接使用,需要做一些濾波降噪二值化處理,這就需要題主有紮實的數學功底了,什麼線代,傅里葉,拉普拉斯,少不了,還有MATLAB也要會用;
還有就是驅動開發,需要題主深入了解各種匯流排協議,熟讀datasheet是基本功,還要看懂電路圖,各種電子儀器的使用,示波器萬用表等;
當然還有界面開發,比如QT,這就需要題主學習C++了,至於QT的學習方法,個人覺得沒必要買書,官方文檔就是最好的書;
此外,還有上層應用開發,這時可能會用到資料庫,不要意外,嵌入式開發也會用到資料庫,比如SQLite;
總之,學習嵌入式不是一蹴而就的,很磨人的,慢慢來吧。
linux,fpga,信號與系統
謝邀。
但還是匿名了。
不建議你現在定下以後從事嵌入式工作這樣的目標。
我當年一心想著畢業以後從事嵌入式軟體開發,為此保研的時候拒絕了某圖像領域的教授的邀請,當時覺得搞圖像太沒意思,嵌入式、智能硬體、物聯網才是高大上,別的都是渣渣。
所以我從本科到碩士一直在搞嵌入式,自覺地水平也還算可以。
但是找工作的時候,現實啪啪打臉。
眼睜睜的看著那些幾乎不會寫代碼,平時作業要抄我的同學,因為碩士是機器學習、圖像等方向,工作好找工資也比我高,我不服啊。
後來,我開始自己研究圖像、視覺相關的知識,發現,這東西也非常有意思啊,當年真是井底之蛙啊。
所以說,你現在本科階段,應該是鋪一個面,各個方向都了解一下,都做一下,然後結合行業趨勢以及自己的興趣,在研究生階段確定一個方向,然後好好研究。
或許你想著就是要做自己感興趣的事,這事就是嵌入式,我原本也這麼想,但是想在,我只能說,生活的壓力是很大的,我得選擇讓老怕孩子父母能夠過的更舒服的工作。
可能是潑了冷水,但還是想說一下自己的感受,不要過早的把自己的路限制窄了。
如果不是興趣所在,我的建議是不要入嵌入式的坑,去做純軟體的東西好得多。
三年嵌入式開發經驗,能力有限,隨便給點意見,你做個參考。
1 首先要學好C語言,這個是基礎,否則一切免談。
2 學會彙編語言 不求精通,只要能理清別人的代碼就行。3 懂硬體 設計,模擬電路不談至少數字電路要精通,否則談不上嵌入式。4 英語,否則永遠找不到資料。5 各種單片機 ,ARM,51,430,至少得熟悉。6 嵌入式操作系統7 計算機原理8 數學 自動控制原理 數字信號處理 等等剩下的就看個人的興趣了,linux,物聯網等等,找個方向,然後慢慢學……不要把嵌入式和計算機割裂開,嵌入式也是計算機
嵌入式軟體的最新技術就是傳統桌面計算機軟體的成(Lao)熟(Jiu)技術
計算機的傳統基礎:數據結構、組成原理、數學,一兩門編程語言,就夠了。
英語作為交流工具,重要性也不亞於以上任何一項。
推薦閱讀:
※為什麼有些iOS軟體需要很高版本的iOS才能運行?
※醫院科室級別的業務軟體如何選擇軟體架構?
※360和金山的安全產品都不想用的時候,有沒有什麼好的替代方案?
※電腦方面的測評可信性到底有多少?
※如何看待某些人下載軟體喜歡到官網的偏好?