3dwoo大學簡體電腦書店
FreeRTOS內核實現與應用開發實戰指南:基于STM32
( 簡體 字)
作者:劉火良 楊森類別:1. -> 電腦組織與體系結構 -> 單晶片 -> STM32
出版社:機械工業出版社FreeRTOS內核實現與應用開發實戰指南:基于STM32 3dWoo書號: 50849
詢問書籍請說出此書號!
有庫存
NT售價: 495
出版日:3/20/2019
頁數:478
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787111618256 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
前 言
引 言
第一部分 從0到1教你寫FreeRTOS內核
第1章 初識FreeRTOS 2
1.1 FreeRTOS版權 2
1.2 FreeRTOS收費問題 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的編程風格 5
1.4.1 數據類型 5
1.4.2 變量名 6
1.4.3 函數名 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 調試配置 13
2.5.1 設置軟件仿真 13
2.5.2 修改時鐘大小 13
2.5.3 添加頭文件路徑 13
第3章 裸機系統與多任務系統 15
3.1 裸機系統 15
3.1.1 輪詢系統 15
3.1.2 前后臺系統 16
3.2 多任務系統 17
第4章 數據結構—列表與列表項 20
4.1 C語言鏈表 20
4.1.1 單向鏈表 20
4.1.2 雙向鏈表 22
4.1.3 鏈表與數組的對比 22
4.2 FreeRTOS中鏈表的實現 23
4.2.1 實現鏈表節點 23
4.2.2 實現鏈表根節點 25
4.3 鏈表節點插入實驗 31
4.4 實驗現象 34
第5章 任務的定義與任務切換 35
5.1 本章目標 35
5.2 什么是任務 36
5.3 創建任務 37
5.3.1 定義任務棧 37
5.3.2 定義任務函數 38
5.3.3 定義任務控制塊 39
5.3.4 實現任務創建函數 40
5.4 實現就緒列表 45
5.4.1 定義就緒列表 45
5.4.2 就緒列表初始化 45
5.4.3 將任務插入就緒列表 46
5.5 實現調度器 49
5.5.1 啟動調度器 49
5.5.2 任務切換 54
5.6 main()函數 58
5.7 實驗現象 61
5.8 本章涉及的匯編指令 64
第6章 臨界段的保護 65
6.1 什么是臨界段 65
6.2 Cortex-M內核快速關中斷指令 65
6.3 關中斷 66
6.3.1 不帶返回值的關中斷函數 66
6.3.2 帶返回值的關中斷函數 67
6.4 開中斷 67
6.5 進入/退出臨界段的宏 68
6.5.1 進入臨界段 68
6.5.2 退出臨界段 69
6.6 臨界段代碼的應用 70
6.7 實驗現象 71
第7章 空閑任務與阻塞延時 72
7.1 實現空閑任務 72
7.1.1 定義空閑任務的棧 72
7.1.2 定義空閑任務的任務控制塊 73
7.1.3 創建空閑任務 73
7.2 實現阻塞延時 74
7.2.1 vTaskDelay()函數 74
7.2.2 修改vTaskSwitchContext()函數 75
7.3 SysTick中斷服務函數 77
7.4 SysTick初始化函數 78
7.5 main()函數 80
7.6 實驗現象 83
第8章 多優先級 84
8.1 支持多優先級的方法 84
8.2 查找最高優先級的就緒任務相關代碼 85
8.2.1 通用方法 87
8.2.2 優化方法 87
8.3 修改代碼以支持多優先級 89
8.3.1 修改任務控制塊 89
8.3.2 修改xTaskCreateStatic()函數 89
8.3.3 修改vTaskStartScheduler()函數 93
8.3.4 修改vTaskDelay()函數 94
8.3.5 修改vTaskSwitchContext()函數 95
8.3.6 修改xTaskIncrementTick()函數 96
8.4 main()函數 97
8.5 實驗現象 100
第9章 任務延時列表 102
9.1 任務延時列表的工作原理 102
9.2 實現任務延時列表 103
9.2.1 定義任務延時列表 103
9.2.2 任務延時列表初始化 103
9.2.3 定義xNextTaskUnblock-Time 103
9.2.4 初始化xNextTaskUnblock-Time 104
9.3 修改代碼以支持任務延時列表 104
9.3.1 修改vTaskDelay()函數 105
9.3.2 修改xTaskIncrementTick()函數 107
9.3.3 修改taskRESET_READY_PRIORITY()函數 109
9.4 main()函數 110
9.5 實驗現象 110
第10章 時間片 111
10.1 時間片測試實驗 111
10.2 main.c文件 112
10.3 實驗現象 115
10.4 原理分析 116
10.4.1 taskSELECT_HIGHEST_PRIORITY_TASK()函數 116
10.4.2 taskRESET_READY_PRIORITY()函數 117
10.5 修改代碼以支持優先級 118
10.5.1 修改xPortSysTick-Handler()函數 118
10.5.2 修改xTaskIncrement-Tick()函數 119
第二部分 FreeRTOS內核應用開發
第11章 移植FreeRTOS到STM32 124
11.1 獲取STM32的裸機工程模板 124
11.2 下載FreeRTOS V9.0.0源碼 124
11.3 FreeRTOS文件夾內容 126
11.3.1 FreeRTOS文件夾 126
11.3.2 FreeRTOS-Plus文件夾 128
11.3.3 HTML文件 129
11.4 向裸機工程中添加FreeRTOS源碼 129
11.4.1 提取FreeRTOS最簡源碼 129
11.4.2 復制FreeRTOS到裸機工程根目錄 130
11.4.3 復制FreeRTOSConf?ig.h文件到User文件夾 131
11.4.4 添加FreeRTOS源碼到工程組文件夾 131
11.5 修改FreeRTOSConf?ig.h文件 133
11.5.1 FreeRTOSConf?ig.h文件內容 133
11.5.2 修改FreeRTOSConfig.h文件 143
11.6 修改stm32f10x_it.c文件 147
11.7 修改main.c文件 151
11.8 下載驗證 152
第12章 任務 153
12.1 硬件初始化 153
12.2 創建單任務—SRAM靜態內存 155
12.2.1 定義任務函數 155
12.2.2 空閑任務與定時器任務棧函數實現 155
12.2.3 定義任務棧 157
12.2.4 定義任務控制塊 157
12.2.5 靜態創建任務 158
12.2.6 啟動任務 159
12.2.7 main.c文件 159
12.3 下載驗證SRAM靜態內存單任務 164
12.4 創建單任務—SRAM動態內存 164
12.4.1 動態內存空間堆的來源 164
12.4.2 定義任務函數 165
12.4.3 定義任務棧 166
12.4.4 定義任務控制塊指針 166
12.4.5 動態創建任務 166
12.4.6 啟動任務 167
12.4.7 main.c文件 167
12.5 下載驗證SRAM動態內存單任務 171
12.6 創建多任務—SRAM動態內存 171
12.7 下載驗證SRAM動態內存多任務 175
第13章 FreeRTOS的啟動流程 176
13.1 “?萬事俱備,只欠東風?”法 176
13.2 “?小心翼翼,十分謹慎?”法 177
13.3 兩種方法的適用情況 179
13.4 FreeRTOS的啟動流程 179
13.4.1 創建任務函數xTaskCreate() 179
13.4.2 開啟調度器函數vTask-StartScheduler() 181
13.4.3 main()函數 185
第14章 任務管理 188
14.1 任務的基本概念 188
14.2 任務調度器的基本概念 188
14.3 任務狀態的概念 189
14.4 任務狀態遷移 190
14.5 常用的任務函數 191
14.5.1 任務掛起函數 191
14.5.2 任務恢復函數 195
14.5.3 任務刪除函數 203
14.5.4 任務延時函數 207
14.6 任務的設計要點 215
14.7 任務管理實驗 216
14.8 實驗現象 221
第15章 消息隊列 222
15.1 消息隊列的基本概念 222
15.2 消息隊列的運作機制 222
15.3 消息隊列的阻塞機制 223
15.4 消息隊列的應用場景 224
15.5 消息隊列控制塊 224
15.6 常用的消息隊列函數 226
15.6.1 消息隊列動態創建函數 226
15.6.2 消息隊列靜態創建函數 232
15.6.3 消息隊列刪除函數 233
15.6.4 向消息隊列發送消息函數 234
15.6.5 從消息隊列讀取消息函數 244
15.7 消息隊列注意事項 251
15.8 消息隊列實驗 252
15.9 實驗現象 256
第16章 信號量 258
16.1 信號量的基本概念 258
16.1.1 二值信號量 258
16.1.2 計數信號量 259
16.1.3 互斥信號量 259
16.1.4 遞歸信號量 259
16.2 二值信號量的應用場景 260
16.3 二值信號量的運作機制 260
16.4 計數信號量的運作機制 261
16.5 信號量控制塊 262
16.6 常用的信號量函數 263
16.6.1 信號量創建函數 263
16.6.2 信號量刪除函數 268
16.6.3 信號量釋放函數 268
16.6.4 信號量獲取函數 271
16.7 信號量實驗 273
16.7.1 二值信號量同步實驗 273
16.7.2 計數信號量實驗 277
16.8 實驗現象 282
16.8.1 二值信號量實驗現象 282
16.8.2 計數信號量實驗現象 283
第17章 互斥量 284
17.1 互斥量的基本概念 284
17.2 互斥量的優先級繼承機制 284
17.3 互斥量的應用場景 287
17.4 互斥量的運作機制 287
17.5 互斥量控制塊 288
17.6 互斥量函數 289
17.6.1 互斥量創建函數xSema-phoreCreateMutex() 289
17.6.2 遞歸互斥量創建函數xSemaphoreCreateRecur-siveMutex() 292
17.6.3 互斥量刪除函數vSema-phoreDelete() 293
17.6.4 互斥量獲取函數xSema-phoreTake() 293
17.6.5 遞歸互斥量獲取函數xSemaphoreTakeRecur-sive() 299
17.6.6 互斥量釋放函數xSema-phoreGive() 301
17.6.7 遞歸互斥量釋放函數xSemaphoreGiveRecur-sive() 304
17.7 互斥量實驗 307
17.7.1 模擬優先級翻轉實驗 307
17.7.2 互斥量降低優先級翻轉危害實驗 312
17.8 實驗現象 318
17.8.1 模擬優先級翻轉實驗現象 318
17.8.2 互斥量降低優先級翻轉危害實驗現象 318
第18章 事件 320
18.1 事件的基本概念 320
18.2 事件的應用場景 321
18.3 事件的運作機制 321
18.4 事件控制塊 323
18.5 事件函數 323
18.5.1 事件創建函數xEvent-GroupCreate() 323
18.5.2 事件刪除函數vEvent-GroupDelete() 325
18.5.3 事件組置位函數xEvent-GroupSetBits()(任務) 326
18.5.4 事件組置位函數xEvent-GroupSetBitsFromISR()(中斷) 330
18.5.5 等待事件函數xEvent-GroupWaitBits() 332
18.5.6 清除事件組指定位函數xEventGroupClearBits()與xEventGroupClearBits-FromISR() 337
18.6 事件實驗 338
18.7 實驗現象 343
第19章 軟件定時器 344
19.1 軟件定時器的基本概念 344
19.2 軟件定時器的應用場景 345
19.3 軟件定時器的精度 345
19.4 軟件定時器的運作機制 346
19.5 軟件定時器控制塊 348
19.6 軟件定時器函數 349
19.6.1 軟件定時器創建函數 349
19.6.2 軟件定時器啟動函數 352
19.6.3 軟件定時器停止函數 356
19.6.4 軟件定時器任務 358
19.6.5 軟件定時器刪除函數 365
19.7 軟件定時器實驗 366
19.8 實驗現象 371
第20章 任務通知 372
20.1 任務通知的基本概念 372
20.2 任務通知的運作機制 372
20.3 任務通知的數據結構 373
20.4 任務通知函數 374
20.4.1 發送任務通知函數 374
20.4.2 獲取任務通知函數 391
20.5 任務通知實驗 398
20.5.1 任務通知代替消息隊列 398
20.5.2 任務通知代替二值信號量 404
20.5.3 任務通知代替計數信號量 409
20.5.4 任務通知代替事件組 414
20.6 實驗現象 419
20.6.1 任務通知代替消息隊列實驗現象 419
20.6.2 任務通知代替二值信號量實驗現象 420
20.6.3 任務通知代替計數信號量實驗現象 420
20.6.4 任務通知代替事件組實驗現象 421
第21章 內存管理 422
21.1 內存管理的基本概念 422
21.2 內存管理的應用場景 423
21.3 內存管理方案詳解 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 內存管理實驗 451
21.5 實驗現象 455
第22章 中斷管理 456
22.1 異常與中斷的基本概念 456
22.1.1 中斷的介紹 457
22.1.2 和中斷相關的術語 457
22.2 中斷管理的運作機制 458
22.3 中斷延遲的概念 459
22.4 中斷管理的應用場景 460
22.5 ARM Cortex-M的中斷管理 460
22.6 中斷管理實驗 462
22.7 實驗現象 470
第23章 CPU利用率統計 471
23.1 CPU利用率的基本概念 471
23.2 CPU利用率的作用 471
23.3 CPU利用率統計 472
23.4 CPU利用率統計實驗 473
23.5 實驗現象 478
附錄 479
全書內容循序漸進,不斷迭代。 在學習時務必做到兩點:一是不能一味地看書,要把代碼和書本結合起來學習,一邊看書, 一邊調試代碼;二是在學完每一章之后,將配套例程重寫一遍,做到舉一反三,真正理解。本書的電子版和配套的源碼均可到野火論壇(www.fireBBS.cn)下載,歡迎各位讀者積極參與交流分享。



