C語言實(shí)現(xiàn)判斷素?cái)?shù)">例16:C語言實(shí)現(xiàn)判斷素?cái)?shù)
2181
2022-05-30
電子與嵌入式系統(tǒng)設(shè)計(jì)叢書
FreeRTOS內(nèi)核實(shí)現(xiàn)與應(yīng)用開發(fā)實(shí)戰(zhàn)指南:
基于STM32
劉火良 楊 森 編著
前 言
如何學(xué)習(xí)本書
本書系統(tǒng)講解FreeRTOS,共分為兩個(gè)部分。第一部分重點(diǎn)講解FreeRTOS的原理實(shí)現(xiàn),從0開始,不斷迭代,教你把FreeRTOS的內(nèi)核寫出來,讓你徹底學(xué)會任務(wù)是如何定義的、系統(tǒng)是如何調(diào)度的(包括底層的匯編代碼講解)、多優(yōu)先級是如何實(shí)現(xiàn)的等操作系統(tǒng)最深層次的知識。當(dāng)你拿到本書開始學(xué)習(xí)的時(shí)候,你一定會驚訝,原來RTOS(Real Time Operating System,實(shí)時(shí)操作系統(tǒng))的學(xué)習(xí)并沒有那么復(fù)雜,反而是那么有趣,原來自己也可以寫RTOS,成就感瞬間爆棚。
當(dāng)徹底掌握第一部分的知識之后,再學(xué)習(xí)其他RTOS,可以說十分輕松。縱觀現(xiàn)在市面上流行的幾種RTOS,它們的內(nèi)核實(shí)現(xiàn)差異不大,只需要深入研究其中一種即可,沒有必要對每一種RTOS都深入地研究源碼。但如果時(shí)間允許,看一看也并無壞處。第二部分重點(diǎn)講解FreeRTOS的移植、內(nèi)核中每個(gè)組件的應(yīng)用,比起第一部分,這部分內(nèi)容掌握起來應(yīng)該比較容易。
全書內(nèi)容循序漸進(jìn),不斷迭代,尤其在第一部分,前一章多是后一章的基礎(chǔ),建議從頭開始閱讀,不要進(jìn)行跳躍式閱讀。在學(xué)習(xí)時(shí)務(wù)必做到兩點(diǎn):一是不能一味地看書,要把代碼和書本結(jié)合起來學(xué)習(xí),一邊看書,一邊調(diào)試代碼。如何調(diào)試代碼呢?即單步執(zhí)行每一條程序,看程序的執(zhí)行流程和執(zhí)行的效果與自己所想的是否一致。二是在每學(xué)完一章之后,必須將配套的例程重寫一遍(切記不要復(fù)制,哪怕是一個(gè)分號。但可以照書錄入),做到舉一反三,確保真正理解。在自己寫的時(shí)候肯定會錯漏百出,要認(rèn)真糾錯,好好調(diào)試,這是你提高編程能力的最好機(jī)會。記住,編寫程序不是一氣呵成的,而是要一步一步地調(diào)試。
本書的編寫風(fēng)格
本書第一部分以FreeRTOS V9.0.0官方源碼為藍(lán)本,抽絲剝繭,不斷迭代,教你如何從0開始把FreeRTOS內(nèi)核寫出來。書中涉及的數(shù)據(jù)類型、變量名稱、函數(shù)名稱、文件名稱、文件存放的位置都完全按照FreeRTOS官方的方式來實(shí)現(xiàn)。學(xué)完這本書之后,你可以無縫地切換到原版的FreeRTOS中使用。要注意的是,在實(shí)現(xiàn)的過程中,某些函數(shù)中會去掉一些形參和冗余的代碼,只保留核心的功能,但這并不會影響學(xué)習(xí)。
本書第二部分主要介紹FreeRTOS的移植和內(nèi)核組件的使用,不會再去深入講解源碼,而是著重講解如何應(yīng)用,如果對第一部分不感興趣,可以跳過第一部分,直接進(jìn)入第二部分的學(xué)習(xí)。
本書還有姊妹篇—《RT-Thread內(nèi)核實(shí)現(xiàn)與應(yīng)用開發(fā)實(shí)戰(zhàn)指南:基于STM32》,兩本書的編寫風(fēng)格、內(nèi)容框架和章節(jié)命名與排序基本一致,語言闡述類似,且涉及RTOS抽象層的理論部分也相同,不同之處在于RTOS的實(shí)現(xiàn)原理、內(nèi)核源碼的講解和上層API的使用,這些內(nèi)容才是重點(diǎn)部分,是讀者學(xué)習(xí)的核心。例如,雖然兩本書的第一部分的章節(jié)名稱基本類似,但內(nèi)容不同,因?yàn)獒槍Φ腞TOS不一樣。其中,關(guān)于新建FreeRTOS工程和裸機(jī)系統(tǒng)與多任務(wù)(線程)系統(tǒng)的描述屬于RTOS抽象層的理論部分,不具體針對某個(gè)RTOS,所以基本一樣。第二部分中,對于什么是任務(wù)(線程)、阻塞延時(shí)和信號量的應(yīng)用等RTOS抽象層的理論講解也基本類似,但是具體涉及這兩個(gè)RTOS的原理實(shí)現(xiàn)和代碼講解時(shí)則完全不同。
如果讀者已經(jīng)學(xué)習(xí)了其中一本書,再學(xué)習(xí)另外一本的話,那么涉及RTOS抽象層的理論部分可跳過,只需要把精力放在RTOS內(nèi)核的實(shí)現(xiàn)和源碼API的應(yīng)用方面。因?yàn)楝F(xiàn)有的RTOS在理論層基本都是相通的,但在具體的代碼實(shí)現(xiàn)上各有特點(diǎn),所以可以用這兩本書進(jìn)行互補(bǔ)學(xué)習(xí),掌握了其中一本書的知識,再學(xué)習(xí)另外一本書定會得心應(yīng)手,事半功倍。
本書的參考資料及配套硬件
關(guān)于本書的參考資料和配套硬件的信息,請參考本書附錄部分。
本書的技術(shù)論壇
如果在學(xué)習(xí)過程中遇到問題,可以到野火電子論壇www.firebbs.cn發(fā)帖交流,開源共享,共同進(jìn)步。
引 言
為什么要學(xué)習(xí)RTOS
當(dāng)我們進(jìn)入嵌入式這個(gè)領(lǐng)域時(shí),首先接觸的往往是單片機(jī)編程,單片機(jī)編程又首選51單片機(jī)來入門。這里面說的單片機(jī)編程通常都是指裸機(jī)編程,即不加入任何RTOS的編程。常用的RTOS有國外的FreeRTOS、μC/OS、RTX和國內(nèi)的FreeRTOS、Huawei LiteOS和AliOS-Things等,其中,開源且免費(fèi)的FreeRTOS的市場占有率最高。
在裸機(jī)系統(tǒng)中,所有的程序基本都是自己寫的,所有的操作都是在一個(gè)無限的大循環(huán)中實(shí)現(xiàn)。現(xiàn)實(shí)生活中的很多中小型電子產(chǎn)品中用的都是裸機(jī)系統(tǒng),而且能夠滿足需求。但是為什么還要學(xué)習(xí)RTOS編程,要涉及一個(gè)操作系統(tǒng)呢?一是因?yàn)轫?xiàng)目需求,隨著產(chǎn)品要實(shí)現(xiàn)的功能越來越多,單純的裸機(jī)系統(tǒng)已經(jīng)不能完美地解決問題,反而會使編程變得更加復(fù)雜,如果想降低編程的難度,可以考慮引入RTOS實(shí)現(xiàn)多任務(wù)管理,這是使用RTOS的最大優(yōu)勢;二是出于學(xué)習(xí)的需要,必須學(xué)習(xí)更高級的技術(shù),實(shí)現(xiàn)更好的職業(yè)規(guī)劃,為將來能有更好的職業(yè)發(fā)展做準(zhǔn)備,而不是一味拘泥于裸機(jī)編程。作為一個(gè)合格的嵌入式軟件工程師,學(xué)習(xí)是永遠(yuǎn)不能停歇的,時(shí)刻都得為將來做準(zhǔn)備。書到用時(shí)方恨少,希望當(dāng)機(jī)會來臨時(shí),你不要有這種感覺。
為了幫大家厘清RTOS編程的思路,本書會在第3章簡單地分析這兩種編程方式的區(qū)別,我們將這個(gè)區(qū)別稱為“學(xué)習(xí)RTOS的命門”,只要掌握這一關(guān)鍵內(nèi)容,以后的RTOS學(xué)習(xí)可以說是易如反掌。在講解這兩種編程方式的區(qū)別時(shí),我們主要講解方法論,不會涉及具體的代碼,即主要還是通過偽代碼來講解。
如何學(xué)習(xí)RTOS
裸機(jī)編程和RTOS編程的風(fēng)格有些不一樣,而且有很多人說學(xué)習(xí)RTOS很難,這就導(dǎo)致想要學(xué)習(xí)的人一聽到RTOS編程就在心里忌憚三分,結(jié)果就是“出師未捷身先死”。
那么到底如何學(xué)習(xí)RTOS呢?最簡單的方法就是在別人移植好的系統(tǒng)上,先看看RTOS中API的使用說明,然后調(diào)用這些API實(shí)現(xiàn)自己想要的功能,完全不用關(guān)心底層的移植,這是最簡單、快速的入門方法。這種方法有利有弊。如果是做產(chǎn)品,好處是可以快速地實(shí)現(xiàn)功能,將產(chǎn)品推向市場,贏得先機(jī);弊端是當(dāng)程序出現(xiàn)問題時(shí),因?qū)TOS不夠了解,會導(dǎo)致調(diào)試?yán)щy。如果想系統(tǒng)地學(xué)習(xí)RTOS,那么只會簡單地調(diào)用API是不可取的,我們應(yīng)該深入學(xué)習(xí)其中一款RTOS。
目前市場上的RTOS,其內(nèi)核實(shí)現(xiàn)方式差異不大,我們只需要深入學(xué)習(xí)其中一款即可。萬變不離其宗,只要掌握了一款RTOS,以后換到其他型號的RTOS,使用起來自然也是得心應(yīng)手。那么如何深入地學(xué)習(xí)一款RTOS呢?這里有一個(gè)非常有效但也十分難的方法,就是閱讀RTOS的源碼,深入研究內(nèi)核和每個(gè)組件的實(shí)現(xiàn)方式。這個(gè)過程枯燥且痛苦。但為了能夠?qū)W到RTOS的精華,還是很值得一試的。
市面上雖然有一些講解相關(guān)RTOS源碼的圖書,但如果基礎(chǔ)知識掌握得不夠,且先前沒有使用過該款RTOS,那么只看源碼還是會非常枯燥,并且不能從全局掌握整個(gè)RTOS的構(gòu)成和實(shí)現(xiàn)。
現(xiàn)在,我們采用一種全新的方法來教大家學(xué)習(xí)一款RTOS,既不是單純地介紹其中的API如何使用,也不是單純地拿里面的源碼一句句地講解,而是從0開始,層層疊加,不斷完善,教大家如何把一個(gè)RTOS從0到1寫出來,讓你在每一個(gè)階段都能享受到成功的喜悅。在這個(gè)RTOS實(shí)現(xiàn)的過程中,只需要具備C語言基礎(chǔ)即可,然后就是跟著本書篤定前行,最后定有所成。
選擇什么RTOS
用來教學(xué)的RTOS,我們不會完全從頭寫一個(gè),而是選取目前國內(nèi)外市場占有率很高的FreeRTOS為藍(lán)本,將其抽絲剝繭,從0到1寫出來。在實(shí)現(xiàn)的過程中,數(shù)據(jù)類型、變量名、函數(shù)名稱、文件類型等都完全按照FreeRTOS里面的寫法,不會再重新命名。這樣學(xué)完本書之后,就可以無縫地過渡到FreeRTOS了。
目 錄
前 言
引 言
第一部分 從0到1教你寫FreeRTOS內(nèi)核
第1章 初識FreeRTOS? 2
1.1 FreeRTOS版權(quán)? 2
1.2 FreeRTOS收費(fèi)問題? 2
1.2.1 FreeRTOS? 2
1.2.2 OpenRTOS? 2
1.2.3 SaveRTOS? 3
1.3 FreeRTOS資料獲取? 3
1.3.1 獲取源碼? 3
1.3.2 獲取書籍? 4
1.3.3 快速入門? 4
1.4 FreeRTOS的編程風(fēng)格? 5
1.4.1 數(shù)據(jù)類型? 5
1.4.2 變量名? 6
1.4.3 函數(shù)名? 6
1.4.4 宏? 7
1.4.5 格式? 7
第2章 新建FreeRTOS工程—軟件仿真? 8
2.1 新建本地工程文件夾? 8
2.2 使用KEIL新建工程? 8
2.2.1 New Project? 9
2.2.2 Select Device for Target? 9
2.2.3 Manage Run-Time Environment? 10
2.3 在KEIL工程中新建文件組? 11
2.4 在KEIL工程中添加文件? 11
2.5 調(diào)試配置? 13
2.5.1 設(shè)置軟件仿真? 13
2.5.2 修改時(shí)鐘大小? 13
2.5.3 添加頭文件路徑? 13
第3章 裸機(jī)系統(tǒng)與多任務(wù)系統(tǒng)? 15
3.1 裸機(jī)系統(tǒng)? 15
3.1.1 輪詢系統(tǒng)? 15
3.1.2 前后臺系統(tǒng)? 16
3.2 多任務(wù)系統(tǒng)? 17
第4章 數(shù)據(jù)結(jié)構(gòu)—列表與列表項(xiàng)? 20
4.1 C語言鏈表? 20
4.1.1 單向鏈表? 20
4.1.2 雙向鏈表? 22
4.1.3 鏈表與數(shù)組的對比? 22
4.2 FreeRTOS中鏈表的實(shí)現(xiàn)? 23
4.2.1 實(shí)現(xiàn)鏈表節(jié)點(diǎn)? 23
4.2.2 實(shí)現(xiàn)鏈表根節(jié)點(diǎn)? 25
4.3 鏈表節(jié)點(diǎn)插入實(shí)驗(yàn)? 31
4.4 實(shí)驗(yàn)現(xiàn)象? 34
第5章 任務(wù)的定義與任務(wù)切換? 35
5.1 本章目標(biāo)? 35
5.2 什么是任務(wù)? 36
5.3 創(chuàng)建任務(wù)? 37
5.3.1 定義任務(wù)棧? 37
5.3.2 定義任務(wù)函數(shù)? 38
5.3.3 定義任務(wù)控制塊? 39
5.3.4 實(shí)現(xiàn)任務(wù)創(chuàng)建函數(shù)? 40
5.4 實(shí)現(xiàn)就緒列表? 45
5.4.1 定義就緒列表? 45
5.4.2 就緒列表初始化? 45
5.4.3 將任務(wù)插入就緒列表? 46
5.5 實(shí)現(xiàn)調(diào)度器? 49
5.5.1 啟動調(diào)度器? 49
5.5.2 任務(wù)切換? 54
5.6 main()函數(shù)? 58
5.7 實(shí)驗(yàn)現(xiàn)象? 61
5.8 本章涉及的匯編指令? 64
第6章 臨界段的保護(hù)? 65
6.1 什么是臨界段? 65
6.2 Cortex-M內(nèi)核快速關(guān)中斷指令? 65
6.3 關(guān)中斷? 66
6.3.1 不帶返回值的關(guān)中斷函數(shù)? 66
6.3.2 帶返回值的關(guān)中斷函數(shù)? 67
6.4 開中斷? 67
6.5 進(jìn)入/退出臨界段的宏? 68
6.5.1 進(jìn)入臨界段? 68
6.5.2 退出臨界段? 69
6.6 臨界段代碼的應(yīng)用? 70
6.7 實(shí)驗(yàn)現(xiàn)象? 71
第7章 空閑任務(wù)與阻塞延時(shí)? 72
7.1 實(shí)現(xiàn)空閑任務(wù)? 72
7.1.1 定義空閑任務(wù)的棧? 72
7.1.2 定義空閑任務(wù)的任務(wù)控制塊? 73
7.1.3 創(chuàng)建空閑任務(wù)? 73
7.2 實(shí)現(xiàn)阻塞延時(shí)? 74
7.2.1 vTaskDelay()函數(shù)? 74
7.2.2 修改vTaskSwitchContext()函數(shù)? 75
7.3 SysTick中斷服務(wù)函數(shù)? 77
7.4 SysTick初始化函數(shù)? 78
7.5 main()函數(shù)? 80
7.6 實(shí)驗(yàn)現(xiàn)象? 83
第8章 多優(yōu)先級? 84
8.1 支持多優(yōu)先級的方法? 84
8.2 查找最高優(yōu)先級的就緒任務(wù)相關(guān)代碼? 85
8.2.1 通用方法? 87
8.2.2 優(yōu)化方法? 87
8.3 修改代碼以支持多優(yōu)先級? 89
8.3.1 修改任務(wù)控制塊? 89
8.3.2 修改xTaskCreateStatic()函數(shù)? 89
8.3.3 修改vTaskStartScheduler()函數(shù)? 93
8.3.4 修改vTaskDelay()函數(shù)? 94
8.3.5 修改vTaskSwitchContext()函數(shù)? 95
8.3.6 修改xTaskIncrementTick()函數(shù)? 96
8.4 main()函數(shù)? 97
8.5 實(shí)驗(yàn)現(xiàn)象? 100
第9章 任務(wù)延時(shí)列表? 102
9.1 任務(wù)延時(shí)列表的工作原理? 102
9.2 實(shí)現(xiàn)任務(wù)延時(shí)列表? 103
9.2.1 定義任務(wù)延時(shí)列表? 103
9.2.2 任務(wù)延時(shí)列表初始化? 103
9.2.3 定義xNextTaskUnblock-Time? 103
9.2.4 初始化xNextTaskUnblock-Time? 104
9.3 修改代碼以支持任務(wù)延時(shí)列表? 104
9.3.1 修改vTaskDelay()函數(shù)? 105
9.3.2 修改xTaskIncrementTick()函數(shù)? 107
9.3.3 修改taskRESET_READY_PRIORITY()函數(shù)? 109
9.4 main()函數(shù)? 110
9.5 實(shí)驗(yàn)現(xiàn)象? 110
第10章 時(shí)間片? 111
10.1 時(shí)間片測試實(shí)驗(yàn)? 111
10.2 main.c文件? 112
10.3 實(shí)驗(yàn)現(xiàn)象? 115
10.4 原理分析? 116
10.4.1 taskSELECT_HIGHEST_PRIORITY_TASK()函數(shù)? 116
10.4.2 taskRESET_READY_PRIORITY()函數(shù)? 117
10.5 修改代碼以支持優(yōu)先級? 118
10.5.1 修改xPortSysTick-Handler()函數(shù)? 118
10.5.2 修改xTaskIncrement-Tick()函數(shù)? 119
第二部分 FreeRTOS內(nèi)核應(yīng)用開發(fā)
第11章 移植FreeRTOS到STM32? 124
11.1 獲取STM32的裸機(jī)工程模板? 124
11.2 下載FreeRTOS V9.0.0源碼? 124
11.3 FreeRTOS文件夾內(nèi)容? 126
11.3.1 FreeRTOS文件夾? 126
11.3.2 FreeRTOS-Plus文件夾? 128
11.3.3 HTML文件? 129
11.4 向裸機(jī)工程中添加FreeRTOS源碼? 129
11.4.1 提取FreeRTOS最簡源碼? 129
11.4.2 復(fù)制FreeRTOS到裸機(jī)工程根目錄? 130
11.4.3 復(fù)制FreeRTOSConf?ig.h文件到User文件夾? 131
11.4.4 添加FreeRTOS源碼到工程組文件夾? 131
11.5 修改FreeRTOSConf?ig.h文件? 133
11.5.1 FreeRTOSConf?ig.h文件內(nèi)容? 133
11.5.2 修改FreeRTOSConfig.h文件? 143
11.6 修改stm32f10x_it.c文件? 147
11.7 修改main.c文件? 151
11.8 下載驗(yàn)證? 152
第12章 任務(wù)? 153
12.1 硬件初始化? 153
12.2 創(chuàng)建單任務(wù)—SRAM靜態(tài)內(nèi)存? 155
12.2.1 定義任務(wù)函數(shù)? 155
12.2.2 空閑任務(wù)與定時(shí)器任務(wù)棧函數(shù)實(shí)現(xiàn)? 155
12.2.3 定義任務(wù)棧? 157
12.2.4 定義任務(wù)控制塊? 157
12.2.5 靜態(tài)創(chuàng)建任務(wù)? 158
12.2.6 啟動任務(wù)? 159
12.2.7 main.c文件? 159
12.3 下載驗(yàn)證SRAM靜態(tài)內(nèi)存單任務(wù)? 164
12.4 創(chuàng)建單任務(wù)—SRAM動態(tài)內(nèi)存? 164
12.4.1 動態(tài)內(nèi)存空間堆的來源? 164
12.4.2 定義任務(wù)函數(shù)? 165
12.4.3 定義任務(wù)棧? 166
12.4.4 定義任務(wù)控制塊指針? 166
12.4.5 動態(tài)創(chuàng)建任務(wù)? 166
12.4.6 啟動任務(wù)? 167
12.4.7 main.c文件? 167
12.5 下載驗(yàn)證SRAM動態(tài)內(nèi)存單任務(wù)? 171
12.6 創(chuàng)建多任務(wù)—SRAM動態(tài)內(nèi)存? 171
12.7 下載驗(yàn)證SRAM動態(tài)內(nèi)存多任務(wù)? 175
第13章 FreeRTOS的啟動流程? 176
13.1 “?萬事俱備,只欠東風(fēng)?”法? 176
13.2 “?小心翼翼,十分謹(jǐn)慎?”法? 177
13.3 兩種方法的適用情況? 179
13.4 FreeRTOS的啟動流程? 179
13.4.1 創(chuàng)建任務(wù)函數(shù)xTaskCreate()? 179
13.4.2 開啟調(diào)度器函數(shù)vTask-StartScheduler()? 181
13.4.3 main()函數(shù)? 185
第14章 任務(wù)管理? 188
14.1 任務(wù)的基本概念? 188
14.2 任務(wù)調(diào)度器的基本概念? 188
14.3 任務(wù)狀態(tài)的概念? 189
14.4 任務(wù)狀態(tài)遷移? 190
14.5 常用的任務(wù)函數(shù)? 191
14.5.1 任務(wù)掛起函數(shù)? 191
14.5.2 任務(wù)恢復(fù)函數(shù)? 195
14.5.3 任務(wù)刪除函數(shù)? 203
14.5.4 任務(wù)延時(shí)函數(shù)? 207
14.6 任務(wù)的設(shè)計(jì)要點(diǎn)? 215
14.7 任務(wù)管理實(shí)驗(yàn)? 216
14.8 實(shí)驗(yàn)現(xiàn)象? 221
第15章 消息隊(duì)列? 222
15.1 消息隊(duì)列的基本概念? 222
15.2 消息隊(duì)列的運(yùn)作機(jī)制? 222
15.3 消息隊(duì)列的阻塞機(jī)制? 223
15.4 消息隊(duì)列的應(yīng)用場景? 224
15.5 消息隊(duì)列控制塊? 224
15.6 常用的消息隊(duì)列函數(shù)? 226
15.6.1 消息隊(duì)列動態(tài)創(chuàng)建函數(shù)? 226
15.6.2 消息隊(duì)列靜態(tài)創(chuàng)建函數(shù)? 232
15.6.3 消息隊(duì)列刪除函數(shù)? 233
15.6.4 向消息隊(duì)列發(fā)送消息函數(shù)? 234
15.6.5 從消息隊(duì)列讀取消息函數(shù)? 244
15.7 消息隊(duì)列注意事項(xiàng)? 251
15.8 消息隊(duì)列實(shí)驗(yàn)? 252
15.9 實(shí)驗(yàn)現(xiàn)象? 256
第16章 信號量? 258
16.1 信號量的基本概念? 258
16.1.1 二值信號量? 258
16.1.2 計(jì)數(shù)信號量? 259
16.1.3 互斥信號量? 259
16.1.4 遞歸信號量? 259
16.2 二值信號量的應(yīng)用場景? 260
16.3 二值信號量的運(yùn)作機(jī)制? 260
16.4 計(jì)數(shù)信號量的運(yùn)作機(jī)制? 261
16.5 信號量控制塊? 262
16.6 常用的信號量函數(shù)? 263
16.6.1 信號量創(chuàng)建函數(shù)? 263
16.6.2 信號量刪除函數(shù)? 268
16.6.3 信號量釋放函數(shù)? 268
16.6.4 信號量獲取函數(shù)? 271
16.7 信號量實(shí)驗(yàn)? 273
16.7.1 二值信號量同步實(shí)驗(yàn)? 273
16.7.2 計(jì)數(shù)信號量實(shí)驗(yàn)? 277
16.8 實(shí)驗(yàn)現(xiàn)象? 282
16.8.1 二值信號量實(shí)驗(yàn)現(xiàn)象? 282
16.8.2 計(jì)數(shù)信號量實(shí)驗(yàn)現(xiàn)象? 283
第17章 互斥量? 284
17.1 互斥量的基本概念? 284
17.2 互斥量的優(yōu)先級繼承機(jī)制? 284
17.3 互斥量的應(yīng)用場景? 287
17.4 互斥量的運(yùn)作機(jī)制? 287
17.5 互斥量控制塊? 288
17.6 互斥量函數(shù)? 289
17.6.1 互斥量創(chuàng)建函數(shù)xSema-phoreCreateMutex()? 289
17.6.2 遞歸互斥量創(chuàng)建函數(shù)xSemaphoreCreateRecur-siveMutex()? 292
17.6.3 互斥量刪除函數(shù)vSema-phoreDelete()? 293
17.6.4 互斥量獲取函數(shù)xSema-phoreTake()? 293
17.6.5 遞歸互斥量獲取函數(shù)xSemaphoreTakeRecur-sive()? 299
17.6.6 互斥量釋放函數(shù)xSema-phoreGive()? 301
17.6.7 遞歸互斥量釋放函數(shù)xSemaphoreGiveRecur-sive()? 304
17.7 互斥量實(shí)驗(yàn)? 307
17.7.1 模擬優(yōu)先級翻轉(zhuǎn)實(shí)驗(yàn)? 307
17.7.2 互斥量降低優(yōu)先級翻轉(zhuǎn)危害實(shí)驗(yàn)? 312
17.8 實(shí)驗(yàn)現(xiàn)象? 318
17.8.1 模擬優(yōu)先級翻轉(zhuǎn)實(shí)驗(yàn)現(xiàn)象? 318
17.8.2 互斥量降低優(yōu)先級翻轉(zhuǎn)危害實(shí)驗(yàn)現(xiàn)象? 318
第18章 事件? 320
18.1 事件的基本概念? 320
18.2 事件的應(yīng)用場景? 321
18.3 事件的運(yùn)作機(jī)制? 321
18.4 事件控制塊? 323
18.5 事件函數(shù)? 323
18.5.1 事件創(chuàng)建函數(shù)xEvent-GroupCreate()? 323
18.5.2 事件刪除函數(shù)vEvent-GroupDelete()? 325
18.5.3 事件組置位函數(shù)xEvent-GroupSetBits()(任務(wù))? 326
18.5.4 事件組置位函數(shù)xEvent-GroupSetBitsFromISR()(中斷)? 330
18.5.5 等待事件函數(shù)xEvent-GroupWaitBits()? 332
18.5.6 清除事件組指定位函數(shù)xEventGroupClearBits()與xEventGroupClearBits-FromISR()? 337
18.6 事件實(shí)驗(yàn)? 338
18.7 實(shí)驗(yàn)現(xiàn)象? 343
第19章 軟件定時(shí)器? 344
19.1 軟件定時(shí)器的基本概念? 344
19.2 軟件定時(shí)器的應(yīng)用場景? 345
19.3 軟件定時(shí)器的精度? 345
19.4 軟件定時(shí)器的運(yùn)作機(jī)制? 346
19.5 軟件定時(shí)器控制塊? 348
19.6 軟件定時(shí)器函數(shù)? 349
19.6.1 軟件定時(shí)器創(chuàng)建函數(shù)? 349
19.6.2 軟件定時(shí)器啟動函數(shù)? 352
19.6.3 軟件定時(shí)器停止函數(shù)? 356
19.6.4 軟件定時(shí)器任務(wù)? 358
19.6.5 軟件定時(shí)器刪除函數(shù)? 365
19.7 軟件定時(shí)器實(shí)驗(yàn)? 366
19.8 實(shí)驗(yàn)現(xiàn)象? 371
第20章 任務(wù)通知? 372
20.1 任務(wù)通知的基本概念? 372
20.2 任務(wù)通知的運(yùn)作機(jī)制? 372
20.3 任務(wù)通知的數(shù)據(jù)結(jié)構(gòu)? 373
20.4 任務(wù)通知函數(shù)? 374
20.4.1 發(fā)送任務(wù)通知函數(shù)? 374
20.4.2 獲取任務(wù)通知函數(shù)? 391
20.5 任務(wù)通知實(shí)驗(yàn)? 398
20.5.1 任務(wù)通知代替消息隊(duì)列? 398
20.5.2 任務(wù)通知代替二值信號量? 404
20.5.3 任務(wù)通知代替計(jì)數(shù)信號量? 409
20.5.4 任務(wù)通知代替事件組? 414
20.6 實(shí)驗(yàn)現(xiàn)象? 419
20.6.1 任務(wù)通知代替消息隊(duì)列實(shí)驗(yàn)現(xiàn)象? 419
20.6.2 任務(wù)通知代替二值信號量實(shí)驗(yàn)現(xiàn)象? 420
20.6.3 任務(wù)通知代替計(jì)數(shù)信號量實(shí)驗(yàn)現(xiàn)象? 420
20.6.4 任務(wù)通知代替事件組實(shí)驗(yàn)現(xiàn)象? 421
第21章 內(nèi)存管理? 422
21.1 內(nèi)存管理的基本概念? 422
21.2 內(nèi)存管理的應(yīng)用場景? 423
21.3 內(nèi)存管理方案詳解? 424
21.3.1 heap_1.c? 424
21.3.2 heap_2.c? 428
21.3.3 heap_3.c? 436
21.3.4 heap_4.c? 438
21.3.5 heap_5.c? 448
21.4 內(nèi)存管理實(shí)驗(yàn)? 451
21.5 實(shí)驗(yàn)現(xiàn)象? 455
第22章 中斷管理? 456
22.1 異常與中斷的基本概念? 456
22.1.1 中斷的介紹? 457
22.1.2 和中斷相關(guān)的術(shù)語? 457
22.2 中斷管理的運(yùn)作機(jī)制? 458
22.3 中斷延遲的概念? 459
22.4 中斷管理的應(yīng)用場景? 460
22.5 ARM Cortex-M的中斷管理? 460
22.6 中斷管理實(shí)驗(yàn)? 462
22.7 實(shí)驗(yàn)現(xiàn)象? 470
第23章 CPU利用率統(tǒng)計(jì)? 471
23.1 CPU利用率的基本概念? 471
23.2 CPU利用率的作用? 471
23.3 CPU利用率統(tǒng)計(jì)? 472
23.4 CPU利用率統(tǒng)計(jì)實(shí)驗(yàn)? 473
23.5 實(shí)驗(yàn)現(xiàn)象? 478
附錄? 479
IoT
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。