嵌入式軟體開發之我見

2021-09-05 05:26:34 字數 3122 閱讀 2313

自己從事嵌入式系統開發有好多年了,在此想與大家分享我對於嵌入式開發的一點心得與體會。

先大致說一說我的工作經歷。97年畢業後做了兩年的電氣與電子設計與開發,這一時期,我做過電路原理圖的設計和pcb板的設計。從99年開始,我進入了軟體行業。第一次做嵌入式開發是在2023年,在隨後的六年多的時間裡,我差不多做過整個作業系統的元件。一開始用的是uc/os rtos,熟悉它的人知道,它是乙個微核心,提供了任務的排程、mutex、semaphore等基本的功能,但是像tcp協議棧、檔案系統、堆管理(指malloc/和free)這些功能都沒有,當然也包括沒有相應的硬體驅動模組,如pci、串列埠、i2c、ide硬碟等。第一次做的這個產品是乙個dvr(digital video recorder),cpu用的是amd的sc520,是一塊x86的處理器。因為公司小,所以整個dvr的嵌入式軟體就我乙個人做,這對於我來說是乙個難得的機會和挑戰。我所做的包括:

1) 熟悉cpu。x86中存在實模式和保護模式,cpu一上電後進入的是實模式,要進入保護模式則需要做一定的設定,最後做乙個長跳轉,就能進入保護模式。對於這一處理器的熟悉和了解,使得我對於處理器有乙個很好的認識。此外,還得明白什麼是晶元組、pci的原理和配置方法、sdram如何配置、ide的pio模式是如何工作的,等等。

2) 熟悉uc/os rtos並對其進行擴充套件。理解任務是如何實現的、任務是如何被排程的、mutex和semaphore是如何實現的、對處理器進行開關中斷的目的是什麼且要注意什麼,等等。對於rtos的擴充套件則包括實現了乙個採用malloc/free進行記憶體分配的堆管理模組,這一管理模組是參照xinu作業系統來實現的;對任務排程部分進行修改以方便中斷服務程式的管理。

3) 將minux作業系統的檔案系統移植到我們的dvr上。minux中採用的就是unix中的i-node的方式來管理檔案的,這種方式在現在的linux中也能看到。由於minux的檔案系統是針對小型儲存裝置的,所以對其**要進行修改,以適應當時所採用的上g的硬碟。

4) 將xinu中的tcp協議棧移植到dvr上。我記得很清楚的是,當時對於tcp的滑動視窗的除錯以及校驗和的除錯花了不少時間。

可以說這一時期的工作,使得我對於作業系統的原理和實現非常的熟悉。還有,我在這一公司使用過了邏輯分析儀去分析匯流排訊號以解決問題,這些都是非常好的經歷,都有助於提公升對計算機系統的理解。

2023年我加入了utstarcom,因為前乙個專案的經歷,當時進這一公司時覺得自己很牛。但很快我發現,嵌入式系統中還有很多是我要學的,我還嫩呢。比如:

1) 第乙個挑戰是處理器,當時用的是powerpc8250。對於處理器,我花了不少時間去讀相關的資料。總的加起來,其手冊超過兩千頁,而且還是英文的。為了使得自己更加的熟悉這塊處理器,我前前後後對這些資料完整的讀了三四遍。

2) 當時採用的是rtems作業系統,這一系統就是乙個類unix的作業系統,早期是美**方使用的,後來變成了開源專案。在這一作業系統上的工作經歷讓我一下子意識到了自己的乙個問題,那就是:以前的工作只是技術性的不具備系統性。比如,如何將乙個作業系統作為乙個系統將其設計得更好、驅動程式如何方便增加以及擴充套件,等等。這一切說到底是自己的設計能力還是不足。我花了很長的時間來研究rtems作業系統的實現,這對於提公升自己的設計能力有很大的幫助。

在utstarcom工作的初期,所有與作業系統相關的問題都是由我來解決的。此外,在我的經理的支援下,我還做過了乙個更新版本rtems作業系統的移植,當時,utstarcom的rtems作業系統的移植是在紐澤西完成的,我不知我是不是utstarcom在中國第乙個做這個作業系統移植的。當時,我在做移植時還碰到了乙個與編譯器相關的問題,還找過windriver做支援。因為我們用的是windriver的偵錯程式,當時懷疑是偵錯程式有問題,最後發現是rtems的tool chain有bug。utstarcom的中期,我們將我們的應用程式移植到了vxworks上,所以後來我對於vxworks也很熟悉。後來還做過了乙個adsl接入的專案,採用的還是vxworks以及pne(platform for network equipment),處理器用的是intel的xscale ixp425。2023年5月我離開了utstarcom。