本書基于野火STM32全系列開發板介紹FreeRTOS內核實現與應用開發,全書分為兩部分,第一部分先教你如何從0到1把FreeRTOS內核寫出來,從底層的匯編開始講解任務如何定義、如何切換,還講解了阻塞延時如何實現、如何支持多優先級、如何實現任務延時列表以及時間片等FreeRTOS的核心知識點;第二部分講解FreeRTOS內核組件的應用以及使用FreeRTOS進行多任務編程。

本書內容翔實,案例豐富,配有大量示例代碼,適合作為嵌入式領域科技工作者的參考書,也適合相關專業的學生學習參考。
如何學習本書

本書系統講解FreeRTOS,共分為兩個部分。第一部分重點講解FreeRTOS的原理實現,從0開始,不斷迭代,教你把FreeRTOS的內核寫出來,讓你徹底學會任務是如何定義的、系統是如何調度的(包括底層的匯編代碼講解)、多優先級是如何實現的等操作系統最深層次的知識。當你拿到本書開始學習的時候,你一定會驚訝,原來RTOS(Real Time Operating System,實時操作系統)的學習并沒有那么復雜,反而是那么有趣,原來自己也可以寫RTOS,成就感瞬間爆棚。

當徹底掌握第一部分的知識之后,再學習其他RTOS,可以說十分輕松。縱觀現在市面上流行的幾種RTOS,它們的內核實現差異不大,只需要深入研究其中一種即可,沒有必要對每一種RTOS都深入地研究源碼。但如果時間允許,看一看也并無壞處。第二部分重點講解FreeRTOS的移植、內核中每個組件的應用,比起第一部分,這部分內容掌握起來應該比較容易。

