RT-Thread內核實現與應用開發實戰指南:基于STM32( 簡體 字) | |
作者:劉火良 楊森 編著 | 類別:1. -> 電腦組織與體系結構 -> 單晶片 -> 電腦組織與體系結構 -> 單晶片 -> 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的世界,野火與你同行。 |