1. 程式人生 > >嵌入式Linux——學習經歷

嵌入式Linux——學習經歷

簡介:

        本文主要介紹我學習嵌入式的經歷。並結合自身的經驗希望可以對大家有所幫助。

視訊及教材:

        郭天祥相關視訊及教材,天狼星相關視訊及教材,野火迷你相關視訊及教材以及韋東山100ask官網所介紹的視訊及教材

個人簡介:

        我的本科學校是一個很普通的二本,研究生也是二本。我找的是一個規模中等的公司(我個人對這份工作還是比較滿意的)。而我所面試的公司也是做嵌入式Linux相關的產品。好了我的基本情況就介紹到這裡了。而詳細的情況我會在下面說明。

我的大學——忙碌而充實:

        因為我所做的與微控制器相關的專案都在大學時,而在研究生期間我主要研究的是量子相關的課題,所以這裡我重點介紹我的大學。

        我的大學是一個很普通的二本。有時候大家可以會覺得他是一個專科,因為他是以學院命名的。而對於剛進大學的我嵌入式是一個我從來沒有接觸過的概念,更沒有想到我的後半生都會與嵌入式相關。那時的我並沒有明確的目標,只是想著要好好學習老師課上所講的內容,而那時也是我最天真的時候。那時我所做的很多事都是因為其他人也在做,而沒有真正去了解我真正想要的是什麼,更沒有認真的想過我的大學應該怎麼過。

        這樣的日子維持了一年,在這一年中我雖然也很忙碌但是回想自己走過的路,卻發現並沒有留下任何的痕跡。而真正出現轉機是在我大二國慶節期間,那時候的我無所事事,但好的一點是我有幾個要好的朋友。我們在一起聊天的時候他們聊到了自己所焊接的電路板,自己所搭建的電路,以及自己所設計的功能模組。這些都是我以前所沒有接觸過的。那一時刻,我突然意識到雖然我完全聽不懂他們在說什麼,但是感覺可以自己設計電路來實現某種特殊的功能對我來說似乎很有吸引力。所以那時候我決定要加入這個組織——第二課堂。

        不得不說第二課堂開啟了我對這個世界新的認識,同時也感謝第二課堂為我提供了那麼好的平臺來學習各種嵌入式相關的知識。現在想想在第二課堂的兩年我都覺得收穫滿滿。我剛進第二課堂時還沒有學習微控制器,而是利用各種電子元器件和簡單的晶片來實現一些簡單的功能電路。而我們使用最多的就是NE555晶片了。雖然現在已經忘了這些晶片的功能,但是那段時間的練習卻真正的讓我學到了很多模電數電方面的知識,以及對各種晶片引腳和各種電子元器件的識別。這段時間一定要感謝我的好朋友禮標和吳老闆。

        我接觸的第一個微控制器是stc89c51,也就是大家常說的51微控制器。而這個微控制器讓我瞭解到,原來我們可以通過一種程式語言來控制一個機器的電平變化。而不是我在以前焊接電路板時,只能使用簡單的邏輯電路搭建簡單的功能。在這裡,他的功能得到了足夠的擴充套件。而51微控制器的兩個重點:中斷和定時器,這兩樣功能讓我十分幸喜,因為我意識到我可以使用這兩個功能來完成很多的設計了。而那時的液晶屏更是讓我意識到我可以將自己想表達的意思或者監控的資料顯示到我的機器上了。這是多麼愉快的事情(那時總是因為一些簡單的功能而幸喜,而現在回想當初的行為確實有些幼稚)。依然記得當時自己用液晶在螢幕上顯示內容時的高興。

        這個之後我還用51做了很多好玩的東西,例如LED矩陣:

        學完51微控制器,我就開始學習ATmage16(AVR)微控制器。這個微控制器還是對暫存器進行操作的,不過相對於51來說AVR的速度確實快了很多,而且功能也更加的強大。例如在引腳的模式選擇方面就比51多了好幾個。而其他的中斷以及AD等更是51所不能及的。因此我在那段時間用AVR做了很多好玩的東西。而這期間我用這個微控制器做過一個小冰箱:

        這個冰箱在當時炎熱的夏季,給我們帶來了不少歡樂。而我使用到的就是一個單匯流排的溫度感測器,其將溫度測出並實時的在數碼管上顯示,而關於溫度的控制部分,我本來打算用pwm來控制電源的開關以實現控制溫度的目的,但是並沒有完成這部分功能,而這部分的功能我用到了後面做智慧風扇中。

        而做完冰箱我做了一些更有趣的專案——智慧小車,這個智慧小車有三個功能:循跡,避障和藍芽遙控。我將這三部分功能融合到一起,通過手機藍芽選擇使用哪個功能。而這裡的循跡和避障功能我使用網上的紅外發送和接收模組通過檢測紅外線是否接收到來確定是否遇到黑線或者碰到東西,從而做出反應。而對於藍芽遙控功能,我直接使用藍芽模組通過串列埠連線以實現藍芽資料傳輸。這裡有一個循跡的圖:

        做完小車之後我感覺自己對ATmage16晶片有了一定的瞭解,這時候我畫了一個ATmage16最小系統的板子:

        確實只有自己畫了板子,才對這個晶片有一個更深入的理解。同時也可以對外圍部件以及各個部件的尺寸型別有更好的瞭解:

        而學還習AVR有一個讓我驕傲的地方就是我寫了一些AVR模組的庫,這個庫對我十分重要,我在使用AVR後期進行程式設計時主要就是對這些庫中的原始檔和標頭檔案進行呼叫。當你學會使用現有的庫時,你會發現其實庫呼叫是多麼的方便。

        學完AVR之後我就開始學習stm32,對我來說32就像是一個新的大陸,之所以這麼說不僅僅是因為32在效能方面遠超51和AVR,而是因為32的程式設計方式是呼叫庫進行程式設計的。在學習32之前我一直是針對暫存器進行程式設計(當然32也可以針對暫存器進行程式設計)。而暫存器程式設計的特定就是你要很好的瞭解你所程式設計的微控制器,也就是說你要對微控制器的各個引腳及介面功能都要十分的熟悉。而對於32微控制器來說就相對簡單,比較適合對硬體不是很熟悉的人。也就是說就算你對暫存器的操作方式不是很熟悉也可以對32微控制器進行程式設計。因為32微控制器是一個可以呼叫庫進行程式設計的。由於32微控制器的很多功能都已經被前輩寫好,並將其封裝成庫。而我們只需要呼叫某種功能在庫中的API介面就可以了。因此使用32微控制器對我們來說是一個質的飛躍。同時也讓我們瞭解了對庫中API介面呼叫的重要性。這將幫助我以後學習嵌入式Linux打下基礎。

        我用32做的是我的畢業設計,對於我所完成的功能,我使用自己當初畢業論文的簡介:

        在沒有家人在場的情況下,當老人不小心摔倒而且沒有能力進行自救時或者老人遇到其他的突發危險而現場沒有家人幫助時,如果沒有及時得到救治或者幫助,這很可能會導致老人癱瘓甚至威脅老人的生命安全。在這種情況下,我們採用集三軸加速度和三軸陀螺儀於一體的MPU6050模組對老人是否跌倒進行監測。當老人跌倒時,以STM32為核心的中央控制系統將會向周圍人發出發出聲光警報。如果老人有能力自己站起來,可以自行解除警報。當老人沒有能力自己站起來時,裝置將在警報響起10 S後通過GSM模組將從GPS模組獲得的經緯度資訊以簡訊形式傳送到指定聯絡人。該指定聯絡人可以通過智慧手機搜尋得出老人的地址。而且本裝置還有一鍵SOS功能,當老人碰到其他危險且沒有能力自救時,可以通過按下SOS按鍵直接將自己的地理資訊通過簡訊形式傳送給指定聯絡人。

        而作品的實物圖為:

        好了,做完上面的設計,我的大學也就畫上了完美的句號。在此我要感謝幾個人,是他們在我做嵌入式的路上指導和幫助我,併為我提供各種便利。首先要感謝的是第二課堂的汪老師,可以說第二課堂的學生能有今天的成就在很大程度上要感謝汪老師,是汪老師為我們提供第二課堂的教室,並在學習的路上指導我們。而第二個要感謝的就是我的同學,吳老闆和禮標,是他們在我當初學習嵌入式時不斷指引我,並幫助我學習了很多的知識。而第三個要感謝的是我的師兄:林耕風。他對我以後在嵌入式方向上的提高給了很多好的建議。同時他也是一個熱愛著技術,並對生活充滿激情的人。他是我很敬佩也很嚮往的人。好了,接下來要開啟的是我的研究生生涯了。

