1.3.2 任务的优先级
任务的优先级安排原则如下:
- 中断关联性:与中断服务程序(ISR)有关联的任务应该安排尽可能高的优先级,以便及时处理异步事件,提高系统的实时性。
如果优先级安排得比较低,CPU有可能被优先级比较高的任务长期占用,以致于在第二次中断发生时连第一次中断还没有处理,产生信号丢失现象。 - 关键性:任务越关键安排的优先级越高,以保障其执行机会;
- 频繁性:对于周期性任务,执行越频繁,则周期越短,允许耽误的时间也越短,故应该安排的优先级也越高,以保障及时得到执行;
- 快捷性:在前面各项条件相近时,越快捷(耗时短)的任务安排的优先级越高,以使其它就绪任务的延时缩短;
- 传递性:信息传递的上游任务的优先级高于下游任务的优先级。如信号采集任务的优先级高于数据处理任务的优先级。
二、任务管理
2.1 任务创建
为了使μC/OS-III知道一个任务的存在,必须先创建该任务,通过调用系统API函数
OSTaskCreate()
来创建一个任务。
- 任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中建立。
- 在开始多任务调度之前,用户必须至少创建一个用户任务。
- 任务不能在中断服务程序(ISR)中建立。
- μC/OS-III通过任务控制块(TCB)对任务进行管理,创建任务实际上就是给任务代码分配一个任务控制块。
- 任务控制块是一个基于链表的数据结构体,任务控制块主要用于记录任务的堆栈栈顶指针、指向下一个任务控制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。
- 当任务的CPU使用权被剥夺时,μC/OS-III用任务控制块来保存该任务的状态,从而保证任务重新获得CPU使用权时能从断点处恢复继续执行。
任务的相关资源(图中未含任务控制块):
- 任务栈是一个后进先出(LIFO)的线性表。
每个任务均需有一个栈(任务栈),用于存储局部变量、传递的函数参数、返回地址及CPU寄存器的值。 - 每个任务均需有一个优先级,取值范围
0~OS_CFG_PRIO_MAX-1
,用户不能使用最高优先级0和最低优先级 。 - 任务的具体实现对应于任务函数,任务函数的参数
p_arg
值由任务创建函数OSTaskCreate()
传递而来。
任务函数由系统择机调用,而不能由用户主动调用。
2.2 任务的基本状态
任务的5种基本状态及转换关系&#