最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

51單片機進階開發(fā)(一)之單片機編程思維

2022-09-09 21:13 作者:落木青云  | 我要投稿

寫在前面的P話

明天就中秋節(jié)了,祝各位中秋節(jié)快樂!各位都有月餅吃了吧?如果沒得月餅吃的朋友在評論區(qū)留個記號,或許我可以幫上你們。這邊肯定也有朋友不想吃月餅或吃膩了的吧,那你們也在后面留個記號,然后大家可以各取所需相互幫助了,這樣我應(yīng)該算幫你們之間都解決了吃月餅的問題了吧。哈哈哈……來我家吃月餅也是可以的。最近一段時間很久都沒動靜了,發(fā)個文證明一下我還活著,也感謝各位老鐵一路的支持!其實,今天的這篇文章也是公眾號上發(fā)了沒轉(zhuǎn)過來的,所以我就這么敷衍的搬過來吧。為了表示歉意,明天你們吃月餅,我寫文章,內(nèi)容都想好了,保證很多人沒看過,看懂的人對日后計算機相關(guān)學習肯定會有180度變化——“老子不學了”。哈哈……

好了,玩笑話就不多扯了,下面先看今天的正文吧 》》》

單片機編程需要什么思維

又很長一段時間沒有更新文章了,今天這篇文章其實很久之前就寫好開頭了,但直到今天才完成,讓追更的小伙伴久等了,非常抱歉!看后臺數(shù)據(jù)這段時間有不少小伙伴取關(guān)了,但令人欣慰的是總的關(guān)注人數(shù)沒有下降,所以非常感謝各位關(guān)注的朋友。當然取關(guān)的朋友也是可以理解,畢竟我這里很長時間沒更新,學習進度肯定是拖了后腿,有些內(nèi)容還不如自學的快。之前本來想著沒寫內(nèi)容的時候就搬運一些視頻過來給大家看看,但后臺還是有不知情的朋友詢問視頻內(nèi)容相關(guān)的一些問題,不是自己做的內(nèi)容回答起來總有點“欺騙感情”的感覺,所以索性就不搬運了,以后如果看到有非常值得看的視頻再搬過來給大家吧,當然在內(nèi)容中我也會強調(diào)視頻為搬運(之前其他平臺上傳的一些搬運視頻時我選擇的是原創(chuàng),因為那些平臺對填寫外網(wǎng)轉(zhuǎn)載的鏈接不太友好。在微信公眾號前期我發(fā)的自己的原創(chuàng)視頻因為當時還沒有獲取原創(chuàng)權(quán)限也沒聲明原創(chuàng),后面開通原創(chuàng)功能后我自己的視頻在發(fā)布時就都聲明為原創(chuàng)了,好在公眾號對搬運的視頻不用審核轉(zhuǎn)載鏈接,只要不聲明原創(chuàng)就好,所以后面公眾號里看到未聲明原創(chuàng)的視頻大家應(yīng)該第一時間就要明白是我搬運過來的,大家欣賞一下就好)??傊谶@里我還會繼續(xù)分享一些實用知識或技能,讓看到文章的朋友有所收獲。當然寫文章,做視頻也不會給我?guī)硎杖?,主要是希望這里能成為一個交流的平臺,給需要的人。生活不僅有遠方,還要有柴米油鹽醬醋茶,所以在我來不及更新的時候,你可以在后臺留言或私信你的問題,我看到消息肯定會答復你的疑問。祝大家周末愉快,暑假的朋友假期愉快!哈哈哈,明天我還得繼續(xù)搬磚,最近在準備一個網(wǎng)頁3D項目,因為是第一次接觸所以還是需要花足夠的功夫,歡迎有經(jīng)驗或有興趣朋友一起交流。后面空閑時我也做幾篇文章分享給大家,接下來進入今日正題。

前面的《51單片機入門基礎(chǔ)知識》和《51單片機編程開發(fā)》兩部分內(nèi)容我們將51單片機的基本知識做了簡單介紹??催^的朋友現(xiàn)在使用51單片機編寫一些簡單的程序應(yīng)該是沒有問題了吧。當然前面的內(nèi)容還只是單片機世界的冰山一角,離真正能做項目開發(fā)肯定還有一定的距離,說簡單來說就是學完前面的內(nèi)容你能做的都只是一些小玩意,這些代碼也不會給你帶來啥經(jīng)濟收入?;蛟S部分朋友在此基礎(chǔ)上能夠制作出一些有趣的“神器”了。那真的恭喜你,繼續(xù)努力,后面可以制作更多有趣的東西。

