edtext 从右边开始输入 安卓_FreeRTOS 从入门到精通6--详解任务管理下(对比PLC,安卓)...
接著上一講
奔騰的心:FreeRTOS 從入門到精通5--詳解任務管理上?zhuanlan.zhihu.com在這一講中我將要介紹任務的運行模式,同時與可編程控制器(PLC)以及安卓系統的運行模式進行比較。我在德國讀書時專業是嵌入式開發,工作后從事的是西門子PCS7過程系統的編程,業余學習了安卓開發。在學習的過程中,我逐漸意識到單片機,PLC和智能手機本質上上都是一類控制器,很多對于系統開發的理念都是相近互通的,基于此便產生一種想法,想在介紹FreeRTOS的任務管理時,同時對比下PLC和安卓的任務管理機制。
首先,我們先看一下FreeRTOS的任務狀態的轉化圖
FreeRTOS的任務狀態轉化圖其中每個狀態的含義如下
- 阻塞狀態(Blocked)當任務等待某個事件或信號的時候處于此狀態
- 掛起狀態(Suspended)當任務被vTaskSuspend()函數禁止運行的時候處于此狀態
- 就緒狀態(Ready)當任務沒有被阻塞或者掛起等待運行的時候處于此狀態
- 運行狀態(Running)當任務被內核調度執行的時候處于此狀態
在系統初始化所有任務被創建的時候,任務一開始都處于就緒狀態(Ready),然后內核調度器開始調度首先選擇執行優先級最高的任務,此時被執行的任務處于運行狀態(Running)。當任務執行延時命令或者等待某個同步事件的時候便交出了自己的運行權,此時將處于阻塞狀態(Blocked)。在任務運行的時候,它可以通過vTaskSuspend()函數將其他任務或者自身掛起進入掛起狀態(Suspended)。被掛起的任務只有通過vTaskResume()函數恢復成就緒狀態(Ready)。
接下來,讓我們看看程序在可編程邏輯器(PLC)中的運行機制。
PLC程序的運行機制在PLC中,一般任務都是寫好后順序執行的。在讀取輸入階段,PLC掃描所有輸入端子,并將各輸入端的通/斷狀態存入相對應的輸入映像寄存器中,刷新輸入映像寄存器的值。CPU對用戶程序按順序進行掃描,逐條執行程序指令。在用戶程序執行完畢后,PLC將輸出映像寄存器中的通/斷狀態送到輸出鎖存器中,通過輸出端子驅動用戶輸出設備或帶動負載。在這里可以把PLC中運行的任務看作是優先級相同的任務,任務之間不會互相搶占運行的權利,內核調度器類似合作式調度(Co-operative Scheduling)- 按照預設的順序先后執行控制任務。因為PLC程序的運行都是可預測的,所以PLC更適合對穩定性實時性要求更高的工業領域。
最后,讓我們看看安卓系統中任務的運行模式,有個專有名詞叫生命周期。在安卓編程中,每個活動(Activity)包含一個畫面和對應的程序,這里可以類比成一個任務。活動通過OnCreate()函數創建,通過OnStart()函數啟動,當被其他活動搶占之后會通過onPause()函數暫停并通過onStop()函數停止(此時活動將在手機屏幕上消失)。被停止的活動通過OnRestart()函數重新運行,或者通過onDestroy()函數被銷毀。
活動的生命周期FreeRTOS中任務的運行狀態機制和安卓編程中活動的生命周期比較相似。FreeRTOS通過xTaskCreate()函數創建任務,相當于安卓的onCreate()函數;FreeRTOS通過vTaskSuspend()函數掛起任務,相當于安卓的onPause()函數;FreeRTOS通過vTaskResume()函數恢復任務到就緒狀態,相當于安卓的onResume()函數;FreeRTOS通過vTaskDelete()函數刪除任務,相當于安卓的onDestroy()函數。通過這些相似之處可以看到,學好FreeRTOS對于安卓開發也有裨益,而玩轉了嵌入式和安卓編程,融會貫通硬件和軟件開發,你將立于紫禁城之巔,成為每個產品經理最缺的那個程序員大神。
FreeRTOS的調度算法及配置
搶占式時間片調度(Prioritized Pre-emptive Scheduling with Time Slicing)
這是比較通用的調度方式,上一篇提到的溫度檢測系統采用的就是這種方式。內核調度器在每個時間片結束的時候執行一次,選擇處于就緒狀態的任務中優先級最高的任務置于下一個時間片執行。如果優先級相同的話則交替執行。此時,FreeRTOSConfig.h頭文件的設置如下:
configUSE_PREEMPTION(允許搶占) 1
configUSE_TIME_SLICING(采用時間片) 1
搶占式無時間片調度(Prioritized Pre-emptive Scheduling without Time Slicing)
在這種調度方式下,因為沒有采取時間片,所以調度器的執行開銷會比較小。如果兩個任務的優先級相同的話,在搶占式時間片調度下,兩個任務會交替運行;然而在搶占式無時間片調度下,當前運行的任務會一直運行,直到它進入阻塞或者掛起狀態,另一個相同優先級的任務才會運行。高優先級的任務會搶占低優先任務。此時,FreeRTOSConfig.h頭文件的設置如下:
configUSE_PREEMPTION(允許搶占) 1
configUSE_TIME_SLICING(采用時間片) 0
合作式調度(Co-operative Scheduling)
這種調度模式下,當前執行任務將會一直運行,同時高優先級的任務不會搶占低優先級任務。內核調度只會在當前執行任務進入阻塞狀態的時候才會執行,選擇處于就緒狀態的任務中優先級最高的任務進行執行。此時,FreeRTOSConfig.h頭文件的設置如下:
configUSE_PREEMPTION(允許搶占) 0
configUSE_TIME_SLICING(采用時間片) 任意
在下一講中,我將介紹FreeRTOS中隊列管理的知識。隊列管理(Queue Management)提供了任務之間,任務和中斷之間的通訊機制。
奔騰的心:FreeRTOS 從入門到精通7--隊列管理?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的edtext 从右边开始输入 安卓_FreeRTOS 从入门到精通6--详解任务管理下(对比PLC,安卓)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11新特性探究:显式overrid
- 下一篇: 【NLP】bert4vec:一个基于预训