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