實時操作系統應用技術 課件全套 王宜懷 第1-9章-課程導引+RTOS的基本概念與線程基礎知識-初步理解RT-Thread的調度原理_第1頁
實時操作系統應用技術 課件全套 王宜懷 第1-9章-課程導引+RTOS的基本概念與線程基礎知識-初步理解RT-Thread的調度原理_第2頁
實時操作系統應用技術 課件全套 王宜懷 第1-9章-課程導引+RTOS的基本概念與線程基礎知識-初步理解RT-Thread的調度原理_第3頁
實時操作系統應用技術 課件全套 王宜懷 第1-9章-課程導引+RTOS的基本概念與線程基礎知識-初步理解RT-Thread的調度原理_第4頁
實時操作系統應用技術 課件全套 王宜懷 第1-9章-課程導引+RTOS的基本概念與線程基礎知識-初步理解RT-Thread的調度原理_第5頁
已閱讀5頁,還剩391頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

RTOS1.1實時操作0系統的基本含義課程導引第1章RTOS的基本概念與線程基礎知識1.2RTOS中的基本概念1.3線程的三要素、四種狀態及三種基本形式1.4本章小結RTOS課程導引1.學什么?第1頁共27頁本課程以國產實時操作系統RT-Thread為藍本,闡述RTOS的應用與原理。

教材:王宜懷等編著,實時操作系統應用技術:基于RT-Thread與ARM的編程實踐,機械工業出版社,2024年4月。(內含硬件板,定價89.90元,網上折扣后為70元左右。)RTOS全書包含基礎應用篇(1~6章)、綜合實踐篇(7~8章)、原理剖析篇(9章)三大部分,只做實時操作系統下應用開發,可只閱讀基礎應用篇與綜合實踐篇,希望了解原理,則通讀全書。電子資源下載地址:https:///RTwThreadwARMjc/list.htm第2頁共27頁RTOS2.為什么要學?(1)實時操作系統是嵌入式人工智能與物聯網終端的重要工具和運行載體;(2)隨著微型計算機技術的不斷發展,RAM、Flash空間變大,價格降低,RTOS將逐步成為標準配置;(3)使用RTOS,可以把一個大工程分解成一個一個小工程,RTOS為應用編程提供服務,方便應用程序開發、維護與程序移植。第3頁共27頁RTOS3.如何學?—“勤”(1)學習過程:課前預習:花20分鐘左右瀏覽課本;聽課:帶好紙質和筆,腦手聯動;課后:及時看書、梳理札記、完成作業,當天完成當天任務;實驗:勤動手;期中、期末復習:收攏知識;(2)電子札記:按照模板,嚴格遵守排版格式,及時梳理知識要點;(3)勤問:學問學問,一要學,二要問,要克服“不問”之慣性,問老師、問同學。

第4頁共27頁RTOS嵌入式系統,即嵌入式計算機系統,它是不以計算機形式出現的“計算機”。這類計算機隱含在各種具體產品之中,在這些產品中,計算機程序發揮關鍵核心作用。嵌入式處理器按其應用范圍可以分為電子系統智能化(微控制器MCU)和計算機應用延伸(應用處理器MAP)兩大類。1.1實時操作系統的基本含義1.1.1無操作系統與實時操作系統第5頁共27頁RTOS1.無操作系統下程序運行流程無操作系統(NoOperatingSystem,NOS)的嵌入式系統中,在系統復位后,首先進行堆棧、中斷向量、系統時鐘、內存變量、部分硬件模塊等初始化工作,然后進入“無限循環”,在這個無限循環中,CPU一般根據一些全局變量的值決定執行各種功能程序(線程),這是第一條運行路線。若發生中斷,將響應中斷,執行中斷服務例程(InterruptServiceRoutines,ISR),這是第二條運行路線,執行完ISR后,返回中斷處繼續執行。從操作系統的調度功能角度理解,NOS中的主程序,可以被簡單地理解為一個RTOS內核,這個內核負責系統初始化和調度其它線程。注:NOS實例演示(

..\03-Software\CH02\NOS)第6頁共27頁RTOS2.RTOS下程序運行流程本書主要闡述面向嵌入式人工智能與物聯網領域的實時操作系統(RTOS)的應用方法與原理。在基于RTOS的編程模式下,同樣有兩條線路:一條是線程線,編程時把一個較大工程分解成幾個較小的工程(被稱為線程或任務),有個調度者負責這些線程的執行;另一條線路是中斷線,與NOS情況一致,若發生中斷,將響應中斷,執行中斷服務程序(ISR),然后返回中斷處繼續執行。注:RT-Thread實例演示(..\03-Software\CH02\NOSRT-Thread)第7頁共27頁RTOS3.RTOS的基本功能線程管理與調度、線程間的同步與通信、存儲管理、時間管理、中斷管理等。4.RTOS的應用場合將成為未來MCU應用開發的標準配置。(選擇具體的RTOS時,注意避免收費陷阱)第8頁共27頁RTOS1.1.2實時操作系統與非實時操作系統嵌入式操作系統有實時與非實時之分。應用處理器使用的嵌入式操作系統EOS對實時性要求不高,主要關心功能,這類操作系統主要有標準鴻蒙、Android、iOS、嵌入式Linux等。(多進程操作系統)而以微控制器為核心的嵌入式系統,期望能夠在較短的確定時間內完成特定的系統功能或中斷響應,應用于這類系統中的操作系統就是實時操作系統,這類操作系統主要有RT-Thread、輕量級鴻蒙、μC/OS、MQX、FreeRTOS等。(單進程操作系統)第9頁共27頁RTOS1.2RTOS中的基本概念1.2.1線程與調度的基本含義1.線程的基本含義(重點)線程是RTOS中最重要概念之一。在RTOS下,把一個復雜的嵌入式應用工程按一定規則分解成一個個功能清晰的小工程,然后設定各個小工程的運行規則,交給RTOS管理,這就是基于RTOS編程的基本思想。這一個個小工程被稱為“線程(Thread)”,RTOS管理這些線程,被稱為“調度(Scheduling)”。第10頁共27頁RTOS1)從線程調度角度理解:RTOS中的線程是一個功能清晰的小程序,是RTOS調度的基本單元;2)從RTOS的軟件設計角度來理解:線程就是在軟件設計時,需要根據具體應用,劃分出獨立的、相互作用的程序集合。這樣的程序集合就被稱為線程,每個線程都被賦予一定的優先級;3)從CPU角度理解:在單CPU下,某一時刻CPU只會處理(執行)一個線程,或說只有一個線程占用CPU。RTOS內核關鍵功能就是以合理的方式為系統中的每個線程分配時間(即調度),使之得以運行。第11頁共27頁RTOS2.調度的基本含義(重點)調度就是決定該輪到哪個線程運行了,它是內核最重要的職責。例如,一臺晚會有小品、相聲、唱歌、詩朗誦等節目,而舞臺只有一個,在晚會過程中導演會指揮每個節目什么時間進行候場、什么時間上臺進行表演、表演多長時間等,這個過程就可以看做是導演在對各個獨立的節目進行調度,通過導演的調度各個節目有序演出,觀眾就能看到一臺精彩的晚會。優先級的調度算法算法的核心思想是:總是讓處于就緒態的、優先級最高的線程先運行,優先級相同的按照先進就緒隊列先運行,同優先級的可各運行一定時間片。第12頁共27頁RTOS1.2.2

