μC/OS调度器及任务创建、挂起、恢复、删除、初始化函数的使用

本文详细介绍了μC/OS-II操作系统中任务调度器的工作原理,包括任务切换、任务创建、挂起、恢复和删除的步骤。调度器通过OSSched()和OSIntExt()实现任务的切换,依赖于任务控制块和堆栈指针的管理。创建任务使用OSTaskCreate()和OSTaskCreateExt(),挂起任务则通过OSTaskSuspend(),恢复任务使用OSTaskResume(),删除任务调用OSTaskDel()。所有操作之前需先调用OSInit()初始化系统环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在多任务系统中,令CPU中止当前运行的任务转而去运行另一个任务的工作叫做任务切换,而按照某种规则进行任务切换的工作叫做任务的调度

2、μC/OS-II中,任务调度是由任务调度器来完成的

3、任务调度器主要两项工作:①在任务就绪表中查找具有最高优先级别的就绪任务②中断级的调度器

4、任务级的调度器由函数OSSched()实现,中断级的调度器由函数OSIntExt()实现

5、调度器做任务切换的工作:①获得运行任务的TCB指针②进行断点数据的切换

6、调度器真正实施任务切换之前的主要工作是获得待运行任务的任务控制块指针和当前的任务控制块指针,μC/OS-II允许应用程序通过调用函数OSSchedLock()和OSSchedUnlock()给调度器上锁和解锁

7、调度器OSSched()在确认未被上锁并且不是中断服务程序调用调度器的情况下,首先从任务就绪表中查到最高优先级级别就绪任务的优先级别OSPrioHighRdy,然后再确认这个就绪任务不是当前正在运行的任务

8、调度器在任务切换前获得的两个指针OSTCBCarOSTCBllighRdy


9、任务切换的工作是靠OSCtxSw()来完成的,任务切换就是中止正在运行的任务,转而去运行另一个任务的操作,当然,这个任务应该是就绪任务中优先级别最高的那个任务

10、一个任务保护断点时的压栈动作:


11、一个被中止的任务能否正确的在断点处恢复运行,关键在于能否正确地在CPU各寄存器中恢复断点数据;而能否正确的恢复断点数据的关键是CPU的堆栈指针SP是否有正确的指向

12、任务的切换就是断点数据的切换,断点数据的切换也是CPU堆栈指针的切换

13、调度器进行任务切换的动作:


完成此任务时,OSCtxSw()做了7项工作:

①把被中止任务的断点指针保存到任务堆栈中

②把CPU通用寄存器的内容保存到任务堆栈中

③把被终止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr

④获得待运行任务的任务控制块

⑤使CPU通过任务控制块获得待运行任务的任务堆栈指针

⑥把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中

⑦使CPU获得待运行任务的断点指针

 

2.5

1、创建任务的实质是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务

2、μC/OS-II创建任务的函数:OSTaskCreate()和OSTaskCreateExt()(该函数是OSTaskCreate()的扩展,并提供了一些附加功能)

3、OSTaskCreate()的源代码


2.5.2

OSTaskCreateExt()函数的原型:


2.5.3

1、在调用函数OSStart()之前先创建一个任务,并赋予它最高的优先级别,从而使它成为起始任务,然后在这个起始任务中,在创建其他各任务

2、PC功能函数:


2.6

1、挂起一个任务表示停止这个任务的运行

2、任务的挂起和恢复


2.6.1

1、挂起任务函数OSTaskSuspendINT8U prio);

2、函数OSTaskSuspend()的流程图:


2.6.2

1、恢复任务函数OSTaskResume()的原型:

INT8U OSTaskResume INT8U prio);

2、函数OSTaskResume()的流程图:


2.7.1

1、任务优先级别的修改通过调用函数OSTaskChangePrio()来实现,OSTaskChangePrio()函数的原型:

INT8U OSTaskChangePrio(

                     INT8U oldprio,

                     INT8U newprio,

                     );

2.7.2

1、任务的删除表示把任务置于睡眠状态(做法:把被删除任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,然后在任务就绪表中把该任务的就绪状态置0

2、调用函数OSTaskDel()来实现删除任务自身或者出了空闲任务之外的其他任务的功能,函数OSTaskDel()的原型:#if OS_TASK_DEL_EN

                                    INT8U OSTaskDel(

                                                  INT8U prio

                                                  );

3、请求删除任务函数OSTaskDelReq(),其原型:

INT8U OSTaskDelReq

                  INY8U prio

                  );

其中OSTaskDelReq()的流程图:


2.7.3

1、通过调用函数OSTaskQuery()来获取选定的任务的信息,其原型为:

INT8U OSTaskQuery(

                 INT8U prio

                 OS_TCB * pdata

                );

 

2.8

2.8.1

1、在使用μC/OS-II所有服务之前,必须调用初始化函数OSInit(),对μC/OS-II自身运行的环境进行初始化

2、初始化函数OSInit()对数据结构进行初始化时,主要是创建包括空任务控制块链表在内的5个空数据缓冲区,而且为了快速的查询任务控制块链表中的各元素,OSInit()还要创建一个数组OSTCBPrioTbl[OS_LOWEST_PRIO+1],这个数组里按任务的优先级别的顺序呢把任务控制块的指针存放在对应的元素中

3、μC/OS-II初始化后的数据结构:

 

初始化后全局变量的情况:



2.8.2

μC/OS-II进行任务的管理是从调用启动函数OSStart()开始的,其前提条件是在调用该函数之前至少创建了一个用户任务

调用函数OSStart()后的数据结构:


2.10

小结:1、任务是由任务控制块,任务堆栈和任务代码组成

2、系统是按任务就绪表和任务的优先级别分别来调度的

3、任务切换的核心工作是任务堆栈指针的切换

4、任务调度器代码的设计,使得它的运行时间与系统中的任务数无关,从而使它满足了实时系统的要求

5、任务的优先级别也是任务的标识

6、应用程序首先应该调用函数OSInit()对全局变量和数据结构进行初始化,以建立μC/OS-II的运行环境

7、应用程序是通过调用函数OSStart()开始进入多任务管理的,但在调用函数OSStart()之前,必须至少创建了一个任务

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值