国产精品久久99,51久久成人国产精品麻豆,亚洲欧洲免费三级网站,最近中文字幕mv,重口老太大和小伙乱

首頁>科技 > 正文

FreeRTOS-STM32操作系統(tǒng)|每日速遞

2023-06-21 19:19:51來源:隊牛彈琴

單片機的Helloworld程序中(讓LED實現(xiàn)閃爍)的過程中,常常用到了延時,在這個延時過程中CPU相當(dāng)于什么事情都沒干,當(dāng)然這只是個實現(xiàn)電平翻轉(zhuǎn)的簡單任務(wù)。但是一旦任務(wù)增多后CPU的算力就大打折扣,因為在延遲的過程中,CPU這個“勞動者”在等待時間消息,幾乎不再工作,這就需要一種方法去最大化“壓榨”CPU的算力,使得CPU全時間滿負(fù)荷運行。

嵌入式設(shè)備一般分為以下幾種:

裸機系統(tǒng)、輪詢系統(tǒng)、前后臺系統(tǒng)、多任務(wù)系統(tǒng)。輪詢系統(tǒng)就是一個主程序中不斷運行無限循環(huán)里邊的程序內(nèi)容;前后臺系統(tǒng)就是在輪詢系統(tǒng)中加入了中斷,中斷事件的處理是在中斷函數(shù)進(jìn)行處理的,中斷是前臺,主程序是后臺;多任務(wù)系統(tǒng)是事件的中斷處理在主函數(shù),中斷函數(shù)負(fù)責(zé)傳遞中斷標(biāo)志位。


(資料圖片)

不同系統(tǒng)模型的對比如下圖:

常見的操作系統(tǒng)如下:常用的 RTOS有國外的 FreeRTOS、μC/OS、RTX 和國內(nèi)的 FreeRTOS、Huawei LiteOSAliOS-Things 等,其中尤以國外開源且免費的FreeRTOS 的市場占有率最高。操作系統(tǒng)其實就是把硬件資源虛擬化,把單核處理虛擬成“多核”提高“并發(fā)”感。這種思想非常重要,類似的有虛擬機,還有當(dāng)下大量應(yīng)用于物聯(lián)網(wǎng)的Docker技術(shù)。

對于單核ARM單片機來說,要達(dá)到兩個進(jìn)程任務(wù)的幾乎同步態(tài),那是不可能的,所以對于多任務(wù)系統(tǒng),要限制每個任務(wù)的運行時間,所以就需要分時切片處理,如下圖,運行兩個任務(wù)進(jìn)程,每個任務(wù)進(jìn)程的運行時間所占據(jù)的時間片一樣的,只要時間片劃分足夠小,例如在毫秒級別上進(jìn)行任務(wù)切換可以滿足大部分系統(tǒng)的穩(wěn)定運行需求。時間片上運行過程如下圖 運行結(jié)果如下下圖:

TWO