我的研究生——迷茫中前行:

      我在研究生期間主要的課題是量子通訊,而與嵌入式的關係並不是很大。而對於嵌入式的很多知識我是自學的,這裡就要感謝韋東山老師的視訊以及開發板,韋東山老大的開發板和視訊很詳細的為我們講解了Linux在2440開發板上的執行、移植以及驅動的編寫。這裡還要感謝我表哥和我的同學吳老闆,是他們在我當初迷茫的時候為我指引方向。

      如果用一個詞來形容我的大學,我會用充實來形容,因為在大學期間我的目標明確,同時也會很有效的將自己的時間用到學習中。而對於我的研究生,我想跟多的是迷茫。初入研究生學校對很多新鮮的事物充滿好奇,那時的我以為自己還可以像大學時一樣有一個實驗室,然後自己在其中做一些喜歡的專案。但是真實的研究生生活並不是我想象的那樣,我的導師的研究課題是量子方向,因此我要學習量子的知識,而這方面知識的學習對我來說壓力很大。因為在大學時我更多的時間是在實驗室度過的。所以我的理論知識並不好,尤其是物理(但真正的學習下來,自己還是收穫頗豐,同時也為自己在一個新的領域開啟了一扇門,而相對於其他的來說,更重要的是我在這段時間證明了自己的學習能力,我發現如果你用心去學一門知識,其實也並不是那麼的困難)。同時我發現我的實驗室並不是我想象的實驗室,我的實驗室裡沒有示波器,沒有可控電源。那時候的我十分失落,雖然比較失望但是我並沒有就此放棄。在思考了一段時候之後我覺得學習Java,因為Java在那時比較火,同時也不需要任何的硬體,只要你有電腦就好了。因此我開啟了Java的學習之路。現在想想那時候學的東西,似乎都已經忘記,但是那時候對於生活的態度還是很好的。我雖然不能改變我導師的方向,那麼我就用課餘時間去學一些東西來彌補這份失落。我記得我用GUI介面做了一個飛機大戰的遊戲。同時也學習了HTML,並在我女朋友生日的時候copy並修改別人的網頁來為他慶生。

      我修改的網頁已經找不到了,但是修改前的網頁還在,這個網頁是動態的,簡潔但是漂亮。

      學了很多Java的知識但是總覺得心中空落落的,我知道我所學習的東西並不系統,同時也不是從底層開始做起,所以做起事來總覺的心中沒有把握。同時我發現現在學習Java的人太多了,同時也發現Java似乎是每個人都可以學習的,是無門檻的,那麼我的核心競爭力在哪裡?這是我當時問自己的一句話,我也希望大家可以常問一下自己,你的核心競爭力是什麼?

      而這時我與我哥以及吳老闆的電話改變了我的學習路線。我在電話中問他們也是問自己:我應該學習什麼?我的興趣點又是什麼?我要高於其他人的門檻是什麼?我發現我還是對嵌入式有感情。我還是想學習有底層的東西,這樣我覺得學的踏實。同時我發現學習嵌入式Linux是需要門檻的,並不是每個學過微控制器的本科生就可以學習。所以我從研二的時候開始學習嵌入式Linux,而從此開始了我的嵌入式Linux之路。而也開始了我對系統的瞭解。我以前的部落格所介紹的就是我在研究生期間學習嵌入式Linux的學習筆記和心得。

