内容简介
第一部分 从0到1教你写μC/OS内核
第1章 新建工程——软件仿真
1.1 新建本地工程文件夹
1.2 使用KEIL新建工程
1.2.1 New Project
1.2.2 Select Device For Target
1.2.3 Manage Run-Time Environment
1.3 在KEIL工程中新建文件组
1.4 在KEIL工程中添加文件
1.5 调试配置
1.5.1 设置软件仿真
1.5.2 修改时钟大小
1.5.3 添加头文件路径
第2章 裸机系统与多任务系统
2.1 裸机系统
2.1.1 轮询系统
2.1.2 前后台系统
2.2 多任务系统
第3章 任务的定义与任务切换
3.1 多任务系统中任务的概念
3.2 创建任务
3.2.1 定义任务栈
3.2.2 定义任务函数
3.2.3 定义任务控制块
3.2.4 实现任务创建函数
3.3 操作系统初始化
3.4 启动系统
3.5 任务切换
3.6 main()函数
3.7 实验现象
第4章 任务时间片运行
4.1 SysTick简介
4.2 初始化SysTick
4.3 编写SysTick中断服务函数
4.4 main()函数
4.5 实验现象
第5章 空闲任务与阻塞延时
5.1 实现空闲任务
5.1.1 定义空闲任务栈
5.1.2 定义空闲任务的任务控制块
5.1.3 定义空闲任务函数
5.1.4 空闲任务初始化
5.2 实现阻塞延时
5.3 main()函数
5.4 实验现象
第6章 时间戳
6.1 时间戳简介
6.2 时间戳的实现
6.3 时间戳代码
6.3.1 CPU_Init()函数
6.3.2 CPU_TS_Init()函数
6.3.3 CPU_TS_TmrInit()函数
6.3.4 BSP_CPU_ClkFreq()函数
6.3.5 CPU_TS_TmrFreqSet()函数
6.3.6 CPU_TS_TmrRd()函数
6.3.7 OS_TS_GET()函数
6.4 main()函数
6.5 实验现象
第7章 临界段
7.1 临界段简介
7.2 Cortex-M内核快速关中断指令
7.3 关中断
7.4 开中断
7.5 临界段代码的应用
7.6 测量关中断时间
7.6.1 测量关中断时间初始化
7.6.2 测量最大关中断时间
7.6.3 获取最大关中断时间
7.7 main()函数
7.8 实验现象
第8章 就绪列表
8.1 优先级表的定义及函数
8.2 就绪列表的定义及函数
8.3 main()函数
8.4 实验现象
第9章 多优先级
9.1 定义优先级相关全局变量
9.2 修改OSInit()函数
9.3 修改任务控制块
9.4 修改OSTaskCreate()函数
9.5 修改OS_IdleTaskInit()函数
9.6 修改OSStart()函数
9.7 修改PendSV_Handler()函数
9.8 修改OSTimeDly()函数
9.9 修改OSSched()函数
9.10 修改OSTimeTick()函数
9.11 main()函数
9.12 实验现象
第10章 时基列表
10.1 实现时基列表
10.1.1 定义时基列表变量
10.1.2 修改任务控制块
10.1.3 实现时基列表相关函数
10.2 修改OSTimeDly()函数
10.3 修改OSTimeTick()函数
10.4 main()函数
10.5 实验现象
第11章 时间片
11.1 实现时间片
11.1.1 修改任务控制块
11.1.2 实现时间片调度函数
11.2 修改OSTimeTick()函数
11.3 修改OSTaskCreate()函数
11.4 修改OS_IdleTaskInit()函数
11.5 main()函数
11.6 实验现象
第12章 任务的挂起和恢复
12.1 实现任务的挂起和恢复
12.1.1 定义任务的状态
12.1.2 修改任务控制块
12.1.3 编写任务挂起和恢复函数
12.2 main()函数
12.3 实验现象
第13章 任务的删除
13.1 实现任务删除
13.2 main()函数
13.3 实验现象
第二部分 μC/OS-Ⅲ内核应用开发
第14章 移植μCOS-Ⅲ到STM32
14.1 获取STM32的裸机工程模板
14.2 下载μC/OS-Ⅲ源码
14.3 μC/OS-Ⅲ源码文件介绍
14.3.1 EvalBoards
14.3.2 μC-CPU
14.3.3 μC-LIB
14.3.4 μC/OS-Ⅲ
14.4 移植到STM32工程
14.4.1 在工程中添加文件分组
14.4.2 添加文件到对应分组
14.4.3 添加头文件路径到工程中
14.4.4 具体的工程文件修改
14.4.5 修改源码中的bsp.c与bsp.h文件
14.5 按需配置最适合的工程
14.5.1 os_cfg.h
14.5.2 cpu_cfg.h
14.5.3 os_cfg_app.h
14.6 修改app.c
14.7 下载验证
第15章 创建任务
15.1 硬件初始化
15.2 创建单任务
15.2.1 定义任务栈
15.2.2 定义任务控制块
15.2.3 定义任务主体函数
15.2.4 创建任务
15.2.5 启动任务
15.2.6 app.c
15.3 下载验证单任务
15.4 创建多任务
15.5 下载验证多任务
第16章 μC/OS-Ⅲ的启动流程
16.1 “万事俱备,只欠东风”法
16.2 “小心翼翼,十分谨慎”法
16.3 两种方法的适用情况
16.4 系统的启动
16.4.1 系统初始化
16.4.2 CPU初始化
16.4.3 SysTick初始化
16.4.4 内存初始化
16.4.5 OSStart()函数
16.4.6 app.c
第17章 任务管理
17.1 任务的基本概念
17.2 任务调度器的基本概念
17.3 任务状态迁移
17.4 μC/OS的任务状态
17.5 常用的任务函数
17.5.1 任务挂起函数OS_TaskSuspend()
17.5.2 任务恢复函数OSTaskResume()
17.5.3 任务删除函数OSTaskDel()
17.5.4 任务延时函数
17.6 任务的设计要点
17.7 任务管理实验
17.8 实验现象
第18章 消息队列
18.1 消息队列的基本概念
18.2 消息队列的工作过程
18.2.1 消息池初始化
18.2.2 消息队列的运作机制
18.3 消息队列的阻塞机制
18.4 消息队列的应用场景
18.5 消息队列的结构
18.6 消息队列常用函数
18.6.1 消息队列创建函数OSQCreate()
18.6.2 消息队列删除函数OSQDel()
18.6.3 消息队列发送函数OSQPost()
18.6.4 消息队列获取函数OSQPend()
18.7 使用消息队列的注意事项
18.8 消息队列实验
18.9 实验现象
第19章 信号量
19.1 信号量的基本概念
19.1.1 二值信号量
19.1.2 计数信号量
19.2 信号量的应用场景
19.3 二值信号量的运作机制
19.4 计数信号量的运作机制
19.5 信号量控制块
19.6 信号量函数
19.6.1 信号量创建函数OSSemCreate()
19.6.2 信号量删除函数OSSemDel()
19.6.3 信号量释放函数OSSemPost()
19.6.4 信号量获取函数OSSemPend()
19.7 使用信号量的注意事项
19.8 信号量实验
19.8.1 二值信号量同步实验
19.8.2 计数信号量实验
19.9 实验现象
19.9.1 二值信号量同步实验现象
19.9.2 计数信号量实验现象
第20章 互斥量
20.1 互斥量的基本概念
20.2 互斥量的优先级继承机制
20.3 互斥量的应用场景
20.4 互斥量的运作机制
20.5 互斥量控制块
20.6 互斥量函数
20.6.1 创建互斥量函数OSMutexCreate()
20.6.2 删除互斥量函数OSMutexDel()
20.6.3 获取互斥量函数OSMutexPend()
20.6.4 释放互斥量函数OSMutexPost()
20.7 互斥量相关实验
20.7.1 模拟优先级翻转实验
20.7.2 互斥量实验
20.8 实验现象
20.8.1 模拟优先级翻转实验现象
20.8.2 互斥量实验现象
第21章 事件
21.1 事件的基本概念
21.2 事件的应用场景
21.3 事件的运作机制
21.4 事件控制块
21.5 事件函数
21.5.1 事件创建函数OSFlagCreate()
21.5.2 事件删除函数OSFlagDel()
21.5.3 事件设置函数OSFlagPost()
21.5.4 事件等待函数OSFlagPend()
21.6 事件实验
21.7 实验现象
第22章 软件定时器
22.1 软件定时器的基本概念
22.2 软件定时器的应用场景
22.3 软件定时器的精度
22.4 软件定时器控制块
22.5 软件定时器函数
22.5.1 软件定时器创建函数OSTmrCreate()
22.5.2 软件定时器启动函数OSTmrStart()
22.5.3 软件定时器列表管理
22.5.4 软件定时器停止函数OSTmrStop()
22.5.5 软件定时器删除函数OSTmrDel()
22.6 软件定时器任务
22.7 软件定时器实验
22.8 实验现象
第23章 任务信号量
23.1 任务信号量的基本概念
23.2 任务信号量函数
23.2.1 任务信号量释放函数OSTaskSemPost()
23.2.2 任务信号量获取函数OSTaskSemPend()
23.3 任务信号量实验
23.3.1 任务信号量代替二值信号量实验
23.3.2 任务信号量代替计数信号量实验
23.4 实验现象
23.4.1 任务信号量代替二值信号量实验现象
23.4.2 任务信号量代替计数信号量实验现象
第24章 任务消息队列
24.1 任务消息队列的基本概念
24.2 任务消息队列函数
24.2.1 任务消息队列发送函数OSTaskQPost()
24.2.2 任务消息队列获取函数OSTaskQPend()
24.3 任务消息队列实验
24.4 实验现象
第25章 内存管理
25.1 内存管理的基本概念
25.2 内存管理的运作机制
25.3 内存管理的应用场景
25.4 内存管理函数
25.4.1 内存池创建函数OSMemCreate()
25.4.2 内存申请函数OSMemGet()
25.4.3 内存释放函数OSMemPut()
25.5 内存管理实验
25.6 实验现象
第26章 中断管理
26.1 异常与中断的基本概念
26.1.1 与中断相关的硬件
26.1.2 与中断相关的术语
26.2 中断的运作机制
26.3 中断延迟的概念
26.4 中断的应用场景
26.5 ARM Cortex-M的中断管理
26.6 中断延迟发布
26.6.1 中断延迟发布的概念
26.6.2 中断队列控制块
26.6.3 中断延迟发布任务初始化函数OS_IntQTaskInit()
26.6.4 中断延迟发布过程函数OS_IntQPost()
26.6.5 中断延迟发布任务函数OS_IntQTask()
26.7 中断管理实验
26.8 实验现象
第27章 CPU利用率及栈检测统计
27.1 CPU利用率的基本概念及作用
27.2 CPU利用率统计初始化
27.3 栈溢出检测概念及作用
27.4 栈溢出检测过程
27.5 统计任务函数OS_StatTask()
27.6 栈检测函数OSTaskStkChk()
27.7 任务栈大小的确定
27.8 CPU利用率及栈检测统计实验
27.9 实验现象
附录