15歲開始接觸計算機編程,18歲學習C/C++編程,迄今已十多年有余,并參與大大小小幾十個項目的開發及維護。涉及工業自動化、嵌入式計算機以及逆變器等領域。尤其擅長RTOS,如uC/OS-II、RTEMS,翻譯RTEMS官方文檔近千頁,擅長測量電路和開關電源的設計,現在擔任公司團隊設計電池測試產品和大功率逆變器產品,看看這位資深人士的分享內容。
在嵌入式學習過程中,對于非常熟悉Windows這樣的操作系統,但卻不一定熟悉嵌入式系統中常用的RTOS,嵌入式和事實系統是一種什么樣的?
嵌入式系統是為了特定應用高度定制的軟件硬件計算機系統。從廣義的去理解,只要被定制,都可以算作嵌入式系統。如今,在家用的x86系統上,跑一個類似VxWorks、RTEMS等操作系統,當成一個家庭網關都可算是嵌入式系統。有時候,同行認為真正的嵌入式系統硬件也必須按照應用去定制。操作系統就是個資源的管理器。管理計算機上的全部資源,如CPU的計算時間、內存、IO等。實時操作系統簡單的說,計算結果不僅依賴于計算結果的正確性,還依賴于結果計算完成的時間。
嵌入式學習過程中,對于嵌入式系統實時性要求高,對于所有滿足一定的速度是否都可稱為實時系統?
很多廠家并不需要RTOS,前后臺也能滿足其需要,但他們還是用了RTOS。實時操作系統的高效是為嵌入式系統廣為接受的一個很重要的原因。高效有兩層意思,一是用任務可以封裝開發的邏輯,使應用層代碼邏輯更加完整,減小開發難度,代碼的復用程度會變高;二是,RTOS代碼都比較簡潔,算法的空間雜度和時間雜度都很小,能將MCU的絕大部分資源都留給應用層。反過來,大量的應用促使RTOS更加的可靠、更加的精煉,實時性也會更好。當然,如醫療電子、航天電子和工業控制本身,有許多計算是依賴于時間的,對實時性要求非常苛刻。
嵌入式編程相比PC編程,具有哪些復雜性?在嵌入式學習中應當如何開始和深入?
嵌入式開發大的挑戰是軟件硬件同時成熟,出了問題容易踢皮球,影響開發時間。然而,對于軟件開發者來說,大的問題莫過于軟件代碼的撰寫。PC平臺的封裝非常完善,應用也非常廣泛,沒有明顯的錯誤,極其穩定。嵌入式平臺幾乎沒這樣的資源和封裝級別,且和一些寄存器相關。這些寄存器配置的順序,值都有嚴格的規定,嚴格按照datasheet的要求做。嵌入式代碼全新開發得太多,自身也有個成熟的過程,也存在著很多方面的問題。例如:代碼的應用層和底層耦合、應用層的使用不當和造成底層順序錯誤等等。嵌入式調試成本很高,調試手段相比PC也比較單一,對從業人員的要求更高,這都增加了嵌入式的復雜性。
對于嵌入式學習來講,在嵌入式開發中,對于硬件開發平臺來講,FPGA,ARM,DSP等等,哪個更好,對于初學者來講,想要學習ARM開發板,該如何去選購?
FPGA和MCU是嵌入式開發的兩個不同領域:前者硬件多、后者軟件多,應用的行業領域和背景知識差別很大。兩者相互不能完全替代。一般來說,FPGA相對于MCU的市場,較為小眾。至于DSP,它是以計算見長的一類MCU,并不適合跑調轉指令太多的事務代碼,會打斷流水線,優勢體現不出來。所以,DSP的應用和一般的MCU用法略有不同,比較側重計算、優化。
在嵌入式學習中,嵌入式開發的開發板是否一定要買?是否有比較好的硬件模擬器?
可以直接在x86上做。我買過開發板,但是買了之后,就放在屋子里睡覺,因為可以直接使用x86平臺做目標平臺。虛擬平臺差異很大。目前,x86是虛擬做得好的平臺,可以在x86上實現所有的驅動。ARM的平臺虛擬水平也要看具體型號。我曾今參加一個開源項目,將RTEMS移植到QEMU mini2440上,可惜QEMU mini2440 的虛擬器或多或少仍有點問題,但也可以解決大部分的問題。可對于學習操作系統的朋友,去解決虛擬平臺的問題,有些不靠譜。所以,真心想學習的,就把x86當作嵌入式平臺去寫代碼。畢竟,能比x86這種嵌入式還要復雜的系統,也是屈指可數的,其含金量毋庸置疑。
在嵌入式學習過程中,在這些常用的嵌入式系統中,如何來更好地選擇適合自己的系統?
uC/OS,FreeRTOS、rt-thread、VxWorks、ThreadX、RTEMS、ECOS。不下上百種。在這些系統中選擇自己的系統可不是件容易的事情。學習的朋友,我推薦uC/OS,有相關書籍,網上的資源也比較多。uC/OS僅僅是一個處理器時間的分配器,簡單、易學。學好了,觸類旁通,其他的也復雜不了多少。由于商業應用比較復雜,涉及工具鏈、商業授權、維護、可靠性、易用性等問題。商業應用的朋友我建議開源免費的就選擇發展時間比較長的系統,如RTEMS、ECOS這種系統,或者直接選擇有商業服務的系統。
嵌入式學習中,在眾多實際操作系統中,你為什么選擇RTEMS?現在還有開發用到RTEMS嗎?如果初學者想精通一門RTOS , 應該從RTEMS開始,這種辦法可行么?
RTEMS的內部數據結構設計非常精巧,是一個知識的寶庫。舉個例子,在數據結構里,雙向空鏈表插入第一個元素時與插入第二個元素操作很不一樣。在RTEMS里,用特殊的技巧使得不需要做這種判斷,直接插入就好。又如堆的管理、重復釋放申請的指針,不會產生任何問題。而在uC/OS里,這是致命的。雖然RTEMS是上個世紀80年代末開發的系統,數據結構和內部的組織從今天的角度來看,仍然是非常先進的,是個含金量非常高的系統。
RTEMS的代碼量比Linux小,又比uC/OS這種系統大幾個數量級。其開發難度和應用難度相對較高。初學者若是有堅實的基礎,可以從RTEMS開始學習;基礎較差朋友,若有RTEMS的熟手帶,也是可以的。否則不建議這樣做,會挫傷學習的積極性,形成惡性循環。