內核類其他基本概念1.時鐘節拍時鐘節拍:時鐘節拍(ClockTick),有時也直接譯為時鐘嘀嗒,它是一個定時器產生的周期性中斷,調度功能重要來源之一。

2.代碼臨界段代碼臨界段:也稱為臨界區,是指部分代碼開始執行則不允許任何中斷打擾。在進入時關中斷,出來時開中斷。3.不可搶占型內核與可搶占型內核不可搶占型內核:要求每個線程主動放棄CPU的使用權。可搶占型內核:一個正在運行的線程可以被打斷,而讓另一個優先級更高、且變為就緒態的線程運行。一般為可搶占型內核。第13頁共27頁RTOS4.實時性相關概念及RTOS實時性指標(了解)實時性:實時性可以理解為在規定時間內系統的反應能力,可分為硬實時和軟實時。硬實時:要求在規定的時間內必須完成操作。軟實時:只要按照線程的優先級盡可能快地完成操作即可。評價一個RTOS一般可從以下幾個方面來衡量

(1)線程調度的時間指標調度延時、線程切換時間、恢復時間。

(2)中斷禁止時間、中斷延遲時間。

(3)最小內存開銷。第14頁共27頁RTOS1.線程的上下文及線程切換(重點、難點)線程的上下文是指某一時間點CPU內部寄存器的內容。當多線程內核決定運行另外的線程時,它保存正在運行線程的上下文,保存在線程自己的堆棧之中。入棧工作完成以后,就把下一個將要運行線程的上下文,從其線程堆棧中重新裝入CPU的寄存器,開始下一個線程的運行,這一過程叫作線程切換或上下文切換。上下文的英文單詞是context,這個詞具有場景、語境、來龍去脈的含義。要點:線程棧、SP、PC1.2.3線程類其他基本概念第15頁共27頁RTOS2.線程優先級(了解)在一個多線程系統中,每個線程都有一個優先級,RTOS根據線程的優先級等進行線程調度,一般情況下優先級高的線程先運行。了解有關概念:優先級驅動、優先級反轉、優先級繼承。3.線程間通信(后面重點學習的內容,RTOS為我們服務的)線程間通信是指線程間的信息交換,其作用是實現線程間同步及數據傳輸。同步是指根據線程間的合作關系,協調不同線程間的執行順序。線程間通信的方式主要有事件、消息隊列、信號量、互斥量等。4.資源(了解)RTOS中的資源是指任何被線程所占用的實體,可以是輸入/輸出設備,例如顯示器,也可以是一個變量、結構或數組等。涉及資源的主要概念有:共享資源、互斥與死鎖等。第16頁共27頁RTOS1.3線程的三要素、四種狀態及三種基本形式從線程的存儲結構上看,線程由三個部分組成:線程函數、線程堆棧、線程描述符,這就是線程的三要素。線程函數:線程要完成具體功能的程序;線程堆棧:每個線程擁有自己獨立的線程堆棧空間,用于保存線程在調度時的上下文信息及線程內部使用的局部變量;線程描述符:關聯了線程屬性的程序控制塊,記錄le線程的各個屬性。1.3.1線程的三要素:線程函數、線程堆棧、線程描述符(重點)第17頁共27頁RTOS1.線程函數一個線程,對應一段函數代碼,完成一定功能,可被稱之為線程函數。RTOS內核如何知道哪個該先運行呢?由于任何時刻只能有一個線程在運行(處于激活態),當RTOS內核使一個線程運行時,之前的運行線程就會退出激活態。CPU被處于激活態的線程所獨占,從這個角度看,線程函數與無操作系統(NOS)中的“main”函數性質相近,一般被設計為“永久循環”,認為線程一直在執行,永遠獨占處理器。但也有一些特殊性,將在第6章中討論。第18頁共27頁RTOS2.線程堆棧(重點、難點)線程堆棧是獨立于線程函數之外的RAM,是按照“先進后出”策略組織的一段連續存儲空間,是RTOS中線程的重要組成部分。在RTOS中被創建的每個線程都有自己私有的堆棧空間,在線程的運行過程中,堆棧用于保存線程程序運行過程中的局部變量、線程調用普通函數時會為線程保存返回地址等參數變量、保存線程的上下文等等。第19頁共27頁RTOS3.線程描述符(重點、難點)線程被創建時,系統會為每個線程創建一個唯一的線程描述符TD,它相當于線程在RTOS中的一個“身份證”,RTOS就是通過這些“身份證”來管理線程和查詢線程信息的。在RTOS中,一般情況下使用列表來維護線程描述符。在RT-Thread中阻塞列表用于存放因等待某個信號而終止運行的線程;延時列表用于存放通過延時函數或等待某個信號指定的時間而終止運行的線程;就緒列表則按優先級的高低存放準備要運行的線程。第20頁共27頁RTOS1.線程狀態的基本含義(重點、難點)1)終止態:線程已經完成,或被刪除,不再需要使用CPU。2)阻塞態:又可稱為“掛起態”。線程未準備好,不能被激活。當等待時間到或等待的情況發生時,該線程才變為就緒態。3)就緒態:線程已經準備好可以被激活,但未進入激活態。一旦獲取CPU的使用權就可以進入激活態,處于就緒態的線程描述符存放于就緒列表中。4)激活態:即“運行態”,線程在運行中,線程擁有CPU使用權。在任一時刻,線程被創建后所處的狀態一定是四種狀態之一。1.3.2線程的四種狀態:終止態、阻塞態、就緒態和激活態第21頁共27頁RTOS2.線程狀態之間的轉換(了解)RTOS線程的四種狀態是動態轉換的