在操作系統(tǒng),每一個要執(zhí)行的任務(wù),也就是一段程序的運行過程被稱為一個 進(jìn)程。進(jìn)程包含著動態(tài)的概念,它是一個程序的運行過程,而不是一個靜態(tài)的程序。進(jìn)程體現(xiàn)在程序中形式實際上就是一段循環(huán)執(zhí)行的代碼,使用操作系統(tǒng)的任務(wù)創(chuàng)建函數(shù)創(chuàng)建了這個進(jìn)程之后,操作系統(tǒng)就自動找到這段代碼并執(zhí)行。一段程序執(zhí)行時,一般劃分成三個階段,開始執(zhí)行--->執(zhí)行中--->執(zhí)行完成。這也恰好對應(yīng)了進(jìn)程的工作狀態(tài): 就緒態(tài)(Ready)---> 運行態(tài)(Running---> 終止態(tài)(Blocked)。如果在一個進(jìn)程執(zhí)行的過程中,調(diào)用了將進(jìn)程掛起的功能函數(shù),或者是進(jìn)程執(zhí)行時有更高優(yōu)先級的 任務(wù)就緒了,則進(jìn)程會進(jìn)入 掛起狀態(tài)(Suspended)。容易把阻塞態(tài)與掛起態(tài)相混,我的理解是處于阻塞態(tài)的時候進(jìn)程在等待一個信號條件滿足后繼續(xù)運行,該信號條件可以是中斷可以是信號量等等。而處于掛起態(tài)的時候該程序根本沒運行,就像一個人被掛起,那他根本不可能完成任何任務(wù)。

由于使用時間切片引起任務(wù)進(jìn)程的暫停容易導(dǎo)致正在處理的數(shù)據(jù)丟失,所以操作系統(tǒng)需要給每個任務(wù)進(jìn)程分配一個內(nèi)存,存儲上個時間片尚未處理的任務(wù)數(shù)據(jù)。

同時任務(wù)進(jìn)程的工作并不是完全獨立的而是互相交替訪問的,各個進(jìn)程的通信也需要容易導(dǎo)致對某個變量的的訪問極易出現(xiàn)沖突,所以需要一個信息傳輸?shù)慕橘|(zhì)- 存儲隊列。該消息隊列既能寫入數(shù)據(jù)也能讀取數(shù)據(jù),消息隊列對象一般以全局變量進(jìn)行聲明。消息緩存空間采用先進(jìn)先出FIFO方式進(jìn)行存儲,實現(xiàn)效果如下圖。

有限的硬件資源可能會被多個進(jìn)程同時訪問,并且有的進(jìn)程對被控制實體的作用是相反的,極短時間內(nèi)互斥任務(wù)進(jìn)程的切換極易使得被控對象產(chǎn)生震蕩,所以需要對互斥進(jìn)程做一個規(guī)約,這個規(guī)約的實現(xiàn)就是信號量,F(xiàn)reeRTOS中可以實現(xiàn)任務(wù)之間同步或臨界資源的互斥訪問,常用于協(xié)助一組相互競爭的任務(wù)來訪問臨界資源。也可以用作進(jìn)程順序執(zhí)行或者同步運行的保證。

具體來說信號量是一個非負(fù)整數(shù),由臨界資源釋放,當(dāng)信號量為0時,剩余任務(wù)進(jìn)程失去資源訪問的機會,只有當(dāng)另一個任務(wù)停止訪問臨界資源時,才會釋放出信號量。采用信號量的實現(xiàn)過程如下圖所示。

單片機開發(fā)中用的最多就是二值信號量了,可以理解為一個位0和1,也可以理解為true或false如下圖為二值信號量的實現(xiàn)過程。訪問的任務(wù)進(jìn)程只能有一個,所以就能避免訪問資源引起的競爭與及規(guī)避控制效果的互斥。

在一個復(fù)雜控制系統(tǒng)中一個控制量常常需要多種事件的出現(xiàn)才能觸發(fā),事件的發(fā)生與消失用1和0來表示。多事件的狀態(tài)可以通過FreeRTOS中的事件庫進(jìn)行事件狀態(tài)的統(tǒng)一管理,F(xiàn)reeRTOS中一個事件組為32位,可通過配置文件修改其長度。

以32位為例其中高九位不可用,一個位代表一個事件,例如0x00000092就表示,因為0x00001188轉(zhuǎn)換為二進(jìn)制0b 0000 0000 0000 0000 0000 0000 1001 0010,然后通過查詢事件句柄查詢對應(yīng)事件的發(fā)生與否。

THREE

要看懂FreeRTOS源碼了解其原理,那么必須要學(xué)會c語言中常用的數(shù)據(jù)結(jié)構(gòu)--- 鏈表結(jié)構(gòu),鏈表的源文件在list.c文件中,一般分為單向鏈表和雙向鏈表,單向鏈表有頭尾之分,雙向鏈表則構(gòu)成了一個環(huán),分別指針分別指向上個鏈表節(jié)點地址和下個鏈表節(jié)點地址。

鏈表的節(jié)點成員以及成員作用如下圖所示:

可以看出鏈表本身就不包含大量數(shù)據(jù)的存儲,鏈表是一個動態(tài)的數(shù)據(jù)結(jié)構(gòu),將不連續(xù)的離散的硬件地址通過鏈表映射形成虛擬的連續(xù)存儲地址,面試中也常常問到鏈表和數(shù)組的區(qū)別,數(shù)組是開辟了一個連續(xù)的存儲地址,位置固定。

用最基礎(chǔ)的部分的理解就到此結(jié)束,當(dāng)然考慮到不同任務(wù)進(jìn)程的優(yōu)先級以及不同任務(wù)執(zhí)行的時間長短,和kernel等事件的觸發(fā)中斷,因此FreeRTOS有著更為復(fù)雜的調(diào)度機制,比如本文開頭提到的時間片輪轉(zhuǎn)法,在考慮到任務(wù)優(yōu)先級的時候,該算法根本不能保證高優(yōu)先級的進(jìn)程任務(wù)的執(zhí)行,而且不同任務(wù)在排隊列表中順序各有差異。排隊靠前的低優(yōu)先級任務(wù)和排隊較后的高優(yōu)先級任務(wù)怎么取舍等一系列的問題。當(dāng)然可以明確的是本系統(tǒng)的調(diào)度是由“ 先來先服務(wù)(FCFS)”調(diào)度算法,“ 優(yōu)先級”調(diào)度算法,“ 時間片輪轉(zhuǎn)”調(diào)度算法三種算法共同作用的。而且還可以通過設(shè)置宏configUSE_PREEMPTION來定義是采用搶占式還是合作式操作系統(tǒng)(說太多了不解釋了.....)。

其實把用起來就知道操作系統(tǒng)的一個重要工作就是執(zhí)行各個進(jìn)程的狀態(tài)切換,因為實際上單片機每次只能運行一個進(jìn)程,而操作系統(tǒng)通過適當(dāng)?shù)墓芾?,讓每一個進(jìn)程都可以得到及時的響應(yīng),讓多個進(jìn)程呈現(xiàn)出一種同時運行的“并發(fā)”感,和一根信號上傳輸多種信號的思想是一致的都是分時處理,但是速度肯定不及兩根信號線分別傳輸兩種信號。

現(xiàn)在的嵌入式入門門檻已經(jīng)很低,原有的STM32固件庫官方不在更新,使用CubeMX生成的HAL庫正在逐漸替代原有的固件庫,大大降低開發(fā)門檻提高開發(fā)效率。當(dāng)然熟悉板子上的常用的寄存器會讓你得心應(yīng)手。

項目中關(guān)于RTOS問題的記錄:

(1)FreeRTOS一定要配置好系統(tǒng)時鐘,給予一個單獨的硬件時鐘源作為系統(tǒng)時鐘。否則時間片的長度為無限大..程序只運行第一次進(jìn)入的進(jìn)程任務(wù)。

(2)隊列的大小要設(shè)置得當(dāng),否則容易內(nèi)存溢出,數(shù)據(jù)后移亂碼等情況。

(3)中斷中對事件組的操作一律使用....FromISR。

(4)任務(wù)進(jìn)程中的延遲要使用操作系統(tǒng)中提供的延遲函數(shù)。

(5)應(yīng)用操作系統(tǒng)是讓CPU算力最大化,所以盡量使用官方提供的外設(shè),GPIO口的通信盡量不要選擇模擬協(xié)議自行編程,因為中間需要加入非操作系統(tǒng)的微秒級延遲,降低了CPU的使用效率。

(6)在通信隊列操作中,讀取完畢應(yīng)將通信隊列清空。

(7)單片機硬件系統(tǒng)會產(chǎn)生各式各樣的中斷,而FreeRTOS可以幫助你去對管理中斷,由于STM32的內(nèi)核中斷優(yōu)先級過高,所以規(guī)定FreeRTOS能使用的中斷級別大于4.

關(guān)鍵詞:

責(zé)任編輯:

免責(zé)聲明

頭條新聞

精彩推送

新聞推送