全書內容循序漸進,不斷迭代,尤其在第一部分,前一章多是后一章的基礎,建議從頭開始閱讀,不要進行跳躍式閱讀。在學習時務必做到兩點:一是不能一味地看書,要把代碼和書本結合起來學習,一邊看書,一邊調試代碼。如何調試代碼呢?即單步執行每一條程序,看程序的執行流程和執行的效果與自己所想的是否一致。二是在每學完一章之后,必須將配套的例程重寫一遍(切記不要復制,哪怕是一個分號。但可以照書錄入),做到舉一反三,確保真正理解。在自己寫的時候肯定會錯漏百出,要認真糾錯,好好調試,這是你提高編程能力的最好機會。記住,編寫程序不是一氣呵成的,而是要一步一步地調試。

本書的編寫風格

本書第一部分以FreeRTOS V9.0.0官方源碼為藍本,抽絲剝繭,不斷迭代,教你如何從0開始把FreeRTOS內核寫出來。書中涉及的數據類型、變量名稱、函數名稱、文件名稱、文件存放的位置都完全按照FreeRTOS官方的方式來實現。學完這本書之后,你可以無縫地切換到原版的FreeRTOS中使用。要注意的是,在實現的過程中,某些函數中會去掉一些形參和冗余的代碼,只保留核心的功能,但這并不會影響學習。

