书籍详情
嵌入式实时操作系统FreeRTOS原理及应用:基于STM32微控制器
作者:张超
出版社:电子工业出版社
出版时间:2021-12-01
ISBN:9787121424779
定价:¥49.00
购买这本书可以去
内容简介
本书面向高职和应用型本科的学生,以及嵌入式产品开发的工程技术人员。以通用的STM32开发板为平台,运行freeRTOS操作系统的智能手表作教学项目,贯穿书本内容的编写。全书共分12章,以智能手表项目为主线,系统介绍了嵌入式实时操作系统的概念,freeRTOS任务创建、任务调度、任务同步与消息传递,软件定时器、事件通知等知识。在每个知识点的学习上,均安排有智能手表对应的功能单元,来帮助读者理解知识点,并掌握其实际应用。项目引领,边学边做,学以致用是本书的一大特色。
作者简介
张超,男,硕士研究生,系统分析师,广东梅州人,1971年10月出生。超过20年企业工作经验,主持嵌入式产品的研制、开发三十多项。现任职于中山职业技术学院,主讲《C语言程序设计》、《MCS-51单片机技术》、《STM32单片机技术应用》、《嵌入式产品开发与实践》、《嵌入式实时操作系统》等课程。指导学生竞赛,获全国大学生电子设计大赛、全国职业院校技能大赛嵌入式应用开发赛项等***奖励多项。
目录
第1章 嵌入式实时操作系统介绍\t1
1.1 嵌入式系统和嵌入式操作系统\t1
1.1.1 嵌入式系统的基本概念\t1
1.1.2 嵌入式操作系统\t2
1.1.3 实时操作系统\t2
1.1.4 嵌入式实时操作系统\t3
1.2 嵌入式实时操作系统FreeRTOS简介\t5
1.2.1 FreeRTOS的特点\t5
1.2.2 FreeRTOS的商业许可\t5
1.2.3 选择FreeRTOS的理由\t6
1.3 总结\t7
思考与练习\t7
第2章 FreeRTOS在STM32微控制器上的移植\t8
2.1 文件准备\t8
2.1.1 FreeRTOS源码\t9
2.1.2 基础工程\t12
2.2 FreeRTOS移植\t15
2.2.1 复制FreeRTOS源码\t15
2.2.2 向工程中添加.c文件\t16
2.2.3 配置头文件包含路径\t17
2.2.4 配置FreeRTOS\t17
2.2.5 修改stm32f4xx_it.c文件\t19
2.2.6 编译项目\t19
2.3 移植验证\t20
2.3.1 引入FreeRTOS相关头文件\t20
2.3.2 编写测试任务函数\t20
2.3.3 创建测试任务\t21
2.3.4 开启调度器\t21
2.3.5 下载测试\t22
2.4 添加串口打印功能\t22
2.4.1 串口硬件连接\t22
2.4.2 初始化串口\t23
2.4.3 下载测试\t24
2.5 总结\t25
思考与练习\t25
第3章 FreeRTOS的裁剪和配置\t26
3.1 基础配置\t26
3.1.1 configUSE_PREEMPTION\t27
3.1.2 configUSE_PORT_OPTIMISED_TASK_SELECTION\t27
3.1.3 configCPU_CLOCK_HZ\t27
3.1.4 configTICK_RATE_HZ\t27
3.1.5 configMAX_PRIORITIES\t27
3.1.6 configMINIMAL_STACK_SIZE\t27
3.1.7 configTOTAL_HEAP_SIZE\t28
3.1.8 configUSE_16_BIT_TICKS\t28
3.1.9 configIDLE_SHOULD_YIELD\t28
3.1.10 configMAX_TASK_NAME_LEN\t28
3.1.11 configUSE_TICKLESS_IDLE\t28
3.1.12 关于列队、信号量和任务通知\t29
3.1.13 关于钩子函数\t29
3.2 FreeRTOS中断配置\t29
3.2.1 configPRIO_BITS\t29
3.2.2 configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t30
3.2.3 configKERNEL_INTERRUPT_PRIORITY\t30
3.2.4 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t30
3.2.5 configMAX_SYSCALL_INTERRUPT_PRIORITY\t30
3.3 可选API函数配置\t31
3.4 其他配置\t31
3.4.1 协程相关\t31
3.4.2 任务运行信息相关\t31
3.4.3 软件定时器相关\t32
3.4.4 断言\t32
3.4.5 中断服务函数\t33
3.5 FreeRTOSConfig.h头文件参考配置\t33
3.6 总结\t35
思考与练习\t36
第4章 FreeRTOS任务基础\t37
4.1 FreeRTOS任务\t37
4.1.1 任务的特性\t38
4.1.2 任务的状态\t39
4.1.3 任务的优先级\t39
4.1.4 任务堆栈\t40
4.1.5 任务控制块\t40
4.1.6 列表和列表项\t41
4.2 任务创建和删除\t44
4.2.1 任务函数\t45
4.2.2 任务创建和删除函数\t45
4.2.3 用动态内存分配方法创建任务\t46
4.2.4 用静态内存分配方法创建任务\t47
4.2.5 任务删除\t48
4.3 任务创建与删除示例\t49
4.3.1 组织代码\t49
4.3.2 编写LED0任务函数\t49
4.3.3 编写LED1任务函数\t50
4.3.4 创建任务\t51
4.3.5 修改main.c文件\t51
4.3.6 下载测试\t53
4.4 总结\t53
思考与练习\t54
第5章 FreeRTOS任务调度\t55
5.1 开启调度器\t55
5.1.1 调度器开启函数\t55
5.1.2 调度器开启过程\t57
5.1.3 启动第一个任务\t57
5.2 任务的挂起和恢复\t58
5.2.1 任务的挂起\t58
5.2.2 任务的恢复\t60
5.2.3 任务挂起和恢复示例\t62
5.3 任务的调度\t64
5.3.1 FreeRTOS任务切换场合\t65
5.3.2 PendSV中断\t66
5.3.3 PendSV中断服务函数\t67
5.3.4 查找下一个要运行的任务\t69
5.3.5 FreeRTOS时间片调度\t71
5.3.6 时间片调度示例\t72
5.3.7 空闲任务\t76
5.4 FreeRTOS内核函数\t78
5.4.1 临界段操作函数\t79
5.4.2 挂起和恢复调度器函数\t80
5.4.3 任务切换函数\t81
5.4.4 系统时钟节拍追加\t81
5.4.5 内核函数使用示例\t81
5.5 总结\t84
思考与练习\t84
第6章 FreeRTOS任务函数\t85
6.1 延时函数\t86
6.1.1 系统时钟节拍\t86
6.1.2 相对延时\t86
6.1.3 绝对延时\t87
6.1.4 延时函数使用示例\t88
6.2 优先级控制\t91
6.2.1 获取任务优先级\t91
6.2.2 设置任务优先级\t91
6.2.3 改变任务优先级示例\t91
6.3 获取任务状态信息\t96
6.3.1 任务状态信息获取函数\t96
6.3.2 任务状态信息获取示例\t98
6.4 统计任务运行时间信息\t101
6.4.1 任务运行时间信息统计函数\t101
6.4.2 任务运行时间信息统计示例\t101
6.5 总结\t106
思考与练习\t107
第7章 FreeRTOS队列与消息传递\t108
7.1 FreeRTOS队列及其结构\t108
7.1.1 FreeRTOS队列特性\t108
7.1.2 队列结构体\t110
7.2 队列操作\t111
7.2.1 队列创建\t111
7.2.2 入队操作\t112
7.2.3 出队操作\t114
7.2.4 其他队列操作函数\t116
7.3 用队列实现串口守护任务\t116
7.3.1 守护任务\t116
7.3.2 串口守护任务示例\t116
7.4 总结\t120
思考与练习\t120
第8章 FreeRTOS信号量与任务同步\t121
8.1 二值信号量\t121
8.1.1 创建二值信号量\t122
8.1.2 释放二值信号量\t123
8.1.3 获取二值信号量\t124
8.1.4 用二值信号量进行任务同步\t125
8.2 计数信号量\t131
8.2.1 创建计数信号量\t131
8.2.2 计数信号量的释放和获取\t131
8.2.3 用计数信号量进行任务同步\t131
8.3 互斥信号量\t133
8.3.1 创建互斥信号量\t135
8.3.2 互斥信号量的释放和获取\t135
8.3.3 优先级翻转\t136
8.3.4 优先级翻转示例\t136
8.3.5 用互斥信号量抑制优先级翻转\t140
8.4 递归互斥信号量\t142
8.5 总结\t143
思考与练习\t143
第9章 FreeRTOS事件标志组\t144
9.1 事件标志组\t144
9.1.1 创建事件标志组\t144
9.1.2 设置事件标志位\t145
9.1.3 获取事件标志组值\t146
9.1.4 等待指定的事件标志位\t147
9.2 用事件标志组进行任务同步\t147
9.2.1 配置FreeRTOS\t148
9.2.2 配置定时器\t148
9.2.3 任务函数\t149
9.2.4 创建任务\t151
9.2.5 下载测试\t152
9.3 总结\t153
思考与练习\t153
第10章 FreeRTOS任务通知\t154
10.1 发送和获取任务通知\t154
10.1.1 发送任务通知\t154
10.1.2 获取任务通知\t156
10.2 任务通知使用\t157
10.2.1 用任务通知模拟二值信号量\t157
10.2.2 用任务通知模拟事件标志组\t160
10.3 总结\t163
思考与练习\t163
第11章 FreeRTOS软件定时器\t164
11.1 软件定时器服务任务\t164
11.2 软件定时器操作\t165
11.2.1 单次定时与周期定时\t165
11.2.2 创建软件定时器\t165
11.2.3 启动软件定时器\t166
11.2.4 停止软件定时器\t167
11.3 软件定时器使用示例\t168
11.3.1 配置FreeRTOS\t169
11.3.2 软件定时器回调函数\t170
11.3.3 任务函数\t170
11.3.4 创建软件定时器和任务\t172
11.3.5 下载测试\t173
11.4 总结\t174
思考与练习\t174
第12章 FreeRTOS内存管理\t175
12.1 FreeRTOS内存分配方法\t175
12.1.1 heap_1.c动态内存管理方法\t175
12.1.2 heap_2.c动态内存管理方法\t176
12.1.3 heap_3.c动态内存管理方法\t176
12.1.4 heap_4.c动态内存管理方法\t177
12.1.5 heap_5.c动态内存管理方法\t177
12.2 FreeRTOS内存管理示例\t177
12.3 总结\t180
思考与练习\t180
第13章 智能手表FreeRTOS实现\t182
13.1 功能设计\t182
13.1.1 时间显示\t183
13.1.2 时间设置\t184
13.1.3 闹钟设置\t184
13.1.4 闹钟响铃\t184
13.1.5 秒表计时\t185
13.1.6 心率测量\t185
13.1.7 运动计步\t186
13.1.8 硬件信息\t186
13.2 硬件设计\t187
13.2.1 硬件系统框图\t188
13.2.2 单元电路\t188
13.2.3 硬件原理图\t194
13.3 FreeRTOS工程\t194
13.3.1 复制并新建FreeRTOS工程\t194
13.3.2 智能手表FreeRTOS配置\t196
13.3.3 用STM32CubeMX生成初始化代码\t196
13.4 算法及驱动\t199
13.4.1 OLED12864模块\t199
13.4.2 AHT10\t207
13.4.3 心率测量\t210
13.4.4 运动计步\t214
13.4.5 蓝牙传输\t223
13.4.6 多功能按键\t225
13.4.7 实时时钟\t226
13.5 任务设计\t227
13.5.1 按键任务\t227
13.5.2 时间显示任务\t228
13.5.3 时间设置任务\t229
13.5.4 闹钟设置任务\t231
13.5.5 闹钟时间检查任务\t233
13.5.6 闹钟响铃任务\t234
13.5.7 秒表计时任务\t235
13.5.8 心率测量任务\t237
13.5.9 计步后台任务\t239
13.5.10 计步显示任务\t239
13.5.11 任务信息获取任务\t241
13.6 任务创建、调度与同步\t243
13.6.1 任务创建及调度器开启\t244
13.6.2 抢占式调度提高系统响应性能\t247
13.6.3 时间片调度让任务共享优先级\t247
13.6.4 用任务挂起和恢复实现互斥访问\t247
13.6.5 用互斥信号量共享蓝牙资源\t249
13.6.6 用任务通知同步闹钟响铃任务\t249
13.6.7 用队列共享按键功能\t250
13.6.8 软件定时器使用\t250
13.7 调试与优化\t251
附录A FreeRTOS编码和命名规则\t254
附录B 示例程序和项目所使用的编译环境\t256
附录C 项目实施对开发板的要求\t258
附录D 项目实施所需驱动文件\t259
参考文献\t260
1.1 嵌入式系统和嵌入式操作系统\t1
1.1.1 嵌入式系统的基本概念\t1
1.1.2 嵌入式操作系统\t2
1.1.3 实时操作系统\t2
1.1.4 嵌入式实时操作系统\t3
1.2 嵌入式实时操作系统FreeRTOS简介\t5
1.2.1 FreeRTOS的特点\t5
1.2.2 FreeRTOS的商业许可\t5
1.2.3 选择FreeRTOS的理由\t6
1.3 总结\t7
思考与练习\t7
第2章 FreeRTOS在STM32微控制器上的移植\t8
2.1 文件准备\t8
2.1.1 FreeRTOS源码\t9
2.1.2 基础工程\t12
2.2 FreeRTOS移植\t15
2.2.1 复制FreeRTOS源码\t15
2.2.2 向工程中添加.c文件\t16
2.2.3 配置头文件包含路径\t17
2.2.4 配置FreeRTOS\t17
2.2.5 修改stm32f4xx_it.c文件\t19
2.2.6 编译项目\t19
2.3 移植验证\t20
2.3.1 引入FreeRTOS相关头文件\t20
2.3.2 编写测试任务函数\t20
2.3.3 创建测试任务\t21
2.3.4 开启调度器\t21
2.3.5 下载测试\t22
2.4 添加串口打印功能\t22
2.4.1 串口硬件连接\t22
2.4.2 初始化串口\t23
2.4.3 下载测试\t24
2.5 总结\t25
思考与练习\t25
第3章 FreeRTOS的裁剪和配置\t26
3.1 基础配置\t26
3.1.1 configUSE_PREEMPTION\t27
3.1.2 configUSE_PORT_OPTIMISED_TASK_SELECTION\t27
3.1.3 configCPU_CLOCK_HZ\t27
3.1.4 configTICK_RATE_HZ\t27
3.1.5 configMAX_PRIORITIES\t27
3.1.6 configMINIMAL_STACK_SIZE\t27
3.1.7 configTOTAL_HEAP_SIZE\t28
3.1.8 configUSE_16_BIT_TICKS\t28
3.1.9 configIDLE_SHOULD_YIELD\t28
3.1.10 configMAX_TASK_NAME_LEN\t28
3.1.11 configUSE_TICKLESS_IDLE\t28
3.1.12 关于列队、信号量和任务通知\t29
3.1.13 关于钩子函数\t29
3.2 FreeRTOS中断配置\t29
3.2.1 configPRIO_BITS\t29
3.2.2 configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t30
3.2.3 configKERNEL_INTERRUPT_PRIORITY\t30
3.2.4 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t30
3.2.5 configMAX_SYSCALL_INTERRUPT_PRIORITY\t30
3.3 可选API函数配置\t31
3.4 其他配置\t31
3.4.1 协程相关\t31
3.4.2 任务运行信息相关\t31
3.4.3 软件定时器相关\t32
3.4.4 断言\t32
3.4.5 中断服务函数\t33
3.5 FreeRTOSConfig.h头文件参考配置\t33
3.6 总结\t35
思考与练习\t36
第4章 FreeRTOS任务基础\t37
4.1 FreeRTOS任务\t37
4.1.1 任务的特性\t38
4.1.2 任务的状态\t39
4.1.3 任务的优先级\t39
4.1.4 任务堆栈\t40
4.1.5 任务控制块\t40
4.1.6 列表和列表项\t41
4.2 任务创建和删除\t44
4.2.1 任务函数\t45
4.2.2 任务创建和删除函数\t45
4.2.3 用动态内存分配方法创建任务\t46
4.2.4 用静态内存分配方法创建任务\t47
4.2.5 任务删除\t48
4.3 任务创建与删除示例\t49
4.3.1 组织代码\t49
4.3.2 编写LED0任务函数\t49
4.3.3 编写LED1任务函数\t50
4.3.4 创建任务\t51
4.3.5 修改main.c文件\t51
4.3.6 下载测试\t53
4.4 总结\t53
思考与练习\t54
第5章 FreeRTOS任务调度\t55
5.1 开启调度器\t55
5.1.1 调度器开启函数\t55
5.1.2 调度器开启过程\t57
5.1.3 启动第一个任务\t57
5.2 任务的挂起和恢复\t58
5.2.1 任务的挂起\t58
5.2.2 任务的恢复\t60
5.2.3 任务挂起和恢复示例\t62
5.3 任务的调度\t64
5.3.1 FreeRTOS任务切换场合\t65
5.3.2 PendSV中断\t66
5.3.3 PendSV中断服务函数\t67
5.3.4 查找下一个要运行的任务\t69
5.3.5 FreeRTOS时间片调度\t71
5.3.6 时间片调度示例\t72
5.3.7 空闲任务\t76
5.4 FreeRTOS内核函数\t78
5.4.1 临界段操作函数\t79
5.4.2 挂起和恢复调度器函数\t80
5.4.3 任务切换函数\t81
5.4.4 系统时钟节拍追加\t81
5.4.5 内核函数使用示例\t81
5.5 总结\t84
思考与练习\t84
第6章 FreeRTOS任务函数\t85
6.1 延时函数\t86
6.1.1 系统时钟节拍\t86
6.1.2 相对延时\t86
6.1.3 绝对延时\t87
6.1.4 延时函数使用示例\t88
6.2 优先级控制\t91
6.2.1 获取任务优先级\t91
6.2.2 设置任务优先级\t91
6.2.3 改变任务优先级示例\t91
6.3 获取任务状态信息\t96
6.3.1 任务状态信息获取函数\t96
6.3.2 任务状态信息获取示例\t98
6.4 统计任务运行时间信息\t101
6.4.1 任务运行时间信息统计函数\t101
6.4.2 任务运行时间信息统计示例\t101
6.5 总结\t106
思考与练习\t107
第7章 FreeRTOS队列与消息传递\t108
7.1 FreeRTOS队列及其结构\t108
7.1.1 FreeRTOS队列特性\t108
7.1.2 队列结构体\t110
7.2 队列操作\t111
7.2.1 队列创建\t111
7.2.2 入队操作\t112
7.2.3 出队操作\t114
7.2.4 其他队列操作函数\t116
7.3 用队列实现串口守护任务\t116
7.3.1 守护任务\t116
7.3.2 串口守护任务示例\t116
7.4 总结\t120
思考与练习\t120
第8章 FreeRTOS信号量与任务同步\t121
8.1 二值信号量\t121
8.1.1 创建二值信号量\t122
8.1.2 释放二值信号量\t123
8.1.3 获取二值信号量\t124
8.1.4 用二值信号量进行任务同步\t125
8.2 计数信号量\t131
8.2.1 创建计数信号量\t131
8.2.2 计数信号量的释放和获取\t131
8.2.3 用计数信号量进行任务同步\t131
8.3 互斥信号量\t133
8.3.1 创建互斥信号量\t135
8.3.2 互斥信号量的释放和获取\t135
8.3.3 优先级翻转\t136
8.3.4 优先级翻转示例\t136
8.3.5 用互斥信号量抑制优先级翻转\t140
8.4 递归互斥信号量\t142
8.5 总结\t143
思考与练习\t143
第9章 FreeRTOS事件标志组\t144
9.1 事件标志组\t144
9.1.1 创建事件标志组\t144
9.1.2 设置事件标志位\t145
9.1.3 获取事件标志组值\t146
9.1.4 等待指定的事件标志位\t147
9.2 用事件标志组进行任务同步\t147
9.2.1 配置FreeRTOS\t148
9.2.2 配置定时器\t148
9.2.3 任务函数\t149
9.2.4 创建任务\t151
9.2.5 下载测试\t152
9.3 总结\t153
思考与练习\t153
第10章 FreeRTOS任务通知\t154
10.1 发送和获取任务通知\t154
10.1.1 发送任务通知\t154
10.1.2 获取任务通知\t156
10.2 任务通知使用\t157
10.2.1 用任务通知模拟二值信号量\t157
10.2.2 用任务通知模拟事件标志组\t160
10.3 总结\t163
思考与练习\t163
第11章 FreeRTOS软件定时器\t164
11.1 软件定时器服务任务\t164
11.2 软件定时器操作\t165
11.2.1 单次定时与周期定时\t165
11.2.2 创建软件定时器\t165
11.2.3 启动软件定时器\t166
11.2.4 停止软件定时器\t167
11.3 软件定时器使用示例\t168
11.3.1 配置FreeRTOS\t169
11.3.2 软件定时器回调函数\t170
11.3.3 任务函数\t170
11.3.4 创建软件定时器和任务\t172
11.3.5 下载测试\t173
11.4 总结\t174
思考与练习\t174
第12章 FreeRTOS内存管理\t175
12.1 FreeRTOS内存分配方法\t175
12.1.1 heap_1.c动态内存管理方法\t175
12.1.2 heap_2.c动态内存管理方法\t176
12.1.3 heap_3.c动态内存管理方法\t176
12.1.4 heap_4.c动态内存管理方法\t177
12.1.5 heap_5.c动态内存管理方法\t177
12.2 FreeRTOS内存管理示例\t177
12.3 总结\t180
思考与练习\t180
第13章 智能手表FreeRTOS实现\t182
13.1 功能设计\t182
13.1.1 时间显示\t183
13.1.2 时间设置\t184
13.1.3 闹钟设置\t184
13.1.4 闹钟响铃\t184
13.1.5 秒表计时\t185
13.1.6 心率测量\t185
13.1.7 运动计步\t186
13.1.8 硬件信息\t186
13.2 硬件设计\t187
13.2.1 硬件系统框图\t188
13.2.2 单元电路\t188
13.2.3 硬件原理图\t194
13.3 FreeRTOS工程\t194
13.3.1 复制并新建FreeRTOS工程\t194
13.3.2 智能手表FreeRTOS配置\t196
13.3.3 用STM32CubeMX生成初始化代码\t196
13.4 算法及驱动\t199
13.4.1 OLED12864模块\t199
13.4.2 AHT10\t207
13.4.3 心率测量\t210
13.4.4 运动计步\t214
13.4.5 蓝牙传输\t223
13.4.6 多功能按键\t225
13.4.7 实时时钟\t226
13.5 任务设计\t227
13.5.1 按键任务\t227
13.5.2 时间显示任务\t228
13.5.3 时间设置任务\t229
13.5.4 闹钟设置任务\t231
13.5.5 闹钟时间检查任务\t233
13.5.6 闹钟响铃任务\t234
13.5.7 秒表计时任务\t235
13.5.8 心率测量任务\t237
13.5.9 计步后台任务\t239
13.5.10 计步显示任务\t239
13.5.11 任务信息获取任务\t241
13.6 任务创建、调度与同步\t243
13.6.1 任务创建及调度器开启\t244
13.6.2 抢占式调度提高系统响应性能\t247
13.6.3 时间片调度让任务共享优先级\t247
13.6.4 用任务挂起和恢复实现互斥访问\t247
13.6.5 用互斥信号量共享蓝牙资源\t249
13.6.6 用任务通知同步闹钟响铃任务\t249
13.6.7 用队列共享按键功能\t250
13.6.8 软件定时器使用\t250
13.7 调试与优化\t251
附录A FreeRTOS编码和命名规则\t254
附录B 示例程序和项目所使用的编译环境\t256
附录C 项目实施对开发板的要求\t258
附录D 项目实施所需驱动文件\t259
参考文献\t260
猜您喜欢