1)終止態轉為就緒態:線程重新被開始,根據線程優先級進入就緒態。2)阻塞態轉為就緒態:阻塞條件被解除。3)就緒態轉為激活態、終止態。就緒線程被調度而獲得CPU資源進入運行;也可以直接調用函數進入激活態。4)激活態轉為就緒態、阻塞態、終止態。5)激活態轉為就緒態、阻塞態。第22頁共27頁RTOS線程函數一般分為兩個部分:初始化部分和線程體部分初始化部分實現對變量的定義、初始化以及設備的打開等線程體部分負責完成該線程的基本功能。線程一般結構如下:voidthread_a(uint32_tinitial_data){

//初始化部分

//線程體部分}線程的基本形式:單次執行線程、周期執行線程和事件驅動線程。1.3.3線程的三種基本形式:單次執行、周期執行、資源驅動第23頁共27頁RTOS1.單次執行線程指在創建后只會被執行一次,執行完后就會被銷毀或阻塞的線程。如自動線程。voidthread_a(uint32_tinitial_data){//初始化部分//線程體部分//線程函數銷毀或阻塞}初始化:包括對變量的定義和賦值,打開需要使用的設備等等;線程函數的執行:該線程的基本功能實現;線程函數的銷毀或阻塞:即調用線程銷毀或者阻塞函數將自己從線程列表中刪除。第24頁共27頁RTOS2.周期執行線程指需要按照一定周期執行的線程,大部分線程如此,與NOS下main.c一致。voidthread_a(uint32_tinitial_data){//初始化部分……

//線程體部分while(1){ //循環體部分}}線程函數的執行是放在永久循環體中執行的。線程需要按照一定周期執行,執行完該線程之后可能需要調用延時函數wait將自己放入延時列表中,等時間到了之后重新進入就緒態。第25頁共27頁RTOS3.資源驅動線程資源:主要指信號量、事件等線程通信與同步中的方法。資源驅動線程是操作系統特有的線程類型。執行時間不確定,所要等待的資源可用時才轉入就緒態,否則會被加入到等待該資源的等待列表中。voidthread_a(uint32_tinitial_data)){//初始化部分……while(1){

//調用等待資源函數//線程體部分}}第26頁共27頁RTOS1.4本章小結在RTOS下編程與NOS下編程相比有顯著優點,這個優點就是有個調度者,指揮協調著各個線程的運行,這樣編程者可以把一個大工程分解成一個個小工程,交由RTOS管理,這符合軟件工程的基本原理。線程是RTOS中最重要概念之一。在RTOS下,把一個復雜的應用工程按一定規則分解成一個個功能清晰的小工程,然后設定各個小工程運行規則,交給RTOS管理,這就是基于RTOS編程的基本思想。這一個個小工程被稱為線程,RTOS管理這些線程,被稱為調度。線程可以分別從線程調度、軟件設計、占用CPU等不同視角來理解。調度就是以合理方式為每個線程分配時間,使之得以運行。一個函數只有在給出其線程描述符及線程堆棧的情況下,才可以被稱為線程,才能夠被調度運行。線程一般有四種狀態,分別為:終止態、阻塞態、就緒態和激活態。線程有三種基本形式,分別是單次執行、周期執行及資源驅動等形式。第27頁共27頁RTOS第2章RT-Thread第一個樣例工程本章導引:學習RTOS,首先要以一個芯片為基礎,按照“分門別類,各有歸處”的原則,從建立無操作系統開始,建立起RTOS的工程框架,讓幾個最簡單的線程“跑”起來。以此簡明理解線程被調度運行的基本過程,隨后就可以進行RTOS下程序設計的學習了。本章給出RT-Thread的工程框架及第一個樣例工程。2.1RT-Thread簡介RTOS第2章RT-Thread第一個樣例工程2.3第一個樣例工程2.4本章小結2.2軟硬件開發平臺第29頁共24頁RT-Thread(RealTime-Thread)是上海睿賽德電子科技有限公司于2006年開始推出的開源及社區化發展的一款實時操作系統,主要面向嵌入式人工智能與物聯網領域。RTOS2.1RT-Thread簡介(了解)2.1.1RT-Thread概述2.1.2RT-Thread的基本特點開源免費且有技術支持;淺顯易懂,方便移植;可裁剪性強;占用資源小(我們有4KB的RAM下運行案例)、功耗低。第30頁共24頁/download.html#download-rt-thread-nano如需更新工程內的RT-Thread的版本,本書附錄A(P222),給出了RT-Thread版本更新方法RTOS2.1.3下載與更新RT-Thread源碼

從2006年開始推出版本0.1.0后不斷升級和更新,本書用的是2017年后推出RT-ThreadNano精簡內核版,版本號是3.1.5。下載地址:第31頁共24頁RTOS2.2軟硬件開發平臺學習RTOS一定要以一個軟硬件開發平臺為藍本,學習共性技術,銜接個性,仿真達不到目的。本書的硬件開發平臺為:AHL-STM32L431(書中贈送)。軟件開發平臺為:金葫蘆集成開發環境AHL-GEC-IDE,對于本書例程,兼容ST的集成開發環境STM32CubeIDE。第32頁共24頁2.2.1網上電子資源RTOS網上電子資源內容索引文件夾主要內容01-Document文檔文件夾(AHL-STM32L431用戶手冊、參考等)02-Hardware硬件文件夾(硬件資源電子文檔)03-Software軟件文件夾(各章樣例源程序,按照章進行編號)04-Tool工具文件夾(編程實踐中可能使用的軟件工具)下載地址:https:///RTwThreadwARMjc/list.htm第33頁共24頁2.2.2硬件平臺:AHL-STM32L431RTOS1.為什么需要硬件平臺?1)嵌入式軟件開發有別于PC軟件開發的一個顯著的特點在于,它需要一個交叉編譯和調試環境,即工程的編輯和編譯所使用的軟件通常在PC上運行,而編譯生成的嵌入式軟件的機器碼文件則需要通過寫入工具下載到目標機上執行。2)“仿真”不真,無法達到實際學習目標。3)有硬件條件,當然好!(本書內直接夾帶)第34頁共24頁RTOS2.AHL-STM32L431開發板的引出腳3.AHL-STM32L431開發板的特點1)核心芯片。64引腳LQFP封裝的STM32L431RC芯片。內含256KBFlash(共有128個扇區)、64KBRAM,包含SysTick、GPIO、串口、A/D、D/A、I2C、SPI等模塊。2)硬件功能。由硬件最小系統、紅綠藍三色燈、觸摸按鍵、溫度傳感器、兩路TTL-USB串口等構成。3)Type-C接口。方便程序下載與printf輸出進行跟蹤調試。4)可擴展應用。不僅可以用于RT-Thread實時操作系統的學習,也通過板的引出腳,外接其他接口模塊進行創新性實驗與實踐。引出腳的含義參見附錄B(P222)第35頁共24頁2.2.3軟件平臺:金葫蘆集成開發環境RTOS1.AHL-GEC-IDEhttp:///AHLwGECwIDE/list.htm2.STM32CubeIDEhttps:///zh/development-tools/stm32cubeide.html#get-software蘇州大學嵌入式實驗室于2018年開始逐步推出的免費嵌入式集成開發環境,集成了GNU編譯器、匯編器等,具有編輯、編譯、程序下載、printf打樁調試等功能,為設計人員提供了一個簡捷易用的嵌入式開發工具。主要特點有:1)兼容常用開發環境;2)支持串口下載調試;3)具有外接軟件功能;4)包含豐富的常用工具;5)簡化工程配置;6)提供可擴展功能。該集成開發環境是適用于ST公司的MCU。本書提供的例程兼容AHL-GEC-IDE與STM32CubeIDE。第36頁共24頁2.3.1樣例程序功能2.3第一個樣例工程RTOS樣例程序的硬件是紅、綠、藍三色一體的發光極管(小燈),由三個GPIO引腳控制其亮暗。軟件控制紅、綠、藍各燈每5秒、10秒、20秒狀態變化,對外表現為三色燈的合成色,其實際效果如右圖所示。第37頁共24頁2.3.2工程框架設計原則RTOS所謂工程框架是指工程內文件夾的命名、文件的存放位置、文件內容的放置規則。軟件工程與一件建筑作品、一件畫作等是一致的,軟件工程框架是整個工程的脊梁,其主要線程不是完成一個單獨的模塊功能,而是指出工程應該包含哪些文件夾、這些文件夾里面應該放置什么文件、各個文件的內容又是如何定位等。因此,工程框架設計的基本原則應該是:分門別類,各有歸處,建立工程文件夾,并考慮隨后內容安排及內容定位,建立其下級子文件夾。第38頁共24頁2.3.3NOS工程框架RTOS1.NOS工程框架的樹形結構

文檔文件夾:文檔作為工密切相關部分,是軟件工程的基本要求CPU文件夾:存放CPU相關文件,由ARM提供給MCU廠家MCU文件夾:含有linker_file、startup、MCU_drivers下級文件夾GEC文件夾:引入通用嵌入式計算機(GEC)概念,預留該文件夾用戶板文件夾:含有硬件接線信息的User.h文件及應用驅動軟件構件文件夾:含有與硬件無關的軟件構件應用程序文件夾:應用程序主要在此處編程NOS工程框架樹型模板第39頁共24頁RTOS2.NOS樣例工程的main函數及isr函數線程線(main函數):程序通過判斷全局變量gSec來控制三色小燈的開關狀態,實現紅燈每5s閃爍一次,綠燈每10s閃爍一次,藍燈每20s閃爍一次,同時通過串口輸出開關信息。中斷線(isr.c中斷服務例程):當定時器到達定時時間1s時,會執行定時器中斷服務例程。在定時器中斷服務例程中,首先判斷是否是由TIMER_USER觸發的中斷,如果是,對變量gSec累加,最后清除中斷標志位。第40頁共24頁RTOS3.NOS樣例工程運行測試..\03-Software\CH02-First-Example\NOS編譯樣例工程,通過TTL-USB串口線連接調試串口與PC,進入AHL-GEC-IDE中的“下載”→“串口更新”,點擊“連接GEC”成功后,導入編譯出的.hex文件,點擊“一鍵自動更新”將程序下載到目標板上,可以觀察紅燈、藍燈和綠燈的閃爍情況,若與右圖所示一致,則正確。第41頁共24頁RTOS第42頁共24頁2.3.4RT-Thread工程框架RTOS

與NOS工程框架一致07_AppPrg文件夾:操作系統應用程序主要在此處編程RT-Thread工程框架樹型模板1.RT-Thread工程框架的樹形結構第43頁共24頁RTOS本工程框架是在NOS工程框架的基礎上修改了兩個文件夾:“05_UserBoard”、“07_AppPrg”,補充說明如下:05_UserBoard文件夾:增加了Os_Self_API.h、OS_United_API.h兩個頭文件。Os_Self_API.h給出了RT-Thread對外接口函數API,如事件、消息隊列、信號量、互斥量等有關函數,實際函數代碼駐留于BIOS中。Os_United_API.h給出了RTOS的統一對外接口API,目的是實現不同的RTOS應用程序可移植。07_AppPrg文件夾:是用戶自定義線程的函數體文件,其中threadauto_appinit.c是主線程文件,其他前綴名帶thread的都是用戶線程文件。第44頁共24頁RTOS2.RT-Thread的啟動在該樣例工程(..\CH02-First-Example\RT-Thread)中,先后共創建了5個線程,如下表所示:第45頁共24頁RTOS3.主線程的執行過程(1)主線程過程概述1)在主線程中依次創建藍燈線程、綠燈線程和紅燈線程,紅燈線程實現紅燈每5s閃爍一次,綠燈線程實現綠燈每10s閃爍一次,藍燈線程實現藍燈每20s閃爍一次,創建完這些用戶線程之后主線程被終止。2)此時,在就緒列表中剩下紅燈線程、綠燈線程、藍燈線程和空閑線程這四個線程。第46頁共24頁RTOS3)由于就緒列表優先級最高的第一個線程是thread_redlight,它優先得到激活運行。thread_redlight線程每隔5000ms控制一次紅燈的亮暗狀態,當thread_redlight線程調用系統服務delay_ms執行延時,調度系統暫時剝奪該線程對CPU的使用權,將該線程從就緒列表中移出,并將該線程的定時器放入延時列表中。4)thread_greenlight線程和thread_bluelight線程被系統依次調度執行,根據延時時長將線程從就緒列表中移出,并將線程的定時器放到延時列表中。5)當這三個線程的定時器都被放到延時列表時,就緒列表中只剩下空閑線程,此時空閑線程會得到運行。第47頁共24頁RTOS從工作原理角度來說,調度切換是基于每1ms(時鐘嘀嗒)的SysTick中斷,在SysTick中斷服務例程中,查看延時列表中的線程的定時器是否到期,若有線程的定時器到期,則將線程的定時器從延時列表移出,并將線程放到就緒列表中。同時,由于到期線程的優先級大于空閑線程的優先級,會搶占空閑線程CPU使用權,通過上下文切換激活,再次得到運行。這些工作屬于RTOS內核,應用層面只要了解即可。本樣例工程中,由于SysTick中斷相關程序屬于RT-Thread內核,被駐留于BIOS中,第9章直接運行源碼,可以看到SysTick中斷服務例程,這里先初略了解一下。第48頁共24頁RTOS(2)主線程源碼解析1)創建用戶線程。把函數變為線程。2)啟動用戶線程。放入就緒隊列。3)app_init函數代碼剖析。參見工程源碼。第49頁共24頁RTOS4.紅燈、綠燈、藍燈線程函數首先將小燈初始設置為暗,然后在while(1)的永久循環體內,通過delay_ms()函數實現延時,每隔指定的時間間隔切換燈的亮暗一次。delay_ms()延時操作并非停止其他操作的空跑等待,而是通過延時列表與線程定時器管理延時線程,從而實現對線程的延時。在延時期間,線程被放入到延時列表中,RTOS可以調度執行其他的線程。第50頁共24頁RTOS5.RT-Thread樣例工程運行測試第51頁共24頁RTOS2.4本章小結學習RTOS的第一要素就是實踐,在實踐中體會其基本機制。要進行實踐,必須有軟硬件基礎平臺,本章給出的硬件平臺AHL-STM32L431及軟件平臺AHL-GEC-IDE的介紹,可以滿足RTOS學習與實踐的基本要求,也可以方便地應用于實際產品開發。良好的工程組織是軟件工程的基本要求,也是可移植、可復用、可維護的保證。要按照“分門別類,各有歸處”的基本原則組織工程框架,且一級子文件夾不再變動,使得新增內容各有歸處,同時保證NOS下與RTOS下工程中一級子文件夾名稱相同,為實際應用開發提供了規范的標準模板。本章的實例只用到RTOS下的延時函數,但有三個線程在運行,可以體會到這里的延時函數與運行機器碼空延時不同,它讓出了CPU使用權,在延時期間,CPU可以執行其他線程,第10章將對這種延時方式做進一步分析。第52頁共24頁RTOS本章導引:對應用程序設計來說,RTOS是一種工具,是為應用程序服務的,它不該成為應用程序的負擔。而我們必須基本掌握這個工具的使用方法,才能使它為我們服務,否則它會成為負擔。本章詳細介紹中斷系統、時間嘀嗒、延時函數、調度策略、線程優先級和常用列表等RTOS下應用程序的基本要素,帶領大家掌握RTOS的使用方法。第3章RTOS下應用程序的基本要素3.2時間嘀嗒與延時函數3.1中斷基本概念及處理過程RTOS第3章RTOS下應用程序的基本要素3.3調度策略3.4RTOS中的列表3.5本章小結第54頁共22頁RTOS3.1中斷基本概念及處理過程RTOS下程序運行的兩條線路:線程線、中斷線線程線:可能有許多個線程,由內核調度運行中斷線:線程被某種中斷打斷后,轉去運行中斷服務程序ISR,隨后返回原處繼續運行第55頁共22頁RTOS3.1.1中斷基本概念1.中斷與異常的基本含義異常(exception)是CPU強行從正在執行的程序切換到由某些內部或外部條件所要求的處理線程上去,這些線程的緊急程度優先于CPU正在執行的線程。中斷(interrupt)是來自CPU外圍設備的強行線程切換請求。CPU對復位、中斷、異常具有同樣的處理過程,本書隨后在談及這個處理過程時統稱為中斷。第56頁共22頁RTOS2.中斷源、中斷服務程序、中斷向量號與中斷向量表可以引起CPU產生中斷的外部器件被稱為中斷源。CPU被中斷后轉去執行的程序,被稱為中斷服務程序(InterruptServiceRoutine,ISR)。一個CPU通常可以識別多個中斷源,給CPU能夠識別的每個中斷源編個號,就叫中斷向量號。把各個中斷服務程序的首地址放在一段連續的地址中,并且按照中斷向量號順序存放,這個連續存儲區被稱為中斷向量表。在ARMCortex-M微處理器中,還有一個非內核中斷請求(InterruptRequest,IRQ)的編號,稱為IRQ號。IRQ號將內核中斷與非內核中斷稍加區分,對于非內核中斷,IRQ中斷號從0開始遞增,而對于內核中斷,IRQ中斷號從-1開始遞減。第57頁共22頁RTOS3.中斷優先級、可屏蔽中斷和不可屏蔽中斷在進行CPU設計時,一般定義了中斷源的優先級。若CPU在程序執行過程中,有兩個以上中斷同時發生,則優先級最高的中斷得到最先響應。可屏蔽中斷是指可通過程序設置的方式決定不響應該中斷,即該中斷被屏蔽了;不可屏蔽中斷是指不能通過程序方式關閉的中斷。第58頁共22頁RTOS中斷處理的基本過程有:中斷請求、中斷采樣、中斷響應與中斷處理1.中斷請求當某一中斷源需要CPU為其服務時,它將會向CPU發出中斷請求信號(一種電信號)。中斷控制器獲取中斷源硬件設備的中斷向量號,并通過識別的中斷向量號,將對應硬件模塊的中斷狀態寄存器中的“中斷請求位”置位,以便讓CPU知道何種中斷請求來了。2.中斷采樣(檢測)(了解)在中斷周期中,CPU將會檢測系統中是否有中斷請求信號,若此時有中斷請求信號,則CPU將會暫停當前執行的線程,轉而去對中斷請求進行響應,若系統中沒有中斷請求信號則繼續執行當前線程。3.1.2中斷處理的基本過程(重點、難點)第59頁共22頁RTOS3.中斷響應與中斷處理中斷響應的過程是由系統自動完成的。在中斷的響應過程中,首先CPU會查找中斷源所對應的中斷模式是否允許產生中斷,若中斷模塊允許中斷,則響應該中斷請求,中斷響應的過程要求CPU保存當前環境的“上下文(context)”于棧中。通過中斷向量號找到中斷向量表中對應的中斷服務程序ISR的首地址,轉而去執行中斷服務程序ISR。第60頁共22頁RTOS4.ArmCortex-M微處理器中斷編程要點1)理解初始中斷向量表(轉源程序)2)確定對哪個中斷源編程3)宏定義中斷服務程序名4)編制中斷服務例程5)在RTOS下的中斷初始化第61頁共22頁RTOS時鐘嘀嗒(Timetick),是RTOS中時間的最小度量單位,是線程調度的基本時間單元。主要用于系統計時、線程調度等。要進行線程切換,至少等一個時間嘀嗒。時鐘嘀嗒由硬件定時器產生,一般以毫秒(ms)為單位。在RT-Thread中,由于ArmCortex-M內核中含有SysTick定時器,為了操作系統在芯片之間移植方便,時鐘嘀嗒由對SysTick定時器編程產生。3.2時間嘀嗒與延時函數3.2.1時間嘀嗒(重點)第62頁共22頁RTOS1.RTOS下延時函數的基本內涵在有操作系統的情況下,線程一般不采用原地空跑(空循環)的方式進行延時(該方式線程仍然占用CPU的使用權),而往往會使用到延時函數(該方式線程會讓出CPU使用權),通過使用延時列表管理延時線程,從而實現對線程的延時。在RT-Thread中,提供了一個延時函數rt_thread_delay,為了直觀與通用,在Os_United_API.h文件中將該函數宏定義為delay_ms。執行該函數時,將當前線程的定時器按其延時參數指示的時間插入到延時列表的相應位置,當延時時間到達時,線程進入就緒列表,等待RT-Thread調度運行。3.2.2延時函數第63頁共22頁RTOS2.使用RTOS下延時函數的注意點1)delay_ms只能用在對時間精度要求不高或者時間間隔較長的場合。延時時長參數以時鐘嘀嗒為單位,在RT-Thread中1個時鐘嘀嗒等于1ms,這樣對延時時長參數就可以理解為是以ms為單位,此時實際延時時間與希望延時時間相等。但如果1個時鐘嘀嗒大于1ms時,而對希望延時的時間精度有較高要求時(如延時時間不是時鐘嘀嗒的整數倍),由于內核是在每個時鐘嘀嗒到來時(即SysTick中斷)才會去檢查延時列表,此時實際延時時間與希望延時時間可能會有誤差,最壞情況下的誤差接近一個時鐘嘀嗒。所以,只能用在對時間精度要求不高或者時間間隔較長的場合。2)延時小于1個時鐘嘀嗒,不使用delay_ms函數。若需延時的時間小于1個時間時鐘嘀嗒,則不建議使用delay_ms函數,而是根據具體的延時時間,決定采用變量循環空跑(NOP指令)、插入匯編語言或探索其他更合理的方式來解決。第64頁共22頁RTOS調度是內核的主要職責之一,它決定將哪一個線程投入運行、何時投入運行以及運行多久,協調線程對系統資源的合理使用。調度是一種指揮方式,有策略問題。調度策略不同,線程被投入運行時刻也不同。常用的調度策略主要有:優先級搶占調度與時間片輪轉調度等。3.3調度策略3.3.1調度基礎知識(重點)第65頁共22頁RTOS1.優先級搶占調度優先級搶占調度總是讓就緒列表中優先級最高的線程先運行,對于優先級相同的線程,則采用先進先出(FirstInFirstOut,FIFO)的策略。在ARMCortex-M處理器中,中斷(異常)的優先級一般在MCU設計階段就確定了,優先級編號越小表示中斷(異常)的優先級越高,而且高優先級可以搶占低優先級的中斷(異常)。在RT-Thread中,通常使用32種優先級,數值分別為1~32,優先級數值越小,表示優先級越高。第66頁共22頁RTOS基于優先級先進先出調度策略在運行時可分為以下三種情況:第一種情況,線程B的優先級高于線程A,當線程A正在運行時,線程B準備就緒,則調度系統在下一個時間嘀嗒中斷發生的時候,會將CPU的使用權從線程A處搶奪,將其轉入就緒態,并分配CPU使用權給線程B。第二種情況,當線程A被阻塞后主動放棄CPU使用權,調度系統將在當前就緒的線程中尋找優先級最高的線程,將CPU的使用權分配給它。第三種情況,當存在同一優先級的多個線程都處于就緒態時,較早進入就緒態的線程優先獲得系統分配的一段固定時間片供其運行。第67頁共22頁RTOS2.時間片輪詢調度時間片輪轉(RoundRobin,RR)調度策略,也總是讓就緒列表中優先級最高的線程先運行,但是,對于優先級相同的線程,使用時間片輪轉方式,即相同優先級的線程相同時間片方式分享CPU時間。實際上,當采用RR調度時,不同優先級的線程是按照FIFO策略排列的;相同優先級的線程會才會采用時間片輪詢來調用。第68頁共22頁RTOS在RT-Thread中,采用基于優先級先進先出(FIFO)和時間片輪轉(RR)的綜合調度策略,該調度策略為:總是將CPU的使用權分配給當前就緒的、優先級最高的且是較先進入就緒態的線程,同一優先級的線程采用時間片輪轉的調度算法。每個輪詢線程有最長時間限制(時間片),在此時間片內該線程可以被激活。3.3.2RT-Thread中使用的調度策略(重點、難點)在RT-Thread中,調度策略是通過可掛起系統調用PendSV(PendableSupervisor,PendSV)中斷和定時器SysTick中斷來實現的。第69頁共22頁RTOS3.3.3RT-Thread中固有線程(重點)1.自啟動線程在內核啟動之前,需要創建一個自啟動線程,以便內核啟動后執行它,并由它來創建其他用戶線程。當自啟動線程被創建時,其狀態為就緒態,會自動被放入到就緒列表中。在RT-Thread中自啟動線程的優先級為10,在啟動過程中由自啟動線程來創建其他線程,因此它的優先級級必須要高于或等于其他用戶線程的優先級,這樣才能保證其他用戶線程被正常創建并運行。若自啟動線程優先級低于它所創建的用戶線程優先級,則一旦創建一個線程后,自啟動線程會被搶占,無法繼續創建其他線程。第70頁共22頁RTOS2.空閑線程為了確保在內核無用戶線程可執行的時候,CPU能繼續保持運行狀態,那么就必須安排一個空閑線程,該線程不完成任何實際工作,其狀態為就緒態,始終在就緒列表中。在RT-Thread中,空閑線程是在內核啟動的過程被創建的,其優先級為31,是所有線程中最低的。第71頁共22頁RTOSRTOS中要運行的線程大多先放入就緒列表,即就緒列表中的線程是即將運行的線程,隨時準備被調度運行。至于何時被允許運行,由內核調度策略決定。就緒列表中的線程,按照優先級高低順序及先進先出排列。當內核調度器確認哪個線程運行,則將該線程狀態標志由就緒態改為激活態,線程會從就緒列表取出被執行。3.4RTOS中的功能列表(重點)3.4.1就緒列表第72頁共22頁RTOS延時阻塞列表是按線程的延時時間長短的順序排列,線程進入延時列表后,存儲的延時時間與調用延時函數實參不同,存儲的延時時間=(延時函數實參-所有前面線程存儲時間之和)。當線程調用了延時函數,則該線程就會被放入到延時列表中,其狀態由激活態轉化為阻塞態。當延時時間到時,該線程狀態由阻塞態轉化為就緒態,線程將被從延時列表移出并放入到就緒列表中,線程狀態被設置為就緒態,等待調度執行。3.4.2延時阻塞列表第73頁共22頁RTOS當線程進行永久等待狀態或因等待事件位、消息、信號量、互斥量時,其狀態由激活態轉化為阻塞態,線程就會被放到阻塞列表中。當等待條件滿足時,該線程狀態由阻塞態轉化為就緒態,線程會從阻塞列表中移出而放入到就緒列表中,由RTOS進行調度執行。3.4.3條件阻塞列表為了方便對線程進行分類管理,在RTOS中會根據線程等待的事件位、消息、信號量、互斥量等條件,將線程放入對應的阻塞列表。根據線程等待的條件不同,阻塞列表又可分為事件阻塞列表、消息阻塞列表、信號量阻塞列表、互斥量阻塞列表。第74頁共22頁RTOS本章給出的RTOS下應用程序的基本要素主要是針對應用開發者,要理解RTOS下程序運行的基本流程,這些基本要素是必須掌握的。異常與中斷在程序設計中有著特殊作用,使用一個芯片編程,必須知道這個芯片在硬件上支持哪些異常與中斷,中斷條件是什么,在何處進行中斷服務例程的編程等。在RTOS中,時鐘嘀嗒是時間的最小度量單位,是線程調度的基本時間單元。