本書第二部分主要介紹FreeRTOS的移植和內核組件的使用,不會再去深入講解源碼,而是著重講解如何應用,如果對第一部分不感興趣,可以跳過第一部分,直接進入第二部分的學習。

本書還有姊妹篇—《RT-Thread內核實現與應用開發實戰指南:基于STM32》,兩本書的編寫風格、內容框架和章節命名與排序基本一致,語言闡述類似,且涉及RTOS抽象層的理論部分也相同,不同之處在于RTOS的實現原理、內核源碼的講解和上層API的使用,這些內容才是重點部分,是讀者學習的核心。例如,雖然兩本書的第一部分的章節名稱基本類似,但內容不同,因為針對的RTOS不一樣。其中,關于新建FreeRTOS工程和裸機系統與多任務(線程)系統的描述屬于RTOS抽象層的理論部分,不具體針對某個RTOS,所以基本一樣。第二部分中,對于什么是任務(線程)、阻塞延時和信號量的應用等RTOS抽象層的理論講解也基本類似,但是具體涉及這兩個RTOS的原理實現和代碼講解時則完全不同。

如果讀者已經學習了其中一本書,再學習另外一本的話,那么涉及RTOS抽象層的理論部分可跳過,只需要把精力放在RTOS內核的實現和源碼API的應用方面。因為現有的RTOS在理論層基本都是相通的,但在具體的代碼實現上各有特點,所以可以用這兩本書進行互補學習,掌握了其中一本書的知識,再學習另外一本書定會得心應手,事半功倍。

本書的參考資料及配套硬件

關于本書的參考資料和配套硬件的信息,請參考本書附錄部分。

本書的技術論壇

如果在學習過程中遇到問題,可以到野火電子論壇發帖交流,開源共享,共同進步。

鑒于作者水平有限,書中難免有錯漏之處,熱心的讀者也可把勘誤發送到論壇上以便改進。祝你學習愉快,FreeRTOS的世界,野火與你同行。
pagetop