介绍RTX51_TINY:
在偶然的情况下看到了有人在51上运用一款实时操作系统,怀着好奇的心态去了解一下。它的大名叫:RTX51,有两个版本TINY和FULL,本文章主要对tiny版本做一个简单的介绍。RTX51 Tiny是一个非抢占或多优先级的实时操作系统,是一个平级的时间片轮询实时操作系统,所有的任务平等运行。
搭建准备工作:
首先要使用这个操作系统需要做一些前期准备:keil4 C51,一块51开发板。在keil C51上需要做些配置,在魔术棒中Target中operating System中设置RTX51_tiny,main.c文件引用#include“rtx51tny.h”,编译发现** FATAL ERROR L257: RTX51-TINY REQUIRES UPGRADE TO PK51*这个错误的话,原因在破解软件时选择了不带有操作系统的版本注册,此时可以用管理员身份打开keil4 C51中file中license management,点击之前注册的license,进行Uninstall按钮删除注册好的,再重新利用注册机重新注册,选择如下图中的MDK版本注册即可编译通过。
简单代码示例:
准备好前期工作,就开始进行编写代码了,这里引用一个简单的灯任务的调度过程。
#include "rtx51tny.h"
#include <reg52.h>
sbit led0 = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
/* 在CONF_TINY.A51中可配置INT_CLOCK来决定中断使用的周期数也就是时间片,在12HZH的晶振下,INT_CLOCK EQU 10000为10ms,TIMESHARING EQU 5表示任务的时间片最大为50ms */
/* os_create_task(task_id); 创建task_id号任务
os_delete_task(task_id); 删除task_id号任务 */
void main_job() _task_ 0
{
os_create_task(1);//task1
os_create_task(2);//task2
os_create_task(3);//task3
os_delete_task(0);//delet task0
}
/* os_wait(typ, ticks,dummy); typ有三个选项K_SIG(启动信号),K_TMO(超时信号),K_IVL(周期信号)或是组合使用。ticks为等待的滴答时间,设置为10的话就是基准时间片*10,dummy未使用,默认设置为0* */
void led0_job() _task_ 1
{
led0 = 0;
for (;;)
{
led0 = !led0;
os_wait(K_TMO,100,0); //延时1s
}
}
void led1_job() _task_ 2
{
led1 = 0;
for (;;)
{
led1 = !led1;
os_wait(K_TMO,150,0); //延时1.5s
}
}
void led2_job() _task_ 3
{
led2 = 0;
for (;;)
{
led2 = !led2;
os_wait(K_TMO,150,0); //延时1.5s
}
}
在传统的C语言程序入口都是从main函数作为入口,而RTX51_TINY构建的应用程序没有main函数,是从任务0开始执行的。整体代码结构和其他RTOS的线程创建相似:由创建的第一个任务中去创建其余任务后删除自身任务。RTX51_TINY的程序用标准的C语言构造,由Keil C51 C编译器编译。用户可以很容易的定义任务函数,而不需要进行复杂的栈和变量结构配置,只需包含一个指定的头文件(rtx51tny.h),RTX51_TINY使用定时器0,定时器0中断,和寄存器组1.如果在程序中使用了定时器0,则RTX51_TINY将不能正常运行。