找工作——一點優勢就是很大的距離:

      由於我還是學生,所以我參加的是校招,而相對於社招,校招就簡單了很多。而這時你相對於其他人一點的優勢,其實你就跟他拉開了很大的距離。就像我在前面所說的門檻。

      做技術的校招大多數分為下面幾個步驟:

            宣講會——》筆試——》技術面試——》HR面——》發offer

      在各位參加宣講會之前我想大家就對自己要應聘的崗位十分熟悉了吧。如果不熟悉你可以在宣講會時瞭解也不晚,但是大致的方向應該是清楚的,例如你是要做嵌入式還是要做演算法,或者是做影象你應該清楚吧。而在選擇崗位時你就會發現,其實平時多學一些東西還是十分重要的,因為平時多學一些東西,那麼你的選擇範圍就相對廣一些。而宣講會時的提問就很重要了。因為回答你問題的很可能是你的部門主管,同時也可能是你面試時的面試官,所以你要在提問時讓他對你有一個好的印象十分重要。所以你在提問時要有針對性,要在你的問題中體現了你在這個方向上有了一些瞭解,並且很想繼續學下去,而他應聘的置位正好適合你,例如你要應聘嵌入式驅動工程師崗位,你可以這樣提問:您好,我是學習嵌入式Linux驅動的,目前我學習了一些驅動的框架,例如輸入系統和usb驅動。我想問咱們公司在驅動上主要做那個方向?上面的問題體現出了兩點,第一你確實學習了嵌入式驅動的一些知識,同時你也表示你對這個職位感興趣。

      宣講會之後就要筆試了,而筆試其實更多的時候是在考大家的基礎,或者說是一個細節。這就要看你平時程式設計時是不是細心了。而對於做嵌入式驅動的崗位有時候還會考你一些簡單的彙編,所以希望你在平時用匯編程式設計時注意一些。這裡我要強調的一點就是你要在這個試卷上體現出你確實學過一些知識,也就是通過你的答案讓閱卷的人知道你是他要找的(閱卷的人很可能就是要面試你的人)。例如你會碰到對暫存器中位操作的試題,對於很多人可能就是簡單的使用指標對暫存器中位進行操作,而這個時候你在指標宣告前加一個voliate關鍵字就很不一樣了,閱卷的人以看就知道你不僅會這道題,同時也知道你確實寫過驅動相關的程式碼。而在筆試中另一個要注意的地方就是當你碰到不會寫的程式時,寫下你的思路,這個很重要。有時候閱卷人就是要看到你的思路。而對於寫出程式的題,你同樣要寫出思路,這樣可以讓閱卷人更好的瞭解你的思路,同時這也體現了一個好的程式設計師的素養。

      筆試完就要通過你的筆試內容來決定是否通知你參加面試了。而技術面就要檢驗大家平時的學習成果了,技術面其實更多還是喜歡問你做過什麼樣的專案。如果你有一些專案經驗,那麼你就有加分項了。因為面試官很喜歡有專案經驗的人,如果你沒有專案經驗那麼你就要向面試官證明你的學習能力很強了。而這個時候面試官的問題有時候會很難(因為他會問很多學習中的細節,以及知識點的細節)。還是那句老話,在技術面時不要不懂裝懂,因為對你面試的人都是這方面的牛人,他們對這方面的知識十分熟悉,所以你會什麼答什麼。不會的不要亂說 。要保持謙虛。

      如果你通過了技術面試,那麼可以很榮幸的通知你,你被錄取的機率就很大了,因為到HR面試時,主要就是來談工資了。