前言
第1章 嵌入式操作系統(tǒng)基礎 1
1.1 嵌入式軟件系統(tǒng)結構 1
1.1.1 輪詢系統(tǒng) 1
1.1.2 前后臺系統(tǒng) 1
1.1.3 多任務系統(tǒng) 2
1.2 多任務機制概述 3
1.2.1 時鐘節(jié)拍 3
1.2.2 多任務機制 4
1.2.3 任務上下文 5
1.2.4 任務切換 5
1.2.5 任務的時間片和優(yōu)先級 7
1.2.6 任務調度和調度方式 8
1.2.7 任務調度算法 9
1.2.8 任務狀態(tài) 12
1.3 同步、互斥和通信 12
1.3.1 任務等待和喚醒機制 13
1.3.2 任務互斥和優(yōu)先級反轉 14
1.3.3 優(yōu)先級天花板和優(yōu)先級繼承 15
1.4 中斷機制 17
1.4.1 中斷流程概述 18
1.4.2 中斷優(yōu)先級 19
1.4.3 中斷嵌套 19
1.4.4 中斷時序 20
1.5 Trochili RTOS介紹 22
第2章 線程管理與調度 23
2.1 線程結構設計 23
2.1.1 線程的結構設計 23
2.1.2 線程的狀態(tài) 25
2.1.3 線程優(yōu)先級 27
2.1.4 線程時間片 28
2.1.5 線程棧管理 28
2.1.6 線程函數和線程數據 29
2.2 線程隊列設計 29
2.3 線程調度機制設計 32
2.3.1 線程調度模型 32
2.3.2 線程調度算法 33
2.3.3 線程調度步驟 33
2.4 線程管理和調度實現 34
2.4.1 線程初始化 35
2.4.2 線程激活 35
2.4.3 線程休眠 37
2.4.4 線程掛起 40
2.4.5 線程解掛 42
2.4.6 線程延時 44
2.4.7 線程延時取消 46
2.4.8 線程主動調度 48
2.4.9 線程優(yōu)先級設定 50
2.4.10 線程時間片修改 58
2.5 系統(tǒng)守護線程 58
2.6 線程應用演示 59
2.6.1 線程激活和休眠演示 59
2.6.2 線程掛起和解掛演示 62
2.6.3 線程延時演示 65
2.6.4 線程主動調度演示 67
2.6.5 線程優(yōu)先級修改演示 70
2.6.6 線程時間片修改演示 73
第3章 線程同步和通信 77
3.1 線程阻塞隊列 77
3.2 線程阻塞記錄 78
3.3 IPC機制底層支撐函數 79
3.3.1 線程阻塞隊列初始化 80
3.3.2 保存線程阻塞信息 80
3.3.3 清除線程阻塞信息 80
3.3.4 讀取線程阻塞結果 80
3.3.5 線程阻塞過程 80
3.3.6 解除線程阻塞過程 81
3.3.7 解除最佳線程阻塞過程 81
3.3.8 解除全部線程阻塞過程 81
3.3.9 強制解除線程阻塞 81
3.3.10 休眠被阻塞的線程 81
3.3.11 設置被阻塞線程的優(yōu)先級 82
第4章 信號量設計與實現 83
4.1 信號量的基本知識 83
4.1.1 二值信號量的概念 83
4.1.2 計數信號量的概念 84
4.1.3 信號量的操作 85
4.1.4 信號量的應用 86
4.2 信號量設計實現 90
4.2.1 信號量的初始化 92
4.2.2 信號量的取消初始化 92
4.2.3 信號量的獲取 93
4.2.4 信號量的釋放 98
4.2.5 終止線程阻塞 103
4.2.6 信號量刷新 104
4.3 信號量應用演示 104
4.3.1 線程間的信號量單向同步 105
4.3.2 線程間的信號雙向同步 107
4.3.3 線程和ISR的信號同步 110
4.3.4 線程間的資源共享 113
4.3.5 多線程的信號同步 116
4.3.6 強制解除線程阻塞 120
4.3.7 信號量取消初始化 123
第5章 互斥量設計實現 126
5.1 互斥量基礎知識 126
5.1.1 互斥量的概念 126
5.1.2 互斥量的操作 127
5.1.3 互斥量的應用 128
5.2 互斥量設計實現 129
5.2.1 互斥量的初始化 130
5.2.2 互斥量取消初始化 130
5.2.3 互斥量的加鎖 131
5.2.4 互斥量的釋放 134
5.2.5 終止線程阻塞 137
5.2.6 互斥量刷新 137
5.3 互斥量應用演示 139
5.3.1 線程間的資源共享 139
5.3.2 強制解除線程阻塞 142
5.3.3 互斥量刷新 144
5.3.4 互斥量取消初始化 147
第6章 郵箱設計實現 151
6.1 郵箱基礎知識 151
6.1.1 郵箱的概念 151
6.1.2 郵箱的操作 153
6.1.3 郵箱的典型應用 153
6.2 郵箱功能設計 156
6.2.1 郵箱的初始化 158
6.2.2 郵箱的取消初始化 158
6.2.3 接收郵件 159
6.2.4 發(fā)送郵件 163
6.2.5 終止線程阻塞 168
6.2.6 郵箱刷新 168
6.2.7 郵箱廣播 169
6.3 郵箱應用演示 170
6.3.1 線程間的異步數據傳輸 170
6.3.2 線程和ISR間的異步數據傳輸 173
6.3.3 線程間的單向同步數據傳輸 176
6.3.4 線程間的雙向同步數據傳輸 179
6.3.5 多線程同步與郵箱刷新 183
6.3.6 多線程同步與郵箱廣播 188
6.3.7 強制解除線程阻塞 192
6.3.8 郵箱取消初始化 195
第7章 消息隊列設計與實現 199
7.1 消息隊列基礎 199
7.1.1 消息隊列的概念 199
7.1.2 消息隊列的操作 201
7.1.3 消息隊列的典型應用 203
7.2 消息隊列功能設計 207
7.2.1 消息隊列初始化 209
7.2.2 消息隊列取消初始化 209
7.2.3 消息接收 210
7.2.4 消息發(fā)送 215
7.2.5 消息廣播 220
7.2.6 線程阻塞解除 221
7.2.7 消息隊列刷新 221
7.3 消息隊列應用演示 223
7.3.1 線程間的異步數據傳輸 223
7.3.2 線程和ISR間的異步數據傳輸 226
7.3.3 線程間的單向同步數據傳輸 229
7.3.4 線程間的雙向同步數據傳輸 232
7.3.5 多線程同步與消息隊列刷新 236
7.3.6 多線程同步與消息隊列廣播 240
7.3.7 線程阻塞解除 244
7.3.8 消息隊列取消初始化 248
第8章 事件標記設計實現 253
8.1 事件標記基礎知識 253
8.1.1 事件標記的概念 253
8.1.2 事件標記的操作 254
8.1.3 事件標記的典型應用 255
8.2 事件標記功能設計 256
8.2.1 事件標記的初始化 257
8.2.2 事件標記的重置 257
8.2.3 接收事件 258
8.2.4 發(fā)送事件 260
8.2.5 終止線程阻塞 263
8.2.6 事件標記刷新 264
8.3 事件標記應用演示 265
8.3.1 線程間的同步 265
8.3.2 線程和ISR間的同步 269
8.3.3 多線程同步與事件標記刷新 272
8.3.4 強制解除線程阻塞 276
8.3.5 事件標記重置 279
第9章 時間管理 283
9.1 定時器機制概述 283
9.1.1 簡單計數方案 283
9.1.2 差分計時隊列方案 284
9.1.3 時間車輪方案 284
9.1.4 定時時間漂移 286
9.1.5 定時器精度 286
9.2 軟件定時器功能設計 286
9.2.1 軟件定時器結構 287
9.2.2 軟件定時器狀態(tài) 288
9.2.3 軟件定時器隊列 289
9.2.4 軟件定時器功能 290
9.3 軟件定時器使用演示 296
第10章 內核移植 299
10.1 處理器介紹 299
10.1.1 STM32的地址映射 300
10.1.2 STM32的時鐘系統(tǒng) 301
10.1.3 STM32的中斷和異常 303
10.1.4 時鐘節(jié)拍定時器 307
10.1.5 處理器啟動 309
10.2 內核移植 311
10.2.1 內核功能剪裁 311
10.2.2 內核移植實現 313
10.2.3 線程棧初始化函數 314
10.2.4 PendSV中斷管理函數 315
10.2.5 臨界區(qū)管理函數 317
10.2.6 內核多任務啟動函數 317
10.2.7 線程優(yōu)先級計算函數 317
10.2.8 內核與處理器接口函數 317
10.2.9 內核啟動流程 317
10.3 評估板介紹 321
10.3.1 LED驅動開發(fā) 323
10.3.2 外部按鍵驅動開發(fā) 325
10.3.3 串口驅動開發(fā) 328
第11章 以太網實踐 331
11.1 以太網和以太網協(xié)議棧 331
11.2 MCU接入以太網的方式 332
11.3 以太網控制器和驅動開發(fā) 333
11.4 基于RTOS的Web實驗 341
11.4.1 例程分析 341
11.4.2 實驗現象 344