單片機時間片輪詢法


原文地址::http://bbs.eeworld.com.cn/thread-319810-1-1.html

上次發帖《淺談單片機應用程序架構》后,很多網友都希望有下午,詳細說明3中架構的具體應用。而在這一段時間以來本人一直在考慮寫這樣一個帖子,但是由於工作的原因基本上沒有時間寫這樣一個貼。今天有點空余時間,就這里談談,本人在最近幾個項目中使用《時間片輪詢法》的一些心得。至於網友希望獲取3中架構的應用實例,只能看以后有時間后來編寫了,希望大家支持與理解。

 

       對於時間片輪詢法的具體架構在這里就不在闡述了,需要了解的網友可以去看上次發的架構貼,里邊已經說的很詳細了,不明白的地方請留意,本人會盡量說明白。

 

       在發架構貼之前本人也從來沒有使用過時間片輪詢法,一直都只是知道這個概念。所以上次發的架構貼也是本人的一種摸索,但是架構一定的正確可行的,而且它的優勢也是很明顯的。

 

       自從發了架構貼以后,本人的項目開發均使用了時間片輪詢法進行開發,剛開始遇到了不少問題。讓我對此法有些懷疑了,覺得還是需要操作系統才能實現真正的任務級編程。大家都知道操作系統中,並不需要我們去了解任務之間的切換。而我們只有划分好任務,以及任務之間的通訊就可以了。但是時間片輪詢法中所以的任務之間的通訊,任務之間的切換等等都必須是程序員來實現,那么在使用此法時應該注意些什么才能實現真正的任務級編程呢?

 

      在說明注意事項之前,本人要特別說明,你要相信操作系統能實現的時間片輪詢法一定能實現。同樣能讓人感受到多任務的快感,只是這些都直接考驗了一個編程人員的技巧以及思維(需要的是多任務的思維方式)。

 

注意事項:

 

    1. 任務的划分:任務一定要划分的非常合理,盡量做到任務的相對獨立;

    2. 任務的優先:一定要注意任務優先級的設計,把需要及時處理的任務排到任務的最前面;

    3. 任務的執行:任務的執行一定要盡量的快,一定要保證在毫秒級,否則任務還沒執行完,其他任務都再等,就到不到實時系統的要求,也談不上多任務了;

    4. 時間的划分:時間片的划分是整個系統的關鍵,一定要保證任務在需要執行的時候能夠進入該執行的任務中,否則就不能實現真正的時間片輪詢了。

 

 

通過以上的介紹,我想大家多覺得特別抽象吧。下面就針對以下幾點舉例說明:

 

    1. 任務的划分:

    

任務的划分並不難,你需要先全面的了解你的項目是要實現什么功能,把其划分成多個功能模塊,每一個模塊就是一個任務,每一個任務對應一個函數。

 

例如一個時鍾產品,一般由:按鍵、顯示、時間、鬧鈴、菜單(設置/查詢等)等組成。那么我們可以把其划分成5個任務。

 

    2. 任務的優先:

 

同樣通過以上事例來說明任務優先級,可能划分的方法有很多種,而且看不出很大的區別,這里只是本人認為最為合理的方式:

   

    A. 時間,這里的時間就是從時鍾芯片中獲取時間;

    B. 鬧鈴,獲取時間后應該首先判斷是否是設置的鬧鈴時間,如果是就進行鬧鈴提示,否則,退出執行下一個任務;

    C. 顯示,顯示時間,如果有鬧鈴,則顯示鬧鈴標志;

    D. 按鍵,判斷是否有按鍵,如果有就進入相應的操作;
    E. 菜單,通過按鍵進入相應的菜單,如果沒有按鍵,就不執行菜單任務直接退出。

 

這就是整個時鍾產品需要實現的整個過程,任務之間的通訊已經任務之間的相互制約都是通過全局變量實現的,例如進入時間設置等時,就沒有有必要實現時間的讀取,鬧鈴的判斷,以及時間的顯示。這時只需要執行按鍵任務以及菜單任務即可,直至退出為止。這里需要說明的是不執行的任務是在判斷任務執行情況后不具體執行任務代碼,並不是一直在菜單程序中死等等,直至菜單退出。因為那樣的話就不是真正的多任務級了,也談不上時間片了。

 

    3. 任務的執行:

 

       任務的執行一定要盡量的快,一定不能因為某個任務需要等等特殊的東西,而影響的其他任務,也不能在任務中調用大的延時函數,一定要保證任務的運行速度,要知道每一個任務的具體執行時間。例如上例中,絕對不能因為等等按鍵的釋放而導致其他任務的不運行。那么怎么消抖呢?這個方法有很多,你可要通過利用兩次按鍵任務是時間實現消抖,例如第一按鍵后,你做個標志,表示有鍵,但是不執行菜單,可要通過第二次進入按鍵任務判斷,是否是按鍵的按鍵,還是誤按,這種情況下就必須要保證按鍵任務的運行時間在消抖也許的時間內容,例如20ms。

 

      再例如:在應用GPRS時,由於GPRS發送指令到接收到應答的時間都是秒級的,所以一定不能發完指令后,一定要等到應答才執行下一個任務,而是通過雙線程的思想,把GPRS的發送和接收分為兩條線,一條發,一條接,而這兩條線之間都是同樣全局變量來連線。每次進入GPRS任務時都判斷是否由發送和接收,如果有發送就發送,有接收就判斷是否為上次發送的應答,如果是就可以繼續發送了,否則繼續等待應答的接收,以最快的速度實現任務的執行。

 

    4. 時間的划分:

 

     時間片的划分尤為重要,需要保證每一任務都能在該執行的時間內運行。就以時鍾事例來說,顯示和獲取時鍾一般一秒一次就可以了,如果你有時鍾冒號“:”的顯示,那么1秒必須執行兩次以上才能保證顯示的正常。當然在系統允許的情況下可以盡量多允許幾次,但一定最低的允許次數。像按鍵可以使用20ms作為任務的時間片,因為一般按鍵的消抖時間為20ms,那么時間片划分為20ms完全可以保證即不漏掉按鍵,也不會誤讀按鍵。

 

 

//================================================================================

備注:

1》覺得這種方法對於構建復雜的系統很有參考意義!!!

 

 

 

其他:

https://www.cnblogs.com/zhliao/archive/2012/08/11/2633630.html

 

 

https://www.baidu.com/link?url=Fjx4b-9Vc4GlTPzSkjm1yCZwM9g70AvIl0-gfeaZu5uKf7QUe4iUcGbEzYTIcEt7tVFehIqFhVHnzpEaVMnKHa&wd=&eqid=969703ee00014e3b000000025be50000

 

 

 

類似於,比如,你有10個MM,每晚陪一個,無差別輪流陪,每個MM給一晚時間,這就是無占先先、無優先級的時間片輪詢,任何MM不能打斷你當前陪的MM,直到結束。

無占先、有優先級輪詢,就是你陪玩一個MM后,下一晚,你看看哪個MM急於要你陪,可能有多個,然后看其排隊取舍(隊列、FIFO等等)。

有占先的,則及時你正在陪一個MM,但是其中一個更霸道的MM來要你先陪,那么你就得中斷跟當前這個MM的親熱,先去處理霸道MM,完事了,回來再繼續跟原來這個MM好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM