1. uC/OS-II文件结构
与处理器无关的代码:OS_CORE.C, OS_FLAG.C, OS_MBOX.C, OS_MEM.C, OS_MUTEX.C, OS_Q.C, OS_SEM.C, OS_TASK.C, OS_TIME.C, UCOS_II.C, UCOS_II.H。
配置文件(与应用程序有关):OS_CFG.H, INCLUDES.H
与处理器有关的代码(移植):OS_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C
2. uC/OS-II组成部分
uC/OS-II大致可以分成系统核心(包含任务调度)、任务管理、时间管理、多任务同步与通信、内存管理、CPU移植等部分。
(1) 核心部分(OSCore.c) :uC/OS-II处理核心,包括初始化、启动、中断管理、时钟中断、任务调度及事件处理等用于系统基本维持的函数。
(2) 任务管理(OSTask.c) :包含与任务操作密切相关的函数,包括任务建立、删除、挂起及恢复等,uC/OS II以任务为基本单位进行调度。
(3) 时钟部分(OSTime.c) :uC/OS-II中最小时钟单位是timetick(时钟节拍),其中包含时间延迟、时钟设置及时钟恢复等与时钟相关的函数。
(4) 多任务同步与通信(OSMbox.c, OSQ.c, OSSem.c, OSMutex.c, OSFlag.c):包含事件管理函数,涉及Mbox、msgQ、Sem、Mutex、Flag等。
(5) 内存管理部分(OSMem.c):主要用于构建私有的内存分区管理机制,其中包含创建memPart、申请/释放memPart、获取分区信息等函数。
(6) CPU接口部分:uC/OS-II针对特定CPU的移植部分,由于牵涉到SP等系统指针,通常用汇编语言编写,包括任务切换、中断处理等内容。
3. uC/OS-II任务状态
在uC/OS-II中,一个任务就是一个线程,该任务可以认为CPU完全属于它自己。任务有自己的堆栈和CPU寄存器,并且被赋予一定的优先级。任务可能处于睡眠、就绪、运行、等待或中断服务状态之一。
(1) uC/OS-II调度算法
uC/OS-II采用基于优先级的调度算法,总是选择当前处于就绪状态的优先级最高的任务进行调度。uC/OS-II是可抢占性的强实时性OS,在完成中断后允许进行新的任务调度。
uC/OS-II有两种调度方式:任务级任务调度、中断级任务调度。
(2) 应用程序中函数的调用关系
#include “includes.h”
#define TASK_STK_SIZE 512 // 定义堆栈长度(1024字节)
OS_STK TaskStk[TASK_STK_SIZE]; // 定义一个数组来作为任务堆栈
void main()
{
……
OSInit(); // 初始化uC/OS-IIi
……
OSTaskCreate(MyTask1,……); // 创建用户任务1
OSTaskCreate(MyTask2,……); // 创建用户任务2
……
OSStart(); // 启动任务
……
}
void MyTask(void *pdata)
{
for (;;)
{
可以被中断的任务代码;
OS_ENTER_CRITICAL(); //进入临阶段(关中断)
不可以被中断的任务代码;
OS_EXIT_CRITICAL(); //退出临阶段 (开中断)
可以被中断的任务代码;
}
}
空任务块链表(所有任务控制块还没有分配给任务),是在应用程序调用函数OSInit()对系统进行初始化时建立的。
任务建立时,首先会调用OSTaskStkInit(),也会调用函数OS_TCBInit()初始化任务控制块OS_TCB,函数OSTaskCreate()或OSTaskCreateExt()调用任务控制块初始化函数OS_TCBInit()。
OS_TCBInit()然后调用OSTCBCreatHook()。OSTCBCreatHook()是用户自定义的函数。
当用户程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后利用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部。
uC/OS-II有两种调度器:
任务级调度器(由OSSched()实现)、中断级调度器(由OSIntExt()实现)
(3) 任务级任务调度
指在非中断返回时进行任务调度,一般发生在当前任务因时间延迟或等待某事件而阻塞或被挂起,或有更高优先级的任务处于就绪状态。
任务的基本信息:
· CPU的PC寄存器:任务当前执行的位置;
· CPU的通用寄存器:任务当前执行涉及的临时数据;
· CPU的状态寄存器:存储当前CPU的状态。
任务级任务切换:从一个任务直接切换至另一个任务,不涉及CPU状态的切换,OS_TASK_SW()既保存当前任务上下文,又恢复新任务上下文。
过程:OS_Sched() -> OS_SchedNew() -> OS_TASK_SW() |