嵌入式軟件系統開發歷程

大家好,今天我來介紹一下我自己的大概履歷,尤其是我的嵌入式軟件開發歷程。
現在我在忙着找工作,我發現許多來學校招聘的企業都是招聘Java研發工程師、ios、Android開發工程師。因爲最近一年都在做嵌入式軟件開發,有些慌亂。懷疑會找不到工作。
本科是軟件工程專業出身,因爲在大學之前我對計算機技術的瞭解幾乎是空白,之前沒有接觸過計算機設備,大一的時候C語言掛科,計算機程序設計實踐重修。即便如此,最後還是保研了。大一一學年以及大二上學期我的成績一直都是處於專業裏中游的水平。後面我漸漸適應了大學裏的學習節奏,你可能覺得我怎麼適應的這麼慢,其實我那時候也玩遊戲。這些就不說了。總的來說,依照我本科時候的技術水平,我是找不到工作的。我十分承認這一點。自然有許多比我技術水平還要差的同學,他們最後能夠找到工作,我也感覺沒什麼。之所以能夠保研是因爲從大二學年下學期,我就努力的去自習,我那時候很迷茫,但沒辦法,覺得只要努力學習就對了。可以說也是幸運的。最後兩學年綜合成績達到專業前五名。我曾經到過蘇州實習,其實就是學習Android開發技術。我擔任我們那個小組的組長,最後開發了一款小型的APP。
研究生期間參與了一個小型項目、兩個中小型項目。第一個項目是關於物聯網無線通信技術的。我負責協助Android客戶端的開發。但是現在關於Android我已經有些生疏了。所以一開始校招我還網申了一些移動客戶端的開發崗位。經歷了騰訊、新浪、網易等大公司筆試的打擊之後,我開始思考我到底適合什麼。有一段時間,我感覺只要是一份軟件開發的工作我都可以勝任,但是因爲一直忙於科研項目,沒有任何準備,總是在編程題上栽跟頭。儘管我一直在進行嵌入式系統軟件開發的工作,但是關於數據結構中的圖、樹甚至鏈表我都沒有用到。從最開始到現在,我從一個C語言掛過科的同學,成長爲能夠獨立承擔一個嵌入式項目軟件系統的開發。只是一年的時間,我學會了C語言中的socket通信,多線程併發、內存動態分配等技術。我不知道自己到底是什麼水平,實驗室一起做項目的同學都說我很有能力,但是現實卻是我沒有找到工作。我也很困惑。我知道自己技術確實一般,但是我不想再傻傻接收許多技術比我差的人都拿到Offer我卻一個都沒有的尷尬境地。自己有些不善言談。面試的時候,別人問我什麼我都如實回答。忘記了就是忘記了,不在熟悉就是不在熟悉,但也不代表我不能夠快速上手,不能夠完成分配給我的任務。但別人怎麼相信,畢竟求職大軍實在是人數太多。但人們不瞭解並不影響我繼續努力。
從去年9月份我開始使用C語言進行項目的開發,從一個源文件到兩個、三個、到一個完成的工程。一直都是我一個人在編程序。我也確實參與了華爲公司某個部分的協助開發調試工作,那時候甚至加班到晚上十點多鐘解決開發中遇到的問題。我也確實參與了項目中設備的實地安裝與調試。所以我還是相信自己的能力。我技術確實不夠精通,我會Linux內核的裁剪,但是並不太瞭解Linux內核驅動。只要有資料和指導文檔,我可以盡職盡責的做好BSP搭建、編譯與調試這項工作。但是我該怎麼描述,彷彿只要我一開口,就會暴露自己對知識瞭解不夠底層的缺陷。我自然也想學會許多物聯網與嵌入式的底層核心知識,但是我一直都是自己鑽研,周圍做嵌入式開發的人屈指可數,有些同學是在我原來的工程源碼上了解嵌入式軟件系統開發的基礎。

已經一年了,嵌入式軟件開發過程中我遇到過很多難題,尤其是硬件模塊的調試。有時間我會再好好整理自己曾經遇到的問題與解決方法。現在一心想要找到一份嵌入式Linux開發的工作。我我會盡心盡力完成我的任務,也會積極幫助團隊成員解決項目開發中遇到的問題。但是怎麼才能夠讓面試官相信我呢。現在沒有Offer不代表將來我的技術水平不會超越別人。還是相信自己。早就海投簡歷了,投了一些國企,也投了一些小企業。希望自己能夠安心繼續科研項目的工作,順利完成我的學業生涯。也希望自己將來入職,能夠遇到一羣努力認真工作的人。這樣很多事情都會有效率上的提升。

下面是我一些粗略的總結,都來自於我親身的體驗。

1、首先熟悉串口設備編程,網上有一些通用的串口操作函數。比如設置校驗位、波特率以及串口的讀寫(其實就是對Linux下文件句柄的操作)
2、串口有時候讀取或寫入異常就要檢查一下有些字符的校驗設置選項
3、工程模塊一個個添加,在最開始就要有一套自己的編程規範,比如說怎麼定義變量,怎麼定義函數名,怎麼定義宏。如果沒有標準,工程遲早會亂掉的。之前開發Android工程也是一樣。就是要有一套自己的軟件設計規範,就像設計一套通訊協議標準一樣。然後很重要的一點就是註釋。即便是自己的程序,不寫註釋,一個月之後看着也會變得很陌生。
4、硬件部分的調試一定要多詢問硬件開發人員,因爲自己在那裏鑽研只是浪費時間,也不瞭解原理。與硬件開發人員一起調試設備可以學到一些很有用的知識。當然最好還是有一份指導文檔。按照指導文檔來做就會事倍功半。
5、嵌入式軟件系統的開發最開始不會用到數據結構的難點,只是數組就可以解決大部分的問題。但是定義變量的時候要注意它的作用域,尤其當你開啓了多線程之後,變量的值恐怕不再是你想的那樣。還有一點就是動態分配的內存一定要注意釋放,然後置空,否則內存泄漏的問題嚴重會導致系統崩潰。
6、我學會了使用JTAG燒寫特殊格式的文件到NAND Flash中,使用的就是Xilinx官方的開發工具,Xilinx官方也有一些指導文檔,只不過是英文的,需要自己找一些命令來操作。還有就是將image.ub第一次燒寫到內存中,讓系統現在內存中運轉起來。然後拷貝格式化emmc的文件。之後掛在emmc,再之後自然是直接將image.ub拷貝到emmc上面。那麼下次系統再啓動的時候就不要自己手動輸入image.ub文件在內存中的起始地址。BOOT.BIN會自動到emmc上面去尋找image.ub文件,從而啓動片上Linux操作系統。
7、關於一些硬件模塊的管腳,就是GND接GND,電壓接電壓。然後RX接TX,TX接RX。注意電壓大小要相同,否則就需要轉壓模塊。
8、測試溫度傳感器需要在最開始編譯BSP的時候進行配置,petalinux有圖形化的配置頁面,根據官方要求進行配置項的選擇,之後保存編譯。(4G模塊 RTC模塊也是一樣)
9、嵌入式系統還有最重要的一點就是要有配置文件,記錄下系統動態或者遠程修改的配置,防止系統重啓或者異常斷電導致配置丟失。
10、普通的嵌入式系統必備的功能有自動校準時間功能,平臺通訊功能、傳感器數據採集功能、遠程更新功能。還有最重要的主控程序。這些都是基本的功能,其他的模塊可以根據具體場景與需求動態擴展。

今天,就先說到這。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章