logo资料库

RT-THREAD 编程指南.pdf

第1页 / 共543页
第2页 / 共543页
第3页 / 共543页
第4页 / 共543页
第5页 / 共543页
第6页 / 共543页
第7页 / 共543页
第8页 / 共543页
资料共543页,剩余部分请下载后查看
版本和修订
目录
1 RT-Thread 简介
1.1 RT-Thread 概述
1.2 许可协议
1.3 RT-Thread 的架构
2 内核基础
2.1 RT-Thread 内核介绍
2.1.1 线程调度
2.1.2 时钟管理
2.1.3 线程间同步
2.1.4 线程间通信
2.1.5 内存管理
2.1.6 I/O 设备管理
2.2 RT-Thread 启动流程
2.3 RT-Thread 程序内存分布
2.4 RT-Thread 自动初始化机制
2.5 RT-Thread 内核对象模型
2.5.1 静态对象和动态对象
2.5.2 内核对象管理架构
2.5.3 对象控制块
2.5.4 内核对象管理方式
2.5.4.1 初始化对象
2.5.4.2 脱离对象
2.5.4.3 分配对象
2.5.4.4 删除对象
2.5.4.5 辨别对象
2.6 RT-Thread 内核配置示例
2.7 常见宏定义说明
3 线程管理
3.1 线程管理的功能特点
3.2 线程的工作机制
3.2.1 线程控制块
3.2.2 线程重要属性
3.2.2.1 线程栈
3.2.2.2 线程状态
3.2.2.3 线程优先级
3.2.2.4 时间片
3.2.2.5 线程的入口函数
3.2.2.6 线程错误码
3.2.3 线程状态切换
3.2.4 系统线程
3.2.4.1 空闲线程
3.2.4.2 主线程
3.3 线程的管理方式
3.3.1 创建和删除线程
3.3.2 初始化和脱离线程
3.3.3 启动线程
3.3.4 获得当前线程
3.3.5 使线程让出处理器资源
3.3.6 使线程睡眠
3.3.7 挂起和恢复线程
3.3.8 控制线程
3.3.9 设置和删除空闲钩子
3.3.10 设置调度器钩子
3.4 线程应用示例
3.4.1 创建线程示例
3.4.2 线程时间片轮转调度示例
3.4.3 线程调度器钩子示例
4 时钟管理
4.1 时钟节拍
4.1.1 时钟节拍的实现方式
4.1.2 获取时钟节拍
4.2 定时器管理
4.2.1 RT-Thread 定时器介绍
4.2.1.1 HARD_TIMER 模式
4.2.1.2 SOFT_TIMER 模式
4.2.2 定时器工作机制
4.2.2.1 定时器控制块
4.2.2.2 定时器跳表 (Skip List) 算法
4.2.3 定时器的管理方式
4.2.3.1 创建和删除定时器
4.2.3.2 初始化和脱离定时器
4.2.3.3 启动和停止定时器
4.2.3.4 控制定时器
4.3 定时器应用示例
4.4 高精度延时
5 线程间同步
5.1 信号量
5.1.1 信号量工作机制
5.1.2 信号量控制块
5.1.3 信号量的管理方式
5.1.3.1 创建和删除信号量
5.1.3.2 初始化和脱离信号量
5.1.3.3 获取信号量
5.1.3.4 无等待获取信号量
5.1.3.5 释放信号量
5.1.4 信号量应用示例
5.1.5 信号量的使用场合
5.1.5.1 线程同步
5.1.5.2 锁
5.1.5.3 中断与线程的同步
5.1.5.4 资源计数
5.2 互斥量
5.2.1 互斥量工作机制
5.2.2 互斥量控制块
5.2.3 互斥量的管理方式
5.2.3.1 创建和删除互斥量
5.2.3.2 初始化和脱离互斥量
5.2.3.3 获取互斥量
5.2.3.4 释放互斥量
5.2.4 互斥量应用示例
5.2.5 互斥量的使用场合
5.3 事件集
5.3.1 事件集工作机制
5.3.2 事件集控制块
5.3.3 事件集的管理方式
5.3.3.1 创建和删除事件集
5.3.3.2 初始化和脱离事件集
5.3.3.3 发送事件
5.3.3.4 接收事件
5.3.4 事件集应用示例
5.3.5 事件集的使用场合
6 线程间通信
6.1 邮箱
6.1.1 邮箱的工作机制
6.1.2 邮箱控制块
6.1.3 邮箱的管理方式
6.1.3.1 创建和删除邮箱
6.1.3.2 初始化和脱离邮箱
6.1.3.3 发送邮件
6.1.3.4 等待方式发送邮件
6.1.3.5 接收邮件
6.1.4 邮箱使用示例
6.1.5 邮箱的使用场合
6.2 消息队列
6.2.1 消息队列的工作机制
6.2.2 消息队列控制块
6.2.3 消息队列的管理方式
6.2.3.1 创建和删除消息队列
6.2.3.2 初始化和脱离消息队列
6.2.3.3 发送消息
6.2.3.4 发送紧急消息
6.2.3.5 接收消息
6.2.4 消息队列应用示例
6.2.5 消息队列的使用场合
6.2.5.1 发送消息
6.2.5.2 同步消息
6.3 信号
6.3.1 信号的工作机制
6.3.2 信号的管理方式
6.3.2.1 安装信号
6.3.2.2 阻塞信号
6.3.2.3 解除信号阻塞
6.3.2.4 发送信号
6.3.2.5 等待信号
6.3.3 信号应用示例
7 内存管理
7.1 内存管理的功能特点
7.2 内存堆管理
7.2.1 小内存管理算法
7.2.2 slab 管理算法
7.2.3 memheap 管理算法
7.2.4 内存堆配置和初始化
7.2.5 内存堆的管理方式
7.2.5.1 分配和释放内存块
7.2.5.2 重分配内存块
7.2.5.3 分配多内存块
7.2.5.4 设置内存钩子函数
7.2.6 内存堆管理应用示例
7.3 内存池
7.3.1 内存池工作机制
7.3.1.1 内存池控制块
7.3.1.2 内存块分配机制
7.3.2 内存池的管理方式
7.3.2.1 创建和删除内存池
7.3.2.2 初始化和脱离内存池
7.3.2.3 分配和释放内存块
7.3.3 内存池应用示例
8 中断管理
8.1 Cortex-M CPU 架构基础
8.1.1 寄存器简介
8.1.2 操作模式和特权级别
8.1.3 嵌套向量中断控制器
8.1.4 PendSV 系统调用
8.2 RT-Thread 中断工作机制
8.2.1 中断向量表
8.2.2 中断处理过程
8.2.2.1 中断前导程序
8.2.2.2 用户中断服务程序
8.2.2.3 中断后续程序
8.2.3 中断嵌套
8.2.4 中断栈
8.2.5 中断的底半处理
8.3 RT-Thread 中断管理接口
8.3.1 中断服务程序挂接
8.3.2 中断源管理
8.3.3 全局中断开关
8.3.4 中断通知
8.4 中断与轮询
8.5 全局中断开关使用示例
9 内核移植
9.1 CPU 架构移植
9.1.1 实现全局中断开关
9.1.1.1 关闭全局中断
9.1.1.2 打开全局中断
9.1.2 实现线程栈初始化
9.1.3 实现上下文切换
9.1.3.1 实现 rt_hw_context_switch_to()
9.1.3.2 实现 rt_hw_context_switch()/ rt_hw_context_switch_interrupt()
9.1.3.3 实现 PendSV 中断
9.1.4 实现时钟节拍
9.2 BSP 移植
10 Env 用户手册
10.1 主要特性
10.2 准备工作
10.3 Env 的使用方法
10.3.1 打开 Env 控制台
10.3.1.1 方法一:点击 Env 目录下可执行文件
10.3.1.2 方法二:在文件夹中通过右键菜单打开 Env 控制台
10.3.2 编译 BSP
10.3.2.1 第一步:切换到 BSP 根目录
10.3.2.2 第二步:bsp 的编译
10.3.3 BSP 配置:menuconfig
10.3.3.1 快捷键介绍
10.3.3.2 修改配置
10.3.3.3 保存配置
10.3.4 软件包管理:package
10.3.4.1 下载、更新、删除软件包
10.3.4.2 升级本地软件包信息
10.3.5 Env 工具配置
10.4 在项目中使用 Env
10.4.1 使用 Env 的要求
10.4.2 menuconfig 中选项的修改方法
10.4.3 新的项目添加 menuconfig 功能
10.4.4 旧项目添加 menuconfig 功能
10.5 使用 pip 扩展更多功能
10.6 Env 工具使用注意事项
10.7 常见问题
10.7.1 Q: Env 工具出现乱码怎么办?
10.7.2 Q: 提示找不到 git 命令?
10.7.3 Q: 提示找不到 CMD 命令?
10.7.4 Q: 运行 python 的时候提示 no module named site 怎么办?
10.7.5 Q: 在 Env 下能生成哪些类型的工程?
10.7.6 Q: 自己制作的 BSP 如何能支持 menuconfig?
10.7.7 Q: pkgs –upgrade 命令和 pkgs –update 命令有什么区别?
10.7.8 Q: VC98 文件夹问题
10.7.9 Q: 使用 menuconfig 命令提示``can't find file Kconfig''。
10.8 常用资料链接
11 I/O 设备模型
11.1 I/O 设备介绍
11.1.1 I/O 设备模型框架
11.1.2 I/O 设备模型
11.1.3 I/O 设备类型
11.2 创建和注册 I/O 设备
11.3 访问 I/O 设备
11.3.1 查找设备
11.3.2 初始化设备
11.3.3 打开和关闭设备
11.3.4 控制设备
11.3.5 读写设备
11.3.6 数据收发回调
11.3.7 设备访问示例
12 UART 设备
12.1 UART 简介
12.2 访问串口设备
12.2.1 查找串口设备
12.2.2 打开串口设备
12.2.3 控制串口设备
12.2.4 发送数据
12.2.5 设置发送完成回调函数
12.2.6 设置接收回调函数
12.2.7 接收数据
12.2.8 关闭串口设备
12.3 串口设备使用示例
12.3.1 中断接收及轮询发送
12.3.2 DMA 接收及轮询发送
13 PIN 设备
13.1 引脚简介
13.2 访问 PIN 设备
13.2.1 获取引脚编号
13.2.1.1 使用宏定义
13.2.1.2 查看驱动文件
13.2.2 设置引脚模式
13.2.3 设置引脚电平
13.2.4 读取引脚电平
13.2.5 绑定引脚中断回调函数
13.2.6 使能引脚中断
13.2.7 脱离引脚中断回调函数
13.3 PIN 设备使用示例
14 ADC 设备
14.1 ADC 简介
14.1.1 转换过程
14.1.2 分辨率
14.1.3 精度
14.1.4 转换速率
14.2 访问 ADC 设备
14.2.1 查找 ADC 设备
14.2.2 使能 ADC 通道
14.2.3 读取 ADC 通道采样值
14.2.4 关闭 ADC 通道
14.2.5 FinSH 命令
14.3 ADC 设备使用示例
14.4 常见问题
14.4.1 Q: menuconfig 找不到 ADC 设备的配置选项?
15 HWTIMER 设备
15.1 定时器简介
15.2 访问硬件定时器设备
15.2.1 查找定时器设备
15.2.2 打开定时器设备
15.2.3 设置超时回调函数
15.2.4 控制定时器设备
15.2.5 设置定时器超时值
15.2.6 获取定时器当前值
15.2.7 关闭定时器设备
15.3 硬件定时器设备使用示例
16 I2C 总线设备
16.1 I2C 简介
16.2 访问 I2C 总线设备
16.2.1 查找 I2C 总线设备
16.2.2 数据传输
16.3 I2C 总线设备使用示例
17 PWM 设备
17.1 PWM 简介
17.2 访问 PWM 设备
17.2.1 查找 PWM 设备
17.2.2 设置 PWM 周期和脉冲宽度
17.2.3 使能 PWM 设备
17.2.4 关闭 PWM 设备通道
17.3 FinSH 命令
17.4 PWM 设备使用示例
18 RTC 设备
18.1 RTC 简介
18.2 访问 RTC 设备
18.2.1 设置日期
18.2.2 设置时间
18.2.3 获取当前时间
18.3 功能配置
18.3.1 启用 Soft RTC (软件模拟 RTC)
18.3.2 启用 NTP 时间自动同步
18.4 FinSH 命令
18.5 RTC 设备使用示例
19 SPI 设备
19.1 SPI 简介
19.2 挂载 SPI 设备
19.3 配置 SPI 设备
19.4 配置 QSPI 设备
19.5 访问 SPI 设备
19.5.1 查找 SPI 设备
19.5.2 自定义传输数据
19.5.3 传输一次数据
19.5.4 发送一次数据
19.5.5 接收一次数据
19.5.6 连续两次发送数据
19.5.7 先发送后接收数据
19.6 访问 QSPI 设备
19.6.1 传输数据
19.6.2 接收数据
19.6.3 发送数据
19.7 特殊使用场景
19.7.1 获取总线
19.7.2 选中片选
19.7.3 增加一条消息
19.7.4 释放片选
19.7.5 释放总线
19.8 SPI 设备使用示例
20 WATCHDOG 设备
20.1 WATCHDOG 简介
20.2 访问看门狗设备
20.2.1 查找看门狗
20.2.2 初始化看门狗
20.2.3 控制看门狗
20.2.4 关闭看门狗
20.3 看门狗设备使用示例
21 WLAN 设备
21.1 WLAN 框架简介
21.1.1 功能简介
21.1.2 配置选项
21.2 访问 WLAN 设备
21.2.1 指定协议
21.2.2 同步扫描热点
21.2.3 同步连接热点
21.2.4 同步断开热点
21.2.5 配置自动重连模式
21.3 FinSH 命令
21.3.1 WiFi 扫描
21.3.2 WiFi 连接
21.3.3 WiFi 断开
21.4 WLAN 设备使用示例
21.4.1 WiFi 扫描
21.4.2 WiFi 连接与断开
21.4.3 WiFi 开启自动重连
22 FinSH 控制台
22.1 FinSH 简介
22.1.1 传统命令行模式
22.1.2 C 语言解释器模式
22.2 FinSH 内置命令
22.2.1 显示线程状态
22.2.2 显示信号量状态
22.2.3 显示事件状态
22.2.4 显示互斥量状态
22.2.5 显示邮箱状态
22.2.6 显示消息队列状态
22.2.7 显示内存池状态
22.2.8 显示定时器状态
22.2.9 显示设备状态
22.2.10 显示动态内存状态
22.3 自定义 FinSH 命令
22.3.1 自定义 msh 命令
22.3.2 自定义 C-Style 命令和变量
22.3.3 自定义命令重命名
22.4 FinSH 功能配置
22.5 FinSH 应用示例
22.5.1 不带参数的 msh 命令示例
22.5.2 带参数的 msh 命令示例
22.6 FinSH 移植
23 虚拟文件系统
23.1 DFS 简介
23.1.1 DFS 架构
23.1.2 POSIX 接口层
23.1.3 虚拟文件系统层
23.1.4 设备抽象层
23.2 挂载管理
23.2.1 初始化 DFS 组件
23.2.2 注册文件系统
23.2.3 将存储设备注册为块设备
23.2.4 格式化文件系统
23.2.5 挂载文件系统
23.2.6 卸载文件系统
23.3 文件管理
23.3.1 打开和关闭文件
23.3.2 读写数据
23.3.3 重命名
23.3.4 取得状态
23.3.5 删除文件
23.3.6 同步文件数据到存储设备
23.3.7 查询文件系统相关信息
23.3.8 监视 I/O 设备状态
23.4 目录管理
23.4.1 创建和删除目录
23.4.2 打开和关闭目录
23.4.3 读取目录
23.4.4 取得目录流的读取位置
23.4.5 设置下次读取目录的位置
23.4.6 重设读取目录的位置为开头位置
23.5 DFS 配置选项
23.5.1 elm-FatFs 文件系统配置选项
23.5.1.1 长文件名
23.5.1.2 编码方式
23.5.1.3 文件系统扇区大小
23.5.1.4 可重入性
23.5.1.5 更多配置
23.6 DFS 应用示例
23.6.1 FinSH 命令
23.6.2 读写文件示例
23.6.3 更改文件名称示例
23.6.4 获取文件状态示例
23.6.5 创建目录示例
23.6.6 读取目录示例
23.6.7 设置读取目录位置示例
23.7 常见问题
23.7.1 Q: 发现文件名或者文件夹名称显示不正常怎么办?
23.7.2 Q: 文件系统初始化失败怎么办?
23.7.3 Q: 创建文件系统 mkfs 命令失败怎么办?
23.7.4 Q: 文件系统挂载失败怎么办?
23.7.5 Q: SFUD 探测不到 Flash 所使用的具体型号怎么办?
23.7.6 Q: 存储设备的 benchmark 测试耗时过长是怎么回事?
23.7.7 Q: SPI Flash 实现 elmfat 文件系统,如何保留部分扇区不被文件系统使用?
23.7.8 Q: 测试文件系统过程中程序卡住了怎么办?
23.7.9 Q: 如何一步步检查文件系统出现的问题?
24 AT 组件
24.1 AT 命令简介
24.2 AT 组件简介
24.3 AT Server
24.3.1 AT Server 配置
24.3.2 AT Server 初始化
24.3.3 自定义 AT 命令添加方式
24.3.4 AT Server API 接口
24.3.4.1 发送数据至客户端(不换行)
24.3.4.2 发送数据至客户端(换行)
24.3.4.3 发送命令执行结果至客户端
24.3.4.4 解析输入命令参数
24.4 AT Client
24.4.1 AT Client 配置
24.4.2 AT Client 初始化
24.4.3 AT Client 数据收发方式
24.4.3.1 创建响应结构体
24.4.3.2 删除响应结构体
24.4.3.3 设置响应结构体参数
24.4.3.4 发送命令并接收响应
24.4.4 AT Client 数据解析方式
24.4.4.1 获取指定行号的响应数据
24.4.4.2 获取指定关键字的响应数据
24.4.4.3 解析指定行号的响应数据
24.4.4.4 解析指定关键字行的响应数据
24.4.4.5 串口配置信息解析示例
24.4.4.6 IP 和 MAC 地址解析示例
24.4.5 AT Client URC 数据处理
24.4.5.1 URC 数据列表初始化
24.4.6 AT Client 其他 API 接口介绍
24.4.6.1 发送指定长度数据
24.4.6.2 接收指定长度数据
24.4.6.3 设置接收数据的行结束符
24.4.6.4 等待模块初始化完成
24.4.7 AT Client 多客户端支持
24.5 常见问题
24.5.1 Q: 开启 AT 命令收发数据实时打印功能,shell 上日志显示错误怎么办?
24.5.2 Q: AT Socket 功能启动时,编译提示 ``The AT socket device is not selected, please select it through the env menuconfig''?
24.5.3 Q: AT Socket 功能数据接收超时或者数据接收不全?
25 SAL 套接字抽象层
25.1 SAL 简介
25.1.1 SAL 网络框架
25.1.2 工作原理
25.1.2.1 多协议栈接入与接口函数统一抽象功能
25.1.2.2 SAL TLS 加密传输功能
25.1.3 配置选项
25.2 初始化
25.3 BSD Socket API 介绍
25.3.1 创建套接字(socket)
25.3.2 绑定套接字(bind)
25.3.3 监听套接字(listen)
25.3.4 接收连接(accept)
25.3.5 建立连接(connect)
25.3.6 TCP 数据发送(send)
25.3.7 TCP 数据接收(recv)
25.3.8 UDP 数据发送(sendto)
25.3.9 UDP 数据接收(recvfrom)
25.3.10 关闭套接字(closesocket)
25.3.11 按设置关闭套接字(shutdown)
25.3.12 设置套接字选项(setsockopt)
25.3.13 获取套接字选项(getsockopt)
25.3.14 获取远端地址信息(getpeername)
25.3.15 获取本地地址信息(getsockname)
25.3.16 配置套接字参数(ioctlsocket)
25.4 网络协议栈接入方式
26 ulog 日志
26.1 ulog 简介
26.1.1 ulog 架构
26.1.2 配置选项
26.1.3 日志级别
26.1.4 日志标签
26.2 日志初始化
26.2.1 初始化
26.2.2 去初始化
26.3 日志输出 API
26.4 日志使用示例
26.4.1 使用示例
26.4.2 在中断 ISR 中使用
26.4.3 设置日志格式
26.4.4 hexdump 输出使用
26.5 日志高级功能
26.5.1 日志后端
26.5.1.1 注册后端设备
26.5.1.2 注销后端设备
26.5.1.3 后端实现及注册示例
26.5.2 异步日志
26.5.2.1 配置选项
26.5.2.2 使用示例
26.5.3 日志动态过滤器
26.5.3.1 按模块的级别过滤
26.5.3.2 按标签全局过滤
26.5.3.3 按级别全局过滤
26.5.3.4 按关键词全局过滤
26.5.3.5 查看过滤器信息
26.5.3.6 使用示例
26.5.4 系统异常时的使用
26.5.4.1 断言
26.5.4.2 CmBacktrace
26.5.5 syslog 模式
26.5.5.1 日志格式
26.5.5.2 使用方法
26.5.6 从 rt_dbg.h 或 elog 迁移到 ulog
26.5.6.1 从 rt_dbg.h 迁移
26.5.6.2 从 elog(EasyLogger)迁移
26.5.7 日志使用技巧
26.5.7.1 合理利用标签分类
26.5.7.2 合理利用日志级别
26.5.7.3 避免重复性冗余日志
26.5.7.4 开启更多的日志格式
26.5.7.5 关闭不重要的日志
26.6 常见问题
26.6.1 Q: 日志代码已执行,但是无输出。
26.6.2 Q: 开启 ulog 后,系统运行崩溃,例如:线程堆栈溢出。
26.6.3 Q: 日志内容的末尾缺失。
26.6.4 Q: 开启时间戳以后,为什么看不到毫秒级时间。
26.6.5 Q: 每次 include ulog 头文件前,都要定义 LOG_TAG 及 LOG_LVL ,可否简化。
26.6.6 Q: 运行出现警告提示:Warning: There is no enough buffer for saving async log, please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option。
26.6.7 Q: 编译时提示:The idle thread stack size must more than 384 when using async output by idle (ULOG_ASYNC_OUTPUT_BY_IDLE)。
27 utest 测试框架
27.1 utest 简介
27.1.1 测试用例定义
27.1.2 测试单元定义
27.1.3 utest 应用框图
27.2 utest API
27.2.1 assert 宏
27.2.2 测试单元运行宏
27.2.3 测试用例导出宏
27.2.4 测试用例 LOG 输出接口
27.3 配置使能
27.4 应用范式
27.5 测试用例运行要求
27.6 运行测试用例
27.6.1 测试结果分析
27.7 测试用例运行流程
27.8 注意事项
28 动态模块
28.1 功能简介
28.2 使用动态模块
28.2.1 编译固件
28.2.2 编译动态模块
28.3 RT-Thread 动态模块 API
28.3.1 加载动态模块
28.3.2 执行动态模块
28.3.3 退出动态模块
28.3.4 查找动态模块
28.3.5 返回动态模块
28.3.6 查找符号
28.4 标准 POSIX 动态库 libdl API
28.4.1 打开动态库
28.4.2 查找符号
28.4.3 关闭动态库
28.5 常见问题
28.5.1 Env 工具的相关问题请参考 《Env 用户手册》。
28.5.2 Q: 根据文档不能成功运行动态模块。
28.5.3 Q: 使用 scons 命令编译工程,提示 undefined reference to __rtmsymtab_start。
29 POSIX 接口
29.1 Pthreads 简介
29.1.1 在 RT-Thread 中使用 POSIX
29.2 线程
29.2.1 线程句柄
29.2.2 创建线程
29.2.2.1 创建线程示例代码
29.2.3 脱离线程
29.2.3.1 脱离线程示例代码
29.2.4 等待线程结束
29.2.4.1 等待线程结束示例代码
29.2.5 退出线程
29.2.5.1 退出线程示例代码
29.3 互斥锁
29.3.1 互斥锁控制块
29.3.2 初始化互斥锁
29.3.3 销毁互斥锁
29.3.4 阻塞方式对互斥锁上锁
29.3.5 非阻塞方式对互斥锁上锁
29.3.6 解锁互斥锁
29.3.7 互斥锁示例代码
29.4 条件变量
29.4.1 条件变量控制块
29.4.2 初始化条件变量
29.4.3 销毁条件变量
29.4.4 阻塞方式获取条件变量
29.4.5 指定阻塞时间获取条件变量
29.4.6 发送满足条件信号量
29.4.7 广播
29.4.8 条件变量示例代码
29.5 读写锁
29.5.1 读写锁控制块
29.5.2 初始化读写锁初始化
29.5.3 销毁读写锁
29.5.4 读写锁读锁定
29.5.4.1 阻塞方式对读写锁读锁定
29.5.4.2 非阻塞方式对读写锁读锁定
29.5.4.3 指定阻塞时间对读写锁读锁定
29.5.5 读写锁写锁定
29.5.5.1 阻塞方式对读写锁写锁定
29.5.5.2 非阻塞方式写锁定读写锁
29.5.5.3 指定阻塞时长写锁定读写锁
29.5.6 读写锁解锁
29.5.7 读写锁示例代码
29.6 屏障
29.6.1 屏障控制块
29.6.2 创建屏障
29.6.3 销毁屏障
29.6.4 等待屏障
29.6.5 屏障示例代码
29.7 信号量
29.7.1 信号量控制块
29.7.2 无名信号量
29.7.2.1 初始化无名信号量
29.7.2.2 销毁无名信号量
29.7.3 有名信号量
29.7.3.1 创建或打开有名信号量
29.7.3.2 分离有名信号量
29.7.3.3 关闭有名信号量
29.7.4 获取信号量值
29.7.5 阻塞方式等待信号量
29.7.6 非阻塞方式获取信号量
29.7.7 指定阻塞时间等待信号量
29.7.8 发送信号量
29.7.9 无名信号量使用示例代码
29.8 消息队列
29.8.1 消息队列控制块
29.8.2 创建或打开消息队列
29.8.3 分离消息队列
29.8.4 关闭消息队列
29.8.5 阻塞方式发送消息
29.8.6 指定阻塞时间发送消息
29.8.7 阻塞方式接受消息
29.8.8 指定阻塞时间接受消息
29.8.9 消息队列示例代码
29.9 线程高级编程
29.9.0.1 线程属性初始化及去初始化
29.9.0.2 线程的分离状态
29.9.0.3 线程的调度策略
29.9.0.4 线程的调度参数
29.9.0.5 线程的堆栈大小
29.9.0.6 线程堆栈大小和地址
29.9.0.7 线程属性相关函数
29.9.0.8 线程属性示例代码
29.9.1 线程取消
29.9.1.1 发送取消请求
29.9.1.2 设置取消状态
29.9.1.3 设置取消类型
29.9.1.4 设置取消点
29.9.1.5 取消点
29.9.1.6 线程取消示例代码
29.9.2 一次性初始化
29.9.3 线程结束后清理
29.9.4 其他线程相关函数
29.9.4.1 判断 2 个线程是否相等
29.9.4.2 获取线程句柄
29.9.4.3 获取最大最小优先级
29.9.5 互斥锁属性
29.9.5.1 互斥锁属性初始化及去初始化
29.9.5.2 互斥锁作用域
29.9.5.3 互斥锁类型
29.9.6 条件变量属性
29.9.6.1 获取条件变量作用域
29.9.7 读写锁属性
29.9.7.1 初始化属性
29.9.7.2 获取作用域
29.9.8 屏障属性
29.9.8.1 初始化属性
29.9.8.2 获取作用域
29.9.9 消息队列属性
29.9.9.1 获取属性
30 电源管理组件
30.1 PM 组件介绍
30.1.1 主要特点
30.1.2 工作原理
30.2 设计架构
30.3 低功耗状态和模式
30.3.1 模式的请求和释放
30.3.2 对模式变化敏感的设备
30.4 调用流程
30.5 API 介绍
30.6 使用说明
30.7 移植说明
30.8 MSH 命令
30.8.1 请求休眠模式
30.8.2 释放休眠模式
30.8.3 设置运行模式
30.8.4 查看模式状态
30.9 常见问题及调试方法
31 SCons 构建工具
31.1 SCons 简介
31.1.1 什么是构建工具
31.1.2 RT-Thread 构建工具
31.1.3 安装 SCons
31.2 SCons 基本功能
31.2.1 SCons 基本命令
31.2.1.1 scons
31.2.1.2 scons -c
31.2.1.3 scons –target=XXX
31.2.1.4 scons -jN
31.2.1.5 scons –dist
31.2.1.6 scons –verbose
31.3 SCons 进阶
31.3.1 SCons 内置函数
31.3.1.1 GetCurrentDir()
31.3.1.2 Glob(`*.c')
31.3.1.3 GetDepend(macro)
31.3.1.4 Split(str)
31.3.1.5 DefineGroup(name, src, depend,**parameters)
31.3.1.6 SConscript(dirs,variant_dir,duplicate)
31.4 SConscript 示例
31.4.1 SConscript 示例 1
31.4.2 SConscript 示例 2
31.4.3 SConscript 示例 3
31.4.4 SConscript 示例 4
31.5 使用 SCons 管理工程
31.5.1 添加应用代码
31.5.2 添加模块
31.5.3 添加库
31.5.4 编译器选项
31.5.5 RT-Thread 辅助编译脚本
31.5.6 SCons 更多使用
RT-THREAD 编程指南 RT-THREAD 文档中心 上海睿赛德电子科技有限公司版权 @2019 WWW.RT-THREAD.ORG Friday 2nd August, 2019
版本和修订 Date 2013-05-14 2018-12-29 2018-12.29 Version v1.0.0 v2.0.0 v2.0.0 Author bernard yangjie misonyo Note 初始版本 内核内容修订 组件及设备内容修订
目录 版本和修订 目录 1 RT-Thread 简介 1.1 RT-Thread 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 许可协议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 RT-Thread 的架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 内核基础 2.1 RT-Thread 内核介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 线程调度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 时钟管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.3 线程间同步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.4 线程间通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.5 内存管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.6 I/O 设备管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 RT-Thread 启动流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 RT-Thread 程序内存分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 RT-Thread 自动初始化机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 RT-Thread 内核对象模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.1 静态对象和动态对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.2 内核对象管理架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.3 对象控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.4 内核对象管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.4.1 初始化对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.4.2 脱离对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i ii 1 1 1 2 4 4 5 5 5 5 6 6 6 8 10 11 11 13 15 16 16 17
2.5.4.3 分配对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.4.4 删除对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.4.5 辨别对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 RT-Thread 内核配置示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 常见宏定义说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 线程管理 3.1 线程管理的功能特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 线程的工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 线程控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 线程重要属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.1 线程栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.2 线程状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.3 线程优先级 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.4 时间片 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.5 线程的入口函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.6 线程错误码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 线程状态切换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.4 系统线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.4.1 空闲线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.4.2 主线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 线程的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 创建和删除线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2 初始化和脱离线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 启动线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.4 获得当前线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.5 使线程让出处理器资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.6 使线程睡眠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.7 挂起和恢复线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.8 控制线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.9 设置和删除空闲钩子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.10 设置调度器钩子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 线程应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 18 18 21 23 24 24 24 25 25 26 27 27 27 28 28 29 29 29 30 30 31 33 33 34 34 34 35 36 37 37
3.4.1 创建线程示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.2 线程时间片轮转调度示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.3 线程调度器钩子示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 时钟管理 4.1 时钟节拍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 时钟节拍的实现方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 获取时钟节拍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 定时器管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 RT-Thread 定时器介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1.1 HARD_TIMER 模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1.2 SOFT_TIMER 模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 定时器工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2.1 定时器控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2.2 定时器跳表 (Skip List) 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 定时器的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3.1 创建和删除定时器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3.2 初始化和脱离定时器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3.3 启动和停止定时器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3.4 控制定时器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 定时器应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 高精度延时 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 线程间同步 5.1 信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 信号量工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 信号量控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3 信号量的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3.1 创建和删除信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3.2 初始化和脱离信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3.3 获取信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3.4 无等待获取信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3.5 释放信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.4 信号量应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 39 41 44 44 44 45 46 46 46 47 47 48 48 49 50 51 52 53 54 57 59 60 60 61 61 61 62 63 64 64 65
5.1.5 信号量的使用场合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5.1 线程同步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5.2 锁 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5.3 中断与线程的同步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5.4 资源计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 互斥量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 互斥量工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.2 互斥量控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3 互斥量的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3.1 创建和删除互斥量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3.2 初始化和脱离互斥量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3.3 获取互斥量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3.4 释放互斥量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.4 互斥量应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.5 互斥量的使用场合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 事件集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 事件集工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 事件集控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3 事件集的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3.1 创建和删除事件集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3.2 初始化和脱离事件集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3.3 发送事件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3.4 接收事件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.4 事件集应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.5 事件集的使用场合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 线程间通信 6.1 邮箱 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 邮箱的工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 邮箱控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3 邮箱的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3.1 创建和删除邮箱 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3.2 初始化和脱离邮箱 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 71 72 72 73 73 73 75 75 75 76 77 78 78 84 84 84 85 85 86 87 88 88 89 92 93 93 93 94 94 95 96
6.1.3.3 发送邮件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3.4 等待方式发送邮件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3.5 接收邮件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.4 邮箱使用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 97 98 98 6.1.5 邮箱的使用场合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 6.2 消息队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.2.1 消息队列的工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.2.2 消息队列控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.2.3 消息队列的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.2.3.1 创建和删除消息队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 6.2.3.2 初始化和脱离消息队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 6.2.3.3 发送消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.2.3.4 发送紧急消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.2.3.5 接收消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 6.2.4 消息队列应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6.2.5 消息队列的使用场合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 6.2.5.1 发送消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 6.2.5.2 同步消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 6.3 信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.3.1 信号的工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.3.2 信号的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.3.2.1 安装信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.3.2.2 阻塞信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 6.3.2.3 解除信号阻塞 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 6.3.2.4 发送信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 6.3.2.5 等待信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 6.3.3 信号应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 7 内存管理 119 7.1 内存管理的功能特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 7.2 内存堆管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 7.2.1 小内存管理算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 7.2.2 slab 管理算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.2.3 memheap 管理算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 7.2.4 内存堆配置和初始化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 7.2.5 内存堆的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 7.2.5.1 分配和释放内存块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 7.2.5.2 重分配内存块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 7.2.5.3 分配多内存块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 7.2.5.4 设置内存钩子函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 7.2.6 内存堆管理应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7.3 内存池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 7.3.1 内存池工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7.3.1.1 内存池控制块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7.3.1.2 内存块分配机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 7.3.2 内存池的管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 7.3.2.1 创建和删除内存池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7.3.2.2 初始化和脱离内存池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 7.3.2.3 分配和释放内存块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.3.3 内存池应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 8 中断管理 139 8.1 Cortex-M CPU 架构基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 8.1.1 寄存器简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 8.1.2 操作模式和特权级别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 8.1.3 嵌套向量中断控制器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 8.1.4 PendSV 系统调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 8.2 RT-Thread 中断工作机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 8.2.1 中断向量表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 8.2.2 中断处理过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 8.2.2.1 中断前导程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 8.2.2.2 用户中断服务程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 8.2.2.3 中断后续程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 8.2.3 中断嵌套 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 8.2.4 中断栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 8.2.5 中断的底半处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
分享到:
收藏