第1章 嵌入式系统概述 1
1.1 嵌入式系统简介 1
1.1.1 嵌入式系统的产生 1
1.1.2 嵌入式系统的定义、特点和分类 2
1.1.3 嵌入式系统的典型组成 3
1.2 嵌入式微处理器 4
1.2.1 嵌入式微处理器简介 4
1.2.2 主流嵌入式微处理器 6
1.3 嵌入式操作系统 7
1.3.1 嵌入式 Linux 8
1.3.2 QNX 9
1.3.3 HuaweiLiteOS 9
1.3.4 Android 10
1.3.5 μC/OS-Ⅱ 10
1.3.6 VxWorks 10
1.3.7 RT-Thread 10
1.4 嵌入式系统的应用领域和发展趋势 11
1.4.1 嵌入式系统的应用领域 11
1.4.2 嵌入式系统的发展趋势 17
1.5 本章小结 18
第2章 RISC-V处理器架构 19
2.1 RISC-V 架构简介 19
2.1.1 RISC-V 架构的发展及推广 19
2.1.2 RISC-V 架构特点 20
2.1.3 RISC-V 架构处理器芯片 22
2.2 RISC-V 寄存器 23
Ⅵ
2.2.1 通用寄存器 23
2.2.2 控制与状态寄存器 24
2.2.3 程序指针寄存器 PC 24
2.3 RISC-V 权限模式 25
2.4 RISC-V 指令集 26
2.4.1 RISC-V 指令编码格式 26
2.4.2 RISC-V 指令长度编码 28
2.4.3 RISC-V 寻址方式 28
2.4.4 RV32I指令简介 29
2.5 RISC-V 异常与中断 33
2.5.1 同步异常和异步异常 33
2.5.2 RV32权限模式和异常 33
2.5.3 机器模式异常相关的 CSR 寄存器 33
2.5.4 异常与中断响应过程 36
2.6 本章小结 37
第3章 昉· 星光2(VisionFive2)RISC-V单板计算机 38
3.1 JH-7110(昉· 惊鸿-7110)处理器 38
3.1.1 JH-7110处理器简介 38
3.1.2 JH-7110处理器内部各模块介绍 39
3.1.3 JH-7110处理器地址映射 41
3.2 VisionFive2RISC-V 单板计算机简介 44
3.2.1 VisionFive2RISC-V 单板计算机组成 44
3.2.2 VisionFive2RISC-V 单板计算机外设 46
3.3 快速使用 VisionFive2RISC-V 单板计算机 47
3.3.1 将操作系统烧录到 Micro-SD 卡上并扩展分区 47
3.3.2 更新 SPL 和 U-Boot 49
3.4 本章小结 50
第4章 Linux基础 51
4.1 Linux和 Shell 51
4.2 常见 Linux发行版本 53
4.3 Linux文件管理 54
4.3.1 查看文件 55
4.3.2 元字符 56
4.3.3 隐藏文件 56
Ⅶ
4.3.4 查看文件内容 57
4.3.5 统计单词数目 57
4.3.6 复制文件 57
4.3.7 重命名文件 57
4.3.8 删除文件 58
4.4 Linux目录 58
4.4.1 主目录 58
4.4.2 绝对路径和相对路径 58
4.4.3 创建目录 59
4.4.4 删除目录 60
4.4.5 改变所在目录 60
4.4.6 重命名目录 60
4.5 Linux文件权限和访问模式 61
4.5.1 查看文件权限 61
4.5.2 文件访问模式 61
4.5.3 目录访问模式 61
4.5.4 改变权限 62
4.5.5 更改所有者和用户组 63
4.6 Linux环境变量 64
4.6.1 .profile文件 65
4.6.2 设置终端类型 65
4.6.3 设置 PATH 变量 65
4.6.4 设置命令提示符 65
4.6.5 常用环境变量 67
4.7 Linuxyum 和 Linuxapt软件包管理器 67
4.7.1 Linuxyum 软件包管理器 67
4.7.2 Linuxapt软件包管理器 68
4.8 Linux常用服务 69
4.8.1 Linux磁盘管理 69
4.8.2 SSH 服务 71
4.8.3 minicom 72
4.9 本章小结 73
第5章 Linux内核 74
5.1 Linux内核概述 74
5.1.1 GNU/Linux的基本体系结构 74
Ⅷ
5.1.2 Linux内核版本及特点 75
5.1.3 Linux内核的主要架构及功能 76
5.1.4 Linux内核源码目录结构 78
5.2 Linux进程管理 79
5.2.1 进程的表示和切换 80
5.2.2 进程、线程和内核线程 82
5.2.3 进程描述符task_struct的几个特殊字段 83
5.2.4 kernel_clone函数 83
5.2.5 进程的创建 85
5.2.6 线程和内核线程的创建 87
5.2.7 进程的执行———exec函数族 88
5.2.8 进程的终止 88
5.2.9 进程的调度 89
5.3 Linux内存管理 91
5.3.1 Linux内存管理概述 91
5.3.2 Linux虚拟存储空间及分布 93
5.3.3 进程空间描述 95
5.3.4 物理内存管理(页管理) 98
5.3.5 基于 Slab分配器的管理技术 100
5.3.6 内核非连续内存分配(vmalloc) 100
5.3.7 页面回收简述 101
5.4 Linux模块 102
5.4.1 LKM 的编写和编译 102
5.4.2 LKM 的内核表示 103
5.4.3 模块的加载与卸载 104
5.4.4 模块主要命令 106
5.5 Linux中断管理 107
5.5.1 Linux中断的一些基本概念 107
5.5.2 通用中断子系统 108
5.5.3 主要数据结构 109
5.6 本章小结 110
第6章 Linux文件系统 111
6.1 Linux文件系统概述 111
6.2 Ext2/Ext3/Ext4文件系统 114
6.3 嵌入式文件系统 116
Ⅸ
6.3.1 嵌入式文件系统概述 116
6.3.2 JFFS2嵌入式文件系统 118
6.4 ramfs和ramdisk文件系统 123
6.4.1 ramfs 123
6.4.2 ramdisk文件系统 124
6.5 根文件系统 125
6.5.1 根文件系统概述 125
6.5.2 根文件系统的制作工具———Busybox 127
6.5.3 制作根文件系统 128
6.6 本章小结 131
第7章 嵌入式Linux系统移植 132
7.1 BootLoader基础 132
7.1.1 BootLoader基本概念 132
7.1.2 BootLoader的操作模式 133
7.1.3 BootLoader的典型结构 133
7.1.4 常见的 BootLoader 134
7.1.5 U-Boot概述 135
7.1.6 RISC-V 架构的 U-Boot引导过程 136
7.1.7 U-Boot环境变量 137
7.1.8 U-Boot命令 138
7.1.9 U-Boot对设备树的支持 140
7.2 JH-7110的启动流程分析 142
7.2.1 启动模式设置 142
7.2.2 启动资源 142
7.2.3 BootROM 144
7.2.4 SPL 145
7.2.5 OpenSBI 145
7.2.6 U-Boot 145
7.3 JH-7110的 U-Boot编程基础知识 146
7.3.1 配置 146
7.3.2 接口描述 149
7.3.3 调试方法 152
7.4 交叉开发环境与交叉编译工具链 153
7.4.1 主机与目标机的连接方式和文件传输方式 154
7.4.2 交叉编译环境的建立 155
Ⅹ
7.4.3 交叉编译工具链概述 155
7.4.4 交叉编译工具链的主要工具 156
7.4.5 RISC-Vgcc工具链 161
7.4.6 Makefile基础 162
7.4.7 clang与 LLVM 164
7.5 嵌入式 RISC-V Linux系统移植过程 167
7.5.1 BootLoader移植 167
7.5.2 内核的配置、编译和移植 169
7.6 本章小结 178
第8章 设备驱动程序设计 179
8.1 设备驱动程序开发概述 179
8.1.1 Linux 设备驱动程序分类 180
8.1.2 驱动程序的处理过程 181
8.1.3 设备驱动程序框架 189
8.1.4 驱动程序的加载 192
8.2 内核设备模型 193
8.2.1 设备模型功能 193
8.2.2 sysfs概述 194
8.2.3 sysfs的实现机制 kobject 195
8.2.4 设备模型的组织———platform 总线 198
8.3 设备树 201
8.4 GPIO 设计案例 205
8.4.1 GPIO 概述 206
8.4.2 配置 207
8.4.3 接口描述 210
8.4.4 示例 212
8.5 I2C 总线设计案例 215
8.5.1 I2C 总线介绍 215
8.5.2 I2C 驱动程序框架 216
8.5.3 配置 219
8.5.4 接口描述 221
8.5.5 通用示例 222
8.6 SPI设计案例 224
8.6.1 配置 225
8.6.2 SPI驱动程序框架 228
Ⅺ
8.6.3 接口描述 229
8.6.4 示例 230
8.7 UART 设计案例 231
8.7.1 简介 232
8.7.2 配置 233
8.7.3 接口描述 235
8.7.4 UART 示例 235
8.8 本章小结 239
第9章 VisionFive2单板机开发案例 240
9.1 Python驱动蜂鸣器案例 240
9.1.1 连接硬件 240
9.1.2 执行演示代码 241
9.1.3 程序源码 241
9.2 Python开发温湿度监测系统案例 242
9.2.1 连接硬件 243
9.2.2 执行演示代码 243
9.2.3 程序源码 244
9.3 Python驱动 LCD 屏显案例 244
9.3.1 连接硬件 244
9.3.2 执行演示代码 244
9.3.3 程序源码 246
9.4 Python读取 GPS数据案例 246
9.4.1 连接硬件 246
9.4.2 执行演示代码 246
9.4.3 程序源码 247
9.5 本章小结 248
参考文献 249