
本书面向高职和应用型本科的学生,以及嵌入式产品开发的工程技术人员。以通用的STM32开发板为平台,运行freeRTOS操作系统的智能手表作教学项目,贯穿书本内容的编写。全书共分12章,以智能手表项目为主线,系统介绍了嵌入式实时操作系统的概念,freeRTOS任务创建、任务调度、任务同步与消息传递,软件定时器、事件通知等知识。在每个知识点的学习上,均安排有智能手表对应的功能单元,来帮助读者理解知识点,并掌握其实际应用。项目引领,边学边做,学以致用是本书的一大特色。
随着现代电子技术的不断发展,嵌入式技术得到了飞速发展,使得嵌入式系统在工业、能源、交通、信息技术、国防等领域得到了越来越广泛的应用。 早期的嵌入式系统由于受硬件资源限制,不得不采用前后台系统模式,如今随着超大规模集成电路成本的极大降低和广泛应用,特别是采用ARM全新Cortex内核的芯片的出现,带有嵌入式实时操作系统的软件设计逐渐成为各类嵌入式应用的主流设计。 FreeRTOS是一个源码开放的嵌入式实时操作系统,体积小巧,裁剪和移植方便,支持抢占式任务调度,可供免费使用。正是由于具有这些特点,FreeRTOS的社会占有量逐年提高。据EE Times统计,自2015年开始,FreeRTOS的社会占有量就已经居第一位。然而,国内系统介绍FreeRTOS原理及应用的书籍还比较少,特别是尚未见将FreeRTOS应用到实际项目中的相关书籍。 本书首先通过介绍FreeRTOS,从FreeRTOS在STM32微控制器上的移植开始,逐步引导读者了解FreeRTOS的源码结构、移植、裁剪和配置。然后介绍FreeRTOS任务基础、任务调度及任务函数等内容,使读者进一步了解FreeRTOS的原理、运行和使用方法。接着介绍用于实现任务之间消息传递和任务同步的队列、信号量、事件标志组、任务通知等内容。最后介绍FreeRTOS软件定时器及内存管理方面的知识。为了让读者更好地理解所学知识点,本书在内容编排上采用了边学边练的形式,在每个知识点后都有配套的示例程序,可以让读者在掌握FreeRTOS相关原理的同时,知道如何去使用它,以及为什么要这样使用,达到学以致用的目的。 本书最后通过一个智能手表的实际案例,从功能设计、硬件设计、FreeRTOS工程、算法及驱动、任务设计,到任务创建、调度与同步及调试与优化,系统地介绍了如何利用相关硬件及FreeRTOS构建一个典型的嵌入式系统的过程和方法,使读者对FreeRTOS在实际嵌入式项目中的应用有一个全面、感性的认识。 能令STM32CubeMX与FreeRTOS协同工作而无须编写硬件初始化代码是本书的一大特点。无论是示例程序,还是智能手表项目,与硬件相关的初始化代码全部利用STM32CubeMX自动生成。由于无须用户编写硬件初始化代码,一方面简化了程序设计,减少出错率,提高了工作效率;另一方面使示例程序和项目能适应更多芯片的开发板,方便读者使用与验证。 本书由张超、赵清艳、普清民共同编写,由于编者水平有限,书中难免存在不足之处,恳请读者批评指正。
第1章 嵌入式实时操作系统介绍 1 1.1 嵌入式系统和嵌入式操作系统 1 1.1.1 嵌入式系统的基本概念 1 1.1.2 嵌入式操作系统 2 1.1.3 实时操作系统 2 1.1.4 嵌入式实时操作系统 3 1.2 嵌入式实时操作系统FreeRTOS简介 5 1.2.1 FreeRTOS的特点 5 1.2.2 FreeRTOS的商业许可 5 1.2.3 选择FreeRTOS的理由 6 1.3 总结 7 思考与练习 7 第2章 FreeRTOS在STM32微控制器上的移植 8 2.1 文件准备 8 2.1.1 FreeRTOS源码 9 2.1.2 基础工程 12 2.2 FreeRTOS移植 15 2.2.1 复制FreeRTOS源码 15 2.2.2 向工程中添加.c文件 16 2.2.3 配置头文件包含路径 17 2.2.4 配置FreeRTOS 17 2.2.5 修改stm32f4xx_it.c文件 19 2.2.6 编译项目 19 2.3 移植验证 20 2.3.1 引入FreeRTOS相关头文件 20 2.3.2 编写测试任务函数 20 2.3.3 创建测试任务 21 2.3.4 开启调度器 21 2.3.5 下载测试 22 2.4 添加串口打印功能 22 2.4.1 串口硬件连接 22 2.4.2 初始化串口 23 2.4.3 下载测试 24 2.5 总结 25 思考与练习 25 第3章 FreeRTOS的裁剪和配置 26 3.1 基础配置 26 3.1.1 configUSE_PREEMPTION 27 3.1.2 configUSE_PORT_OPTIMISED_TASK_SELECTION 27 3.1.3 configCPU_CLOCK_HZ 27 3.1.4 configTICK_RATE_HZ 27 3.1.5 configMAX_PRIORITIES 27 3.1.6 configMINIMAL_STACK_SIZE 27 3.1.7 configTOTAL_HEAP_SIZE 28 3.1.8 configUSE_16_BIT_TICKS 28 3.1.9 configIDLE_SHOULD_YIELD 28 3.1.10 configMAX_TASK_NAME_LEN 28 3.1.11 configUSE_TICKLESS_IDLE 28 3.1.12 关于列队、信号量和任务通知 29 3.1.13 关于钩子函数 29 3.2 FreeRTOS中断配置 29 3.2.1 configPRIO_BITS 29 3.2.2 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 30 3.2.3 configKERNEL_INTERRUPT_PRIORITY 30 3.2.4 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 30 3.2.5 configMAX_SYSCALL_INTERRUPT_PRIORITY 30 3.3 可选API函数配置 31 3.4 其他配置 31 3.4.1 协程相关 31 3.4.2 任务运行信息相关 31 3.4.3 软件定时器相关 32 3.4.4 断言 32 3.4.5 中断服务函数 33 3.5 FreeRTOSConfig.h头文件参考配置 33 3.6 总结 35 思考与练习 36 第4章 FreeRTOS任务基础 37 4.1 FreeRTOS任务 37 4.1.1 任务的特性 38 4.1.2 任务的状态 39 4.1.3 任务的优先级 39 4.1.4 任务堆栈 40 4.1.5 任务控制块 40 4.1.6 列表和列表项 41 4.2 任务创建和删除 44 4.2.1 任务函数 45 4.2.2 任务创建和删除函数 45 4.2.3 用动态内存分配方法创建任务 46 4.2.4 用静态内存分配方法创建任务 47 4.2.5 任务删除 48 4.3 任务创建与删除示例 49 4.3.1 组织代码 49 4.3.2 编写LED0任务函数 49 4.3.3 编写LED1任务函数 50 4.3.4 创建任务 51 4.3.5 修改main.c文件 51 4.3.6 下载测试 53 4.4 总结 53 思考与练习 54 第5章 FreeRTOS任务调度 55 5.1 开启调度器 55 5.1.1 调度器开启函数 55 5.1.2 调度器开启过程 57 5.1.3 启动第一个任务 57 5.2 任务的挂起和恢复 58 5.2.1 任务的挂起 58 5.2.2 任务的恢复 60 5.2.3 任务挂起和恢复示例 62 5.3 任务的调度 64 5.3.1 FreeRTOS任务切换场合 65 5.3.2 PendSV中断 66 5.3.3 PendSV中断服务函数 67 5.3.4 查找下一个要运行的任务 69 5.3.5 FreeRTOS时间片调度 71 5.3.6 时间片调度示例 72 5.3.7 空闲任务 76 5.4 FreeRTOS内核函数 78 5.4.1 临界段操作函数 79 5.4.2 挂起和恢复调度器函数 80 5.4.3 任务切换函数 81 5.4.4 系统时钟节拍追加 81 5.4.5 内核函数使用示例 81 5.5 总结 84 思考与练习 84 第6章 FreeRTOS任务函数 85 6.1 延时函数 86 6.1.1 系统时钟节拍 86 6.1.2 相对延时 86 6.1.3 绝对延时 87 6.1.4 延时函数使用示例 88 6.2 优先级控制 91 6.2.1 获取任务优先级 91 6.2.2 设置任务优先级 91 6.2.3 改变任务优先级示例 91 6.3 获取任务状态信息 96 6.3.1 任务状态信息获取函数 96 6.3.2 任务状态信息获取示例 98 6.4 统计任务运行时间信息 101 6.4.1 任务运行时间信息统计函数 101 6.4.2 任务运行时间信息统计示例 101 6.5 总结 106 思考与练习 107 第7章 FreeRTOS队列与消息传递 108 7.1 FreeRTOS队列及其结构 108 7.1.1 FreeRTOS队列特性 108 7.1.2 队列结构体 110 7.2 队列操作 111 7.2.1 队列创建 111 7.2.2 入队操作 112 7.2.3 出队操作 114 7.2.4 其他队列操作函数 116 7.3 用队列实现串口守护任务 116 7.3.1 守护任务 116 7.3.2 串口守护任务示例 116 7.4 总结 120 思考与练习 120 第8章 FreeRTOS信号量与任务同步 121 8.1 二值信号量 121 8.1.1 创建二值信号量 122 8.1.2 释放二值信号量 123 8.1.3 获取二值信号量 124 8.1.4 用二值信号量进行任务同步 125 8.2 计数信号量 131 8.2.1 创建计数信号量 131 8.2.2 计数信号量的释放和获取 131 8.2.3 用计数信号量进行任务同步 131 8.3 互斥信号量 133 8.3.1 创建互斥信号量 135 8.3.2 互斥信号量的释放和获取 135 8.3.3 优先级翻转 136 8.3.4 优先级翻转示例 136 8.3.5 用互斥信号量抑制优先级翻转 140 8.4 递归互斥信号量 142 8.5 总结 143 思考与练习 143 第9章 FreeRTOS事件标志组 144 9.1 事件标志组 144 9.1.1 创建事件标志组 144 9.1.2 设置事件标志位 145 9.1.3 获取事件标志组值 146 9.1.4 等待指定的事件标志位 147 9.2 用事件标志组进行任务同步 147 9.2.1 配置FreeRTOS 148 9.2.2 配置定时器 148 9.2.3 任务函数 149 9.2.4 创建任务 151 9.2.5 下载测试 152 9.3 总结 153 思考与练习 153 第10章 FreeRTOS任务通知 154 10.1 发送和获取任务通知 154 10.1.1 发送任务通知 154 10.1.2 获取任务通知 156 10.2 任务通知使用 157 10.2.1 用任务通知模拟二值信号量 157 10.2.2 用任务通知模拟事件标志组 160 10.3 总结 163 思考与练习 163 第11章 FreeRTOS软件定时器 164 11.1 软件定时器服务任务 164 11.2 软件定时器操作 165 11.2.1 单次定时与周期定时 165 11.2.2 创建软件定时器 165 11.2.3 启动软件定时器 166 11.2.4 停止软件定时器 167 11.3 软件定时器使用示例 168 11.3.1 配置FreeRTOS 169 11.3.2 软件定时器回调函数 170 11.3.3 任务函数 170 11.3.4 创建软件定时器和任务 172 11.3.5 下载测试 173 11.4 总结 174 思考与练习 174 第12章 FreeRTOS内存管理 175 12.1 FreeRTOS内存分配方法 175 12.1.1 heap_1.c动态内存管理方法 175 12.1.2 heap_2.c动态内存管理方法 176 12.1.3 heap_3.c动态内存管理方法 176 12.1.4 heap_4.c动态内存管理方法 177 12.1.5 heap_5.c动态内存管理方法 177 12.2 FreeRTOS内存管理示例 177 12.3 总结 180 思考与练习 180 第13章 智能手表FreeRTOS实现 182 13.1 功能设计 182 13.1.1 时间显示 183 13.1.2 时间设置 184 13.1.3 闹钟设置 184 13.1.4 闹钟响铃 184 13.1.5 秒表计时 185 13.1.6 心率测量 185 13.1.7 运动计步 186 13.1.8 硬件信息 186 13.2 硬件设计 187 13.2.1 硬件系统框图 188 13.2.2 单元电路 188 13.2.3 硬件原理图 194 13.3 FreeRTOS工程 194 13.3.1 复制并新建FreeRTOS工程 194 13.3.2 智能手表FreeRTOS配置 196 13.3.3 用STM32CubeMX生成初始化代码 196 13.4 算法及驱动 199 13.4.1 OLED12864模块 199 13.4.2 AHT10 207 13.4.3 心率测量 210 13.4.4 运动计步 214 13.4.5 蓝牙传输 223 13.4.6 多功能按键 225 13.4.7 实时时钟 226 13.5 任务设计 227 13.5.1 按键任务 227 13.5.2 时间显示任务 228 13.5.3 时间设置任务 229 13.5.4 闹钟设置任务 231 13.5.5 闹钟时间检查任务 233 13.5.6 闹钟响铃任务 234 13.5.7 秒表计时任务 235 13.5.8 心率测量任务 237 13.5.9 计步后台任务 239 13.5.10 计步显示任务 239 13.5.11 任务信息获取任务 241 13.6 任务创建、调度与同步 243 13.6.1 任务创建及调度器开启 244 13.6.2 抢占式调度提高系统响应性能 247 13.6.3 时间片调度让任务共享优先级 247 13.6.4 用任务挂起和恢复实现互斥访问 247 13.6.5 用互斥信号量共享蓝牙资源 249 13.6.6 用任务通知同步闹钟响铃任务 249 13.6.7 用队列共享按键功能 250 13.6.8 软件定时器使用 250 13.7 调试与优化 251 附录A FreeRTOS编码和命名规则 254 附录B 示例程序和项目所使用的编译环境 256 附录C 项目实施对开发板的要求 258 附录D 项目实施所需驱动文件 259 参考文献 260
http://www.hxedu.com.cn/hxedu/fg/book/bookinfo.html?code=G0424770