3dwoo大學簡體電腦書店
RT-Thread內核實現與應用開發實戰指南:基于STM32
( 簡體 字)
作者:劉火良 楊森 編著類別:1. -> 電腦組織與體系結構 -> 單晶片 -> 電腦組織與體系結構 -> 單晶片 -> STM32
出版社:機械工業出版社RT-Thread內核實現與應用開發實戰指南:基于STM32 3dWoo書號: 50392
詢問書籍請說出此書號!
有庫存
NT售價: 495
出版日:12/1/2018
頁數:399
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787111613664 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
推薦序
前言
引言
第一部分 從0到1教你寫RT-Thread內核
第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 調試配置 7
1.5.1 設置軟件仿真 7
1.5.2 修改時鐘大小 8
1.5.3 添加頭文件路徑 9
第2章 裸機系統與多線程系統 10
2.1 裸機系統 10
2.1.1 輪詢系統 10
2.1.2 前后臺系統 11
2.2 多線程系統 12
第3章 線程的定義與線程切換的實現 15
3.1 什么是線程 16
3.2 創建線程 17
3.2.1 定義線程棧 17
3.2.2 定義線程函數 19
3.2.3 定義線程控制塊 20
3.2.4 實現線程創建函數 20
3.3 實現就緒列表 30
3.3.1 定義就緒列表 30
3.3.2 將線程插入就緒列表 30
3.4 實現調度器 31
3.4.1 調度器初始化 32
3.4.2 啟動調度器 33
3.4.3 第一次線程切換 34
3.4.4 系統調度 41
3.5 main()函數 44
3.6 實驗現象 47
第4章 臨界段的保護 50
4.1 什么是臨界段 50
4.2 Cortex-M內核快速關中斷指令 50
4.3 關中斷 51
4.4 開中斷 51
4.5 臨界段代碼的應用 52
4.6 實驗現象 56
第5章 對象容器 57
5.1 什么是對象 57
5.1.1 對象枚舉的定義 57
5.1.2 對象數據類型的定義 57
5.1.3 在線程控制塊中添加對象成員 58
5.2 什么是容器 59
5.3 容器的接口實現 63
5.3.1 獲取指定類型的對象信息 64
5.3.2 對象初始化 64
5.3.3 調用對象初始化函數 67
5.4 實驗現象 67
第6章 空閑線程與阻塞延時 68
6.1 實現空閑線程 68
6.1.1 定義空閑線程的棧 68
6.1.2 定義空閑線程的線程控制塊 69
6.1.3 定義空閑線程函數 69
6.1.4 空閑線程初始化 69
6.2 實現阻塞延時 70
6.3 SysTick_Handler()中斷服務函數 73
6.4 main()函數 77
6.5 實驗現象 80
第7章 多優先級 82
7.1 就緒列表 82
7.1.1 線程就緒優先級組 82
7.1.2 線程優先級表 86
7.2 修改代碼以支持多優先級 88
7.2.1 修改線程控制塊 88
7.2.2 修改調度器初始化函數rt_system_scheduler_init() 90
7.2.3 修改線程初始化函數rt_thread_init() 91
7.2.4 添加線程啟動函數rt_thread_startup() 92
7.2.5 修改空閑線程初始化函數rt_thread_idle_init() 93
7.2.6 修改啟動系統調度器函數rt_system_scheduler_start() 94
7.2.7 修改系統調度函數rt_schedule() 95
7.2.8 修改阻塞延時函數rt_thread_delay() 98
7.2.9 修改時基更新函數rt_tick_increase() 98
7.3 main()函數 99
7.4 實驗現象 102
第8章 定時器 103
8.1 實現定時器 103
8.1.1 系統定時器列表 103
8.1.2 系統定時器列表初始化 104
8.1.3 定義定時器結構體 104
8.1.4 在線程控制塊中內置定時器 105
8.1.5 定時器初始化函數 106
8.1.6 定時器刪除函數 108
8.1.7 定時器停止函數 108
8.1.8 定時器控制函數 109
8.1.9 定時器啟動函數 110
8.1.10 定時器掃描函數 115
8.2 修改代碼以支持定時器 118
8.2.1 修改線程初始化函數 118
8.2.2 修改線程延時函數 119
8.2.3 修改系統時基更新函數 121
8.2.4 修改main.c文件 122
8.3 實驗現象 126
第9章 時間片 127
9.1 實現時間片 127
9.1.1 在線程控制塊中添加時間片相關成員 127
9.1.2 修改線程初始化函數 128
9.1.3 修改空閑線程初始化函數 129
9.1.4 修改系統時基更新函數 129
9.2 修改main.c文件 131
9.3 實驗現象 135
第二部分 RT-Thread 內核應用開發
第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 復制RT-Thread Package到裸機工程根目錄 140
10.4.2 復制rtconfig.h文件到User文件夾 141
10.4.3 復制board.c文件到User文件夾 141
10.4.4 rt-thread文件夾內容簡介 141
10.4.5 添加RT-Thread源碼到工程組文件夾 143
10.5 rtconfig.h文件 145
10.5.1 rtconfig.h文件內容講解 145
10.5.2 rtconfig.h文件修改 152
10.6 board.c文件 156
10.6.1 board.c文件內容講解 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 創建單線程——SRAM靜態內存 175
11.2.1 定義線程函數 175
11.2.2 定義線程棧 176
11.2.3 定義線程控制塊 176
11.2.4 初始化線程 176
11.2.5 啟動線程 177
11.2.6 main.c文件內容 177
11.3 下載驗證SRAM靜態內存單線程 179
11.4 創建單線程——SRAM動態內存 179
11.4.1 動態內存空間堆的來源 180
11.4.2 定義線程函數 181
11.4.3 定義線程棧 181
11.4.4 定義線程控制塊指針 181
11.4.5 創建線程 181
11.4.6 啟動線程 182
11.4.7 main.c文件內容 182
11.5 下載驗證SRAM動態內存單線程 184
11.6 創建多線程——SRAM動態內存 185
11.7 下載驗證SRAM動態內存多線程 187
第12章 重映射串口到rt_kprintf()函數 188
12.1 rt_kprintf()函數定義 188
12.2 自定義rt_hw_console_output()函數 189
12.3 測試rt_kprintf()函數 191
12.3.1 硬件初始化 191
12.3.2 編寫rt_kprintf()測試代碼 192
12.3.3 下載驗證 192
第13章 RT-Thread的啟動流程 194
13.1 “萬事俱備,只欠東風”法 194
13.2 “小心翼翼,十分謹慎”法 195
13.3 兩種方法的適用情況 197
13.4 RT-Thread的啟動流程 197
13.4.1 $Sub$$main()函數 198
13.4.2 rtthread_startup()函數 199
13.4.3 rt_application_init()函數 201
13.4.4 $Super$$main()函數 202
13.4.5 main()函數 203
第14章 線程管理 205
14.1 線程的基本概念 205
14.2 線程調度器的基本概念 205
14.3 線程狀態的概念 206
14.4 線程狀態遷移 206
14.5 常用的線程函數 207
14.5.1 線程掛起函數rt_thread_suspend() 207
14.5.2 線程恢復函數rt_thread_resume() 209
14.6 線程的設計要點 210
14.7 線程管理實驗 212
14.8 實驗現象 215
第15章 消息隊列 216
15.1 消息隊列的基本概念 216
15.2 消息隊列的運作機制 217
15.3 消息隊列的阻塞機制 218
15.4 消息隊列的應用場景 218
15.5 消息隊列控制塊 218
15.6 消息隊列函數 219
15.6.1 消息隊列創建函數rt_mq_create() 219
15.6.2 消息隊列刪除函數rt_mq_delete() 221
15.6.3 消息隊列發送消息函數rt_mq_send() 223
15.6.4 消息隊列接收消息函數rt_mq_recv() 226
15.7 消息隊列使用注意事項 229
15.8 消息隊列實驗 230
15.9 實驗現象 233
第16章 信號量 234
16.1 信號量的基本概念 234
16.2 二值信號量的應用場景 235
16.3 二值信號量的運作機制 236
16.4 計數型信號量的運作機制 236
16.5 信號量控制塊 237
16.6 信號量函數 237
16.6.1 信號量創建函數rt_sem_create() 238
16.6.2 信號量刪除函數rt_sem_delete() 239
16.6.3 信號量釋放函數rt_sem_release() 240
16.6.4 信號量獲取函數rt_sem_take() 242
16.7 信號量實驗 245
16.7.1 二值信號量同步實驗 245
16.7.2 計數型信號量實驗 248
16.8 實驗現象 251
16.8.1 二值信號量同步實驗現象 251
16.8.2 計數型信號量實驗現象 252
第17章 互斥量 253
17.1 互斥量的基本概念 253
17.2 互斥量的優先級繼承機制 253
17.3 互斥量的應用場景 256
17.4 互斥量的運作機制 256
17.5 互斥量控制塊 257
17.6 互斥量函數 258
17.6.1 互斥量創建函數rt_mutex_create() 258
17.6.2 互斥量刪除函數rt_mutex_delete() 260
17.6.3 互斥量釋放函數rt_mutex_release() 261
17.6.4 互斥量獲取函數rt_mutex_take() 264
17.7 互斥量使用注意事項 268
17.8 互斥量實驗 268
17.9 實驗現象 271
第18章 事件 272
18.1 事件的基本概念 272
18.2 事件的應用場景 273
18.3 事件的運作機制 273
18.4 事件控制塊 275
18.5 事件函數 275
18.5.1 事件創建函數rt_event_create() 275
18.5.2 事件刪除函數rt_event_delete() 276
18.5.3 事件發送函數rt_event_send() 277
18.5.4 事件接收函數rt_event_recv() 281
18.6 事件實驗 285
18.7 實驗現象 288
第19章 軟件定時器 289
19.1 軟件定時器的基本概念 289
19.2 軟件定時器的應用場景 290
19.3 軟件定時器的精度 291
19.4 軟件定時器的運作機制 291
19.5 定時器超時函數 293
19.6 軟件定時器的使用 297
19.7 軟件定時器實驗 299
19.8 實驗現象 302
第20章 郵箱 303
20.1 郵箱的基本概念 303
20.2 郵箱的運作機制 304
20.3 郵箱的應用場景 305
20.4 郵箱的應用技巧 305
20.5 郵箱控制塊 306
20.6 郵箱函數 306
20.6.1 郵箱創建函數rt_mb_create() 306
20.6.2 郵箱刪除函數rt_mb_delete() 308
20.6.3 郵箱郵件發送函數rt_mb_send_wait()(阻塞) 310
20.6.4 郵箱郵件發送函數rt_mb_send ()(非阻塞) 315
20.6.5 郵箱郵件接收函數rt_mb_recv() 316
20.7 郵箱實驗 320
20.8 實驗現象 324
第21章 內存管理 325
21.1 內存管理的基本概念 325
21.2 內存管理的運作機制 327
21.2.1 靜態內存管理 327
21.2.2 動態內存管理 328
21.3 內存管理的應用場景 330
21.4 靜態內存管理函數 331
21.4.1 靜態內存控制塊 331
21.4.2 靜態內存創建函數rt_mp_create() 332
21.4.3 靜態內存刪除函數rt_mp_delete() 335
21.4.4 靜態內存初始化函數rt_mp_init() 338
21.4.5 靜態內存申請函數rt_mp_alloc() 340
21.4.6 靜態內存釋放函數rt_mp_free() 344
21.5 動態內存管理函數 346
21.5.1 系統堆內存初始化函數rt_system_heap_init() 346
21.5.2 系統堆內存申請函數rt_malloc() 350
21.5.3 系統堆內存釋放函數rt_free() 354
21.6 內存管理實驗 357
21.6.1 靜態內存管理實驗 357
21.6.2 動態內存管理實驗 361
21.7 實驗現象 364
21.7.1 靜態內存管理實驗現象 364
21.7.2 動態內存管理實驗現象 364
第22章 中斷管理 366
22.1 異常與中斷的基本概念 366
22.1.1 中斷 367
22.1.2 和中斷相關的術語 367
22.2 中斷管理的運作機制 368
22.3 中斷延遲的概念 369
22.4 中斷管理的應用場景 370
22.5 ARM Cortex-M的中斷管理 370
22.6 中斷管理實驗 372
22.7 實驗現象 377
第23章 雙向鏈表 378
23.1 雙向鏈表的基本概念 378
23.2 雙向鏈表函數 378
23.2.1 鏈表初始化函數rt_list_init() 378
23.2.2 向鏈表中插入節點 379
23.2.3 從鏈表刪除節點函數rt_list_remove() 381
23.3 雙向鏈表實驗 382
23.4 實驗現象 385
第24章 CPU利用率統計 387
24.1 CPU利用率的基本概念 387
24.2 CPU利用率的作用 387
24.3 CPU利用率統計實現 388
24.4 CPU利用率實驗 392
24.5 實驗現象 394
附錄 參考資料和配套硬件 396
全書內容循序漸進, 不斷迭代。在學習時務必做到兩點:一是不能一味地看書,要把代碼和書本結合起來學習,一邊看書, 一邊調試代碼;二是在學完每一章之后,將配套例程重寫一遍,做到舉一反三,真正理解。本書的電子版和配套的源碼均可到野火論壇(www.fireBBS.cn)下載,歡迎各位讀者積極參與交流分享。



閱讀建議

全書內容循序漸進, 不斷迭代,在學習

時務必做到兩點:一是不能一味地

看書,要把代碼和書本結合起來學習,

一邊看書, 一邊調試代碼;二是學完每一章之后,將配套例程重寫一遍,做到舉一反三,真正理解。本書電子版和配套的源碼均可到野火論壇(www.fireBBS.cn)下載,歡迎各位讀者積極參與交流分享。
如何學習本書

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

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

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

本書的編寫風格

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

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

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

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

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

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

本書的技術論壇

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

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