輪詢系統與前后台系統:
在我們學習嵌入式編程的時候,首先接觸到的是裸機編程(輪詢),裸機編程的實現比較簡單,而且其邏輯也非常的清晰,通過觀察代碼就能大概判斷程序的執行流程和作用,但是裸機編程有一個巨大的缺點——實時性太差。例如下列代碼(偽):
while(1)
{
...(程序段一) if(key1==0) { ... } if(key2==0) { ... }
}
當我們在執行程序段一時,key1和key2兩個按鍵的按下是不會有反應的(假設執行程序段一需要大量時間),又比如說我們在執行key1中的內容時,key2按鍵是不會反應的,且程序段一在很長一段時間內不會被執行,因為key1中的程序占用了cpu。
但是聰明的程序員們發明了一種程序系統——前后台系統,在前后台中,定義了許多中斷,這些中斷被稱為“前台”,而具體程序的執行流程被稱為“后台”。實現流程為下(偽代碼):
int flag1=0; int flag2=0; int main() { while(1) { if(flag1==1) { } if(flag2==1) { } } } void ISR1(void) { flag1=1; } void ISR2(void) { flag2=1; }
我們注意到,在這個系統中,定義了幾個中斷,如果中斷被觸發,那么flag就快速的置一,這時主程序中掃描到flag置一,就跳入執行響應的程序。這樣,整個系統的響應時間就大大縮短了,且可以在任何時候響應。
小巧但強大的RTOS(實時操作系統):
但是,如果系統非常復雜呢?如果希望兩個程序塊中的程序同時進行運算呢?(這里從使用者的角度上定義“同時”)這時我們就要使用RTOS(實時操作系統)系統了,而RTOS的實現大同小異,我個人比較喜歡RTThread,聽大佬說,它有着令人舒適的類Linux編程風格,並且具有豐富的組件。
在RTThread系統中,最核心的東西就是線程,事件的處理在線程中完成,所有的核心都圍繞着線程展開,線程和STM32中的中斷一樣,也具有優先級,系統通過優先級來判斷哪個線程需要首先被執行。甚至可以讓兩個同優先級的線程同時執行(通過時間片機制)。
那么這個相對來說比較復雜的系統,會不會占用大量的資源呢?答案是不會的。下圖是RTThead官方文檔中心的簡介:
這里我們可以看到RTThread(nano精簡版本)甚至可以輕松的在stm32c8t6上運行。
最后,對於系統,並不能單純的評定它們孰優孰劣,畢竟老話說的好——合適的才是最好的。
(純手擼,喜歡的話不妨推薦一下=)