uC/OS-III內核實現與應用開發實戰指南:基于STM32( 簡體 字) | |
作者:劉火良 楊森 編著 | 類別:1. -> 電腦組織與體系結構 -> 嵌入式系統 |
出版社:機械工業出版社 | 3dWoo書號: 51346 詢問書籍請說出此書號! 有庫存 NT售價: 645 元 |
出版日:6/1/2019 | |
頁數:505 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787111628248 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
前言
引言 第一部分 從0到1教你寫 C/OS內核 第1章 新建工程—軟件仿真 2 1.1 新建本地工程文件夾 2 1.2 使用KEIL新建工程 2 1.2.1 New Project 2 1.2.2 Select Device For Target 3 1.2.3 Manage Run-Time Environment 3 1.3 在KEIL工程中新建文件組 4 1.4 在KEIL工程中添加文件 4 1.5 調試配置 6 1.5.1 設置軟件仿真 6 1.5.2 修改時鐘大小 6 1.5.3 添加頭文件路徑 7 第2章 裸機系統與多任務系統 8 2.1 裸機系統 8 2.1.1 輪詢系統 8 2.1.2 前后臺系統 9 2.2 多任務系統 10 第3章 任務的定義與任務切換 13 3.1 多任務系統中任務的概念 14 3.2 創建任務 15 3.2.1 定義任務棧 15 3.2.2 定義任務函數 16 3.2.3 定義任務控制塊 17 3.2.4 實現任務創建函數 18 3.3 操作系統初始化 22 3.4 啟動系統 24 3.5 任務切換 27 3.6 main()函數 33 3.7 實驗現象 37 第4章 任務時間片運行 39 4.1 SysTick簡介 39 4.2 初始化SysTick 40 4.3 編寫SysTick中斷服務函數 41 4.4 main()函數 42 4.5 實驗現象 44 第5章 空閑任務與阻塞延時 45 5.1 實現空閑任務 45 5.1.1 定義空閑任務棧 45 5.1.2 定義空閑任務的任務控制塊 46 5.1.3 定義空閑任務函數 47 5.1.4 空閑任務初始化 47 5.2 實現阻塞延時 48 5.3 main()函數 50 5.4 實驗現象 52 第6章 時間戳 53 6.1 時間戳簡介 53 6.2 時間戳的實現 53 6.3 時間戳代碼 54 6.3.1 CPU_Init()函數 54 6.3.2 CPU_TS_Init()函數 55 6.3.3 CPU_TS_TmrInit()函數 56 6.3.4 BSP_CPU_ClkFreq()函數 57 6.3.5 CPU_TS_TmrFreqSet()函數 58 6.3.6 CPU_TS_TmrRd()函數 58 6.3.7 OS_TS_GET()函數 59 6.4 main()函數 59 6.5 實驗現象 61 第7章 臨界段 62 7.1 臨界段簡介 62 7.2 Cortex-M內核快速關中斷指令 62 7.3 關中斷 63 7.4 開中斷 63 7.5 臨界段代碼的應用 64 7.6 測量關中斷時間 68 7.6.1 測量關中斷時間初始化 68 7.6.2 測量最大關中斷時間 69 7.6.3 獲取最大關中斷時間 70 7.7 main()函數 71 7.8 實驗現象 71 第8章 就緒列表 72 8.1 優先級表的定義及函數 72 8.2 就緒列表的定義及函數 80 8.3 main()函數 88 8.4 實驗現象 88 第9章 多優先級 89 9.1 定義優先級相關全局變量 89 9.2 修改OSInit()函數 89 9.3 修改任務控制塊 90 9.4 修改OSTaskCreate()函數 90 9.5 修改OS_IdleTaskInit()函數 92 9.6 修改OSStart()函數 93 9.7 修改PendSV_Handler()函數 93 9.8 修改OSTimeDly()函數 94 9.9 修改OSSched()函數 95 9.10 修改OSTimeTick()函數 97 9.11 main()函數 98 9.12 實驗現象 101 第10章 時基列表 103 10.1 實現時基列表 103 10.1.1 定義時基列表變量 103 10.1.2 修改任務控制塊 104 10.1.3 實現時基列表相關函數 106 10.2 修改OSTimeDly()函數 113 10.3 修改OSTimeTick()函數 114 10.4 main()函數 114 10.5 實驗現象 114 第11章 時間片 115 11.1 實現時間片 115 11.1.1 修改任務控制塊 115 11.1.2 實現時間片調度函數 116 11.2 修改OSTimeTick()函數 118 11.3 修改OSTaskCreate()函數 118 11.4 修改OS_IdleTaskInit()函數 120 11.5 main()函數 120 11.6 實驗現象 122 第12章 任務的掛起和恢復 124 12.1 實現任務的掛起和恢復 124 12.1.1 定義任務的狀態 124 12.1.2 修改任務控制塊 125 12.1.3 編寫任務掛起和恢復函數 126 12.2 main()函數 131 12.3 實驗現象 133 第13章 任務的刪除 134 13.1 實現任務刪除 134 13.2 main()函數 136 13.3 實驗現象 136 第二部分 C/OS-III內核 應用開發 第14章 移植C/OS-III到STM32 138 14.1 獲取STM32的裸機工程模板 138 14.2 下載C/OS-III源碼 138 14.3 C/OS-III源碼文件介紹 141 14.3.1 EvalBoards 141 14.3.2 C-CPU 141 14.3.3 C-LIB 143 14.3.4 C/OS-III 143 14.4 移植到STM32工程 145 14.4.1 在工程中添加文件分組 145 14.4.2 添加文件到對應分組 145 14.4.3 添加頭文件路徑到工程中 146 14.4.4 具體的工程文件修改 147 14.4.5 修改源碼中的bsp.c與bsp.h文件 149 14.5 按需配置最適合的工程 151 14.5.1 os_cfg.h 151 14.5.2 cpu_cfg.h 153 14.5.3 os_cfg_app.h 154 14.6 修改app.c 155 14.7 下載驗證 157 第15章 創建任務 158 15.1 硬件初始化 158 15.2 創建單任務 160 15.2.1 定義任務棧 160 15.2.2 定義任務控制塊 160 15.2.3 定義任務主體函數 160 15.2.4 創建任務 161 15.2.5 啟動任務 163 15.2.6 app.c 163 15.3 下載驗證單任務 166 15.4 創建多任務 166 15.5 下載驗證多任務 171 第16章 C/OS-III的啟動流程 172 16.1 “萬事俱備,只欠東風”法 172 16.2 “小心翼翼,十分謹慎”法 173 16.3 兩種方法的適用情況 175 16.4 系統的啟動 175 16.4.1 系統初始化 175 16.4.2 CPU初始化 179 16.4.3 SysTick初始化 182 16.4.4 內存初始化 183 16.4.5 OSStart()函數 183 16.4.6 app.c 184 第17章 任務管理 187 17.1 任務的基本概念 187 17.2 任務調度器的基本概念 188 17.3 任務狀態遷移 188 17.4 C/OS的任務狀態 190 17.5 常用的任務函數 190 17.5.1 任務掛起函數OS_TaskSuspend() 191 17.5.2 任務恢復函數 OSTaskResume() 194 17.5.3 任務刪除函數OSTaskDel() 198 17.5.4 任務延時函數 201 17.6 任務的設計要點 212 17.7 任務管理實驗 213 17.8 實驗現象 222 第18章 消息隊列 223 18.1 消息隊列的基本概念 223 18.2 消息隊列的工作過程 224 18.2.1 消息池初始化 224 18.2.2 消息隊列的運作機制 226 18.3 消息隊列的阻塞機制 227 18.4 消息隊列的應用場景 227 18.5 消息隊列的結構 228 18.6 消息隊列常用函數 230 18.6.1 消息隊列創建函數OSQCreate() 230 18.6.2 消息隊列刪除函數OSQDel() 233 18.6.3 消息隊列發送函數OSQPost() 239 18.6.4 消息隊列獲取函數OSQPend() 249 18.7 使用消息隊列的注意事項 256 18.8 消息隊列實驗 257 18.9 實驗現象 263 第19章 信號量 264 19.1 信號量的基本概念 264 19.1.1 二值信號量 264 19.1.2 計數信號量 265 19.2 信號量的應用場景 265 19.3 二值信號量的運作機制 266 19.4 計數信號量的運作機制 267 19.5 信號量控制塊 267 19.6 信號量函數 268 19.6.1 信號量創建函數 OSSemCreate() 268 19.6.2 信號量刪除函數OSSemDel() 271 19.6.3 信號量釋放函數OSSemPost() 275 19.6.4 信號量獲取函數OSSemPend() 280 19.7 使用信號量的注意事項 285 19.8 信號量實驗 286 19.8.1 二值信號量同步實驗 286 19.8.2 計數信號量實驗 292 19.9 實驗現象 298 19.9.1 二值信號量同步實驗現象 298 19.9.2 計數信號量實驗現象 299 第20章 互斥量 300 20.1 互斥量的基本概念 300 20.2 互斥量的優先級繼承機制 300 20.3 互斥量的應用場景 303 20.4 互斥量的運作機制 303 20.5 互斥量控制塊 304 20.6 互斥量函數 306 20.6.1 創建互斥量函數OSMutexCreate() 306 20.6.2 刪除互斥量函數OSMutexDel() 308 20.6.3 獲取互斥量函數OSMutexPend() 314 20.6.4 釋放互斥量函數OSMutexPost() 320 20.7 互斥量相關實驗 324 20.7.1 模擬優先級翻轉實驗 324 20.7.2 互斥量實驗 330 20.8 實驗現象 336 20.8.1 模擬優先級翻轉實驗現象 336 20.8.2 互斥量實驗現象 336 第21章 事件 338 21.1 事件的基本概念 338 21.2 事件的應用場景 339 21.3 事件的運作機制 339 21.4 事件控制塊 341 21.5 事件函數 342 21.5.1 事件創建函數OSFlagCreate() 342 21.5.2 事件刪除函數OSFlagDel() 344 21.5.3 事件設置函數OSFlagPost() 348 21.5.4 事件等待函數OSFlagPend() 355 21.6 事件實驗 366 21.7 實驗現象 371 第22章 軟件定時器 372 22.1 軟件定時器的基本概念 372 22.2 軟件定時器的應用場景 374 22.3 軟件定時器的精度 374 22.4 軟件定時器控制塊 375 22.5 軟件定時器函數 376 22.5.1 軟件定時器創建函數 OSTmrCreate() 376 22.5.2 軟件定時器啟動函數OSTmrStart() 379 22.5.3 軟件定時器列表管理 384 22.5.4 軟件定時器停止函數OSTmrStop() 387 22.5.5 軟件定時器刪除函數OSTmrDel() 391 22.6 軟件定時器任務 393 22.7 軟件定時器實驗 398 22.8 實驗現象 403 第23章 任務信號量 405 23.1 任務信號量的基本概念 405 23.2 任務信號量函數 406 23.2.1 任務信號量釋放函數OSTaskSemPost() 406 23.2.2 任務信號量獲取函數OSTaskSemPend() 410 23.3 任務信號量實驗 414 23.3.1 任務信號量代替二值信號量實驗 414 23.3.2 任務信號量代替計數信號量實驗 419 23.4 實驗現象 424 23.4.1 任務信號量代替二值信號量實驗現象 424 23.4.2 任務信號量代替計數信號量實驗現象 425 第24章 任務消息隊列 426 24.1 任務消息隊列的基本概念 426 24.2 任務消息隊列函數 427 24.2.1 任務消息隊列發送函數OSTaskQPost() 427 24.2.2 任務消息隊列獲取函數OSTaskQPend() 431 24.3 任務消息隊列實驗 435 24.4 實驗現象 439 第25章 內存管理 440 25.1 內存管理的基本概念 440 25.2 內存管理的運作機制 441 25.3 內存管理的應用場景 443 25.4 內存管理函數 443 25.4.1 內存池創建函數OSMemCreate() 443 25.4.2 內存申請函數OSMemGet() 447 25.4.3 內存釋放函數OSMemPut() 449 25.5 內存管理實驗 451 25.6 實驗現象 456 第26章 中斷管理 457 26.1 異常與中斷的基本概念 457 26.1.1 與中斷相關的硬件 458 26.1.2 與中斷相關的術語 458 26.2 中斷的運作機制 459 26.3 中斷延遲的概念 460 26.4 中斷的應用場景 461 26.5 ARM Cortex-M的中斷管理 461 26.6 中斷延遲發布 463 26.6.1 中斷延遲發布的概念 463 26.6.2 中斷隊列控制塊 465 26.6.3 中斷延遲發布任務初始化函數OS_IntQTaskInit() 466 26.6.4 中斷延遲發布過程函數OS_IntQPost() 468 26.6.5 中斷延遲發布任務函數OS_IntQTask() 471 26.7 中斷管理實驗 475 26.8 實驗現象 481 第27章 CPU利用率及棧檢測統計 482 27.1 CPU利用率的基本概念及作用 482 27.2 CPU利用率統計初始化 483 27.3 棧溢出檢測概念及作用 485 27.4 棧溢出檢測過程 487 27.5 統計任務函數OS_StatTask() 487 27.6 棧檢測函數OSTaskStkChk() 493 27.7 任務棧大小的確定 496 27.8 CPU利用率及棧檢測統計實驗 496 27.9 實驗現象 502 附錄 503 本書基于野火STM32全系列開發板介紹μC/OS-III內核實現與應用開發,全書分為兩部分:第一部分先教你如何從0到1把μC/OS-III內核寫出來,從底層的匯編開始講解任務如何定義、如何切換,還講解了阻塞延時如何實現、如何支持多優先級、如何實現時基列表以及時間片等μC/OS的核心知識點;第二部分講解μC/OS-III內核組件的應用以及使用μC/OS-III進行多任務編程。
本書內容翔實,案例豐富,配有大量示例代碼,適合作為嵌入式領域科技工作者的參考書,也適合相關專業的學生學習參考。 全書內容循序漸進,不斷迭代,在學習的時候務必做到兩點:一是不能一味地看書,要把代碼和書本結合起來學習,一邊看書, 一邊調試代碼;二是在學完每一章之后,將配套例程重寫一遍,做到舉一反三,真正理解。 本書電子版和配套的源碼均可到野火論壇下載,歡迎各位讀者積極參與交流分享 。 如何學習本書
本書從0開始教你如何把C/OS-III寫出來,既講解源碼實現,也講解API如何使用。當你拿到本書開始學習時一定會驚訝,原來RTOS(Real Time Operation System,實時操作系統)的學習并沒有那么復雜,原來自己也可以寫操作系統,成就感立馬爆棚。 全書內容循序漸進,不斷迭代,前一章都是后一章的基礎,因此最好從頭開始閱讀,不要跳躍。在學習時務必做到兩點:一是不能一味地看書,要把代碼和書本結合起來學習,一邊看書,一邊調試代碼。如何調試代碼呢?即單步執行每一條程序,看程序的執行流程和執行效果與自己所想的是否一致;二是在每學完一章之后,必須將配套的例程重寫一遍(切記不要復制,哪怕是一個分號,但可以照書錄入),以做到舉一反三,確保真正理解。在自己寫的時候肯定會錯漏百出,這個時候要認真糾錯,好好調試,這是你提高編程能力的最好機會。記住,編寫程序不是一氣呵成的,而是要一步一步地調試。 本書的編寫風格 本書以C/OS-III官方源碼為藍本,抽絲剝繭,不斷迭代,教你逐步寫出C/OS-III。書中涉及的數據類型、變量名稱、函數名稱、文件名稱、文件存放的位置都完全按照C/OS-III官方的方式來實現。學完本書之后,可以無縫地切換到原版的C/OS-III中使用。要注意的是,在實現的過程中某些函數中會去掉一些形參和冗余的代碼,只保留核心的功能,但這并不會影響學習。注意,本書的目的并不是讓你自己寫一個操作系統,而是讓你了解C/OS-III是如何寫出來的,著重講解原理實現,當你學完這本書之后,再學習其他RTOS將會事半功倍。 本書的技術論壇 如果在學習過程中遇到問題,可以到野火電子論壇發帖交流,開源共享,共同進步。 鑒于水平有限,本書難免有錯漏之處,熱心的讀者也可把勘誤發送到論壇上以便改進。祝你學習愉快,C/OS-III的世界,野火與你同行。 |