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