第12章 C51下的RTX-51实时多任务操作系统

在C51语言中,除了可以编写一般的单进程程序外,还可以实现多任务操作系统设计。在51系列单片机上能够运行的实时多任务操作系统为RTX-51,可以在单个51系列单片机上管理多个进程或者任务。RTX-51使得复杂的多任务程序设计变得简单,因此在51系列单片机中应用很广泛。

本章主要介绍RTX-51实时多任务操作系统的种类,并以RTX-51 Tiny为主介绍RTX-51的系统函数、RTX-51的任务管理及配置等。最后,对RTX-51 FULL系统进行介绍。

12.1 RTX-51实时多任务操作系统简介

在简单的单片机程序中,采用单一进程并配以中断处理则可以完成大部分的设计需求。但是,对于一些复杂的应用程序,需要同时执行多个进程或者任务。传统的程序设计方式使得程序比较复杂,且程序的运行性能难以满足多任务实时性的要求。此时,便需要实时多任务操作系统(RTOS)。

实时多任务操作系统(RTOS)可以灵活地为各个任务分配系统资源,包括CPU、内存以及时间等。因此,CPU同时执行多个任务或者进程,在一定程度上实现多任务并行工作。

在51内核单片机中,可以使用RTX-51多任务实时操作系统来实现多任务并行工作。实时多任务操作系统RTX-51使用标准的C51语言来编写,其自身提供了灵活的时间分配和简单有效的系统函数,可以实现多任务的及时响应和切换。

12.1.1 单任务程序与多任务程序的比较

对于一般的C51程序,均包含main主函数。程序从main主函数开始执行,是一个单任务单进程的程序。如果程序中使用了中断,则可以在中断发生的时候转向中断服务例程。对于RTX-51实时多任务操作系统,其中可以使用多个任务,则允许多个任务并行地执行。下面将举例介绍单任务程序和RTX-51多任务程序的区别。

1.简单的单任务程序

前面介绍过的程序均为简单的单任务程序,从main主函数开始执行语句。简单的单任务程序示例如下。在该程序中,首先定义变量count,然后在while主循环中,循环将变量count加1,然后通过串口打印输出count的数值。程序代码如下所示。


include<reg52.h>

include<stdio.h>

void main()//主函数

{

int count;//定义变量

while(1)//主循环

{

count++;//计数器加1

printf(“count=%d”,count);//打印输出

}

}


2.多任务循环程序

如果有两个或多个任务需要处理,且系统要求不高,这些任务可以在main函数中逐个执行,即所谓的多任务循环程序。多任务循环程序仍然采用main函数开始,为了实现多个任务的操作,需要在程序中按照一定的顺序循环切换任务的执行,或者采用中断系统。多任务循环程序示例如下。在该程序中,首先定义两个变量,在while主循环中,两个变量逐个循环加1并通过串口打印输出。程序代码如下所示。


include<reg52.h>

include<stdio.h>

void main()//主函数

{

int count0;

int count1;

while(1)//主循环

{

count0++;//变量count0加1

printf(“count0=%d\n”,count0);

count1++;//变量count1加1

printf(“count1=%d\n”,count1);

}

}


3.RTX-51实时多任务程序

RTX-51实时多任务操作系统将CPU时间划分为时间片,然后将时间片合理地分配给多个任务。程序中每个任务执行预定数量的时间片,然后切换到另一个任务的时间片上执行。RTX-51多任务程序执行多个任务或者进程的调度,RTX-51任务切换的时间很短,因此可以实现多任务准并行执行。RTX-51多任务系统执行的速度在很大程度上依赖于单片机的CPU频率,对于高性能的程序通常选择高速的单片机来执行。

对于上面的多任务循环程序,如果采用RTX-51实时多任务程序来实现,则程序示例如下。


include<RTX51TNY.h>

include<reg52.h>

include<stdio.h>

int count0;//定义变量count0

int count1;//定义变量count1

Task0()_task_0//任务0

{

os_create_task(1);//创建任务1为准备执行

while(1)

{

printf(“count0=%d\n”,count0++);//打印输出变量count0

}

}

Task1()_task_1//任务1

{

while(1)

{

printf(“count1=%d\n”,count1++);//打印输出变量count1

}

}


在该程序中,使用“task”定义了两个任务,任务0的执行函数为Task0,任务1的执行函数为Task1。RTX-51实时多任务操作系统首先从任务0开始执行程序,并创建任务1为准备执行。当任务0的时间片执行完毕后,RTX-51内核将程序转向任务1开始执行另一个时间片。当任务1的时间片结束后,将重新指向任务0执行。因此,两个任务无限循环切换,实现准并行执行。