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

下載本文檔

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

文檔簡(jiǎn)介

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

rt_uint8_ttype;/*對(duì)象類型*/

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

rt_list_tlist;/*對(duì)象鏈表*/

rt_list_ttlist;/*線程鏈表*/

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

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

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

void*stack_addr;/*棧地址*/

rt_uint32_tstack_size;/*棧大小*/

/*errorcode*/rt_err_terror;/*錯(cuò)誤代碼*/

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論