具体描述
内容简介
μC/OSII是一个源码开放的嵌入式实时操作系统的内核。本书详细地介绍了嵌入式实时操作系统μC/OSII内核的任务的管理和调度、系统时钟和节拍服务、时间管理、中断、任务的通信和同步、内存的简单管理原理。为帮助读者理解书中的内容,本书给出了大量的实例。最后,还介绍了μC/OSII的移植方法。为了学习上的方便,第3版还增加了使用集成开发环境BC45和VC6.0编译μC/OSII的相关内容。第4版主要对第3版前3章做了较大的修改,增加了普通操作系统和嵌入式操作系统的区别,队列、堆栈、计算机中断等特殊问题,并重新编写了任务的概念等内容。
本书适合高等院校计算机、电子技术、自动化技术、仪器仪表等信息类专业教学使用,也适合对嵌入式操作系统感兴趣的工程技术人员阅读参考。
目录
第1章 嵌入式实时操作系统的基本概念……………………………………………………… 1
1.1 计算机操作系统………………………………………………………………………… 1
1.1.1 什么是计算机操作系统…………………………………………………………… 1
1.1.2 操作系统的作用和功能…………………………………………………………… 2
1.2 嵌入式系统和嵌入式操作系统………………………………………………………… 3
1.2.1 嵌入式系统的基本概念…………………………………………………………… 4
1.2.2 嵌入式操作系统…………………………………………………………………… 7
1.2.3 实时操作系统需要满足的条件…………………………………………………… 9
1.2.4 嵌入式系统的任务及嵌入式实时操作系统……………………………………… 11
1.3 嵌入式实时操作系统μC/OS II简介……………………………………………… 12
1.4 通用操作系统与嵌入式操作系统的异同……………………………………………… 13
1.5 小 结…………………………………………………………………………………… 15
1.6 练习题…………………………………………………………………………………… 15
第2章 预备知识……………………………………………………………………………… 16
2.1 开发工具………………………………………………………………………………… 16
2.1.1 BorlandC3.1及其精简版……………………………………………………… 16
2.1.2 多文件程序的编译和连接………………………………………………………… 21
2.2 工程管理工具make及makefile ……………………………………………………… 24
2.3 复杂工程项目的管理…………………………………………………………………… 32
2.3.1 批处理文件与makefile的综合使用…………………………………………… 32
2.3.2 复杂工程管理示例………………………………………………………………… 33
2.4 C指针…………………………………………………………………………………… 37
2.4.1 指针的基本概念…………………………………………………………………… 37
2.4.2 函数指针…………………………………………………………………………… 39
2.4.3 函数指针作为函数参数及回调函数……………………………………………… 41
2.5 typedef常用方法……………………………………………………………………… 43
2.6 常用数据类型及数据结构……………………………………………………………… 45
2.6.1 控制块……………………………………………………………………………… 46
2.6.2 同类控制块的登记造册…………………………………………………………… 50
2.6.3 队列与堆栈………………………………………………………………………… 52
2.6.4 位 图……………………………………………………………………………… 54
2.7 程序流程转移的中断实现方法………………………………………………………… 55
2.8 小 结…………………………………………………………………………………… 56
2.9 练习题…………………………………………………………………………………… 56
第3章 μC/OS II中的任务………………………………………………………………… 57
3.1 任务的基本概念………………………………………………………………………… 57
3.1.1 任务及其种类……………………………………………………………………… 57
3.1.2 任务的状态………………………………………………………………………… 59
3.1.3 用户任务代码的一般结构………………………………………………………… 60
3.1.4 系统任务…………………………………………………………………………… 63
3.1.5 任务的优先权及优先级别………………………………………………………… 64
3.2 任务堆栈………………………………………………………………………………… 65
3.2.1 任务堆栈的创建…………………………………………………………………… 65
3.2.2 任务堆栈的初始化………………………………………………………………… 67
3.3 任务控制块及其链表…………………………………………………………………… 68
3.3.1 任务控制块结构…………………………………………………………………… 68
3.3.2 任务控制块链表…………………………………………………………………… 69
3.3.3 任务控制块的初始化……………………………………………………………… 71
3.4 任务就绪表及任务调度………………………………………………………………… 72
3.4.1 任务就绪表结构…………………………………………………………………… 72
3.4.2 对任务就绪表的操作……………………………………………………………… 74
3.4.3 任务调度…………………………………………………………………………… 76
3.5 任务的创建……………………………………………………………………………… 81
3.5.1 用函数OSTaskCreate()创建任务……………………………………………… 81
3.5.2 用函数OSTaskCreateExt()创建任务…………………………………………… 83
3.5.3 创建任务的一般方法……………………………………………………………… 83
3.6 任务的挂起和恢复……………………………………………………………………… 90
3.6.1 挂起任务…………………………………………………………………………… 90
3.6.2 恢复任务…………………………………………………………………………… 90
3.7 其他任务管理函数……………………………………………………………………… 96
3.7.1 任务优先级别的修改……………………………………………………………… 96
3.7.2 任务的删除………………………………………………………………………… 97
3.7.3 查询任务的信息………………………………………………………………… 103
3.8 μC/OS II的初始化和任务的启动………………………………………………… 103
3.8.1 μC/OS II的初始化…………………………………………………………… 103
3.8.2 μC/OS II的启动……………………………………………………………… 105
3.9 小 结………………………………………………………………………………… 107
3.10 练习题………………………………………………………………………………… 108
第4章 μC/OS II的中断和时钟…………………………………………………………… 109
4.1 μC/OS II的中断…………………………………………………………………… 109
4.1.1 μC/OS II的中断过程………………………………………………………… 109
4.1.2 中断级任务切换函数…………………………………………………………… 113
4.1.3 应用程序中的临界段…………………………………………………………… 113
4.2 μC/OS II的时钟…………………………………………………………………… 115
4.3 时间管理……………………………………………………………………………… 122
4.3.1 任务的延时……………………………………………………………………… 122
4.3.2 取消任务的延时………………………………………………………………… 123
4.3.3 获取和设置系统时间…………………………………………………………… 128
4.4 小 结………………………………………………………………………………… 130
4.5 练习题………………………………………………………………………………… 131
第5章 任务的同步与通信…………………………………………………………………… 132
5.1 任务的同步和事件…………………………………………………………………… 132
5.1.1 任务间的同步…………………………………………………………………… 132
5.1.2 事 件…………………………………………………………………………… 133
5.2 事件控制块及事件处理函数………………………………………………………… 145
5.2.1 事件控制块的结构……………………………………………………………… 145
5.2.2 操作事件控制块的函数………………………………………………………… 147
5.2.3 空事件控制块链表……………………………………………………………… 149
5.3 信号量及其操作……………………………………………………………………… 150
5.3.1 信号量…………………………………………………………………………… 150
5.3.2 信号量的操作…………………………………………………………………… 151
5.4 互斥型信号量和任务优先级反转…………………………………………………… 160
5.4.1 任务优先级的反转现象………………………………………………………… 161
5.4.2 互斥型信号量…………………………………………………………………… 166
5.5 消息邮箱及其操作…………………………………………………………………… 169
5.5.1 消息邮箱………………………………………………………………………… 169
5.5.2 消息邮箱的操作………………………………………………………………… 170
5.6 消息队列及其操作…………………………………………………………………… 175
5.6.1 消息队列………………………………………………………………………… 175
5.6.2 消息队列的操作………………………………………………………………… 178
5.7 小 结………………………………………………………………………………… 184
5.8 练习题………………………………………………………………………………… 185
第6章 信号量集……………………………………………………………………………… 186
6.1 信号量集的结构……………………………………………………………………… 186
6.1.1 基本概念………………………………………………………………………… 186
6.1.2 信号量集的结构组成…………………………………………………………… 187
6.1.3 对等待任务链表的操作………………………………………………………… 191
6.1.4 空标志组链表…………………………………………………………………… 191
6.2 信号量集的操作……………………………………………………………………… 192
6.2.1 创建信号量集…………………………………………………………………… 192
6.2.2 请求信号量集…………………………………………………………………… 194
6.2.3 向信号量集发送信号…………………………………………………………… 194
6.2.4 查询信号量集的状态…………………………………………………………… 200
6.2.5 删除信号量集…………………………………………………………………… 203
6.3 小 结………………………………………………………………………………… 203
6.4 练习题………………………………………………………………………………… 203
第7章 动态内存管理………………………………………………………………………… 204
7.1 内存控制块…………………………………………………………………………… 204
7.1.1 可动态分配内存的划分………………………………………………………… 204
7.1.2 内存控制块OS_MEM 的结构………………………………………………… 205
7.1.3 空内存控制块链表……………………………………………………………… 206
7.2 动态内存的管理……………………………………………………………………… 206
7.2.1 创建动态内存分区……………………………………………………………… 206
7.2.2 请求获得一个内存块…………………………………………………………… 208
7.2.3 释放一个内存块………………………………………………………………… 211
7.2.4 查询一个内存分区的状态……………………………………………………… 215
7.3 小 结………………………………………………………………………………… 220
7.4 练习题………………………………………………………………………………… 220
第8章 在51单片机上移植μC/OS II …………………………………………………… 221
8.1 μC/OS II移植的一般性问题……………………………………………………… 221
8.1.1 可重入函数的概念……………………………………………………………… 221
8.1.2 时钟节拍的产生………………………………………………………………… 222
8.1.3 任务堆栈的设计………………………………………………………………… 222
8.2 在51系列单片机上移植μC/OS II ……………………………………………… 223
8.2.1 文件OS_CPU.H 的修改……………………………………………………… 223
8.2.2 任务堆栈的设计………………………………………………………………… 224
8.2.3 文件OS_CPU_C.C的修改…………………………………………………… 231
8.2.4 几点注意事项…………………………………………………………………… 232
8.3 应用举例……………………………………………………………………………… 232
8.3.1 LED数码显示器的驱动程序…………………………………………………… 232
8.3.2 串行接口的应用………………………………………………………………… 234
8.4 小 结………………………………………………………………………………… 242
8.5 练习题………………………………………………………………………………… 242
第9章 基于ARM 的μC/OS II…………………………………………………………… 243
9.1 移植规划……………………………………………………………………………… 243
9.1.1 编译器的选择…………………………………………………………………… 243
9.1.2 ARM7工作模式的选择………………………………………………………… 243
9.2 移 植………………………………………………………………………………… 244
9.2.1 文件OS_CPU.H 的编写……………………………………………………… 244
9.2.2 文件OS_CPU_C.C的编写…………………………………………………… 246
9.2.3 文件OS_CPU_A.S的编写…………………………………………………… 253
9.2.4 关于中断及时钟节拍…………………………………………………………… 256
9.3 在LPC2000上移植μC/OS II …………………………………………………… 257
9.3.1 挂接SWI软件中断……………………………………………………………… 258
9.3.2 中断及时钟节拍中断…………………………………………………………… 258
9.3.3 一个基于μC/OS II和ARM 的应用程序实例……………………………… 259
9.4 小 结………………………………………………………………………………… 261
9.5 练习题………………………………………………………………………………… 261
第10章 μC/OS II在80x86上的移植…………………………………………………… 262
10.1 概 述………………………………………………………………………………… 262
10.2 任务切换……………………………………………………………………………… 263
10.2.1 任务切换函数OSCtxSw() …………………………………………………… 263
10.2.2 任务切换宏OS_TASK_SW()………………………………………………… 265
10.2.3 中断级任务切换函数OSIntCtxSw()………………………………………… 266
10.3 系统时钟……………………………………………………………………………… 267
10.3.1 PC中DOS的系统时钟………………………………………………………… 267
10.3.2 PC中μC/OS II的系统时钟………………………………………………… 267
10.3.3 μC/OS II系统时钟中断服务程序…………………………………………… 269
10.3.4 μC/OS II系统时钟中断向量的安装………………………………………… 269
10.3.5 由μC/OS II返回DOS ……………………………………………………… 270
10.4 小 结………………………………………………………………………………… 271
第11章 μC/OS II可裁剪性的实现……………………………………………………… 272
11.1 文件OS_CFG.H 中用于系统裁剪的常量………………………………………… 272
11.2 配置常量的解释……………………………………………………………………… 274
11.2.1 OS_MAX_EVENTS ………………………………………………………… 274
11.2.2 OS_MAX_MEM_PARTS …………………………………………………… 275
11.2.3 OS_MAX_QS ………………………………………………………………… 275
11.2.4 OS_MAX_MEM_TASKS …………………………………………………… 275
11.2.5 OS_LOWEST_PRIO ………………………………………………………… 275
11.2.6 OS_TASK_IDLE_STK_SIZE ………………………………………………… 276
11.2.7 OS_TASK_STAT_EN ……………………………………………………… 276
11.2.8 OS_TASK_STAT_STK_SIZE ……………………………………………… 276
11.2.9 OS_CPU_HOOKS_EN ……………………………………………………… 276
11.2.10 OS_MBOX_EN ……………………………………………………………… 277
11.2.11 OS_MEM_EN ………………………………………………………………… 277
11.2.12 OS_Q_EN …………………………………………………………………… 277
11.2.13 OS_SEM_EN ………………………………………………………………… 277
11.2.14 OS_TASK_CHANGE_PRIO_EN ………………………………………… 277
11.2.15 OS_TASK_CREATE_EN …………………………………………………… 277
11.2.16 OS_TASK_CREATE_EXT_EN …………………………………………… 278
11.2.17 OS_TASK_DEL_EN ………………………………………………………… 278
11.2.18 OS_TASK_SUSPEND_EN ………………………………………………… 278
11.2.19 OS_TICKS_PER_SEC ……………………………………………………… 278
第12章 在集成开发环境上编译μC/OS II ……………………………………………… 279
《深入理解ARM Cortex-M系列处理器:架构、指令集与嵌入式系统设计》 内容梗概: 本书是一本全面深入探讨ARM Cortex-M系列处理器内核的专著,旨在为读者提供理解和掌握这一主流嵌入式处理器架构的坚实基础。内容涵盖了Cortex-M系列处理器核心的内部架构、指令集特性、存储器管理、中断处理机制、调试接口等方面,并结合实际应用,阐述了如何利用这些核心构建高效、可靠的嵌入式系统。本书特别关注Cortex-M系列在实时性、低功耗和高性能方面的设计理念,以及如何在实际项目中充分发挥其优势。 详细内容介绍: 第一部分:ARM Cortex-M系列处理器架构解析 1. ARM处理器发展历程与Cortex-M系列定位: 简要回顾ARM架构的发展,从经典的ARMv7-A/R架构过渡到Cortex-M系列。 详细阐述Cortex-M系列(包括M0, M0+, M3, M4, M7, M33等)在嵌入式领域的市场定位,以及其相对于其他ARM内核(如Cortex-A/R)的优势和适用场景。 分析Cortex-M系列面向的典型应用领域,如物联网设备、工业自动化、医疗器械、汽车电子等。 2. Cortex-M内核核心架构: 流水线(Pipeline)与指令执行: 深入解析Cortex-M系列处理器采用的流水线结构(如3级、6级流水线),讲解指令的取指、译码、执行、访存、写回等阶段,以及流水线对性能的影响。 寄存器组(Register File): 详细介绍Cortex-M系列通用寄存器(R0-R15)、特殊功能寄存器(如PC, SP, LR, PSR等)的用途和操作。 指令集架构(ISA): Thumb-2技术: 重点讲解Thumb-2指令集,分析其如何结合16位和32位指令的优势,实现代码密度和性能的平衡。 常用指令详解: 深入剖析算术、逻辑、数据传输、分支跳转、存储器访问、状态位操作等常用指令的格式、编码和执行过程。 协处理器接口(CP10, CP11): (视具体Cortex-M版本而定)介绍Cortex-M系列对协处理器(如FPU)的支持,以及如何通过指令进行交互。 存储器接口: Harvard架构与Von Neumann架构: 分析Cortex-M系列通常采用的改进型Harvard架构,以及其与传统架构的区别和优势。 总线接口(Bus Interface): 介绍AMBA AHB-Lite或AXI等总线协议在Cortex-M处理器与外部设备(存储器、外设)之间的通信机制。 存储器映射(Memory Map): 讲解Cortex-M系列处理器的存储器地址空间划分,包括Flash、SRAM、外设寄存器等区域的分配原则。 3. Cortex-M系列处理器特有的功能模块: 嵌套向量中断控制器(NVIC - Nested Vectored Interrupt Controller): 中断优先级与分组: 详细阐述NVIC如何管理中断源,包括中断优先级、可嵌套性、中断分组机制。 中断向量表(Interrupt Vector Table): 讲解中断向量表的结构、作用以及中断触发时CPU如何查找并跳转到相应中断服务例程。 中断使能与屏蔽: 介绍如何通过NVIC配置寄存器来使能、禁用和配置中断的优先级。 系统控制块(SCB - System Control Block): 运行模式与状态: 讲解处理器的运行模式(如Thread Mode, Handler Mode)和处理状态(如Active, Running)。 复位与时钟控制: 描述Cortex-M处理器的复位机制和内部/外部时钟配置。 电源管理: 介绍Cortex-M系列提供的低功耗模式(如Sleep Mode, Deep Sleep Mode)及其唤醒机制。 总线矩阵(Bus Matrix): (针对部分高级Cortex-M内核)讲解总线矩阵如何实现多个总线主设备(如CPU, DMA)对多个总线从设备(如SRAM, Peripherals)的高效并发访问。 调试支持(Debug Support): JTAG/SWD接口: 详细介绍JTAG和Serial Wire Debug (SWD) 接口,以及如何通过它们进行在线仿真、断点设置、变量查看等调试操作。 CoreSight调试架构: (针对部分高级Cortex-M内核)简要介绍ARM CoreSight调试技术,包括ETM(嵌入式跟踪宏单元)、ITM(指令跟踪宏单元)等,实现更高级的调试和跟踪功能。 第二部分:嵌入式系统设计与Cortex-M应用 1. Cortex-M处理器与外设交互: GPIO(通用输入输出): 讲解如何配置和使用GPIO引脚作为输入、输出,以及其在驱动LED、读取按键等场景的应用。 UART(通用异步收发器): 演示如何通过UART接口实现串口通信,用于调试信息输出或与外部设备交互。 SPI(串行外设接口)与I2C(集成电路总线): 讲解这些标准通信协议在连接外部传感器、存储器、显示器等设备时的应用。 ADC(模数转换器)与DAC(数模转换器): 介绍如何读取模拟信号(如温度、电压)或输出模拟信号。 定时器(Timers): 讲解定时器的多种工作模式(如计数、PWM生成、捕捉),以及在延时、周期性任务、电机控制等方面的应用。 DMA(直接存储器访问): 深入阐述DMA的工作原理,以及如何利用DMA实现CPU与外设之间的高效数据传输,减轻CPU负担。 2. 实时操作系统(RTOS)与Cortex-M的结合: RTOS核心概念回顾(仅限概念,不展开RTOS具体内容): 简述任务(Task)、调度器(Scheduler)、信号量(Semaphore)、互斥锁(Mutex)、消息队列(Message Queue)等RTOS基本概念,强调它们在构建复杂嵌入式应用中的重要性。 RTOS在Cortex-M上的移植与优化: 探讨将RTOS移植到Cortex-M平台的关键技术,包括中断向量表配置、上下文切换实现、时钟节拍(SysTick)的利用等。 多任务并发与同步: 演示如何在Cortex-M平台上利用RTOS实现多个任务的并发执行,并通过同步机制(如信号量、互斥锁)协调任务间的访问,避免竞态条件。 中断与RTOS的协同工作: 分析中断服务例程(ISR)如何与RTOS交互,例如在ISR中发送信号量唤醒任务,以及ISR的执行长度对系统实时性的影响。 3. Cortex-M系列处理器的功耗管理策略: 低功耗模式的应用: 结合具体的Cortex-M内核特性,详细介绍如何利用Sleep Mode、Deep Sleep Mode等低功耗模式来节省能源。 外设时钟门控(Clock Gating): 讲解如何按需开启和关闭外设的时钟,进一步降低功耗。 动态电压频率调节(DVFS): (针对部分高级Cortex-M内核)介绍如何在不同工作负载下动态调整处理器电压和频率,以平衡性能和功耗。 功耗分析工具与方法: 提及常用的功耗分析方法和工具,帮助开发者进行功耗优化。 4. 实际项目中的Cortex-M应用案例分析: 物联网节点设计: 以一个典型的物联网传感器节点为例,阐述如何利用Cortex-M处理器、低功耗通信模块(如BLE、LoRa)和传感器接口,构建低功耗、高性价比的设备。 工业控制单元: 分析如何利用Cortex-M强大的实时处理能力和丰富的通信接口,构建用于电机控制、数据采集和通信的工业控制单元。 消费电子产品: 探讨Cortex-M系列在智能穿戴设备、家用电器等消费电子产品中的应用,强调其成本效益和性能优势。 第三部分:工具链与开发实践 1. ARM开发工具链(Keil MDK, IAR Embedded Workbench, GCC for ARM): 集成开发环境(IDE)介绍: 详细介绍主流的ARM开发IDE的使用,包括工程创建、代码编辑、编译链接、下载调试等流程。 编译器(Compiler)与汇编器(Assembler): 讲解C/C++编译器如何将源代码转换为汇编代码,以及汇编器如何将汇编代码转换为机器码。 链接器(Linker): 阐述链接器如何将多个目标文件和库文件组合成可执行程序,并进行地址分配。 调试器(Debugger)与仿真器(Emulator): 深入讲解调试器的功能,包括断点、单步执行、变量监视、内存查看、寄存器查看等。 2. 调试技巧与性能优化: 常见嵌入式开发问题的排查: 总结和分析嵌入式开发过程中常见的调试难题,如内存溢出、栈溢出、死锁、总线错误等,并提供解决方案。 性能分析与代码优化: 介绍如何利用性能分析工具(如IDE内置的性能分析器、Trace功能)来识别性能瓶颈,并讲解代码优化技巧,如算法改进、指令选择、缓存利用等。 嵌入式系统测试与验证: 讨论单元测试、集成测试、系统测试等在嵌入式系统开发中的重要性,以及如何设计有效的测试用例。 总结: 本书力求以清晰的逻辑、翔实的案例和深入的剖析,帮助读者全面掌握ARM Cortex-M系列处理器的精髓,并能够将其成功应用于实际的嵌入式系统设计开发中。通过对本书的学习,读者将能够构建出更加高效、稳定、可靠且具备优异性能的嵌入式产品。