之后的文章,我將逐步和大家一起來分享怎么樣才能讓自己成為一個有項目開發(fā)能力的單片機工程師。我會以我個人經(jīng)驗講解一些作為工程師需要掌握職業(yè)技能,當然也歡迎分享你的經(jīng)驗。前面的內(nèi)容都是讓大家像玩玩具一樣使用單片機,但項目開發(fā)不是做玩具,所以后面我也會介紹一些以后工作崗位上你可能用的上的一些知識。當然如果手頭有開發(fā)板的朋友,對比你手頭上店家提供給你的資料,51單片機基礎(chǔ)部分內(nèi)容中我所寫知識點還有一部分是沒提及的,比如ADC/DAC(即數(shù)模轉(zhuǎn)換),紅外傳感器,溫度傳感器,濕度傳感器,時鐘芯片,電機驅(qū)動,外接RAM,外接ROM,IIC、SPI通信協(xié)議等等。這些內(nèi)容考慮到大家使用的開發(fā)板可能電路不太一樣,或者因為某些內(nèi)容以后基本用不上,又或者某些內(nèi)容有更簡單的方案了,所以我們就沒拿出來單獨介紹。其實這些都是在我們前面所講知識點的基礎(chǔ)上衍生出來的一些應(yīng)用而已,所以對于一些日后使用比較多的知識我后面的文章將會進行補充說明,雖然不會再單獨立篇進行介紹,但我會在使用時列出一節(jié)內(nèi)容進行說明,這樣方便初學者一次性掌握。

說了這么多題外話,那到底該怎么做我們才能夠具備項目開發(fā)能力呢?那就不得不說我們應(yīng)該要掌握的單片機編程思維了,編程思想就像房子的框架,或者人的骨骼,框架結(jié)構(gòu)就決定了房子的外觀形狀,骨骼確定了人的形態(tài)大小。單片機編程思維也一樣,它決定了程序的效率,可讀性和可移植性。那單片機編程思維需要掌握哪些內(nèi)容呢?前面我們有點出,但沒做具體說明,并且不同的人對這此都有不一樣的說法,它更多的是受一個人的編程習慣所影響。在我看來單片機開發(fā)需要具備的思維首先是模塊化,然后就是多任務(wù)化,再有就是面向?qū)ο蠡.斎贿@幾種編編程思維不是獨立存在的,也不一定就有時間順序,在我的職業(yè)生涯中他們往往都會同時存在于我的代碼中,這些編程思維更像是相互協(xié)同的一種編程習慣。當你形成自己的編程思維之后對此肯定也會有自己的認識。

這里先推薦一本書給大家——《時間觸發(fā)嵌入式系統(tǒng)設(shè)計模式》,對于初學者來說可能理解起來需要多花費一些時間,但我還是強烈推薦這本書,希望各位在初學階段能都形成良好的編程風格。關(guān)于編程習慣的參考資料還可以讀一讀《華為C編程規(guī)范和范例》,另外華為的其他一些相關(guān)資料也是值得一讀的,比如,PCB設(shè)計規(guī)范,EMC指南等等。站在巨人的肩膀上你會看的更遠,所以有時間都可以看一看。當然提升編程能力更重要的是動手,要敢于試錯,如果時間允許多看看網(wǎng)絡(luò)上的開源項目也是不錯的一個選擇,優(yōu)秀的開源項目被全世界的開發(fā)者盯著看,該規(guī)范的都規(guī)范了,總比自己閉門造車寫出來的代碼好看吧。

模塊化編程

模塊化編程是開發(fā)者首先會掌握的一種編程思想,就像前面我們多次提到的把一些特定功能的代碼大打包成一個函數(shù),這么一來以后在其他項目中就可以通過復制、粘貼輕松的移植了。這就是最簡單的模塊化思想了,當然如果要規(guī)范一點的話我們需要在函數(shù)前做一些必要的注釋說明,方便自己日后重新使用這段代碼時能很快就可以知道代碼的功能。比如下面這段代碼:

/*

***********************************************

?* 函數(shù)名:led_display

?* 描 ? 述:****

?* 輸 ? 入:****

?* 輸 ? 出:****

?* 返 ? 回:****

?* 調(diào) ? 用:****

?* 備 ? 注:****

************************************************

*/

void led_display(uint16_t duty ,uint8_t up_rate,uint8_t down_rate)

{

? ??****

}

當然也可以不用寫這么多注釋,注釋內(nèi)容只要能保證可以看懂函數(shù)的意思就行,內(nèi)容根據(jù)自己的喜好來確定,比如你也可以這樣些:

/**

? * @brief ? :****

? * @param :?****

? * @retval ?:?****

?**/

甚至你也可以直接就用一句注釋說明,比如:

/* ? ?****?? */

或者直接

//?****

只要能保證可以一眼看懂你的說明就行,當然最好是自形成一個統(tǒng)一的格式注釋格式,讓程序看起來更加美觀大方,以后別人讀你的程序心情也會好很多,畢竟項目開發(fā)不一定是你一個人完成特別是互聯(lián)網(wǎng)項目,比如一個大型項目就涉及到前端開發(fā)者,后端開發(fā)者,移動端(或桌面端)開發(fā)者,甚至還需要測試人員配合,這種情況雖然不會每個人都需要看你的代碼但至少會有人來跟你協(xié)同完成應(yīng)用功能。所以很多公司都會規(guī)定注釋規(guī)范或編程規(guī)范。

平時編程時除了善于打包函數(shù)將程序模塊化,但項目中很多時候我們的程序不止是幾個函數(shù),我們項目可能使用了大量的外設(shè),程序中需要大量的函數(shù)來完成功能,這時候如果只是打包函數(shù),我們的代碼也會變得非常龐大,如果一個文件里面有幾千甚至上萬行代碼,你日后維護起來是不是會崩潰,可能找一個bug都能找半天,這時候我們需要怎么辦呢?其實C語言庫文件就已經(jīng)告訴我們做法了,當然其他語言也是一樣。這時候我們就可以進行分文件打包程序,就是將相同功能或控制同一個外設(shè)的代碼放在同一個文件里進行模塊化,這樣做是不是比單純使用的函數(shù)會更有優(yōu)勢,以后我們?nèi)绻貜褪褂眠@些代碼都不用在代碼中查找這些函數(shù)的了,直接將整個文件拷貝就可以了,現(xiàn)在我們一起來看看這是怎么實現(xiàn)的。

圖片

以上圖片中展示的就是這種模塊化的做法,在項目中將不同作用的代碼放在不同的文件夾下,將不同模塊的代碼放在不同的***.c文件里面,這樣后續(xù)修改,調(diào)試,移植代碼的效率就會大大提高。那這種做法是怎么實現(xiàn)的呢,之前我們在介紹C語言文件時說過C語言文件主要有兩種,即.c和.h文件,.c文件我們稱它問源文件,.h文件我們稱為頭文件,在源文件中我們存放各種變量或功能函數(shù)的定義等內(nèi)容,在頭文件中聲明對應(yīng)的變量、函數(shù)或宏定義等等,所以一般情況下源文件和頭文件都是成對出現(xiàn)的。若某個文件需要使用另一個文件中定義的函數(shù)時就在該文件頭部添加另一個文件對應(yīng)的頭文件,這樣就可以實現(xiàn)各部模塊程序相互調(diào)用了。通過源文件和頭文件分離,當你遇到有一些代碼文件你不想給別人知道,但又要發(fā)布給別人,這種情況下也有對應(yīng)的處理辦法,具體的做法我們后面再介紹。

一般情況下在不同的源文件中我們也會像之前些函數(shù)一樣對該文件做一些注釋描述,比如:

/**** (C) COPYRIGHT ?*********

?* 文件名 ? :****

?* 描述 ? ? ?:****

?* 操作系統(tǒng) :****

?* 軟件平臺 :****

?* 硬件基礎(chǔ) :****

?* 庫版本 ? ?:****

?* 作者 ? ? ? :****

?* 版本編號 :****

?* 修改時間 :****

?* 修改說明 :****

**********************************/

