嵌入式系統(tǒng)原理及應(yīng)用-基于STM32和RT-Thread 課件 第7、8章 RTT嵌入式操作系統(tǒng)基礎(chǔ)、線程管理_第1頁
嵌入式系統(tǒng)原理及應(yīng)用-基于STM32和RT-Thread 課件 第7、8章 RTT嵌入式操作系統(tǒng)基礎(chǔ)、線程管理_第2頁
嵌入式系統(tǒng)原理及應(yīng)用-基于STM32和RT-Thread 課件 第7、8章 RTT嵌入式操作系統(tǒng)基礎(chǔ)、線程管理_第3頁
嵌入式系統(tǒng)原理及應(yīng)用-基于STM32和RT-Thread 課件 第7、8章 RTT嵌入式操作系統(tǒng)基礎(chǔ)、線程管理_第4頁
嵌入式系統(tǒng)原理及應(yīng)用-基于STM32和RT-Thread 課件 第7、8章 RTT嵌入式操作系統(tǒng)基礎(chǔ)、線程管理_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

嵌入式系統(tǒng)原理及應(yīng)用第7章RTT操作系統(tǒng)基礎(chǔ)1RTT架構(gòu)2RTT開發(fā)環(huán)境搭建3RTT內(nèi)核基礎(chǔ)45課后作業(yè)本章總結(jié)RTT簡介RTT系統(tǒng)架構(gòu)7.1RTT架構(gòu)本節(jié)小結(jié)7.1.1RTT簡介一、操作系統(tǒng)操作系統(tǒng)是管理和控制計算機硬件和軟件的計算機程序,是直接運行在計算機上的最基本的系統(tǒng)軟件。嵌入式操作系統(tǒng)(EmbeddedOperatingSystem,簡稱:EOS)是用于嵌入式系統(tǒng)的操作系統(tǒng),負(fù)責(zé)嵌入式系統(tǒng)的軟、硬件資源分配、任務(wù)調(diào)度、同步通信等,通常包括底層驅(qū)動程序、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議、圖形界面等。7.1.1RTT簡介操作系統(tǒng)桌面操作系統(tǒng)服務(wù)器操作系統(tǒng)移動操作系統(tǒng)嵌入式操作系統(tǒng)Windows,Linux,MacOSLinux,WindowsAndroid,iOSRT-Thread,AliOSThings,HuaweiLiteOS,TencentOStiny,嵌入式Linux,uC/OS,F(xiàn)reeRTOS7.1.1RTT簡介7.1.1RTT簡介二、RTT操作系統(tǒng)RT-Thread,全稱是RealTime-Thread,是一個嵌入式實時多線程操作系統(tǒng),基本屬性之一是支持多任務(wù),允許多個任務(wù)同時運行,但并不意味著處理器在同一時刻真地執(zhí)行了多個任務(wù)。RT-Thread是一個物聯(lián)網(wǎng)操作系統(tǒng)。物聯(lián)網(wǎng)操作系統(tǒng)是指以操作系統(tǒng)內(nèi)核(可以是RTOS、Linux等)為基礎(chǔ),包括如文件系統(tǒng)、圖形庫等較為完整的中間件組件,具備低功耗、安全、通信協(xié)議支持和云端連接能力的軟件平臺。7.1.2RTT系統(tǒng)架構(gòu)不僅僅是一個實時內(nèi)核,還具備豐富的中間層組件。1.內(nèi)核層內(nèi)核層包括RT-Thread內(nèi)核和libcpu/BSP兩部分,其中RT-Thread內(nèi)核是RTT的核心部分,用于實現(xiàn)多線程及其調(diào)度、信號量、郵箱、消息隊列、內(nèi)存管理、定時器等,libcpu/BSP是芯片移植相關(guān)文件和板級支持包,由外設(shè)驅(qū)動和CPU移植構(gòu)成,與底層硬件密切相關(guān)。7.1.2RTT系統(tǒng)架構(gòu)2.組件服務(wù)層組件服務(wù)層采用模塊化設(shè)計,包括設(shè)備框架、低功耗管理、FinSH控制臺、Wifi管理器、USB協(xié)議棧、DFS虛擬文件系統(tǒng)、網(wǎng)絡(luò)架構(gòu)、異常處理、鍵值數(shù)據(jù)庫等組件模塊,各組件模塊高內(nèi)聚、低耦合,是RT-Thread內(nèi)核之上的上層軟件模塊。7.1.2RTT系統(tǒng)架構(gòu)3.軟件包軟件包是運行于RTT物聯(lián)網(wǎng)操作系統(tǒng)平臺上,面向不同應(yīng)用領(lǐng)域的通用軟件組件,由描述信息、源代碼、庫文件組成。RTT提供了開放的軟件包平臺,存放了大量官方提供或開發(fā)者提供的軟件包,這些軟件包具有很強的可重用性,極大地方便了開發(fā)者在最短時間內(nèi),完成應(yīng)用開發(fā),是RTT生態(tài)的重要組成部分。截止目前,RTT提供的軟件包已超多400個,軟件包下載量將近800萬,RTT對軟件包進行了分類管理。7.1.2RTT系統(tǒng)架構(gòu)本節(jié)小結(jié)了解嵌入式操作系統(tǒng);理解物聯(lián)網(wǎng)操作系統(tǒng)及RTT系統(tǒng)架構(gòu);查閱相關(guān)資料,了解國產(chǎn)操作系統(tǒng)發(fā)展歷史,面臨的困局。下載安裝軟件測試7.2RTT開發(fā)環(huán)境搭建本節(jié)小結(jié)7.2.1下載安裝RTT支持RT-ThreadStudio、ARM-MDK、IAR等主流開發(fā)工具開發(fā),其中RT-ThreadStudio是睿賽德為RTT量身定做的免費集成開發(fā)環(huán)境,目前已支持STM32全系列芯片。本書采用RT-ThreadStudio進行RTT開發(fā)。RT-ThreadStudio可從RTT官網(wǎng)下載(/page/download.html),下載完成后雙擊安裝程序即可開始安裝,注意安裝路徑不能包含中文。安裝完成后可雙擊打卡軟件,首次打開需要聯(lián)網(wǎng)注冊或登錄(已注冊過)。7.2.2軟件測試1.創(chuàng)建工程2.編譯工程3.下載程序4.觀察運行結(jié)果本節(jié)小結(jié)熟練搭建RTT開發(fā)環(huán)境內(nèi)核簡介RTT啟動流程7.3RTT內(nèi)核基礎(chǔ)內(nèi)核對象模型程序內(nèi)存分布自動初始化機制本節(jié)小結(jié)7.3.1內(nèi)核簡介內(nèi)核位于內(nèi)核層,是操作系統(tǒng)最基礎(chǔ)最重要的部分,RTT內(nèi)核架構(gòu)如圖所示,內(nèi)核包括內(nèi)核庫和實時內(nèi)核。7.3.1內(nèi)核簡介1.內(nèi)核庫內(nèi)核庫是為了保證內(nèi)核能夠獨立運行的一套小型的類似C庫的函數(shù)實現(xiàn)子集。C庫也叫C運行庫(CRuntimeLibrary),提供了“strcpy”、“memcpy”、“printf”、“scanf”等函數(shù)。根據(jù)編譯器的不同自帶C庫的情況也會有些不同,當(dāng)使用GNUGCC編譯器時,會攜帶更多的標(biāo)準(zhǔn)C庫函數(shù)。RTT內(nèi)核庫僅提供內(nèi)核用到的一小部分C庫函數(shù),為了避免與標(biāo)準(zhǔn)C庫函數(shù)重名,在這些函數(shù)都會加上rt_前綴,如rt_kprintf。7.3.1內(nèi)核簡介2.實時內(nèi)核實時內(nèi)核主要實現(xiàn)對象管理、線程管理及調(diào)度器、線程間通信管理、時鐘管理及內(nèi)存管理等。(1)線程調(diào)度線程是RTT操作系統(tǒng)中最小的調(diào)度單位,RTT不限制線程數(shù)量的多少,線程數(shù)量只和硬件平臺的內(nèi)存相關(guān)。RTT線程調(diào)度算法是基于優(yōu)先級的全搶占式多線程調(diào)度算法,即在系統(tǒng)中除了中斷處理函數(shù)、調(diào)度器上鎖部分的代碼和禁止中斷的代碼是不可搶占的,其它部分都是可以搶占的,包括線程調(diào)度器自身。7.3.1內(nèi)核簡介2.實時內(nèi)核(1)線程調(diào)度與中斷一樣,線程也具有優(yōu)先級,RTT支持256個線程優(yōu)先級,也可通過配置文件更改為最大支持32個或8個線程優(yōu)先級。對于STM32,RTT默認(rèn)配置是32個線程優(yōu)先級,0代表最高優(yōu)先級,31代表最低優(yōu)先級,最低優(yōu)先級留給空閑線程使用。RTT支持創(chuàng)建多個具有相同優(yōu)先級的線程,采用時間片輪轉(zhuǎn)調(diào)度算法調(diào)度優(yōu)先級相同的線程,使得優(yōu)先級相同的線程運行相應(yīng)的時間。7.3.1內(nèi)核簡介2.實時內(nèi)核(2)線程間同步與線程間通信線程間同步用于控制線程的執(zhí)行順序,RTT提供了信號量、互斥量和事件集三種方式用于實現(xiàn)線程間同步。線程間通信用于實現(xiàn)不同線程間的信息傳遞,RTT提供了郵箱、消息隊列和事件三種方式用于實現(xiàn)線程間通信。7.3.1內(nèi)核簡介2.實時內(nèi)核(3)時鐘管理操作系統(tǒng)通過時間規(guī)范任務(wù)的執(zhí)行,操作系統(tǒng)中時間的最小單位是時鐘節(jié)拍,時鐘節(jié)拍是特定的周期性中斷(系統(tǒng)心跳),中斷之間的時間間隔取決于不同的應(yīng)用,一般是1ms~100ms,時鐘節(jié)拍越快,系統(tǒng)的實時響應(yīng)越快,系統(tǒng)的額外開銷也越大。7.3.1內(nèi)核簡介2.實時內(nèi)核(3)時鐘管理時鐘節(jié)拍由配置為中斷觸發(fā)模式的硬件定時器產(chǎn)生,定時器中斷發(fā)生時將調(diào)用一次超時函數(shù)(定時器回調(diào)函數(shù)),通知操作系統(tǒng)已經(jīng)過去一個系統(tǒng)時鐘。RTT提供兩類定時器:一類是單次觸發(fā)定時器,在啟動后只會觸發(fā)一次定時器事件,然后定時器自動停止;另一類是周期觸發(fā)定時器,啟動后會周期性的觸發(fā)定時器事件,直到用戶手動的停止定時器。RTT默認(rèn)采用SysTick定時器產(chǎn)生時鐘節(jié)拍,用戶也可根據(jù)實時性要求選擇合適類型的定時器。7.3.1內(nèi)核簡介2.實時內(nèi)核(4)內(nèi)存管理在計算系統(tǒng)中,存儲空間一般分為內(nèi)部存儲空間和外部存儲空間。內(nèi)部存儲空間即RAM(隨機存儲器),訪問速度較快,能夠按照變量地址隨機訪問,可以把內(nèi)部存儲空間理解為電腦的內(nèi)存。外部存儲空間即ROM(只讀存儲器),其保存的內(nèi)容相對比較固定,即使掉電后數(shù)據(jù)也不會丟失,可以把它理解為電腦的硬盤。7.3.1內(nèi)核簡介2.實時內(nèi)核(4)內(nèi)存管理變量、中間數(shù)據(jù)一般存放在RAM中,只有在實際使用時才將它們從RAM調(diào)入到CPU中進行運算。有些數(shù)據(jù)需要的內(nèi)存大小需要在程序運行過程中根據(jù)實際情況確定,這就要求系統(tǒng)具有對內(nèi)存空間進行動態(tài)管理的能力,在需要一段內(nèi)存空間時,向系統(tǒng)申請,系統(tǒng)選擇一段合適的內(nèi)存空間分配給用戶,用戶使用完畢后,再釋放回系統(tǒng),以便系統(tǒng)將該段內(nèi)存空間回收再利用。7.3.1內(nèi)核簡介2.實時內(nèi)核(4)內(nèi)存管理RTT內(nèi)存管理支持靜態(tài)內(nèi)存池管理及動態(tài)內(nèi)存堆管理。靜態(tài)內(nèi)存池管理是有可用空間時,系統(tǒng)對內(nèi)存塊分配的時間將是恒定的,當(dāng)靜態(tài)內(nèi)存池?zé)o空間時,系統(tǒng)將申請內(nèi)存塊的線程掛起或阻塞掉,當(dāng)其他線程釋放內(nèi)存塊到內(nèi)存池時,如果有掛起的線程等待待分配內(nèi)存塊,則系統(tǒng)將喚醒該線程進行內(nèi)存分配。7.3.1內(nèi)核簡介2.實時內(nèi)核(4)內(nèi)存管理RTT內(nèi)存管理支持靜態(tài)內(nèi)存池管理及動態(tài)內(nèi)存堆管理。動態(tài)內(nèi)存堆管理在系統(tǒng)資源不同的情況下,分別提供了面向小內(nèi)存系統(tǒng)的內(nèi)存管理算法和面向大內(nèi)存系統(tǒng)的內(nèi)存管理算法,還提供了memheap動態(tài)內(nèi)存堆管理方法,可以將含有多個地址且不連續(xù)的內(nèi)存堆“粘貼”在一起,讓用戶操作起來像是在操作一個內(nèi)存堆。7.3.1內(nèi)核簡介2.實時內(nèi)核(5)IO設(shè)備管理RTT將PIN、I2C、SPI、USB、UART等作為外設(shè)設(shè)備,統(tǒng)一通過設(shè)備注冊完成。實現(xiàn)了按名稱訪問的設(shè)備管理子系統(tǒng),可按照統(tǒng)一的API界面訪問硬件設(shè)備。在設(shè)備驅(qū)動接口上,根據(jù)嵌入式系統(tǒng)的特點,對不同的設(shè)備可以掛接相應(yīng)的事件。當(dāng)設(shè)備事件觸發(fā)時,由驅(qū)動程序通知給上層的應(yīng)用程序。7.3.2RTT啟動流程啟動流程是了解一個系統(tǒng)的開始,RTT支持多種平臺和多種編譯器,而rtthread_startup函數(shù)是RTT規(guī)定的統(tǒng)一啟動入口,其執(zhí)行順序是:系統(tǒng)先從啟動文件開始運行,然后進入RTT啟動函數(shù)rtthread_startup,最后進入用戶入口函數(shù)main。7.3.2RTT啟動流程7.3.2RTT啟動流程以RT-ThreadStudio為例,用戶程序入口為位于main.c文件中的main函數(shù)。系統(tǒng)啟動后先運行startup_stm32f103xe.s文件中的匯編代碼,運行“blentry”指令后跳轉(zhuǎn)到components.c文件中調(diào)用entry函數(shù),進而調(diào)用rtthread_startup函數(shù),進行RT-Thread系統(tǒng)啟動。在運行rtthread_startup函數(shù)時調(diào)用rt_application_init函數(shù),創(chuàng)建并啟動main線程,等調(diào)度器工作后進入mian.c文件中運行main函數(shù),完成系統(tǒng)啟動。7.3.2RTT啟動流程7.3.2RTT啟動流程7.3.2RTT啟動流程7.3.2RTT啟動流程7.3.3程序內(nèi)存分布MCU包含F(xiàn)LASH和RAM兩類存儲空間。RT-ThreadStudio將程序編譯后分為text、data和bss三個程序段,分別存儲在MCU不同的存儲區(qū)。程序段存儲內(nèi)容所在存儲區(qū)備注text代碼、中斷向量表、初始化的局部變量、局部常量FlashFlash=text+dataRAM=data+bssdata初始化的全局變量、全局或局部靜態(tài)變量RAMbss所有未初始化的數(shù)據(jù)RAM7.3.3程序內(nèi)存分布7.3.4自動初始化機制自動初始化機制是指初始化函數(shù)在系統(tǒng)啟動過程中被自動調(diào)用,需要在函數(shù)定義處通過宏定義的方式進行自動初始化申明,無需顯式調(diào)用。代碼最后的INIT_BOARD_EXPORT(xxx_init)表示使用自動初始化功能,xxx_init函數(shù)在系統(tǒng)初始化時會被自動調(diào)用。intxxx_init(void){......return0;}INIT_BOARD_EXPORT(xxx_init);7.3.4自動初始化機制RTT的自動初始化機制使用了自定義實時接口符號段,將需要在啟動時進行初始化的函數(shù)指針放到了該段中,形成一張初始化函數(shù)表,在系統(tǒng)啟動過程中遍歷該表,并調(diào)用表中的函數(shù),達到自動初始化的目的。初始化順序宏接口描述1INIT_BOARD_EXPORT(fn)非常早期的初始化,此時調(diào)度器還未啟動2INIT_PREV_EXPORT(fn)主要是用于純軟件的初始化、沒有太多依賴的函數(shù)3INIT_DEVICE_EXPORT(fn)外設(shè)驅(qū)動初始化相關(guān),比如網(wǎng)卡設(shè)備4INIT_COMPONENT_EXPORT(fn)組件初始化,比如文件系統(tǒng)或者LWIP5INIT_ENV_EXPORT(fn)系統(tǒng)環(huán)境初始化,比如掛載文件系統(tǒng)6INIT_APP_EXPORT(fn)應(yīng)用初始化,比如GUI應(yīng)用7.3.5內(nèi)核對象模型1.靜態(tài)對象和動態(tài)對象RT-Thread內(nèi)核采用面向?qū)ο蟮脑O(shè)計思想進行設(shè)計,系統(tǒng)級的基礎(chǔ)設(shè)施都是一種內(nèi)核對象,例如線程,信號量,互斥量,定時器等。內(nèi)核對象分為兩類:靜態(tài)內(nèi)核對象和動態(tài)內(nèi)核對象,靜態(tài)內(nèi)核對象,在程序中初始化;動態(tài)內(nèi)核對象則是從內(nèi)存堆中創(chuàng)建的。靜態(tài)對象會占用RAM空間,不依賴于內(nèi)存堆管理器,內(nèi)存分配時間確定,運行效率高。動態(tài)對象不占用額外的RAM空間,依賴于內(nèi)存堆管理器,運行時申請RAM空間,當(dāng)對象被刪除后,占用的RAM空間被釋放,運行效率較低。7.3.5內(nèi)核對象模型2.內(nèi)核對象管理架構(gòu)RT-Thread采用內(nèi)核對象管理系統(tǒng)來訪問/管理所有內(nèi)核對象,內(nèi)核對象包含了內(nèi)核中絕大部分設(shè)施,這些內(nèi)核對象可以是靜態(tài)分配的靜態(tài)對象,也可以是從系統(tǒng)內(nèi)存堆中分配的動態(tài)對象。通過這種內(nèi)核對象的設(shè)計方式,RT-Thread做到了不依賴于具體的內(nèi)存分配方式,系統(tǒng)的靈活性得到極大的提高。RT-Thread內(nèi)核對象包括:線程,信號量,互斥量,事件,郵箱,消息隊列和定時器,內(nèi)存池,設(shè)備驅(qū)動等。對象容器中包含了每類內(nèi)核對象的信息,包括對象類型,大小等。對象容器給每類內(nèi)核對象分配了一個鏈表,所有的內(nèi)核對象都被鏈接到該鏈表上。7.3.5內(nèi)核對象模型2.內(nèi)核對象管理架構(gòu)7.3.5內(nèi)核對象模型2.內(nèi)核對象管理架構(gòu)structrt_object{/*內(nèi)核對象名稱*/charname[RT_NAME_MAX];/*內(nèi)核對象類型*/rt_uint8_ttype;/*內(nèi)核對象的參數(shù)*/rt_uint8_tflag;/*內(nèi)核對象管理鏈表*/rt_list_tlist;};7.3.5內(nèi)核對象模型3.內(nèi)核對象管理方式一類對象由一個rt_object_information結(jié)構(gòu)體來管理,每一個這類對象的具體實例都通過鏈表的形式掛接在object_list上。而這一類對象的內(nèi)存塊尺寸由object_size標(biāo)識出來(每一類對象的具體實例,他們占有的內(nèi)存塊大小都是相同的)。structrt_object_information{/*對象類型*/enumrt_object_class_typetype;/*對象鏈表*/rt_list_tobject_list;/*對象大小*/rt_size_tobject_size;};7.3.5內(nèi)核對象模型4.內(nèi)核對象操作初始化對象:rt_object_init脫離對象:rt_object_detach分配對象:rt_object_allocate刪除對象:rt_object_delete辨別對象:rt_object_is_systemobject本節(jié)小結(jié)1.了解RTT內(nèi)核;2.掌握RTT啟動流程;3.了解程序內(nèi)存分布和自動初始化機制;4.理解內(nèi)核對象模型。7.4本章總結(jié)7.5課后作業(yè)1.繪制本章內(nèi)容思維導(dǎo)圖。2.搭建RTT開發(fā)環(huán)境,并分析RTT啟動流程。謝謝欣賞THEEND嵌入式系統(tǒng)原理及應(yīng)用第8章線程管理1線程基本概念2線程工作機制3線程應(yīng)用方法及實例45課后作業(yè)本章總結(jié)線程概念線程管理方式及特點8.1線程基本概念本節(jié)小結(jié)8.1.1線程概念模塊化編程是嵌入式系統(tǒng)設(shè)計的基本思想之一,通常將一個大的任務(wù)分解為多個簡單易解決的小任務(wù)。線程是任務(wù)的實現(xiàn)載體,是RTT操作系統(tǒng)中最基本的調(diào)度單位。8.1.2線程管理方式及特點線程管理的主要功能是對線程進行管理和調(diào)度,以實現(xiàn)不同線程的快速切換,達到多線程同時運行的目的,實際上同一時刻MCU只能運行一個線程。8.1.2線程管理方式及特點線程調(diào)度由線程調(diào)度器完成,RT-Thread的線程調(diào)度器是搶占式:保證最高優(yōu)先級的線程優(yōu)先運行。(1)無線程運行時,從就緒線程列表中查找最高優(yōu)先級線程運行。(2)低優(yōu)先級線程使高優(yōu)先級的線程滿足運行條件,當(dāng)前線程停止運行,高優(yōu)先級的線程運行。(3)中斷服務(wù)程序使高優(yōu)先級的線程滿足運行條件,中斷完成時,被中斷的線程掛起,高優(yōu)先級線程運行。線程切換時,調(diào)度器先將當(dāng)前線程上下文信息保存,當(dāng)再切回到這個線程時,調(diào)度器將該線程的上下文信息恢復(fù)。本節(jié)小結(jié)理解線程的概念;理解線程管理方式及特點。線程控制塊線程重要屬性8.2線程工作機制系統(tǒng)線程本節(jié)小結(jié)8.2.1線程控制塊線程控制塊是操作系統(tǒng)用于管理線程的一個數(shù)據(jù)結(jié)構(gòu),存放了線程的優(yōu)先級、線程名稱、線程狀態(tài)、鏈表結(jié)構(gòu)、線程等待事件集合等信息,在RT-Thread中,線程控制塊由結(jié)構(gòu)體structrt_thread表示,指向線程控制塊的指針稱為線程句柄,用rt_thread_t表示。8.2.1線程控制塊structrt_thread{/*rtobject*/charname[RT_NAME_MAX];/*線程名稱*/

rt_uint8_ttype;/*對象類型*/

rt_uint8_tflags;/*標(biāo)志位*/

rt_list_tlist;/*對象鏈表*/

rt_list_ttlist;/*線程鏈表*/

/*stackpointandentry*/void*sp;/*棧指針*/

void*entry;/*線程入口函數(shù)指針*/

void*parameter;/*線程參數(shù)*/

void*stack_addr;/*棧地址*/

rt_uint32_tstack_size;/*棧大小*/

/*errorcode*/rt_err_terror;/*錯誤代碼*/

rt_uint8_tstat;/*線程狀態(tài)*/

/*priority*/rt_uint8_tcurrent_priority;/*線程當(dāng)先優(yōu)先級*/

rt_uint8_tinit_priority;/*線程初始化優(yōu)先級*/

rt_ubase_tinit_tick;/*線程初始化計數(shù)值*/

rt_ubase_tremaining_tick;/*剩余計數(shù)值*/

structrt_timerthread_timer;/*內(nèi)置定時器*/

void(*cleanup)(structrt_thread*tid);/*線程退出清除函數(shù)*/

rt_ubase_tuser_data;/*用戶數(shù)據(jù)*/};typedefstructrt_thread*rt_thread_t;線程控制塊線程句柄結(jié)構(gòu)體:structrt_threadtid1;=“tid1”結(jié)構(gòu)體指針:rt_thread_ttid2;tid2->name=“tid2”;8.2.2線程重要屬性1.線程名稱線程名稱即線程的名字,由用戶命名,命名規(guī)則遵循C語言變量命名規(guī)則,通常以字母開頭,線程名稱的最大長度由rtconfig.h中的宏RT_NAME_MAX指定,多余部分會被自動截掉,默認(rèn)長度為8位。2.線程入口函數(shù)線程入口函數(shù)是線程實現(xiàn)預(yù)期功能的函數(shù),線程的入口函數(shù)由用戶設(shè)計實現(xiàn),有無限循環(huán)和順序執(zhí)行或有限次循環(huán)兩種模式,在創(chuàng)建線程或初始化線程時可以傳入?yún)?shù)。8.2.2線程重要屬性2.線程入口函數(shù)無限循環(huán)模式voidthread_entry(void*paramenter){while(1){/*等待事件的發(fā)生*//*對事件進行服務(wù)、進行處理*/}}順序執(zhí)行或有限次循環(huán)模式staticvoidthread_entry(void*parameter){/*處理事務(wù)#1*/…/*處理事務(wù)#2*/…/*處理事務(wù)#3*/}注意:調(diào)用延時函數(shù)或者主動掛起。注意:簡單的順序語句、dowhlie()或for()循環(huán)8.2.2線程重要屬性3.線程棧RT-Thread線程具有獨立的棧,當(dāng)進行線程切換時,會將當(dāng)前線程的上下文信息保存在棧中,當(dāng)線程恢復(fù)運行時,再從棧中讀取上下文信息,進行恢復(fù)。線程棧大小可根據(jù)實際情況設(shè)定,對于資源相對較大的MCU,可以適當(dāng)設(shè)計較大的線程棧,對于資源較小的MUC可以在初始時設(shè)置較大的棧,如1K或2K字節(jié),然后在FinSH中用list_thread命令查看線程運行過程中使用棧的大小,加上適當(dāng)?shù)挠嗔啃纬勺罱K的線程棧大小。8.2.2線程重要屬性4.線程優(yōu)先級線程的優(yōu)先級表示線程被調(diào)度的優(yōu)先程度,每個線程都具有優(yōu)先級,應(yīng)給重要的線程賦予較高的優(yōu)先級,增大其被調(diào)度的可能。對于ARMCortex-M系列,普遍采用32個優(yōu)先級。最低優(yōu)先級默認(rèn)分配給空閑線程(31),用戶一般不使用。在系統(tǒng)中,當(dāng)有比當(dāng)前線程優(yōu)先級更高的線程就緒時,當(dāng)前線程將立刻被換出,高優(yōu)先級線程搶占處理器運行。8.2.2線程重要屬性5.時間片當(dāng)線程優(yōu)先級相同時,時間片才起作用,系統(tǒng)對優(yōu)先級相同的就緒態(tài)線程采用時間片輪轉(zhuǎn)算法進行調(diào)度,即線程輪轉(zhuǎn)執(zhí)行相應(yīng)個系統(tǒng)節(jié)拍(1ms)。8.2.2線程重要屬性6.線程狀態(tài)對于單核MCU,同一時刻只允許運行一個線程,操作系統(tǒng)會自動根據(jù)線程運行的情況動態(tài)地調(diào)整線程狀態(tài)。RT-Thread中線程共有五種狀態(tài)。8.2.2線程重要屬性6.線程狀態(tài)對于單核MCU,同一時刻只允許運行一個線程,操作系統(tǒng)會自動根據(jù)線程運行的情況動態(tài)地調(diào)整線程狀態(tài)。RT-Thread中線程共有五種狀態(tài)。初始狀態(tài)關(guān)閉狀態(tài)就緒狀態(tài)運行狀態(tài)掛起狀態(tài)創(chuàng)建啟動獲取資源得不到或者延時獲取到資源,或者延時時間到自然結(jié)束強制結(jié)束(一般不用)8.2.2線程重要屬性6.線程狀態(tài)調(diào)用函數(shù)rt_thread_create/init創(chuàng)建/初始化的線程處于初始態(tài);初始態(tài)線程調(diào)用函rt_thread_startup進入就緒態(tài);就緒態(tài)線程被調(diào)度器調(diào)度后進入運行態(tài);處于運行狀態(tài)的線程調(diào)用rt_thread_delay,rt_sem_take,rt_mutex_take,rt_mb_recv等函數(shù)或者獲取不到資源時,將進入掛起態(tài);處于掛起態(tài)的線程等待超時依然未能獲得資源或由于其它線程釋放了資源,將返回就緒態(tài)。掛起態(tài)的線程調(diào)用rt_thread_delete/detach函數(shù),將轉(zhuǎn)換為關(guān)閉態(tài);運行態(tài)的線程運行結(jié)束時,會在線程的最后部分執(zhí)行函數(shù)rt_thread_exit,將狀態(tài)改為關(guān)閉態(tài)。8.2.2線程重要屬性7.錯誤代碼/*線程錯誤代碼*/#defineRT_EOK0/*無錯誤*/#defineRT_ERROR1/*普通錯誤*/#defineRT_ETIMEOUT2/*超時*/#defineRT_EFULL3/*資源已滿*/#defineRT_EEMPTY4/*無資源*/#defineRT_ENOMEM5/*無內(nèi)存*/#defineRT_ENOSYS6/*系統(tǒng)不支持*/#defineRT_EBUSY7/*系統(tǒng)忙*/#defineRT_EIO8/*IO錯誤*/#defineRT_EINTR9/*中斷系統(tǒng)調(diào)用*/#defineRT_EINVAL10/*非法參數(shù)*/8

溫馨提示

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

最新文檔

評論

0/150

提交評論