在RTOS中,延時函數具有讓出CPU使用權的功能,調用延時函數的線程將進入延時阻塞列表,時間到達后,內核將其從延時阻塞列表中移到就緒列表,被調度運行。

在RTOS中,調度是內核的主要職責之一,它決定將哪一個線程投入運行、何時投入運行以及運行多久。編程時,只要線程進入就緒列表,就認為該線程已經運行,何時運行就是調度者的事情了。RTOS的基本調度策略有:優先級搶占調度與時間片輪轉調度等。在RTOS中,使用就緒列表管理就緒的線程,使用延時阻塞列表管理延時等待的線程,使用阻塞列表管理因等待事件、消息等而阻塞的線程。3.5本章小結第75頁共22頁RTOS

本章導引:

在RTOS中,每個線程作為獨立的個體,接受內核調度器的調度運行。但是,線程之間不是完全不聯系的,其聯系的方式就是同步與通信。只有掌握同步與通信的編程方法,才能編寫出較為完整的程序,RTOS中主要的同步與通信手段有事件與消息隊列,它們是RTOS提供給應用編程的重要工具,這個內容是RTOS下進行應用程序開發需要重點掌握的內容之一。在多線程的工程中,還會涉及到對共享資源的排他使用問題,RTOS提供了信號量與互斥量來協調多線程下的共享資源的排他使用,它們也同步與通信范疇。本章給出事件、消息隊列、信號量及互斥量的含義、應用場合、操作函數以及編程舉例,第9章再簡明剖析其運行機制第4章同步與通信4.1RTOS中同步與通信基本概念RTOS4.2事件4.3消息隊列4.4信號量4.5互斥量第4章同步與通信的應用方法4.6本章小結第77頁共45頁RTOS4.1RTOS中同步與通信基本概念

