想學習單片機的同學可以關注、私信我或者在評論區回複我要入門。裸編程是指在裸機上編寫程序,那什麼叫裸機?一般來說沒有編程軟件就屬于裸機。對于新手來說,裸機編程是一個比較好的選擇,同時也比較疼苦。他不能像在專業的編程軟件平台上那麼方便,自動查錯等常用功能都沒有,這就要求我們有一定的編程基礎以及經驗。
初學者拿到任務,搭好測試平台就開始碼程序,想着一個功能一個功能的湊完,然後就組成了任務,這個程序基本上是沒有思想的。要想做有思想的做程序,是不能一上來就堆積源碼的,因為那樣隻會讓一堆生硬的數字怯生生的擠在一起,不管他們有沒有多餘,有沒有矛盾。所以寫源碼之前,是要想清楚如何去寫。裸編程的思想,組織任務模塊過程中及編寫裸程序時影響源碼組織的指導思想,它直接決定着源碼的質量。
一個數據結構,一個模塊形成,一個單片機的指令,一個硬指令的運行機制,一個口線的驅動方式,一個中斷的順序,一個跳變的延遲,一個代碼的位置,一個邏輯的組織,一個模塊與模塊之間的生(運行時的狀态)死(不運行時的狀态)關系等等,這些都是裸程序思想的組成部分。
雖然看起來挺瑣碎,但是裸程序原本就如此,它不同于上位機程序,有一個強大完善的操作系統支持。裸程序就應該是建立在赤裸裸的硬件基礎上的程序,隻有有用的功能才有代碼,裸程序的質量也許經常在應用中感覺不出來,也許你做和他做都能實現功能,但是好的裸程序有良好的可擴充性、可維護性,系統具有高穩定性和高性能。總的來說,就是把一個優秀的靈魂,植入你的源碼中,讓你的源碼具有一個優良的思想。
接下來我們就來具體說裸編程的思想的具體做法。
我做程序也有些年頭了,這些年積累的經驗告訴我:要想寫好的程序不是如何去完成代碼,而是如何去組織代碼。上位機中面向對象的編程思想,就是一個非常不錯的思想。
面向對象的編程思想在上位機中是有一個非常豐富的開發包和功能強大的操作系統支持的,裸編程該怎麼借鑒思想呢?也許很多人會乍看之下覺得不可能。
其實,沒有什麼是不可能的。再複雜的思想,最終都會歸結到彙編,歸結到裸程序,我們的單片機程序,正是一種裸程序。隻是在單片機編程時和微機編程時我們站在開發平台上的高度不一樣。
對這個高度的理解,也許很多人很困惑,因為我們平時很少注意它們,那麼這裡我就舉個其他的例子來說明,盡管和裸編程好象不很相關,但是這個例子裡的高度概念十分清晰。
我們知道網絡傳輸标準層次有七層:應用層、表示層、會話層、傳輸層、網絡層、鍊路層、物理層,這麼多層做什麼用?也許理解這樣分層的概念也十分辛苦,但是理解這樣分層的思想,就容易多了,而且這也是我們硬件工程師們最應該借鑒的思想,讓我們的硬件設計更具有标準性和前瞻性。
這個七層的思想從根本上講就是将一個網絡傳輸産品細化,讓不同的制造商選擇一個适合自己的層次開發自己的産品,層次不一樣,他們所選擇的開發基礎和開發内容就不一樣,高一層開發者繼承低層開發者的成果,從而節省社會資源,提高社會生産力。這裡要說的是,微機上的面向對象編程思想就是如同在應用層上實現的思想,而裸程序的面向對象思想則如同在鍊路層上實現的思想,他下面沒有軟件開發包,隻有物理構架。但是在應用層上實現的思想,最終都要翻譯到物理構架上。
看懂了上面的例子,就一定明白,裸程序的面向對象思想,是可以實現的,隻是難度要大得多,理解要難得多。但是這不要緊,這正是軟件水平的表現,你喜歡技術,又何懼之?其實也不會難到哪裡去,隻是把做事情的方式稍微改變一下而已。
傳統上我們都喜歡用功能來劃分模塊,細分任務,面向對象思想不這樣。面向對象思想則是先從一個任務中找出對象,在對象中攙雜些模塊等來實現功能的。這就是兩種風格不一樣的地方。比如我們要讓我們的單片機把顯示信息輸出到顯示器,那麼傳統的分析方法是信息格式化、格式化數據送顯示器顯示,似乎這樣也就足夠了,不同的顯示器用不同的送顯示程序或者程序段,配置不同的變量,能共的共起來,不能共的分開。
但是面向對象的思想不是這樣做的,而是首先把顯示器當作一個對象,該對象具有一些功能和一些變量屬性,不同的顯示器在對象中使用相同的代碼标識,如函數指針(C語言中),這樣對于任何一個不同的顯示器,在調用時都使用同樣的代碼。
以KeilC為編譯環境來說說一個對象具體組織的一些做法。首先是找出對象,如顯示器,這就是一個典型的對象。其次是分析一個活對象所應具有的基本特征,即屬性與動作。顯示器的屬性如:類型代号、亮度、對比度、顯存等,動作如:初始化、内容刷新和顯示、開啟和關閉、内容閃爍等花樣顯示等。
這樣分也比較容易理解,下面是對于代碼的組織上,要注意對象的獨立性與完整性,首先把顯示器對象單獨放在一個文檔上,屬于對象特有的變量與對象的定義放在一起,要區分公有變量與私有變量的定義方式,對于私有變量要考慮臨時變量與永久變量的安排,這些安排都是對變量生命期的嚴格确定,這樣可以節省内存,避免混亂。
如某一個函數要使用一個變量,函數在調用完了就退出了,而有一個變量隻有它使用,卻要保存每一次調用函數所産生的結果,這樣的變量怎麼定義呢?很多人會直接定義一個全局變量,但是一個好的做法是把這個變量定義成該函數的局部變量,但是定義成靜态的,那麼這樣這個變量對其他代碼就是透明的,完全不可能會被誤修改,而且代碼分類性好,便于将來的維護。用函數指針來統一不同類型的顯示器不同的處理方式,也是一個很好的處理辦法,那樣可以讓具體處理方式千差萬别的顯示器都能用一個統一的對象,但是函數指針要慎重使用。
本期先分享到這裡,想要進群學習單片機編程的同學可以私信我,回複“我要入門”,與我們一起成長,喜歡的可以點個贊關注我們!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!