UCOSII系统详解

2021-04-09 02:30无锡职业技术学院乐明于
电子世界 2021年17期
关键词:指针内存嵌入式

无锡职业技术学院 陈 尧 乐明于

UCOSII经常被用于单片机的系统,使用它能够更好的调用单片机的CPU资源,具有非常多的优点,我们可以使用UCOSII干很多的事情。它是一种实时操作系统(RTOS),与许多商用操作系统具有相同的性能。以及系统使用的基本方法,包括创建任务功能、删除功能、请求任务删除功能、更改功能优先级功能、暂停任务功能、任务恢复功能、任务信息查询。

UCOSII是由它的前版本UCOS渐渐的发展过来的,美国的嵌入式学者在嵌入式期刊中讲解和说明了UCOS系统和它的代码,目前UCOS系统已经发展到了第三个版本,功能越来越强大,而目前市面上最为流行的就是第二个版本UCOSII。

1 UCOSII的优势

UCOSII设计的初衷是为了让嵌入式计算机能够更高效的利用资源,它的底层程序基本上都是由c语言构成的,而cpu的基层程序程序是由汇编语言构成的,整个汇编的部分占用的程序很少很少,因此它的兼容性非常强。使用者只需要很少的要求就可以去使用它。UCOSII系统有许许多多的优势比如它移植方便、效率很高、占用的内存很少、有很强的扩展性等。UCOSII系统可以在任何的cpu上使用,虽然小巧但是具备很多系统的优点。UCOSII是一个非常强大的嵌入式系统。

2 UCOSII任务的几个元素

首先就是任务的优先级,优先级顾名思义就是任务执行的先后顺序,每一个任务都有一个优先级,而任务设置了优先级之后,就成为了任务标志,这个标志就可以代表任务,我们可以通过优先级来对任务进行各种操作,在多个任务中当优先级高的任务执行完成的会将CPU释放,而当其他任务执行之中,高优先级的任务执行完成程序就会转向到高优先级的任务上去。

任务栈:

简而言之就是一个任务存储空间,任务执行过程中一些东西就存储在里边。他的特点是存储空间是连续的,并且创建任务的同时就需要一个任务栈。

任务控制模块OS_TCB:

任务控制模块OS_TCB是用以记录任务的各种状态参数的,UCOSII的每个任务都是由任务控制模块控制的,任务管理主要的几个元素是任务的指针,任务的优先级,以及任务的内存指针也就是栈指针。

任务就绪表:

任务就绪表就是目前已经就绪的所有任务的表格,他是一个状态集,系统的每一个任务在这个状态集中都是存在的。通过观察任务的位状态时1或者0来看任务是否就绪。

任务调度:

任务调度就是在上述的任务表中找到一个优先级最高的任务去执行,让任务优先级高的任务去占用cpu资源,将优先级最高的任务划分到任务调度当中然后去执行它。

3 UCOSII任务的状态过程

UCOSII系统的每一个单独的任务都相当于是一个闭死的环,既如果单独执行一个任务就不会牵扯到其他的任务,会永远的执行下去。UCOSII系统的每个任务都必然处于五个状态当中。分别时睡眠状态也就是挂机状态也就是任务展示没有任务控制模块也或者时任务没有控制模块状态,准备状态也就是就绪状态随时可以占用cpu资源来执行任务被系统分配了任务控制模块,运行状态就是正在占用cpu执行任务的状态,还有等待状态以及中断服务状态等。

UCOSII系统的任务在这几个状态中按需求转换。

4 UCOSII的几个重要函数

4.1 建立任务函数

UCOSII是为了嵌入式系统的一个个任务服务的,所以必然会有一个任务创新的函数,UCOSII并不需要我们去从零开始建立任务,我们只需要使用UCOSII系统自带的函数就可以实现创建任务的功能,使用非常的方便,它的函数名字是OSTaskCreate。原型为:

OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)。

函数有好几个参数包括:代表任务的指针、传递参数的指针、分配给函数的内存栈顶部的指针、每一个任务的优先级等级(优先级是一个任务在后续使用中的身份象征)。内存栈是每个任务都必须拥有的东西,每个栈都是以连续的内存构成的。

4.2 任务删除函数

UCOSII的任务删除函数,就是将整个任务在系统中停止掉,而不是表面意义上的说删除代码。他是通过操作任务的优先级来产生作用的。

4.3 请求任务删除函数

前面提到,必须确保被删除任务的资源被释放的前提下才能将其删除,所以我们通过向被删除任务发送删除请求,来实现任务释放自身占用资源后再删除。UCOSII提供的请求删除任务函数原型为:INT8U OSTaskDel(INT8U prio);

在删除任务的时候如果任务没有释放资源那么可能会产生逻辑上的错误,因此在使用删除函数的时候必须要使用请求任务函数。通过此函数来请求被删除函数,来实现任务删除之前先释放自身的资源。UCOSII提供的请求删除任务函数原型为:INT8U OSTaskDelReq(INT8U prio);

同样我们还是通过任务的优先级来操作的,优先级作为任务的标识。

任务执行的同时是在占用任务的内存栈的也就是说任务的资源在被任务占用中。如果我们这个时候将任务删除,那么将会产生错误,所以在删除的时候我们需要去确认一下任务是否将它的资源释放。因为此UCOSII系统提供了一个专门请求删除任务䣌函数:INT8U OSTaskDelReq(INT8U prio);也就是使用任务的表示身份优先级来实现任务请求删除的操作。

4.4 改变任务的优先级函数

创建任务时,UCOSII会为该任务分配优先级,但优先级不是恒定的。任务的优先级如果无法改变那我们在设定了优先级之后每个任务的优先级机无法改变,这对我们使用UCOSII系统是非常不方便的。因此UCOSII为此提供了一个改变任务优先级的函数如下:INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio);

4.5 任务挂起函数

任务挂起函数使用起来很方便,它跟任务删除函数很相似,却也有很多不同的点,比如任务的挂起只改变任务的就绪状态并且记录下,并没有像任务删除函数一样将任务在任务控制标里删除,所以它不想任务删除函数一样需要释放任务的资源,被任务观其函数挂起的任务可以通过函数解挂也就是恢复成原来的样子。INT8U OSTaskSuspend(INT8U prio);

4.6 任务恢复函数

如上所说挂起的任务可以恢复,说的就是任务回复函数了。此功能允许使用者恢复挂起的任务,从而允许计划程序恢复,UCOSII提供的任务恢复函数原型为:INT8U OSTaskResume(INT8U prio)。

UCOSII系统实现了抢占内核式的多任务执行,拥有一般系统的服务。使用时在每个任务完成后用延迟函数或者程序需要延迟时释放CPU,系统就会将CPU释放给优先级最高且就绪的任务,通过这种方式实现多任务的运行。如果高优先级的任务一直没有释放CPU的使用权,那么其他低优先级的任务就永远无法得到CPU的使用权,也就是说及时任务没有删除或者挂起也无法运行。也可以看出UCOSII系统的强大,使用UCOSII系统我们可以更高效的管理嵌入式程序的多任务。

猜你喜欢
指针内存嵌入式
“春夏秋冬”的内存
搭建基于Qt的嵌入式开发平台
为什么表的指针都按照顺时针方向转动
嵌入式软PLC在电镀生产流程控制系统中的应用
内存搭配DDR4、DDR3L还是DDR3?
基于改进Hough变换和BP网络的指针仪表识别
Altera加入嵌入式视觉联盟
ARM Cortex—MO/MO+单片机的指针变量替换方法
倍福 CX8091嵌入式控制器
基于内存的地理信息访问技术