在百米比賽起點,運動員正在等待發令槍響,一旦發令槍響,運動員立即起跑,這就是一種同步。當一個人采摘蘋果放入籃子中,另外一個人只要見到籃子中有蘋果,就取出加工,這也是一種同步。RTOS中也有類似的機制應用于線程之間,或者中斷服務例程與線程之間。第78頁共45頁RTOS4.1.1同步的含義與通信手段同步:為了實現各線程之間的合作和無沖突的運行,一個線程的運行過程就需要和其他線程進行配合,線程之間的配合過程稱為同步。線程間的同步過程通常是由某種條件來觸發的,所以同步也稱為條件同步。通信手段:為了實現線程之間的同步,RTOS提供了靈活多樣的通信手段,如事件、消息隊列、信號量、互斥量等等,它們適合不同的場合。第79頁共45頁RTOS

1.從是否需要通信數據的角度看1)如果只發同步信號,不需要數據,可使用事件、信號量、互斥量。同步信號為多個信號的邏輯運算結果時,一般使用事件作為同步手段。2)如果既有同步功能,又能傳輸數據,可使用消息隊列。2.從產生與使用數據速度的角度看

若產生數據的速度快于處理速度,就會有未處理的數據堆積,這種情況下只能使用有緩沖功能的通信手段,如消息隊列。但是,產生數據的速度總平均應該慢于處理速度,否則消息隊列會溢出。第80頁共45頁RTOS4.1.2同步類型(難點)在RTOS中,有中斷與線程之間的同步、兩個線程之間的同步、兩個以上線程同步一個線程、多個線程相互同步等同步類型。1.中斷和線程之間的同步一般是中斷服務例程發出同步信號,處于阻塞狀態的線程等著這個信號。一旦這個信號發出,處于阻塞狀態的線程就會從阻塞狀態變為就緒狀態,接受RTOS內核的調度。2.兩個線程之間的同步兩個線程之間的同步分為單向同步(用得多)和雙向同步(實現產銷平衡)。第81頁共45頁RTOS3

