RT-Thread內(nèi)核實現(xiàn)與應(yīng)用開發(fā)實戰(zhàn)指南 基于STM32
定 價:99 元
叢書名:華章科技
- 作者:劉火良 楊森
- 出版時間:2018/12/1
- ISBN:9787111613664
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP332.3-62
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書基于野火STM32全系列開發(fā)板介紹RT-Thread內(nèi)核實現(xiàn)與應(yīng)用開發(fā),全書分為兩部分:*部分教你如何從0到1把RT-Thread內(nèi)核寫出來,從底層的匯編開始講解線程如何定義、如何切換,還講解了阻塞延時如何實現(xiàn)、如何支持多優(yōu)先級、如何實現(xiàn)定時器以及時間片等RT-Thread的核心知識點;第二部分則講解RT-Thread內(nèi)核組件的應(yīng)用以及如何使用RT-Thread進行多線程編程。
本書內(nèi)容翔實,案例豐富,配有大量示例代碼,適合作為嵌入式領(lǐng)域科技工作者的參考書,也適合相關(guān)專業(yè)學(xué)生學(xué)習(xí)參考。
如何學(xué)習(xí)本書
本書是首本系統(tǒng)講解RT-Thread的中文書籍,共分為兩個部分。第一部分重點講解RT-Thread的原理實現(xiàn),從0開始,不斷迭代,教你把RT-Thread的內(nèi)核寫出來,讓你徹底學(xué)會線程是如何定義的、系統(tǒng)是如何調(diào)度的(包括底層的匯編代碼講解)、多優(yōu)先級是如何實現(xiàn)的等操作系統(tǒng)的最深層次的知識。當(dāng)你拿到本書開始學(xué)習(xí)的時候,你一定會驚訝,原來RTOS的學(xué)習(xí)并沒有那么復(fù)雜,反而是那么有趣;原來自己也可以寫RTOS,成就感立馬爆棚。
當(dāng)徹底掌握第一部分的知識之后,再學(xué)習(xí)其他RTOS,可以說十分輕松?v觀現(xiàn)在市面上流行的幾種RTOS,它們的內(nèi)核實現(xiàn)差異不大,只需要深入研究其中一種即可,沒有必要對每一種RTOS都深入地研究源碼,但如果時間允許,看一看也并無壞處。第二部分重點講解RT-Thread的移植、內(nèi)核中每個組件的應(yīng)用,比起第一部分,這部分內(nèi)容掌握起來應(yīng)該比較容易。
全書內(nèi)容循序漸進,不斷迭代,尤其在第一部分,前一章是后一章的基礎(chǔ),必須從頭開始閱讀,不能進行跳躍式的閱讀。在學(xué)習(xí)時務(wù)必做到兩點:一是不能一味地看書,要把代碼和書本結(jié)合起來學(xué)習(xí),一邊看書,一邊調(diào)試代碼。如何調(diào)試代碼呢?即單步執(zhí)行每一條程序,看程序的執(zhí)行流程和執(zhí)行的效果與自己所想的是否一致。二是在每學(xué)完一章之后,必須將配套的例程重寫一遍(切記不要復(fù)制,即使是一個分號,但可以照書錄入),做到舉一反三,確保真正理解。在自己寫的時候難免錯誤百出,要珍惜這些錯誤,好好調(diào)試,這是你提高編程能力的最好機會。記住,程序不是一氣呵成寫出來的,而是一步一步調(diào)試出來的。
本書的編寫風(fēng)格
本書第一部分主要以RT-Thread Nano 3.0.3官方源碼為藍本,抽絲剝繭,不斷迭代,教你如何從0開始把RT-Thread內(nèi)核寫出來。書中涉及的數(shù)據(jù)類型、變量名稱、函數(shù)名稱、文件名稱、文件存放的位置都完全按照RT-Thread官方的方式來實現(xiàn)。學(xué)完這本書之后,你可以無縫地切換到原版的RT-Thread中使用。要注意的是,在實現(xiàn)的過程中,某些函數(shù)中會去掉一些形參和冗余的代碼,只保留核心的功能,但這并不會影響我們學(xué)習(xí)。
本書第二部分主要介紹RT-Thread的移植和內(nèi)核組件的使用,不會再去深入講解源碼,而是著重講解如何應(yīng)用,如果對第一部分不感興趣,也可以跳過第一部分,直接進入第二部分的學(xué)習(xí)。
本書還有姊妹篇——《FreeRTOS內(nèi)核實現(xiàn)與應(yīng)用開發(fā)實戰(zhàn)指南:基于STM32》,兩本書的編寫風(fēng)格、內(nèi)容框架和章節(jié)命名與排序基本一致,語言闡述類似,且涉及RTOS抽象層的理論部分也相同,不同之處在于RTOS的實現(xiàn)原理、內(nèi)核源碼的講解和上層API的使用,這些內(nèi)容才是重點部分,是讀者學(xué)習(xí)的核心。例如,雖然兩本書的第一部分的章節(jié)名稱基本類似,但內(nèi)容不同,因為針對的RTOS不一樣。其中,關(guān)于新建RT-Thread工程和裸機系統(tǒng)與多線程(任務(wù))系統(tǒng)的描述屬于RTOS抽象層的理論部分,不具體針對某個RTOS,所以基本一樣。第二部分中,對于什么是線程(任務(wù))、阻塞延時和信號量的應(yīng)用等RTOS抽象層的理論講解也基本類似,但是具體涉及這兩個RTOS的原理實現(xiàn)和代碼講解時則完全不同。
如果讀者已經(jīng)學(xué)習(xí)了其中一本書,再學(xué)習(xí)另外一本的話,那么涉及RTOS抽象層的理論部分可跳過,只需要把精力放在RTOS內(nèi)核的實現(xiàn)和源碼API的應(yīng)用方面。因為現(xiàn)有的RTOS在理論層基本都是相通的,但在具體的代碼實現(xiàn)上各有特點,所以可以用這兩本書進行互補學(xué)習(xí),掌握了其中一本書的知識,再學(xué)習(xí)另外一本書定會得心應(yīng)手,事半功倍。
本書的參考資料和配套硬件
關(guān)于本書的參考資料和配套硬件的信息,請參考本書附錄部分。
本書的技術(shù)論壇
如果在學(xué)習(xí)過程中遇到問題,可以到野火電子論壇www.firebbs.cn發(fā)帖交流,開源共享,共同進步。
鑒于水平有限,書中難免有錯漏之處,熱心的讀者也可把勘誤發(fā)送到論壇上以便改進。祝你學(xué)習(xí)愉快,RT-Thread的世界,野火與你同行。
推薦序
前言
引言
第一部分 從0到1教你寫RT-Thread內(nèi)核
第1章 新建RT-Thread工程——軟件仿真 2
1.1 新建本地工程文件夾 2
1.2 使用KEIL新建工程 3
1.2.1 New Project 3
1.2.2 Select Device for Target 3
1.2.3 Manage Run-Time Environment 4
1.3 在KEIL工程中新建文件組 5
1.4 在KEIL工程中添加文件 6
1.5 調(diào)試配置 7
1.5.1 設(shè)置軟件仿真 7
1.5.2 修改時鐘大小 8
1.5.3 添加頭文件路徑 9
第2章 裸機系統(tǒng)與多線程系統(tǒng) 10
2.1 裸機系統(tǒng) 10
2.1.1 輪詢系統(tǒng) 10
2.1.2 前后臺系統(tǒng) 11
2.2 多線程系統(tǒng) 12
第3章 線程的定義與線程切換的實現(xiàn) 15
3.1 什么是線程 16
3.2 創(chuàng)建線程 17
3.2.1 定義線程棧 17
3.2.2 定義線程函數(shù) 19
3.2.3 定義線程控制塊 20
3.2.4 實現(xiàn)線程創(chuàng)建函數(shù) 20
3.3 實現(xiàn)就緒列表 30
3.3.1 定義就緒列表 30
3.3.2 將線程插入就緒列表 30
3.4 實現(xiàn)調(diào)度器 31
3.4.1 調(diào)度器初始化 32
3.4.2 啟動調(diào)度器 33
3.4.3 第一次線程切換 34
3.4.4 系統(tǒng)調(diào)度 41
3.5 main()函數(shù) 44
3.6 實驗現(xiàn)象 47
第4章 臨界段的保護 50
4.1 什么是臨界段 50
4.2 Cortex-M內(nèi)核快速關(guān)中斷指令 50
4.3 關(guān)中斷 51
4.4 開中斷 51
4.5 臨界段代碼的應(yīng)用 52
4.6 實驗現(xiàn)象 56
第5章 對象容器 57
5.1 什么是對象 57
5.1.1 對象枚舉的定義 57
5.1.2 對象數(shù)據(jù)類型的定義 57
5.1.3 在線程控制塊中添加對象成員 58
5.2 什么是容器 59
5.3 容器的接口實現(xiàn) 63
5.3.1 獲取指定類型的對象信息 64
5.3.2 對象初始化 64
5.3.3 調(diào)用對象初始化函數(shù) 67
5.4 實驗現(xiàn)象 67
第6章 空閑線程與阻塞延時 68
6.1 實現(xiàn)空閑線程 68
6.1.1 定義空閑線程的棧 68
6.1.2 定義空閑線程的線程控制塊 69
6.1.3 定義空閑線程函數(shù) 69
6.1.4 空閑線程初始化 69
6.2 實現(xiàn)阻塞延時 70
6.3 SysTick_Handler()中斷服務(wù)函數(shù) 73
6.4 main()函數(shù) 77
6.5 實驗現(xiàn)象 80
第7章 多優(yōu)先級 82
7.1 就緒列表 82
7.1.1 線程就緒優(yōu)先級組 82
7.1.2 線程優(yōu)先級表 86
7.2 修改代碼以支持多優(yōu)先級 88
7.2.1 修改線程控制塊 88
7.2.2 修改調(diào)度器初始化函數(shù)rt_system_scheduler_init() 90
7.2.3 修改線程初始化函數(shù)rt_thread_init() 91
7.2.4 添加線程啟動函數(shù)rt_thread_startup() 92
7.2.5 修改空閑線程初始化函數(shù)rt_thread_idle_init() 93
7.2.6 修改啟動系統(tǒng)調(diào)度器函數(shù)rt_system_scheduler_start() 94
7.2.7 修改系統(tǒng)調(diào)度函數(shù)rt_schedule() 95
7.2.8 修改阻塞延時函數(shù)rt_thread_delay() 98
7.2.9 修改時基更新函數(shù)rt_tick_increase() 98
7.3 main()函數(shù) 99
7.4 實驗現(xiàn)象 102
第8章 定時器 103
8.1 實現(xiàn)定時器 103
8.1.1 系統(tǒng)定時器列表 103
8.1.2 系統(tǒng)定時器列表初始化 104
8.1.3 定義定時器結(jié)構(gòu)體 104
8.1.4 在線程控制塊中內(nèi)置定時器 105
8.1.5 定時器初始化函數(shù) 106
8.1.6 定時器刪除函數(shù) 108
8.1.7 定時器停止函數(shù) 108
8.1.8 定時器控制函數(shù) 109
8.1.9 定時器啟動函數(shù) 110
8.1.10 定時器掃描函數(shù) 115
8.2 修改代碼以支持定時器 118
8.2.1 修改線程初始化函數(shù) 118
8.2.2 修改線程延時函數(shù) 119
8.2.3 修改系統(tǒng)時基更新函數(shù) 121
8.2.4 修改main.c文件 122
8.3 實驗現(xiàn)象 126
第9章 時間片 127
9.1 實現(xiàn)時間片 127
9.1.1 在線程控制塊中添加時間片相關(guān)成員 127
9.1.2 修改線程初始化函數(shù) 128
9.1.3 修改空閑線程初始化函數(shù) 129
9.1.4 修改系統(tǒng)時基更新函數(shù) 129
9.2 修改main.c文件 131
9.3 實驗現(xiàn)象 135
第二部分 RT-Thread 內(nèi)核應(yīng)用開發(fā)
第10章 移植RT-Thread到STM32 138
10.1 獲取STM32的裸機工程模板 138
10.2 下載RT-Thread Nano源碼 138
10.3 安裝RT-Thread Package 139
10.4 向裸機工程中添加RT-Thread源碼 140
10.4.1 復(fù)制RT-Thread Package到裸機工程根目錄 140
10.4.2 復(fù)制rtconfig.h文件到User文件夾 141
10.4.3 復(fù)制board.c文件到User文件夾 141
10.4.4 rt-thread文件夾內(nèi)容簡介 141
10.4.5 添加RT-Thread源碼到工程組文件夾 143
10.5 rtconfig.h文件 145
10.5.1 rtconfig.h文件內(nèi)容講解 145
10.5.2 rtconfig.h文件修改 152
10.6 board.c文件 156
10.6.1 board.c文件內(nèi)容講解 156
10.6.2 board.c文件修改 160
10.7 添加core_delay.c和core_delay.h文件 167
10.8 修改main.c 171
10.9 下載驗證 172
第11章 線程 173
11.1 硬件初始化 173
11.2 創(chuàng)建單線程——SRAM靜態(tài)內(nèi)存 175
11.2.1 定義線程函數(shù) 175
11.2.2 定義線程棧 176
11.2.3 定義線程控制塊 176
11.2.4 初始化線程 176
11.2.5 啟動線程 177
11.2.6 main.c文件內(nèi)容 177
11.3 下載驗證SRAM靜態(tài)內(nèi)存單線程 179
11.4 創(chuàng)建單線程——SRAM動態(tài)內(nèi)存 179
11.4.1 動態(tài)內(nèi)存空間堆的來源