),所以也叫開發板;甚至是軟件化的仿真器。 開發時,利用宿主機上的交叉編譯、匯編、鏈接工具,形成目標機上可執行的二進制代碼,再將可執行文件下載到目標機上執行。 另外,嵌入式系統的調試也常常采用交叉運行的方式。 另外,嵌入式系統的調試也常常采用交叉運行的方式。 4.1.14.1.1 交叉開發 為什么需要交叉編譯? 目標機往往無法進行有效的本地編譯。 開發過程中,目標機硬件本身無法使用或者不夠穩定。 目標機平臺缺乏完整的本地編譯工具與環境。 目標機平臺缺乏完整的本地編譯工具與環境。 目標機系統本身性能不夠強,導致編譯速度慢。 嵌入式系統的軟件編譯不同于Windows開發,不僅需要編譯應用程序,還需要編譯相應的依賴庫、操作系統內核等,因此完整的編譯非常耗時。 例如在奔騰44級別的PC上編譯一個Linux內核可能需要十幾分鐘的時間,從硬件角度來說,決定編譯速度的主要因素有CPU速度、內存速度、內存容量、文件系統I/O速度等。
速度。這些在嵌入式系統上往往比PC差很多,所以在目標系統上本地編譯效率太低了。 4.1.1.1 交叉開發 宿主機和目標機的區別 宿主機和目標機的區別 宿主機和目標機通常是異構的,宿主機一般采用x86架構,但目標機的架構可能是非x86的,比如ARM、MIPS、PowerPC等。對于有些系統可能不是這樣,比如Atom系統中,宿主機和目標機一般都是標準的x86系統,當然執行的指令集可能不一樣,比如宿主機(DuoCoreDuo)可能支持SSE4,而Atom支持SSE3和SSSE3,所以編譯時必須考慮目標機型號和指令集的選擇。
處理能力不同。通常宿主機的處理速度和存儲容量比目標機大得多。 使用操作系統不同。宿主機通常運行通用操作系統,而目標機通常運行各種嵌入式操作系統。 輸入輸出方式不同。與宿主機相比,目標機的輸入輸出功能可能相對簡單。 交叉開發的主要工作包括交叉編譯、交叉鏈接、交叉調試等。 4.1.24.1.2 編程語言 嵌入式系統常用的編程語言有ADAPython模塊匯編、匯編、C/C++啟動代碼、硬件抽象層啟動代碼、硬件抽象層(HAL)(HAL)C/C++、匯編、匯編驅動層驅動層 C/C++、匯編、匯編操作系統層操作系統層、JavaJava、.NET.NET、腳本、PythonPython應用層 常用的編程語言級別 在較低級別,不得不使用匯編語言,盡管它的使用量不大。
復雜的嵌入式系統通常由多種語言混合編寫而成。 4.1.2 編程語言通用計算機系統中使用的編程語言有很多,從低級的匯編語言,到FORTRAN、ADA、Module以及與平臺無關的高級語言,再到Java、C#、.NET等等,不勝枚舉。從面向過程的PASCALPASCAL,到面向對象,到ObjectOrientedProgrammingOOPOOPJavaJava,再到泛型編程(GenericProgrammingGPGP)。考察一種語言是否適用,需要從多個方面進行考慮。 4.1.24.1.2 編程語言選定一種高級語言之后,在項目中并不一定能用到它的所有功能。例如對于C++C++語言,很多時候在實際的嵌入式開發中并不會用到它的某些語言功能。
實際嵌入式開發中用到的功能并不多。例如模板對于泛型編程很重要,但如果編譯器不能很好地實現它們,很容易增加最終代碼的大小,這對于資源嚴重有限的嵌入式開發人員來說有時是難以容忍的。還有異常處理,在某些嵌入式操作系統中,C++的異常處理會引起處理器執行狀態的切換,導致系統效率明顯下降,不適合實時性要求高的系統。由于其具有易于低級編程等諸多優點,目前是大多數嵌入式系統開發的首選語言。4.2 嵌入式軟件開發流程一般來說,嵌入式軟件開發要經過編輯(代碼編寫)、編譯、重定位(尋址和打包)、燒錄、下載、調試、優化等步驟。在某些嵌入式系統中,可能還需要進行測試和驗證。
步驟。從流程上看,大致可以分為編碼階段、構建階段、部署階段、調優等階段。 加載器 典型的嵌入式軟件開發流程圖 典型的嵌入式軟件開發流程圖 4.2 嵌入式軟件開發流程 4.2 嵌入式軟件開發流程 編碼階段 編碼階段是軟件開發的開始,它的任務是寫出軟件的源代碼,所用的工具是各種編輯器。 構建階段 構建階段的任務是將代碼轉換成可以在嵌入式硬件上執行的可執行程序,這個階段包括幾個步驟,包括編譯、鏈接、尋址和打包。 尋址和打包。 構建階段的一般流程 構建階段的一般流程 構建 步驟1 步驟2 步驟3 構建的第一步是編譯,也就是將源代碼文件翻譯成目標文件。 編譯是由編譯器來完成的,編譯器的任務是把用某種編程語言編寫的源代碼翻譯成等同于特定處理器的一系列操作碼。 與這些操作碼相對應的文件稱為目標文件。
構建的第二步是把所有的目標文件鏈接成一個目標文件,這個目標文件被稱為可重定位程序(Re locatable Program)。鏈接工作是由鏈接器(linker)完成的,鏈接器的主要工作是掃描所有輸入的目標文件,然后合并多個目標文件的段并解析它們之間的依賴關系(這個過程叫做符號解析(symbolresolution)),最后生成可執行文件。在很多開發工具中,會把編譯器和鏈接器的功能結合起來,直接把源代碼文件轉換成可執行文件,這個過程通常叫做構建(Build)。可重定位和非可重定位的可執行文件。一般來說,嵌入式系統的可執行文件有可重定位(re-relocatable)和非可重定位(non-relocatable)兩個版本。
40年的人生實踐和10多年的專業實踐,讓我是這樣看人的。
1)人會不斷地變化,每個階段都不一樣,當然每個人變化的程度受各種因素影響也不一樣,或者更直白一點,我認為人的發展階段就是個墑增的過程,我們只要不主動發生改變,不干預,就會越來越衰敗,隨波逐流的結果就是自己沒有要求,或者變成只是別人隨機塑造我們的結果。總之,我們身上有爸媽、朋友、社會、環境的影子,唯獨沒有自己的影子。
2)人的底層價值觀相對不變,價值觀是被環境、被我們過去的經歷、被我們自己持續塑造的。但總感覺,我會選擇保留一些不愿意被改造的東西,我把這個叫做我的“自我”的表達。 反正幾十年之后,我們好像也都會死掉,我活過的最重要的標志是我用我的方式活過,這也許是唯一與眾不同的地方。
3)人的意識和認知體系,就好像是電腦軟件的編程系統,我們互相參與彼此的編程過程,也同時可以自己塑造自己的程序。
4)編程的過程要非常細致,要很有耐心,還需要信心。說這些是因為,本質上我一向耐心不夠,我底層的程序是,我干點啥,我都希望最好在下一個五分鐘內我原來的目標實現了。我看到自己這個奇葩的自動程序,就更沒耐心了。但是我必須改寫它,如果放任這個程序運行,只會讓我周圍的事情保持糟糕,而且其他的程序可能也會在不同程度上混亂。
程序混亂的標志是崩潰和痛苦的情緒反應。抑郁情緒和焦慮情緒是程序混亂的警報裝置。如果我這段時間發現,我非常抑郁,我早上起來感覺好崩潰,特別煩躁不安,我就會提醒自己,看來我原有的運行程序需要學習重新編寫了,換句話說:我應該更新軟件了。 當然,我用了30年意識到我需要不斷地更新軟件。所以,我希望大家不用像我一樣浪費這么多時間,大家可以更早地先嘗試更新自己的軟件程序。
我自己每天編程的方式有四個。
1)記夢
我堅持用日記記錄夢境超過9年了,因為夢是潛意識的表達,通過夢的回顧和自我分析,可以讓我更了解我的潛意識,當然我還很喜歡在清醒夢里研究直接改造我的夢。這是我和潛意識的關系。
夢境大概可以分成四大類:
A. 有關身體健康的夢:比如我夢到大水中有很多小蟲子,這說明我的體內可能有細菌感染,是需要我處理的。
B. 發泄心理情緒的夢:我夢到被人追殺,我拼命地逃跑,這說明我的焦慮水平在增加,我需要在現實生活中處理和應對下我的壓力事件了。
C. 預測類型的夢:我會夢到一個場景,人物,我根本沒有經歷過的,但是在一個月,或者三個月后,它們真的在我現實生活中發生了,這就是預測類型的夢。因為這種夢,我對生活的好奇心會增加很多!
D. 清醒夢:這是夢里最有價值的,因為我可以在清醒夢中直接改造我自己的心理程序。當我突然意識到我在做夢,我會讓自己千萬別著急醒過來,然后保持著這個狀態,我去夢的世界的周圍去看看,如果有房子,我知道這象征了我心里的安全感,我就會走進房子里面,去打掃下灰塵(灰塵=情緒),把燈光點亮一點(燈光=希望感、生活中的力量感),把房子里的樹木澆點水,讓它長得更好(樹木=信念系統)……
2)每周的定期的反思日記
我會記錄我思想的變化,這些思想就是我的程序。這個記錄不一定會改,純粹用來研究自己。這是我和思想的關系。
3)和不同的人定期接觸
作為生活實驗,去發現別人眼中的我,我和他人的差異,進一步驗證我和世界的關系。 其實用微信接觸也是很有意思的,我的重點是“不重復”的交往模式。我會嘗試用一個新的表達方式講出來,看看對方的反應,當然前提是我別把對方徹底得罪了。事實上,制造某種可控的小沖突,是我覺得生活中最好玩的,因為這有兩個好處,首先,朋友之間,有點小沖突,會給關系一些新的刺激。關鍵是得有后續,得把沖突包扎好,我發現,當我把情緒表達和發泄出來,然后再和解,關系會更加緊密。當然也有失敗的案例,但是概率比較小。大概率是我和我身邊的人都成長了。、
我會拒絕一些飯局,因為吃著真沒啥意思,我認為在浪費我的生命。但如果我真去了,我就會想辦法抬起頭來,看看周圍,哪怕我只是觀察,我也得讓我和這個世界有點鏈接,不然我認為我的生命力又被吃了。
我個人曾經一度熱衷于短視頻,因為我覺得太好玩了,但我玩了一段時間后發現,我的腦子變笨了,注意力變少了,它們在蠶食我的大腦!我就果斷地卸載了很多短視頻的娛樂app,當然我也有戒斷反應,抓耳撓腮的不適應,但我知道,只有現實中的人和事物,才能給我更真實的觸碰,否則我會被自己的大腦制造的幻覺直接騙過去。我被自己騙,真的是一個無比活該的可憐局面啊。
4)最最重要的來了! 給自己編程!
我會通過一些場景和經歷,設置自己程序的變化。 這個屬于編程模式。
比如,我最近檢測出我有個自動化程序:我一見到人,我會自動調取過于熱情的關系模式。這非常消耗我的能量狀態,而且我認為這屬于人格面具的一個表演范疇,這個程序的好處是容易自來熟,快速建立人和人的關系,但是弊端是很容易讓他人侵入我的邊界,我會被不斷地要求干這干那,而且我的注意力會被不斷地蠶食。
這個程序的瘋狂之處在于,它會告訴我,我是奉獻者、服務者以及我會心甘情愿地做偉大的犧牲者。這個熱情的內在程序,還和我另外的價值觀信念體系達成了一個混亂的鏈接, 包括我需要:
A. 日行一善——用來訓練我的愛心。
B. 我需要通過幫助他人積功累德——用來體驗人類命運共同體和我生命內在的升華。
這兩個問題本身不大,這屬于我內在程序中有意義的層面,但是過于熱情的自來熟模式,讓我發現我被這種熱情面具自動給捆綁了。 當我意識到,我就決定重新編寫我的程序。
首先,我先安排我在睡夢之前自我暗示:我引導自己進入自我催眠狀態,植入指令:我決定改變我一見到人就自來熟的熱情消耗模式。
其次,我開始在各種場景中檢驗我自己的自動反應,當我意識到我又自動化進行了,我就會立即停止它,然后嘗試把熱情度降低。
我最重要的改變來自于一個很有趣的事,我找到了一個聲樂老師,她比我還熱情,我當時心里感慨,蒼天有眼啊,我竟然發現了具備同一個熱情自動模式的人,還比我更恐怖,我親眼看到了別人眼中的“我”的樣子,我的內在自動化程序在修改中了。
總之,我們不僅可以編寫自己的程序,也可以參與編寫其他人的程序,這兩種編程都是相輔相成的,我們想實行孤立主義地活著,這只是大腦創造出來麻痹自己的幻覺而已。