.兩個以上線程同步+一個線程(了解)當需要由兩個以上線程來同步一個線程時,簡單的通信方式難以實現,可采用事件按“邏輯與”來實現,此時被同步線程的執行次數不超過各個同步線程中發出信號最少的線程的執行次數。4

.多個線程相互同步(了解)多個線程相互同步可以將若干相關線程的運行頻度保持一致,每個相關線程在運行到同步點時都必須等待其他線程,只有全部相關線程都到達同步點,才可以按優先級順序依次離開同步點,從而達到相關線程的運行頻度保持一致的目的。第82頁共45頁RTOS4.2.1事件的含義及應用場合4.2事件

事件:當某個線程需要等待另一線程(或中斷)的信號才能繼續工作,這個信號被稱為事件。若需要將兩個及兩個以上的信號進行某種邏輯運算,用邏輯運算的結果作為同步控制信號時,也是事件。

應用場合:事件可以實現一個線程(或中斷服務例程)控制另一個線程,多個信號也可以進行邏輯運算后形成一個事件。事件發出后,等待事件的線程將從阻塞狀態變為就緒狀態。第83頁共45頁RTOS4.2.2事件的常用函數1.創建事件函數(event_create)第84頁共45頁RTOS2.獲取事件函數event_recv()第85頁共45頁RTOS3.發送事件函數event_send()第86頁共45頁4.2.3事件編程舉例:通過事件實現中斷和線程通信1.事件樣例程序的功能事件編程實例見“..\03-Software\CH04-Syn-Comm\Event-ISR”文件夾。該工程給出了利用事件進行中斷與線程同步的實例,其功能為:1)用戶串口中斷為收到一個字節產生中斷,在“isr.c”文件的中斷服務例程UART_User_Handler中,進行接收組幀;2)當串口接收到一個完整的數據幀(幀頭3A+四位數據+幀尾0D0A),發送一個事件(起名為紅燈事件);3)在紅燈線程中,有等待紅燈事件的語句,沒有紅燈事件時,該線程進入阻塞隊列,一旦有紅燈事件發生,運行隨后的程序,紅燈狀態反轉。第87頁共45頁RTOS2.準備階段1)聲明事件字全局變量并創建事件字。在使用事件之前,首先在07_AppPrg文件夾下的工程總頭文件(includes.h文件)中聲明一個事件字全局變量g_EventWord。2)確定要用的事件名稱、使用事件字的哪一位。在樣例工程總頭文件includes.h的“全局使用的宏常數”處3)創建事件字實例。在threadauto_appinit.c文件app_init函數中創建。

