引言
一个嵌入式操作系统的实现过程
读者对象
内容安排
致谢
第一部分:构建内核
1. 搭建工作环境:选择内核、处理器与工具链
1.1. 认识嵌入式操作系统内核
1.1.1. 操作系统是什么
1.1.2. 嵌入式操作系统的特点
1.1.3. 内核要完成的工作
1.1.4. 内核的选择:微内核
1.2. 选择硬件平台
1.2.1. 计算机组成简介
1.2.2. ARM Cortex-M4处理器与STM32微控制器
1.2.3. 探索者STM32F407开发板
1.3. 搭建开发工具链
1.3.1. Linux系统环境及基本操作
1.3.2. 文本编辑器:VS Code
1.3.3. 交叉编译器:gcc-arm
1.3.4. 代码烧录器:OpenOCD
1.3.5. 在线调试器:GDB
1.4. 小结
2. 让处理器跑起来:编写boot引导程序
2.1. 处理器的工作原理
2.1.1. ARM Cortex-M4的内核结构
2.1.2. ARM指令集与汇编语言简介
2.1.3. STM32的上电过程
2.2. 编写引导程序
2.2.1. 用汇编实现的启动文件: boot.s
2.2.2. 从汇编程序跳转到C程序的main()函数
2.2.3. 通过编译链接脚本生成二进制文件
2.2.4. 烧录并运行程序
2.3. 小结
3. 通过外设进行交互:编写串口驱动
3.1. 外设驱动模型
3.1.1. 外设类型
3.1.2. 外设驱动要完成的功能
3.1.3. STM32片上外设的访问方法
3.2. 通过串口进行通信交互
3.2.1. 串口通信简介
3.2.2. 初始化串口
3.2.3. 实现printf()
3.2.4. 轮询接收数据
3.3. 小结
4. 及时处理突发事件:响应串口接收中断
4.1. 处理器的中断机制
4.1.1. 什么是中断
4.1.2. ARM Cortex-M4的中断控制器NVIC
4.2. 给串口驱动添加中断服务
4.2.1. 开启串口接收中断
4.2.2. 从中断向量表跳转到中断服务函数
4.2.3. 确认中断信号
4.2.4. 实现接收缓存队列
4.3. 小结
5. 同时完成多项任务:CPU资源的时分复用
5.1. 时分复用思想
5.1.1. 程序运行所需的资源
5.1.2. 进程的前身:多道程序
5.1.3. 运行上下文切换原理
5.1.4. ARM Cortex-M4针对上下文切换的优化
5.2. 用汇编实现的上下文切换
5.2.1. 保存上文
5.2.2. 恢复下文
5.2.3. 分配栈空间
5.2.4. 实现交替发送字符的两道程序
5.3. 小结
6. 控制切换任务的节奏:引入系统时钟
6.1. 时钟硬件
6.1.1. 处理器的主频
6.1.2. ARM Cortex-M4的内核计时器SysTick
6.2. 定时触发上下文切换
6.2.1. 初始化SysTick
6.2.2. 开启计时器溢出中断
6.2.3. 在中断服务函数中触发上下文切换
6.3. 小结
7.管理任务的运行状态:构建进程管理系统
7.1. 进程管理组件
7.1.1. 进程描述符
7.1.2. 进程的状态机
7.1.3. 进程队列
7.2. 实现第一个内核进程——init
7.2.1. init进程的功能——空转
7.2.2. 移植Linux内核的通用链表
7.2.3. 初始化进程管理组件
7.3. 实现第二个内核进程——echo
7.3.1. echo进程的功能——回显串口接收数据
7.3.2. echo进程主动挂起
7.3.3. 在串口接收中断服务函数中唤醒进程
7.4. 小结
8.区别对待不同的任务:实现进程调度器
8.1. 进程调度器
8.1.1. 进程调度器的任务
8.1.2. 为进程划分时间片
8.1.3. 抢占式的优先调度
8.2. 编写进程调度函数schedule()
8.2.1. 调度函数schedule()的流程
8.2.2. 修改进程描述符
8.2.3. 增加优先队列
8.2.4. 处理当前进程的时间片
8.2.5. 选择并切换进程
8.3. 小结
9. 解除进程与外设的关联:用信号通知进程中断事件
9.1. 中断、事件与信号
9.1.1. echo进程与串口中断服务的耦合关系
9.1.2. 把中断抽象成事件
9.1.3. 发布事件发生的信号
9.2. 信号机制驱动的echo进程
9.2.1. 定义事件描述符
9.2.2. 实现事件等待队列
9.2.3. 在进程中监听事件信号
9.2.4. 在中断中发布事件信号
9.2.5. 在调度时唤醒等待的进程
9.3. 小结
10.建立进程之间的信息通道:IPC
10.1. 进程间通信机制
10.1.1. 异步IPC与同步IPC
10.1.2. 系统调用
10.1.3. 建立在IPC上的微内核
10.2. 实现服务模式的同步IPC
10.2.1. 定义服务描述符
10.2.2. 实现系统调用msg_send()
10.2.3. 实现系统调用msg_recv()
10.2.4. 提供系统时钟查询服务:tick进程
10.3. 实现基于消息队列的异步IPC
10.3.1. 定义消息描述符
10.3.2. 把串口驱动封装成进程uart_driver
10.3.3. 注册进程uart_driver的消息队列
10.3.4. 异步调用msg_send()发送消息
10.4. 小结
11. 解决资源竞争的问题:给公共资源加锁
11.1. 增加测试进程test——通过串口输出字符
11.2. test与echo的竞争关系
11.2.1. 竞争条件
11.2.2. 临界区
11.3. 实现互斥信号量mutex_t
11.3.1. ARM Cortex-M4互斥访问方法
11.3.2. 实现函数mutex_lock()与mutex_free()
11.3.3. 用mutex_t保护串口外设资源
11.4. 小结
12. 发布内核V1.0
12.1. 迟到的系统框图
12.2. 内核V1.0的适用场景
12.3. 移植内核
12.4. 小结
第二部分:丰富内核
13. 扩展系统内存空间:突破片上内存的限制
13.1. 计算机的内存系统
13.1.1. 计算机的层次化存储结构简介
13.1.2. ARM Cortex-M4的内存空间划分
13.1.3. STM32的静态存储管理器FSMC
13.1.4. 开发板上的扩展内存SRAM
13.2. 驱动扩展内存SRAM
13.2.1. 配置FSMC的时钟和相关引脚
13.2.2. 设置FSMC的工作模式
13.2.3. 读写SRAM
13.3. 小结
14. 支持动态分配内存:构建内存管理系统
14.1. 进程的内存空间
14.1.1. 栈空间
14.1.2. 堆空间
14.1.3. 静态数据空间
14.2. 实现堆空间内存的动态分配
14.2.1. 初始化内存池
14.2.2. malloc()接口实现
14.2.3. free()接口实现
14.3. 小结
15.防止用户篡改系统数据:保护内核的内存空间
15.1. 操作系统内核的内存空间
15.1.1. 内核态与用户态
15.1.2. ARM Cortex-M4的内存保护单元MPU
15.1.3. 高级内存管理单元MMU简介
15.2. 通过MPU保护内存空间
15.2.1. 指定内核的内存空间
15.2.2. 在进程描述符中记录内存的使用情况
15.2.3. 在进程切换时修改MPU的保护项
15.3. 小结
16.解决内存数据掉电丢失的问题:扩展外部存储空间
16.1. 计算机的外部存储
16.1.1. 常见的外部存储介质
16.1.2. 开发板上的SD存储卡
16.1.3. STM32的SDIO接口
16.2. 实现SD卡驱动程序
16.2.1. 初始化SDIO接口
16.2.2. 完成SD卡的枚举过程
16.2.3. 实现SD卡的读写操作
16.3. 实现SD卡驱动的专用进程
16.3.1. 定义驱动进程的服务和消息
16.3.2. 实现SD卡的驱动循环
16.4. 小结
17. 管理外部存储空间:构建文件系统
17.1. 文件系统简介
17.1.1. 文件系统的功能
17.1.2. 文件与目录
17.1.3. 常见的文件系统方案
17.2. 建立一个基于FAT表的文件系统
17.2.1. 设计文件的存放方式
17.2.2. FAT表的实现
17.2.3. 抽象文件属性
17.2.4. 以文件形式存储的根目录
17.2.5. 格式化磁盘的接口
17.2.6. 解析文件名
17.3. 小结
18. 外部存储中数据的增删改查:实现文件系统管理器
18.1. 实现文件系统的基本操作
18.1.1. 检查文件是否存在
18.1.2. 创建文件
18.1.3. 打开文件
18.1.4. 读写文件
18.1.5. 关闭文件
18.1.6. 删除文件
18.2. 实现文件管理进程
18.2.1. 文件系统基本操作的服务
18.2.2. 实现管理进程的控制循环
18.3. 小结
19. 管理丰富多样的系统外设:建立统一的外设驱动框架
19.1. 把外设抽象成文件
19.1.1. 外设是一种特殊的文件
19.1.2. 定义文件操作符file_operators
19.1.3. 定义文件描述符file
19.1.4. 定义已打开文件的描述符inode
19.2. 把串口抽象为字符设备
19.2.1. 向内核注册串口驱动
19.2.2. 通过open()获取串口资源
19.2.3. 通过close()释放串口资源
19.2.4. 实现字符设备的读写接口
19.2.5. 定义串口设备的配置接口ioctl()
19.3. 把SD卡抽象为块设备
19.3.1. 注册SD卡驱动
19.3.2. 实现获取和释放SD卡资源的接口
19.3.3. 实现块设备的读写接口
19.3.4. 实现配置接口ioctl()
19.4. 小结
20. 发布内核V2.0
20.1. 更新系统框图
20.2. 内核V2.0的适用场景
20.3. 可能的探索方向
20.4. 小结
参考资料
测试页
本书使用 GitBook 发布
20. 发布内核V2.0
20. 发布内核V2.0
20.1. 更新系统框图
20.2. 内核V2.0的适用场景
20.3. 可能的探索方向
20.4. 小结
20. 发布内核V2.0
20.1. 更新系统框图
20.2. 内核V2.0的适用场景
20.3. 可能的探索方向
20.4. 小结
results matching "
"
No results matching "
"