RTX51 是keil公司开发的一款实时操作系统,其有两个版本:1.Tiny 2.Full,区别如下:

RTX51 Full :使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作在

与中断功能相似的状态下 信号和信息可以通过邮箱系统在任务之间互相传递 你可以从一存

储池中分配和释放内存 你可以强迫一个任务等待中断 超时或者是从另一个任务或中断发出的

信号或信息

RTX51 Tiny:仅支持时间片轮转任务切换和使用信号进行任务切换 不支持抢先式的任务切换

不包括消息历程 没有存储器池分配程序

总结来说,Tiny就是RTX51 Full的精简版,只有基本的任务切换功能。

使用RTX51操作系统需要有以下要求:

1.keil C51 集成开发环境,其许可证版本必须为PK51,否则无法编译通过。

2. RTX51_Tiny需要占用 定时器0 、定时器0中断以及寄存器组0。用户程序不可再使用这些资源。


下面介绍STC15W系列单片机如何使用RTX51_Tiny操作系统:

1.首先将RTX51_Tiny的头文件和Lib库文件添加到工程,这两个文件在keil C51的安装目录下

 

把这两个文件拷贝到工程目录下,并在Keil中把这两个文件添加到工程。

2.keil配置选项里选择RTX51_Tiny操作系统

3.RTX51_Tiny 相关配置 

由于RTX51_Tiny是基于时间片的操作系统,而且它没有优先级的概念,每个任务执行的时间是一定的,即当前任务的时间片达到时,会立即切换到其他就绪的任务,任务的时间片可以通过Conf_tny.A51文件的相关参数修改。

INT_CLOCK 是 RTX系统的1个滴答时钟的时间,此处定义为33177是指 1个系统滴答时钟=33177个单片机的机器周期,由于我的单片机时钟的33.1776Mhz,所以其一个机器周期为1/33.1776 ≈ 0.0301us,33177个机器周器就是 999.9us≈1ms。注意:此值最大为65536

TIMESHARING 是 一个时间片等于多少个RTX系统的滴答时钟,此处定义为10,即定义时间片为10ms。

4. 编写测试程序。

RTX51 Tiny 无需编写main函数,直接编写任务函数即可,且每个任务函数必须是死循环,不可以返回。这里编写了3个任务,任务0 负责初始化和创建任务1 和任务2,最后删除自身,不再执行。任务1和任务2 都是串口打印,这样可以使用串口工具,观察其运行情况。程序中需要包含 "RTX51TNY.h" 头文件,即RTX51 Tiny的系统函数头文件。

#include "config.h"// 时钟 IO口配置头文件

#include "USART.h"
#include "stdio.h"
#include "RTX51TNY.h"   //包含系统头文件



void MainTask(void) _task_ 0  //任务0,首先进入这里
{
  UartInit();//串口初始化
  os_create_task (1);   //创建任务1、2
  os_create_task (2);    
  os_delete_task (0);   //挂起本任务0,不再运行本任务
}


void LEDTask(void)  _task_ 1  //任务1
{

  while(1) 
  { 
	printf("11111111111\r\n");	
  }
}

void UARTTask(void) _task_ 2 //任务2
{
  while(1)
  {
	printf("task task task \r\n");
  }
	
}


通过串口可以看出,这两个任务在交替运行:

5.系统延时函数的使用

char os_wait(
unsigned char event_sel, /*要等待的事件*/
unsigned char ticks, /*要等待的滴答数*/
unsigned int dammy); /*无用参数*/

该函数挂起当前任务,并等待一个或几个事件,如时间间隔,超时,或从其它任务和中断发来的信号。参数 event_set 指定要等待的事件,可以是下面中事件的一些组合。

注意:其第二个参数ticks是以INT_CLOCK为基准的。

K_SIG 等待一个信号
K_TMO等待超时
K_IVL 等待定时器滴答的间隔

K_SIG:是等待其他任务给本任务发生一个信号然后才开始执行本任务,如果一直没有收到这个信号,那么本任务将不会执行。 

可以看出,任务2 一直没有被执行,因为它一直收不到信号。

K_TMO:等待产生超时信号,当信号产生后,只是将相应的任务置上就绪标志位,任务并不是立即就能够运行。任务需要等到其它任务轮流执行,到自己的时间片后才会执行。一个任务可以等待一个超时事件(Timeout),超时事件是一个非常普通的事件,就是一个简单的数,代表有多少个内核时钟滴答数。当一个任务在等待超时事件,那么其他的任务将继续运行。一旦需要等待的内核时钟滴答数已经耗尽,那么这个等待的任务则继续运行。
K_IVL:时间间隔事件(Interval)是超时事件的一个变种,两者之间的差别就在于时间间隔事件所要求的时钟滴答数和任务中上一次调用的内核函数 os_wait 有关。时间间隔事件通
常用来产生一个规则而且是同步运行的任务(例如:一秒钟运行一次的任务),而不管
任务运行和 os_wait 之间的时间是多长。如果所设定的时钟滴答数已经耗尽(时间是从
内核函数 os_wait 的上一次调用开始算起),任务将立即运行(在没有其他任务运行的
条件下)。
   

RTX51Tiny使用说明文档:https://sourceforge.net/projects/stc51/files/RTX51/RTX51-Tiny____.pdf/download

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