第88頁共47頁RTOS

3.應用階段1)等待事件位置位:這一步是在等待事件觸發的線程中進行的,使用event_recv函數。2)設置事件位:這一步是在觸發事件的線程中進行的(也可以在中斷服務例程中進行),在線程的相應位置使用event_send函數對事件位置位,用來表示某個特定事件發生。例:event_send(g_EventWord,RED_LIGHT_EVENT);//設置紅燈事件4.樣例程序源碼(參見“..\03-Software\CH04-Syn-Comm\Event-ISR”),轉入實例分析。第89頁共45頁RTOS4.3.1消息隊列的含義以及應用場合4.3消息隊列

消息(Message):是一種線程間數據傳送的單位,它可以是只包含文本的字符串或數字,也可以更復雜,如結構體類型等,所以相比使用事件時傳遞的少量數據(1位或1個字),消息則可以傳遞更多、更復雜的數據,它的傳送通過消息隊列實現。

消息隊列(MessageQueue):是在消息傳輸過程中保存消息的一種容器,是將消息從它的源頭發送到目的地的中轉站,它是能夠實現線程之間同步和大量數據交換的一種隊列機制。第90頁共45頁RTOS消息隊列作為具有行為同步和緩沖功能的數據通信手段,主要適用于以下兩個場合:第一,消息的產生周期較短,消息的處理周期較長;第二,消息的產生是隨機的,消息的處理速度與消息內容有關,某些消息的處理時間有可能較長。這兩種情況均可把產生與處理分在兩個程序主體進行編程,它們之間通過消息隊列通信。第91頁共45頁RTOS4.3.2消息隊列的常用函數1.創建消息隊列變量函數(mq_create)第92頁共45頁RTOS第93頁共45頁2.發送消息函數(mq_send)RTOS3.獲取消息函數(mq_recv)第94頁共45頁RTOS4.3.3消息隊列的編程實例:通過消息隊列實現中斷和線程通信1.消息隊列樣例程序功能消息隊列編程實例見“..\03-Software\CH04-Syn-Comm\MessageQueue”文件夾。該工程給出如何利用消息隊列中斷服務例程與線程之間傳遞消息,其功能為:1)用戶串口中斷為收到一個字節產生中斷,在“isr.c”文件的中斷服務例程UART_User_Handler中,進行接收組幀;2)當串口接收到一個完整的數據幀,發送一個消息,每個消息就是數據幀中的8字節數據。每個消息的字節數是在創建消息隊列時確定的,且為定長。3)在等待消息的線程(thread_message_recv)中,有等待消息的語句,若消息隊列中沒有消息,該線程進入阻塞隊列,一旦有消息隊列中有消息,運行隨后的程序,通過串口打印出消息,以及消息隊列中剩余消息的個數。第95頁共45頁RTOS4.3.3消息隊列的編程實例2.準備階段1)聲明消息隊列全局變量。在使用消息隊列之前,首先在07_AppPrg文件夾下的工程總頭文件(includes.h文件)中聲明一個全局消息變量g_mq。2)創建消息隊列實例。在threadauto_appinit.c文件的app_init函數中創建消息隊列實例,實參為:消息變量名字為g_mq,每個消息8個字節,最大消息個數4個。第96頁共45頁RTOS3.應用階段:1)等待消息。即通過mq_recv函數獲取消息隊列中存放的消息。例如在本節樣例程序中,thread_messagerecv.c文件中,在mq_recv函數處等待消息隊列中有消息時才會繼續往下運行。2)發送消息(將消息放入消息隊列)。通過mq_send函數將消息放入消息隊列中,若消息隊列中存放的消息數已滿,則會直接舍棄該條消息。例:mq_send(g_mq,recv_data,sizeof(recv_data));4.樣例程序源碼代碼詳見:..\03-Software\CH04-Syn-Comm\MessageQueue,轉入實例分析。第97頁共45頁RTOS運行結果1)當發送一幀消息時,串口輸出消息的內容第98頁共45頁RTOS運行結果2)當發送多于5個消息時,溢出的部分會被舍棄第99頁共47頁RTOS4.4.1信號量的含義與應用場合4.4信號量

信號量(Semaphore):信號量的概念最初是由荷蘭計算機科學家艾茲格·迪杰斯特拉(EdsgerW.Dijkstra)提出的,廣泛應用于不同的操作系統中。維基百科()對信號量的定義如下:信號量是一個提供信號的非負整型變量,以確保在并行計算環境中,不同線程在訪問共享資源時,不會發生沖突。第100頁共45頁RTOS

可以把信號量看做實際生活中的停車位,定義的信號量個數就是停車位的個數,車子(線程)想要進行停車操作必須要申請(wait)到可用的停車位,停車位滿了就只能等待(對應線程阻塞),而一旦有車輛離開(release),停車位就會加一。

