### 嵌入式实时操作系统uCOS-II:第3章 任务管理
#### 3.1 核心函数
在嵌入式实时操作系统μC/OS-Ⅱ中,任务管理是实现多任务处理的关键部分。第三章主要介绍了μC/OS-Ⅱ的任务管理和调度原理,特别强调了7个核心管理函数以及9个用户管理函数。
**OS_CFG.H 文件中的配置常量**:
- **OS_ENTER_CRITICAL()**: 用于关闭中断进入临界区。
- **OS_EXIT_CRITICAL()**: 用于打开中断离开临界区。
- **OSInit()**: 初始化μC/OS-Ⅱ。
- **OSStart()**: 启动μC/OS-Ⅱ,开始调度任务。
- **OSIntEnter()**: 在中断服务程序中进入中断上下文。
- **OSIntExit()**: 在中断服务程序中退出中断上下文。
- **OSSchedLock()**: 锁定调度器。
- **OS_SCHED_LOCK_EN**: 如果配置为1,则启用调度锁。
- **OSSchedUnlock()**: 解锁调度器。
- **OS_SCHED_LOCK_EN**: 如果配置为1,则启用调度解锁。
- **OSVersion()**: 返回μC/OS-Ⅱ的版本号。
#### 3.1.1 临界段的处理
临界段是指程序中访问共享资源或执行关键操作的一段代码。为了确保数据一致性,在多任务环境中需要对临界段进行保护,避免多个任务同时访问同一资源。μC/OS-Ⅱ通过关闭中断的方式来保护临界段。
- **OS_ENTER_CRITICAL()**: 关闭中断,使处理器不会响应外部中断请求,从而保护临界段代码不受中断干扰。
- **OS_EXIT_CRITICAL()**: 打开中断,使处理器能够继续响应中断请求。
这两个宏的具体实现取决于使用的微处理器架构,并且可以在`OS_CPU.H`文件中找到相应的定义。每种微处理器都有自己的`OS_CPU.H`文件,其中包含了这些宏的具体实现。
**宏定义**:
宏定义是一种预处理器指令,用于在编译之前进行文本替换。宏定义分为不带参数和带参数两种。
- **不带参数的宏定义**:
- 格式:`#define 标识符 字符串`
- 示例:`#define PI 3.14`
- **带参数的宏定义**:
- 格式:`#define 标识符(参数) 字符串`
- 示例:`#define S(R) PI*R*R`
- **取消宏定义**:
- 格式:`#undef 标识符`
- 示例:`#undef PI`
**开关中断的方法**:
μC/OS-Ⅱ提供了三种不同的方式来实现开关中断的功能:
- **OS_CRITICAL_METHOD=1**: 使用直接开关的方式,简单但是可能会破坏中断的状态。
- **OS_CRITICAL_METHOD=2**: 使用堆栈保存中断状态,这种方法更安全但也更加复杂,通常需要汇编代码支持。
- **OS_CRITICAL_METHOD=3**: 使用局部变量来保存中断状态,这种方法更为灵活。
#### 3.1.2 任务的形式
μC/OS-Ⅱ中的任务本质上是一个C语言函数,具备以下特点:
- **返回类型**:必须是`void`型。
- **参数**:具有一个参数,类型为`void*`,用于传递任务所需的数据。
- **结构**:
- **无限循环结构**:任务体是一个无限循环,任务在循环内部执行特定的操作,直到系统重启或者任务被删除。
- **一次性执行结构**:任务只执行一次,执行完成后被删除。
**无限循环结构示例**:
```c
void YourTask(void *pdata)
{
for (;;)
{
// 用户代码
OSMboxPend();
OSQPend();
OSSemPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly(100); // 延时100毫秒
}
}
```
当任务被删除后,虽然代码仍然存在于RAM中,但μC/OS-Ⅱ会将其标记为休眠状态,不再调度执行。除非系统重启,否则这段代码将不再被执行。
通过对μC/OS-Ⅱ第三章的学习,可以深入理解任务管理的核心概念和技术细节,这对于开发基于μC/OS-Ⅱ的嵌入式系统至关重要。