當然你也可以不用寫這么多內(nèi)容,以你能看懂為準。

多任務(wù)編程

一般情況下我們在使用 51、AVR、STM32等單片機編程的時候都是在main函數(shù)里面用while(1)做一個大循環(huán)來完成所有的處理,即應(yīng)用程序是一個無限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成所需的處理。有時候我們也需要用到中斷來完成一些功能操作。相對于多任務(wù)系統(tǒng)而言,這個就是單任務(wù)系統(tǒng),也稱作前后臺系統(tǒng),中斷服務(wù)函數(shù)作為前臺程序,大循環(huán)while(1)作為后臺程序。

圖片

類似一下的做法:

void IRQHandler_fun()

{

? ? flag1 = 1;

}

int main (void)

{

? ? while(1)

? ? {

? ? ? ? if (1 = flag1)

? ? ? ? {

? ? ? ? ? ? func1();

? ? ? ? ? ? flag1 = 0;

? ? ? ? }

? ? }

}

這種做法在一般項目中是完全沒有問題的,但是這種程序結(jié)構(gòu)的一個缺陷是它的前后臺系統(tǒng)的實時性不強,前后臺系統(tǒng)各個任務(wù)(應(yīng)用程序)都是排隊等著輪流執(zhí)行,不管你這個程序現(xiàn)在有多緊急,沒輪到你就只能等著!相當于所有任務(wù)(應(yīng)用程序)的優(yōu)先級都是一樣的。在小項目中前后臺系統(tǒng)簡單,資源消耗也少,單片機處理起來還得心應(yīng)手!但在稍微大一點的嵌入式應(yīng)用中前后臺系統(tǒng)對實時性要求較高的應(yīng)用中就明顯力不從心了。這時候就需要進行多任務(wù)處理了,就像一下的做法:

void first_task()

{

? ? while (1)

? ? {

? ? ? ? if(has_data())

? ? ? ? ? ? put_data();

? ? }

}

void second_task()

{

? ? while (1)

? ? {

? ? ? ? if(get_data())

? ? ? ? ? ? do_something();

? ? }

}


int main(void)

{

? ? create_task(first_task);

? ? create_task(second_task);

? ? start_task();

}

相信細心的朋友一眼就能發(fā)現(xiàn),這種做法很明顯的不一樣就是每個任務(wù)函數(shù)中都有一個while (1)死循環(huán),是不是我們只要在程序中多使用一些while (1)死循環(huán)就OK了呢?簡單說可以這么認為吧,當然實際情況肯定不會這么簡單。

那多任務(wù)編程是怎么實現(xiàn)程序功能的呢?多任務(wù)系統(tǒng)把一個大問題“分而治之”,把大任務(wù)劃分成很多個小問題,逐步的把小任務(wù)解決掉,大任務(wù)也就隨之解決了,這些任務(wù)是并發(fā)處理的。注意,并不是說同一時刻一起執(zhí)行很多個任務(wù),畢竟我們單片機項目都是使用單核芯片,任意時刻它也只能存在一個任務(wù)占用其內(nèi)核,它是由于每個任務(wù)執(zhí)行的時間很短,導致看起來像是同一時刻執(zhí)行了很多個任務(wù)一樣。

看了以上內(nèi)容是不是感覺多任務(wù)編程非常的難?其實難肯定是難,但也沒有那么難,因為現(xiàn)在有非常多開源多任務(wù)系統(tǒng)供我們選擇,比如freeRTOS,RT-Thread,UC/OS等等,所以就不用我們自己從零寫一個多任務(wù)系統(tǒng)了,使用時選擇一個合適的系統(tǒng)進行移植就能減少很多工作量了。

圖片

像以上這個項目,調(diào)用freeRTOS來實現(xiàn)程序功能。當然這種編程思維不是一兩天就能掌握,需要一定的項目經(jīng)驗,所以初學者理解起來困難并不要緊,要緊的是自己需要把C語言基礎(chǔ)掌握好,基礎(chǔ)牢固了編程就有感覺了。

面向?qū)ο缶幊?/h1>

