tft每日頭條

 > 科技

 > rtos系統框架

rtos系統框架

科技 更新时间:2024-07-28 12:15:06

先展示一個系統運行的動态圖

rtos系統框架(RTOS系列11操作系統内核運行原理)1

1.操作系統内核關鍵知識點

本文将用一個實際的工程例子來剖析操作系統内核運行原理。在此之前我們先回顧一下之前文章講述的重點知識點。

《嵌入式實時操作系統3——任務切換》中講到任務切換5個步驟:保存現場,保存棧指針,找出最高優先級任務,讀取棧指針,恢複現場。

《嵌入式實時操作系統4——任務調度》中講到:操作系統總是運行最高優先級任務,一旦有更高優先級任務就緒,操作系統将立即暫停當前任務運行更高等級任務,相同優先級下的多個任務采取時間片輪詢的方式依次運行。

《嵌入式實時操作系統5——就緒表》中講到:操作系統内核會将就緒的任務存放在就緒表,内核總是從就緒表中找出最高優先級任務,并執行該任務。

《嵌入式實時操作系統8——等待表》中講到:當多任務系統中有任務需要延時等待時,操作系統内核會将該任務從就緒表中移動到等待表中,等待表的作用就是幫助操作系統内核管理需要延時等待的任務。

《嵌入式實時操作系統10——系統時鐘節拍》中講到:系統時鐘節拍服務被定時器中斷程序調用,系統時鐘節拍服務完成了:更新系統節拍時間,更新等待表和就緒表,處理時間片輪詢,切換任務。

2.操作系統内核運行原理

操作系統内核運行的本質就是根據需求調度任務,在多個任務中找出最高優先級任務,并運行這個任務。

我們用駕校的例子,駕校隻有一輛教學車,多名學生和一個教練。根據報名費的不同将學員分成了VIP等級和普通等級,每個等級有若幹個學員。教練然後制定了2張表格:

1、就緒表:記錄了正在排隊的學員信息2、等待表:記錄了正在休息的學員信息

教練隻需要關注就緒表,讓就緒表中的學員上車練習。首先教練在就緒表中檢查優先等級,判斷VIP等級中有沒有學員,如果VIP等級有學員,教練優先讓VIP的學員上車練習,隻有等VIP學員都完成練習放棄練習,才輪到普通學員上車練習

如果有一個學員需要去廁所20分鐘,教練就把這個學員的名字從就緒表中移除,把他的名字放入等待表中,在此期間不會考慮讓該學員上車練習。

20分鐘後學員上完廁所回來,教練就把這個學員的名字從等待表中移除,把他的名字加入就緒表中。假設此時正在練車的是普通學員,而這位休息的學員是VIP學員(并且希望練車),敬業的教練就要立即讓普通學員停止練習,讓VIP級學員優先練習。如果這位休息的學員事普通等級,那就讓這個他繼續等待,相同等級的學員輪流執行。

rtos系統框架(RTOS系列11操作系統内核運行原理)2

3.工程描述

通過駕校的例子大家對操作系統内核工作原理有了初步了解,接下來我們根據一個實際工程來深入研究操作系統内核是如何工作的。

該工程是應用于智能家具中的一個多功能空調面闆,該面闆的主要功能是控制家裡的溫度和濕度,多功能面闆實物如下:

rtos系統框架(RTOS系列11操作系統内核運行原理)3

多功能空調面闆工程硬件基于國産GD系列芯片,軟件基于FreeRTOS操作系統。

rtos系統框架(RTOS系列11操作系統内核運行原理)4

多功能空調面闆主要有LCD顯示,按鍵輸入,溫濕度檢查3個功能模塊。軟件工程設計為以下3個任務:

1、溫濕度讀取任務,優先級為高。任務設計為每間隔4ms讀取一個溫濕度傳感器,讀到溫濕度數據後,将數據發送給顯示任務。2、按鍵任務,優先級為低。任務設計為持續掃描4個按鍵,監測按鍵是否按下,并能識别按鍵長按和連擊,有按鍵觸發後,将按鍵數據發給顯示任務。3、顯示任務,優先級為低。任務設計為根據接收到的溫濕度數據,顯示溫度和濕度;根據接收到的按鍵數據,進行顯示界面切換。

4.操作系統運行分析

main函數中設置SysTick定時器為1ms周期定時,創建顯示任務,按鍵任務和溫濕度讀取任務。main代碼如下:

/* github: liyinuo2017 author:liwei */ int32_t main(void) { system_clk_init(); /* 配置系統時鐘 */ /*顯示任務*/ xTaskCreate((TaskFunction_t )display_task, (const char* )"display", (uint16_t )SIZE_512, (void* )NULL,(UBaseType_t )LOW_PRIO,(TaskHandle_t* )NULL); /*按鍵任務*/ xTaskCreate((TaskFunction_t )button_task, (const char* )"button", (uint16_t )SIZE_256, (void* )NULL, (UBaseType_t )LOW_PRIO,(TaskHandle_t* )NULL); /*溫濕度讀取任務*/ xTaskCreate((TaskFunction_t )temp_humi_task, (const char* )"temp_humi", (uint16_t )SIZE_256, (void* )NULL, (UBaseType_t )HIGH_PRIO,(TaskHandle_t* )NULL); /* 任務調度 */ vTaskStartScheduler(); while(1); }

顯示任務,按鍵任務和溫濕度讀取任務這3個任務的代碼如下:

/*lcd顯示任務 */ void display_task(void *pvParameters) { display_init(); /* 初始化 */ for(;;) { display_data_updata();/* 數據更新 ,運行 時間1ms*/ display_handle(); /* 顯示更新 , 運行 時間1ms*/ } } /* 按鍵任務 */ void button_task(void *pvParameters) { button_init(); /* 初始化 */ for(;;) { button_scanf();/* 按鍵掃描 , 運行 時間1ms*/ button_data_send(); /* 按鍵數據發送給顯示任務 , 運行 時間1ms*/ } } /* 溫濕度讀取任務 */ void temp_humi_task(void *pvParameters) { temp_humi_init(); /* 初始化 */ for(;;) { data_read_calc();/* 讀取數據, 運行 時間1ms*/ temp_humi_data_send(); /* 數據發送給顯示任務 , 運行 時間1ms*/ } }

執行vTaskStartScheduler函數後,操作系統内核開始任務調度,操作系統的狀态如下圖:

rtos系統框架(RTOS系列11操作系統内核運行原理)5

操作系統啟動運行,由于HIGH_PRIO優先級為任務最高優先級,因此操作系統内核讓溫度讀取任務開始運行,當溫度讀取任務完成讀取溫濕度數據,并将數據發送給顯示任務。

溫度讀取任務完成相應操作後執行延時等待,操作系統内核會将溫度讀取任務從就緒表中移除,将溫度讀取任務添加到等待表中,更新優先級表,切換任務。

rtos系統框架(RTOS系列11操作系統内核運行原理)6

當溫度讀取任務進入等待隊列後,LOW_PRIO優先級為任務最高優先級,該優先級下有顯示任務和按鍵任務,顯示任務在就緒表前端,顯示任務先運行。

rtos系統框架(RTOS系列11操作系統内核運行原理)7

顯示任務運行1ms後,定時器周期産生中斷,系統時鐘節拍服務被執行,更新系統時間,檢查等待表,并執行時間片輪詢操作,顯示任務被移動到就緒表末端,按鍵任務來到就緒表前端,中斷返回前執行任務切換,按鍵任務開始運行。

按鍵任務運行1ms後,定時器周期産生中斷,系統時鐘節拍服務被執行,更新系統時間,檢查等待表,并執行時間片輪詢操作,按鍵任務被移動到就緒表末端,顯示任務來到就緒表前端,中斷返回前執行任務切換,顯示任務開始運行。

rtos系統框架(RTOS系列11操作系統内核運行原理)8

系統時鐘節拍服務被執行後,更新系統時間,檢查等待表,此時溫度讀取任務完成延時等待,操作系統内核會溫度讀取任務從等待表中移除,将溫度讀取任務添加到就緒表中,更新優先級表,由于HIGH_PRIO優先級為任務最高優先級,切換任務,溫度讀取任務開始運行。

rtos系統框架(RTOS系列11操作系統内核運行原理)9

軟件工程運行的整個動态過程如下圖:

rtos系統框架(RTOS系列11操作系統内核運行原理)1

未完待續…實時操作系統系列将持續更新創作不易希望朋友們點贊,轉發,評論,關注。您的點贊,轉發,評論,關注将是我持續更新的動力作者:李巍Github:liyinuoman2017

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved