UCOSIII操作系统
UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
UCOSIII操作系统——任务篇(1)创建任务
UCOSIII操作系统——任务篇(2)相关API函数
UCOSIII操作系统——系统初始化篇(1)系统初始化
UCOSIII操作系统——系统初始化篇(2)CPU,SysTick,内存初始化
UCOSIII操作系统——硬件初始化篇(1)硬件初始化以及开始运行系统
正在更新整理…
说在前面:
这个内容不适合0基础的人,因为这里只讲了应用层面的东西,并没有深入内核讲解,所以要从零开始学UCOSIII的朋友,可以先去学完入门内容,再来观看这个笔记加深印象。
这篇文章是个人学习整理,如有错误请指正
UCOSIII操作系统——任务篇(2)相关API函数
常用的任务函数
函数 | 描述 |
---|---|
OSTaskCreate() | 创建任务 |
OSTaskDel() | 删除任务 |
OS_TaskSuspend() | 任务挂起 |
OSTaskResume() | 任务恢复 |
创建任务->OSTaskCreate()
该函数在任务篇(1)创建任务已经讲解,这里就不再赘述。
删除任务->OSTaskDel()
任务删除函数原型
void OSTaskDel (OS_TCB *p_tcb, // 要删除的任务控制块指针
OS_ERR *p_err) // 返回错误类型
- OSTaskDel()用于删除-一个任务。 当一个任务删除另外-一个任务时,形参为要删除任务创建时返回的任务句柄(控制块TCB),如果是删除自身,则形参为NULL。要想使用该函数必须在os_ cfg.h 中把OS_ CFG_ TASK_ DEL_ EN宏定义配置为1,删除的任务将从所有就绪,阻塞,挂起和事件列表中删除。
- 删除任务是说任务将返回并处以删除(休眠)状态,任务的代码不再被uCOS调用,删除任务不是删除代码,删除任务和挂起任务有些相似,其实有着本质的区别,根本来说,最大的不同就是删除任务队任务控制块的操作,我们知道在任务创建的时候,需要给每个任务分配一个任务控制块,这个任务控制块存储有关这个任务重要的信息,对任务间有至关重要的作用,挂起任务根本不会动任务控制块,但删除任务就会把任务控制块进行初始化,这样子关于任务的任何信息都被抹去。注意了,删除任务并不会释放任务的堆栈空间。
- 虽然UCOSI允许用户在系统运行的时候来删除任务,但是应该尽量的避免这样的操作,如果多个任务使用同一个共享资源,这个时候任务A正在使用这个共享资源,如果删除了任务A,这个资源并没有得到释放,那么其他任务就得不到这个共享资源的使用权,会出现各种奇怪的结果。
任务删除函数使用实例
- 删除自身
OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身,第一个参数为0或者NULL
- 删除任务
OSTaskDel( & AppTaskLed1TCB, & err ); /* 删除LED 任务! */
任务删除函数一般使用情况
一般用在启动任务,即StartTask,因为启动任务一般就是初始化CPU,内存,创建其他任务函数,创建信号量,消息队列等东西的任务,所以只要一开始运行一次就可以删除了。
任务挂起->OS_TaskSuspend()
任务挂起函数原型
void OSTaskSuspend (OS_TCB *p_tcb, // 要挂起的任务控制块指针
OS_ERR *p_err) // 返回错误类型
- 挂起指定任务。被挂起的任务绝不会得到CPU的使用权,不管该任务具有什么优先级。任务可以通过调用OS_TaskSuspend)函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,它相对于调度器而言是不可见的,除非它从挂起态中解除。任务挂起是我们经常使用的一个函数,想要使用的就必须将宏定义OS_ CFG_ TASK_ SUSPEND_ EN使能,这样在编译的时候才会包含OS _TaskSuspend()这个函数。
- 我们可以多次调用OSTaskSuspend()函数来挂起一个任务,因此我们需要调用同样次数的
OSTaskResume()函数才可以恢复被挂起的任务,这一点非常重要。
任务恢复->OSTaskResume()
任务恢复函数原型
void OSTaskResume (OS_TCB *p_tcb, // 要恢复的任务控制块指针
OS_ERR *p_err) // 返回错误类型
- 既然有任务的挂起,那么当然一样有恢复,不然任务怎么恢复呢,OSTaskResume()函数用来恢复被OSTaskSuspend()函数挂起的任务,任务恢复就是让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。如果被恢复任务在所有就绪态任务中,处于最高优先级列表的第一位,那么系统将进行任务上下文的切换。
- OSTaskResume()函 数是唯一能恢复被挂起任务的函数。如果被挂起的任务还在等待别的内核对象,比如事件标志组、信号量、互斥信号量、消息队列等,即使使用OSTaskResume(函数恢复了被挂起的任务,该任务也不一定能立即运行,该任务还是要等相应的内核对象,只有等到内核对象后才可以继续运行。
以上就是任务操作的基本内容啦,有这些大概也就够用了。
多看一些示范历程,从里面学到实际的应用操作
比如STM32系列的,可以参考正点原子,和野火的例程,相关代码都在他们各自的论坛都可以下载到哦,B站还有他们的UCOSIII的视频,建议可以两个视频结合着看,可以领悟不同的东西