前面介紹C語言基礎(chǔ)時我們說過編程語言主要有面向過程和面向?qū)ο髢煞N,C語言是典型的面向過程的一種編程語言。你們你可能就會想為什么我們使用C語言開發(fā)單片機程序還需要面向?qū)ο蟮木幊趟季S呢,是要使用面向?qū)ο蟮木幊陶Z言來開發(fā)了嗎?當然不是,我們還是使用C語言來編程,只是呢,在編程時我們按面向?qū)ο蟮姆绞絹硖幚砥湎嚓P(guān)功能,簡單的說就是把C語言通過一定的處理技巧封裝成像面向?qū)ο蟮木幊陶Z言一樣來執(zhí)行程序功能。

對于流程清晰的簡單程序,一般只有一條流程主線,很容易被劃分成順序執(zhí)行的幾個步驟,面向?qū)ο缶幊毯兔嫦蜻^程編程沒有太大差別,并且面向過程編程相對比面向?qū)ο缶幊谈又庇^高效。

當我們面對一個大型的復雜程序,由于其錯綜復雜的流程和交互關(guān)系,很難將其簡單地拆分成一條主線串成的簡單步驟,而通常表現(xiàn)為一個網(wǎng)狀關(guān)系結(jié)構(gòu)。這個時候,面向過程編程的這種流程化和線性化的思維方式就會顯得比較吃力,而面向?qū)ο缶幊痰膬?yōu)勢就比較明顯了。

這也是為什么說面向?qū)ο蟮木幊陶Z言是更高級的語言的原因之一,面向?qū)ο缶幊田L格的代碼更容易復用、擴展和維護、更高級、更人性化、更適合大規(guī)模復雜程序的開發(fā)。在C語言編程的一些操作系統(tǒng)(包括Unix,linux以及Windows等等)中就會用到的面向?qū)ο蟮木幊谭绞剑锩嬗泻芏嗟慕Y(jié)構(gòu)體、指針、鏈表等內(nèi)容。如果還沒有接觸到面向?qū)ο缶幊讨荒苷f明你做的東西還不夠復雜。當然也不是非要掌握這個技能你才能進行項目開發(fā),只是你掌握了這些技能你就能開發(fā)更復雜的工程了。你的薪酬肯定也會比其他人高。

我們想來看看一些簡單的面向?qū)ο缶幊檀a:

圖片
圖片

以上是STM32某系列芯片官方標準庫函數(shù)中的部分片段代碼。

圖片

上圖中是freeRTOS中任務(wù)創(chuàng)建的函數(shù),對于初學者來說這些咋看都是很深奧的內(nèi)容,所以這里也不需要你現(xiàn)在就掌握它,以后你有機會接觸它們,現(xiàn)在知道有這么回事就好了?,F(xiàn)在總不至于哪天面試的時候被人問你一句你是否嘗試過面向?qū)ο箝_發(fā)單片機程序時自己啥話都說不上來。

圖片

這是微軟某個版本的某C源文件的某段源碼,看起來很復雜吧,說實話這段代碼我也沒細看,細看也一時不可能看明白,只是剛好看到就這個就貼上來跟大家一起分享一下。

結(jié)語:

今天內(nèi)容是日后走向項目開發(fā)的必經(jīng)之路寫的比較多,部分內(nèi)容現(xiàn)在理解不了也無需擔心或害怕,很多東西都是練著練著就熟悉了,所以平時遇到不理解知識點都不用恐懼,哪里不懂就百度哪里,現(xiàn)在遇到的問題多了一個個解決之后將來就不會難倒你了,所以初學時多動手的好處就在于盡早暴露你的不足,助你日后開發(fā)項目時輕車熟路,舉重若輕。

51單片機進階開發(fā)(一)之單片機編程思維的評論 (共 條)

分享到微博請遵守國家法律
巴楚县| 开江县| 临西县| 板桥市| 赤峰市| 钟祥市| 会宁县| 林甸县| 竹北市| 比如县| 瑞安市| 北碚区| 宜阳县| 丰顺县| 繁峙县| 西藏| 洪江市| 高碑店市| 永泰县| 会理县| 合川市| 剑川县| 仪征市| 兴化市| 朝阳县| 兴山县| 册亨县| 建瓯市| 项城市| 林州市| 阿城市| 阳高县| 平顺县| 陵川县| 黎平县| 合川市| 水富县| 东港市| 京山县| 成都市| 万安县|