正是信號量這種有序的特性,使得信號量在計算機中有著較多的應用場合,如實現線程之間的有序操作;實現線程之間的互斥執行,使信號量個數為1,對臨界區加鎖,保證同一時刻只有一個線程在訪問臨界區;為了實現更好的性能而控制線程的并發數等等。第101頁共45頁RTOS4.4.2信號量的常用函數1.創建信號量變量函數(sem_create)第102頁共45頁RTOS2.等待獲取信號量函數第103頁共45頁RTOS3.釋放信號量函數(sem_release)第104頁共45頁RTOS4.4.3信號量的編程舉例:通過信號量來實現車輛的有序進場停車1.信號量樣例程序的功能事件編程實例見“..\03-Software\CH04-Syn-Comm\Semaphore”文件夾。該工程給出了利用事件進行中斷與線程同步的實例,其功能為:1)該工程以三輛車進只有兩個停車位的停車場為例,空車位對應于信號量,只有信號量>0,車輛才能進場,車輛空位>0,車輛可以進場停車,車輛空位減1;2)車輛出來時,車輛空位加1,對應于信號量的獲取與釋放。

3)模擬程序設計的功能是車子1進場停車20秒,車子2進場停車10秒,車子3進場停車5秒,可以看到需要等待進場的情況。第105頁共45頁RTOS4.4.3信號量的編程舉例2.準備階段1)聲明信號量全局變量。在使用信號量之前,首先在07_AppPrg文件夾下的工程總頭文件(includes.h文件)中聲明一個信號量全局變量g_sp。2)創建信號量實例。在threadauto_appinit.c的app_init函數中創建信號量第106頁共45頁RTOS3.應用階段1)等待信號量。在線程訪問資源前,通過sem_take函數等待信號量;若無可用信號量時,則線程進入信號量阻塞列表,等待可用信號量。例:sem_take(g_sp,WAITING_FOREVER);//等待信號量2)釋放信號量。在線程使用完資源后,通過sem_release函數釋放信號量。例:sem_release(g_sp);//釋放信號4.樣例程序源碼(參見..\03-Software\CH04-Syn-Comm\Semaphore..),轉入實例分析。第107頁共45頁RTOS程序執行分析流程(重點):每當有車輛進入停車場直到車輛離開,會輸出車輛對空閑車位(信號量)的使用過程以及線程的狀態。車輛到達停車場先請求空閑停車位(信號量),如果當前空閑車位(信號量)個數為0,即無空閑車位(信號量),則會輸出當前車輛等待空閑車位(信號量)的提示;當車輛申請到空閑車位(信號量),則輸出剩余空閑車位(信號量)的個數;車輛離開停車場釋放空閑車位(信號量),并輸出提示以釋放車位(信號量)。在車輛獲取空閑車位(信號量)時和車輛駛離停車場釋放空閑車位(信號量)時,增加了當前空閑車位(信號量)數量的判斷,有空閑車位綠燈亮表示允許停車,無空閑車位紅燈亮表示禁止停車。第108頁共45頁RTOS運行結果第109頁共45頁RTOS4.5.1互斥量的含義和應用場合4.5互斥量

互斥量(Mutex,也稱為互斥鎖):是一種用于保護操作系統中的臨界區(或是共享資源)基本的同步工具之一。它能夠保證任何時刻只有一個線程能夠操作臨界區,從而實現線程間同步。互斥量的操作只有加鎖和解鎖兩種,每個線程都可以對一個互斥量進行加鎖和解鎖操作,必須按照先加鎖再解鎖的順序進行操作。一旦某個線程對互斥量上鎖,在它對互斥量進行解鎖操作之前,任何線程都無法再對該互斥量進行上鎖,是一個獨占資源的行為。第110頁共45頁RTOS在一個計算機系統中,有很多受限的資源,如串行通信接口、讀卡器和打印機等硬件資源以及公用全局變量、隊列和數據等軟件資源。以使用串口通信為例,下面是兩個線程間不使用互斥和使用互斥的情況。在不使用互斥的情況下,由于操作系統時間片輪轉機制,線程A和線程B交替執行,會導致發送的內容混亂,無法得到正確的結果。第111頁共47頁RTOS4.5.2互斥量的常用函數1.創建互斥量變量函數(mutex_create)第112頁共45頁RTOS2.獲取互斥量函數(mutex_take)

第113頁共45頁RTOS3.互斥量釋放函數(mutex_release)第114頁共45頁RTOS4.5.3互斥量的編程舉例:實現對互斥資源的獨占訪問1.互斥量樣例程序的功能事件編程實例見“..\03-Software\CH04-Syn-Comm\Mutex-3LED”。該工程給出了通過互斥量來實現線程對資源的獨占訪問的實例,其功能為:樣例工程實現紅燈線程每5s閃爍一次、綠燈線程每10s閃爍一次和綠燈線程每20s閃爍一次。在2.3節的樣例工程中紅燈線程、藍燈線程和綠燈線程有時會同時亮的情況(出現混合顏色),而本工程通過單色燈互斥量使得每一時刻只有一個燈亮,不出現混合顏色情況。第115頁共45頁RTOS4.5.3互斥量的編程舉例2.準備階段

1)聲明互斥量全局變量。在includes.h中定義互斥量。G_VAR_PREFIXmutex_tmutex;2)創建互斥量實例。在app_init函數中初始化互斥量。g_mutex=mutex_create("g_mutex",IPC_FLAG_PRIO);//初始化互斥量變量第116頁共45頁RTOS3.應用階段1)鎖定互斥量。在線程訪問獨占資源前,通過mutex_take函數鎖定互斥量,以獲取其使用權;若此時獨占資源已被其他線程鎖定,則線程進入該互斥量的等待列表,等待鎖定此資源的線程解鎖該互斥量。2)解鎖互斥量。在線程使用完獨占資源后,通過mutex_release()函數解鎖互斥量,釋放對獨占資源的使用權,以便其他線程能夠使用獨占資源。例:mutex_release(mutex);4.樣例程序源碼(參見“..\03-Software\CH04-Syn-Comm\Mutex-3LED”),轉入實例分析。第117頁共45頁RTOS程序流程執行分析(重點):

紅燈線程調用mutex_take函數申請鎖定單色燈互斥量成功,互斥鎖為1,紅燈線程切換亮暗。任何此時訪問紅燈線程的請求都將被拒絕。當紅燈線程鎖定單色燈互斥量時,藍燈線程和綠燈線程申請鎖定單色燈互斥量均失敗,會被放到互斥量阻塞列表中,直到紅燈線程解鎖單色燈互斥量之后,才會從互斥量阻塞列表中移出,獲得單色燈互斥量,然后進行燈的亮暗切換。由于單色燈互斥量是由紅燈線程鎖定的,因此紅燈線程能成功解鎖它。5s后,紅燈線程解鎖單色燈互斥量,解鎖后互斥鎖為0,并進入等待狀態。此時單色燈互斥量會從互斥量列表移出,并轉移給正在等待單色燈互斥量的綠燈線程。第118頁共45頁RTOS

綠燈線程變為單色燈互斥量所有者,就表示綠燈線程成功鎖定單色燈互斥量,互斥鎖變為1,同時切換綠燈亮暗。10s后,綠燈線程解鎖單色燈互斥量,互斥鎖再次變為0,此時仍處于等待狀態的藍燈線程成為單色燈互斥量所有者。20s后,藍燈

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論