FreeRTOS內(nèi)核實(shí)現(xiàn)與應(yīng)用開發(fā)實(shí)戰(zhàn)指南:基于STM32
定 價(jià):99 元
叢書名:電子與嵌入式系統(tǒng)設(shè)計(jì)叢書
- 作者:
- 出版時(shí)間:2019/3/1
- ISBN:9787111618256
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP332.3-62
- 頁(yè)碼:0
- 紙張:
- 版次:
- 開本:16開
本書基于野火STM32全系列開發(fā)板介紹FreeRTOS內(nèi)核實(shí)現(xiàn)與應(yīng)用開發(fā),全書分為兩部分:第一部分教你如何從0到1把FreeRTOS內(nèi)核寫出來(lái),從底層的匯編開始,講解任務(wù)如何定義、如何切換,還講解了阻塞延時(shí)如何實(shí)現(xiàn),如何支持多優(yōu)先級(jí),如何實(shí)現(xiàn)定時(shí)器以及時(shí)間片等FreeRTOS的核心知識(shí)點(diǎn);第二部分則開始講解FreeRTOS內(nèi)核組件的應(yīng)用以及如何使用FreeRTOS進(jìn)行多任務(wù)編程。
本書內(nèi)容翔實(shí),案例豐富,配有大量示例代碼,適合作為嵌入式領(lǐng)域工程師和愛(ài)好者的技術(shù)參考書,也適合相關(guān)專業(yè)的學(xué)生學(xué)習(xí)參考。
前 言
引 言
第一部分 從0到1教你寫FreeRTOS內(nèi)核
第1章 初識(shí)FreeRTOS 2
1.1 FreeRTOS版權(quán) 2
1.2 FreeRTOS收費(fèi)問(wèn)題 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ái)系統(tǒng) 16
3.2 多任務(wù)系統(tǒng) 17
第4章 數(shù)據(jù)結(jié)構(gòu)—列表與列表項(xiàng) 20
4.1 C語(yǔ)言鏈表 20
4.1.1 單向鏈表 20
4.1.2 雙向鏈表 22
4.1.3 鏈表與數(shù)組的對(duì)比 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 啟動(dòng)調(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)先級(jí) 84
8.1 支持多優(yōu)先級(jí)的方法 84
8.2 查找最高優(yōu)先級(jí)的就緒任務(wù)相關(guān)代碼 85
8.2.1 通用方法 87
8.2.2 優(yōu)化方法 87
8.3 修改代碼以支持多優(yōu)先級(jí) 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í)間片測(cè)試實(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)先級(jí) 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最簡(jiǎn)源碼 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 啟動(dòng)任務(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動(dòng)態(tài)內(nèi)存 164
12.4.1 動(dòng)態(tài)內(nèi)存空間堆的來(lái)源 164
12.4.2 定義任務(wù)函數(shù) 165
12.4.3 定義任務(wù)棧 166
12.4.4 定義任務(wù)控制塊指針 166
12.4.5 動(dòng)態(tài)創(chuàng)建任務(wù) 166
12.4.6 啟動(dòng)任務(wù) 167
12.4.7 main.c文件 167
12.5 下載驗(yàn)證SRAM動(dòng)態(tài)內(nèi)存單任務(wù) 171
12.6 創(chuàng)建多任務(wù)—SRAM動(dòng)態(tài)內(nèi)存 171
12.7 下載驗(yàn)證SRAM動(dòng)態(tài)內(nèi)存多任務(wù) 175
第13章 FreeRTOS的啟動(dòng)流程 176
13.1 “?萬(wàn)事俱備,只欠東風(fēng)?”法 176
13.2 “?小心翼翼,十分謹(jǐn)慎?”法 177
13.3 兩種方法的適用情況 179
13.4 FreeRTOS的啟動(dòng)流程 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)用場(chǎng)景 224
15.5 消息隊(duì)列控制塊 224
15.6 常用的消息隊(duì)列函數(shù) 226
15.6.1 消息隊(duì)列動(dòng)態(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章 信號(hào)量 258
16.1 信號(hào)量的基本概念 258
16.1.1 二值信號(hào)量 258
16.1.2 計(jì)數(shù)信號(hào)量 259
16.1.3 互斥信號(hào)量 259
16.1.4 遞歸信號(hào)量 259
16.2 二值信號(hào)量的應(yīng)用場(chǎng)景 260
16.3 二值信號(hào)量的運(yùn)作機(jī)制 260
16.4 計(jì)數(shù)信號(hào)量的運(yùn)作機(jī)制 261
16.5 信號(hào)量控制塊 262
16.6 常用的信號(hào)量函數(shù) 263
16.6.1 信號(hào)量創(chuàng)建函數(shù) 263
16.6.2 信號(hào)量刪除函數(shù) 268
16.6.3 信號(hào)量釋放函數(shù) 268
16.6.4 信號(hào)量獲取函數(shù) 271
16.7 信號(hào)量實(shí)驗(yàn) 273
16.7.1 二值信號(hào)量同步實(shí)驗(yàn) 273
16.7.2 計(jì)數(shù)信號(hào)量實(shí)驗(yàn) 277
16.8 實(shí)驗(yàn)現(xiàn)象 282
16.8.1 二值信號(hào)量實(shí)驗(yàn)現(xiàn)象 282
16.8.2 計(jì)數(shù)信號(hào)量實(shí)驗(yàn)現(xiàn)象 283
第17章 互斥量 284
17.1 互斥量的基本概念 284
17.2 互斥量的優(yōu)先級(jí)繼承機(jī)制 284
17.3 互斥量的應(yīng)用場(chǎ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)先級(jí)翻轉(zhuǎn)實(shí)驗(yàn) 307
17.7.2 互斥量降低優(yōu)先級(jí)翻轉(zhuǎn)危害實(shí)驗(yàn) 312
17.8 實(shí)驗(yàn)現(xiàn)象 318
17.8.1 模擬優(yōu)先級(jí)翻轉(zhuǎn)實(shí)驗(yàn)現(xiàn)象 318
17.8.2 互斥量降低優(yōu)先級(jí)翻轉(zhuǎn)危害實(shí)驗(yàn)現(xiàn)象 318
第18章 事件 320
18.1 事件的基本概念 320
18.2 事件的應(yīng)用場(chǎ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)用場(chǎ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í)器啟動(dòng)函數(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ù)通知代替二值信號(hào)量 404
20.5.3 任務(wù)通知代替計(jì)數(shù)信號(hào)量 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ù)通知代替二值信號(hào)量實(shí)驗(yàn)現(xiàn)象 420
20.6.3 任務(wù)通知代替計(jì)數(shù)信號(hào)量實(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)用場(chǎ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ù)語(yǔ) 457
22.2 中斷管理的運(yùn)作機(jī)制 458
22.3 中斷延遲的概念 459
22.4 中斷管理的應(yīng)用場(chǎ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