應當說,前面兩個公司工作經歷是我很寶貴的財富。一方面完成了從小公司到大公司的轉變,說實在的在進utstarcom時,還是很有壓力的。什麼都是新的,新的行業、新的產品,當然對於我來說是直接工作內容的變化,新的處理器、新的作業系統、等。前兩個公司有乙個工作情景我一直很懷念,那就是:我是一手拿示波器,一手拿電路原理圖進行軟體除錯的。

好了說了這麼多,現在我想說說我對於嵌入式系統開發的感受和看法。在此,我想先說說什麼是嵌入式開發,這一點我看過不少對其的定義。先拋開別人的定義,我想說說我的觀點。有不少工程師的工作是寫執行在rtos之上的應用程式的,但他(她)其實根本不用接觸硬體相關的知識、不用接觸什麼是中斷、也不用考慮任務的優先順序,對於這些工作我不認為是嵌入式開發,其實,說到底只是採用了新的一套api(即rtos的相關函式)進行程式設計。嵌入式開發我認為至少要與硬體和rtos打交道,對一作業系統的原理和實現很清楚。從我的角度來看,如果乙個寫驅動的人只知道驅動相關的內容,而對於作業系統的機理並不是很清楚,那也不能算是嵌入式系統開發,就是驅動開發。下面是我對於嵌入式系統開發的一些看法。

1) 嵌入式開發對於提公升我們的系統知識有很大的幫助,尤其是作業系統的知識。嵌入式系統開發對於我們的知識面要求非常的廣,且要有一定的深度。在做嵌入式開發之前,我是做visual c++開發的,當我做過嵌入式開發後,我就能明白在windows桌面上雙擊滑鼠時,後台有什麼事情發生了。比如,我能想到後面有乙個loader將檔案載入到記憶體,並最終執行程式。雖然,沒有做過嵌入式開發也能想到這一點,但能看到的深度是不同的。

2) 當我們對於作業系統的原理和實現非常熟悉後,嵌入式系統開發的工作相對簡單。因為,作業系統的概念已經很成熟了,而現在的嵌入式系統就是將現代作業系統的技術運用到嵌入式系統。這裡說的簡單,主要是強調其需求相對的穩定、功能相對的單一。軟體設計真正複雜是做應用,應用開發是我們真正能發揮設計能力的地方。

3) 嵌入式系統開發經驗對於提公升我們解決問題的能力有及大的幫助。因為我們系統性的知道了軟體是如何被組織在cpu上執行的,這對於我們分析和解決問題很有意義,對於自己解決複雜問題的信心也很有幫助。

4) 具備一定的硬體知識對於嵌入式開發大有裨益。比如,我們要明白什麼是片選,什麼是3態,什麼是i/o,如何看時序圖等等。最好還得會使用相關儀器,比如示波器、邏輯分析儀。

最後,我想說的是嵌入式系統開發一旦我們達到了一定的水平後,其實很簡單,就是如何去看cpu和相關晶元的datasheet!

嵌入式軟體開發流程

1 嵌入式軟體開發流程在整個流程中,使用者首先需要建立工程並對工程做初步的配置,包括配置處理器和配置除錯裝置。編輯工程檔案,包括自己編寫的彙編和c語言源程式,還有工程編 譯時需要編寫的鏈結指令碼檔案,除錯過程中需要編寫儲存區映像檔案和命令指令碼檔案,以及上電復位時的程式執行入口的啟動程式檔案。對後四...

凹凸電子 嵌入式軟體開發

embedded software design engineer 1 讀程式段,回答問題 int main int argc,char argv a 寫出程式輸出 b 在乙個可移植的系統中這種表示式是否存在風險?why?include stdio.h int a 0 int b static ch...

困難的嵌入式軟體開發

作為一名初級的嵌入式軟體開發從業者,幾年的工作經歷讓我感覺到嵌入式軟體的開發越來越困難了。當然,也可能是近來工作中接觸到應用層方面的開發,與底層的啟動器 核心 檔案系統移植方面的工作不同,引發的一些感觸。然而對於底層的開發,我仍然不能夠說達到了勝任工作的級別 底層的開發,純粹是拿來主義 將現有的開源...