实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

在上一章我们讲解了UCOSIII的任务管理,我们学习的目的就是为了使用,这一节我们就讲解一下UCOSIII如何创建任务和任务相关函数的使用。

1、任务创建和删除实验

① OSTaskCreate()函数

UCOSIII是多任务系统,那么肯定要能创建任务,创建任务就是将任务控制块、任务堆栈、任务代码等联系在一起,并且初始化任务控制块的相应字段。在UCOSIII中我们通过函数OSTaskCreate()来创建任务,OSTaskCreate()函数原型如下(在os_task.c中有定义)。调用OSTaskCreate()创建一个任务以后,刚创建的任务就会进入就绪态,注意!!!不能在中断服务程序中调用OSTaskCreate()函数来创建任务
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

② OSTaskDel()函数

OSTaskDel()函数用来删除任务,当一个任务不需要运行的话,我们就可以将其删除掉,删除任务不是说删除任务代码,而是UCOSIII不再管理这个任务,在有些应用中我们只需要某个任务只运行一次,运行完成后就将其删除掉,比如外设初始化任务,OSTaskDel()函数原型如下:
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

虽然UCOSIII允许用户在系统运行的时候来删除任务,但是应该尽量的避免这样的操作,如果多个任务使用同一个共享资源,这个时候任务A正在使用这个共享资源,如果删除了任务A,这个资源并没有得到释放,那么其他任务就得不到这个共享资源的使用权,会出现各种奇怪的结果。
我们调用OSTaskDel()删除一个任务后,这个任务的任务堆栈、OS_TCB所占用的内存并没有释放掉,因此我们可以利用他们用于其他的任务,当然我们也可以使用内存管理的方法给任务堆栈和OS_TCB分配内存,这样当我们删除掉某个任务后我们就可以使用内存释放函数将这个任务的任务堆栈和OS_TCB所占用的内存空间释放掉。
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

2、任务挂起和恢复实验

① OSTaskSuspend()函数

有时候有些任务因为某些原因需要暂停运行,但是以后还要运行,因此我们就不能删除掉任务,这里我们可以使用OSTaskSuspend()函数挂起这个任务,以后再恢复运行,函数OSTaskSuspend()原型如下:
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

② OSTaskResume()函数

OSTaskResume()函数用来恢复被OSTaskSuspend()函数挂起的任务,OSTaskResume()函数是唯一能恢复被挂起任务的函数。如果被挂起的任务还在等待别的内核对象,比如事件标志组、信号量、互斥信号量、消息队列等,即使使用OSTaskResume()函数恢复了被挂起的任务,该任务也不一定能立即运行,该任务还是要等相应的内核对象,只有等到内核对象后才可以继续运行,OSTaskResume()函数原型如下:
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

3、时间片轮转调度实验

我们说过UCOSIII是支持多个任务拥有同一个优先级的,这些任务采用时间片轮转调度方法进行任务调度。在os_cfg.h文件中有个宏OS_CFG_SCHED_ROUND_ROBIN_EN,我们要想使用时间片轮转调度就需要将OS_CFG_SCHED_ROUND_ROBIN_EN定义为1,这样UCOSIII中有关时间片轮转调度的代码才会被编译,否则不能使用时间片轮转调度,这点特别重要。

① OSSchedRoundRobinCfg()函数

OSSchedRoundRobinCfg()函数用来使能或失能UCOSIII,如果我们要使用时间片轮转调度功能的话不仅要将宏OS_CFG_SCHED_ROUND_ROBIN_EN定义为1,还需要调用OSSchedRoundRobinCfg()函数来使能UCOSIII,OSSchedRoundRobinCfg()函数原型如下。
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

② OSSchedRoundRobinYield()函数

当一个任务想放弃本次时间片,把CPU的使用权让给同优先级下的另外一个任务就可以使用OSSchedRoundRobinYield()函数,函数原型如下:
实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用

实时操作系统UCOS学习笔记7----UCOSIII任务相关API函数使用