RTX51-TINY操作系统在51单片机的一个小型操作系统,在实际应用中,极大的降低了编程难度,尤其是较为复杂的一些菜单操作,比状态机编程要简单很多,本文主要将该操作系统在STC8G1K17单片机上进行移植。
1、将操作系统的库文件和配置文件拷贝到新建的KEIL工程目录下,两个文件在KEIL的安装目录下,如下图所示:
2、新建KEIL工程。新建一个新的KEIL工程,芯片选择STC8G1K系列,然后 将操作系统的两个文件和自己新建的main.c文件添加到新建的工程。如下图所示:
3、工程设置。在如下图所示的设置界面,选择RTX-51 Tiny。
4、编写main.c文件。在自己新建的main.c文件中,加入以下代码
#include "stc8g.h"
#include "RTX51TNY.h"
/******************RTX-51tiny产品参数****************
最大可定义任务数量 -----16
最大可激活的任务数 -----16
需要定时器0 和 寄存器组1
***************************************************/
void task_create(void) _task_ 0 //类似main函数
{
os_create_task(1); //
os_create_task(2); //
os_create_task(3); //
os_delete_task(0); //挂起本任务0,不再运行本任务
while(1);
}
//-----------------------------------------------
void TaskA(void) _task_ 1 //任务1
{
while(1)
{
os_wait2(K_IVL,2); //延时
}
}
//------------------------------------------------
void TaskB(void) _task_ 2 //任务2
{
while(1)
{
os_wait2(K_IVL,2); //延时
}
}
//------------------------------------------------
void TaskC(void) _task_ 3 //任务3
{
while(1)
{
os_wait2(K_IVL,2); //延时
}
}
运用RTX51-tiny编程是不需要main函数的,系统初始化完成后,直接进入任务0运行,在任务0中新建了3个任务,然后删除任务0.然后系统就会以定义的时间片,在任务1、2、3中顺序运行。每一个任务内部均是一个while(1)死循环。相比较于裸机开发的只有一个while(1),RTX-51tiny操作系统可以有多个while(1)循环(最多16个),并且while(1)循环之间可以发送消息。编译后通过后,如下所示:
可以看到代码量只有814个字节,占用空间非常少。注意RTX51-tiny操作系统需要占用定时器0和寄存器组1作为系统时间,应用编程不能再用。
5、conf_tny.a51配置文件说明。该文件主要是配置操作系统的任务调度周期,主要需要配置操作系统的滴答时间(系统ticks)和任务调度时间。如下图所示设置的ticks时间为10000个机器周期,任务调度时间(即每个任务运行时间)为5个ticks时间。这里涉及一个重要的问题,传统51单片机的机器周期是晶振周期的12分频,STC单片机的机器周期是没有经过分频的,如果STC的运行时钟配置为12MHz(运行时钟在STC-ISP下载软件中配置),那么在配置INT_CLOCK参数时,机器周期到底是12MHz还是经过分频后的1MHz?
经过实际测试发现:虽然STC单片机的机器周期没有经过分频,但是在配置操作系统的ticks时,还是要按照分频后的机器周期来设置。比如STC时钟周期配置为12MHz,那么在配置操作系统ticks时的机器周期应该按照12MHz/12=1MHz来计算。按照上图的配置来看,那么ticks=10000/(12MHz/12)=10ms。我们实际测试情况如下,在任务1中给单片机的P10口输出一个方波,方波高电平的持续时间为10个ticks,实际测试的IO口输出的波形如下所示:
可以看到高电平的持续时间约为100ms(10个ticks时间),因此,可以看到配置操作系统的ticks确实是经过12分频的。这里又有一个问题,既然计算操作系统的ticks时,需要将机器周期12分频,那么单片机实际上在运行代码时,有没有进行12分频?
我们编写同样类似的代码,将延时函数更改为 _nop_()函数,让P10端口输出方波。
STC单片机的时钟同样设置为12M,如下所示:
测试结果如下:可以看到实际延时时间约为470ns(5个nop时间),那么一个nop时间约为90ns,基本上可以看到系统运行时钟在12MHz。
因此,可以得到结论:在配置操作系统的ticks时,机器周期=STC运行时钟/12。但是单片机运行时钟是没有经过分频的。