|
本帖最后由 水漫金山2017 于 2019-12-3 09:00 編輯
單片機又稱微控制器,其工作原理與PC機相似,也就是存儲程序和程序控制的工作方式。這里的程序有可能是匯編語言也有可能是C語言,但這里我們即將要討論的不是用哪種語言編寫程序的問題。我想和大家討論的是一種程序設(shè)計模式,也就是討論一下單片機程序設(shè)計中的一種比較通用,合理的方法。當(dāng)然了,這里還是以C語言程序設(shè)計作為例程。我們都知道,從微觀上來講,CPU只能一條條的執(zhí)行指令。(這里為方便討論問題,有可能不區(qū)分指令和程序)。也就是說,在微觀上來講,CPU在某一個時刻,只能執(zhí)行一個指令動作,這是我們要明白的第一點。第二點,我們還要知道單片機中還有一個特別好的運行機制,那就是中斷。中斷可以讓任勞任怨的CPU專注于眼前的事情,而不必時刻“擔(dān)心”著“突然事件”。待到“突然事件”發(fā)生,CPU再轉(zhuǎn)頭去處理。還有一點,我們要明白,那就是單片機的主頻越高,指令執(zhí)行的越快。(當(dāng)然了,頻率高帶來的附作用,也不是我們這篇文章要討論的)。知道了以上三點,我們現(xiàn)在就開始有關(guān)文章主題的討論。
平時生活中,我們經(jīng)常用快慢這兩個字。比如說,這個人做事真快,吃飯也快,寫程序也快,總之吃喝拉撒,衣食住行都快。那么一個人做事快,有什么好處呢?很明顯,節(jié)約時間,能處理更多的事情,看起來像是很多事情同時做了一樣。慢,則一切相反。對單片機這種MHZ頻率的機器來講,實現(xiàn)”看起來像”同時處理更多的事情更是不在話下。這也是單片機程序能并發(fā)的物質(zhì)基礎(chǔ)之一。單片機雖然快,但我們也不能隨隨便便把所有任務(wù)都直接丟給單片機去處理,那樣會出問題的。比如,我們在剛一接觸單片機程序設(shè)計時,會這樣寫程序://主程序: //中斷服務(wù)程序
void main() void ISR(void)
{ {
//初始化單片機系統(tǒng) Task1();
Task2();
Inital() Task3();
}
//超級循環(huán)
while(1)
{
Task1();
Task2();
Task3();
}
}
這樣寫單片機程序會因為一個任務(wù)的“阻塞”而耽誤其他程序的實時響應(yīng)。比如,Task1,是一個按鍵掃描程序,其中有大概10ms的消抖時間,如果我們在程序中直接寫一個delay_10ms()程序,那么Task2和Task3勢必會因為這個延時而耽誤運行。所以,為了解決類似這樣的沖突,我們提出了一種單片機程序設(shè)計模式,一種基于系統(tǒng)節(jié)拍時間的程序設(shè)計模式。這種設(shè)計模式的思想是,在一個系統(tǒng)節(jié)拍時間到來,只運行其中一任務(wù)(注意,一定是一個任務(wù))。所謂節(jié)拍時間是單片機系統(tǒng)提供給每一個任務(wù)的運行時間。在實際應(yīng)用中,其實每個任務(wù)的最低響應(yīng)時間要求可以是不同的,比如,按鍵可以10 - 20ms掃描一次,動態(tài)掃描的LED,總的刷新周期不超過20ms,人眼還是可以接受的,再比如,溫度數(shù)據(jù)采集甚至可以500ms一次,正因為這些差異我們可以實現(xiàn)單片機程序的“并發(fā)執(zhí)行“。
|
|