最近对实时嵌入式系统很感兴趣,找了些关于KEIL的RTX51资料。觉得写的挺好的,自己也小试了试一些例程。
如《RTX-51 实时操作系统 》一文中所描述的:RTX51是一个适用于8051 家族的实时多任务操作系统。RTX51使复杂的系统和软件设计以及有时间限制的工程开发变得简单。RTX51是一个强大的工具,它可以在单个CPU上管理几个作业(任务)。RTX51有两种不同的版本:RTX51 Full和RTX51 Tiny。二者的主要区别是前者是可以强占(或者说可剥夺的)系统而后者是不可以强占的(不可剥夺的)。
测试单任务程序:
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include <reg51.h>
int counter;
void main (void){
counter = 0;
while(1){ /*repert forever 永远重复 */
counter++; /*increment counter 计数加1*/
}
}
仿真结果如下图所示:
运行前 counter="0"
运行过程中counter不断增加
测试循环任务切换程序:
/******************************************************************************/
/* */
/* RTX_EX1.C: The first RTX-51 Program */
/* */
/******************************************************************************/
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include <reg51.h>
long counter0; /* counter for task 0 */
long counter1; /* counter for task 1 */
/******************************************************************************/
/* Task 0 'job0': RTX-51 tiny starts execution with task 0 */
/******************************************************************************/
job0 () _task_ 0 {
os_create_task (1); /* start task 1 ,开始任务1 */
while (1) { P1=0xff; /* endless loop ,无限循环 */
/*源程序为 P1=0x00,但由于初始化该任务时间特别短,为了便于观察后面的任务改为P1=0xff*/
counter0++;
/* increment counter0 counter1加 0 */
}
}
/******************************************************************************/
/* Task 1 'job1': RTX-51 tiny starts this task with os_create_task (1) */
/******************************************************************************/
job1 () _task_ 1 {
while (1) { P1=0x00; /* endless loop ,无限循环,P1口可以接LED,灯灭则表示在进程1中 */
/*源程序为 P1=0xff,但由于初始化后一直都在该任务中,为了便于观察改为P1=0x00*/
counter1++; /* increment counter 1 ,counter1加 1 */
os_delete_task (0); /*删除任务0*/
}
}
仿真结果如下图所示:
运行前:P1=0xff;counter0=0;counter1=0;菜单命令外设—RTX Tiny
任务列表显示任务状态:任务0和1均为删除状态(未建立)
刚开始运行一小段时间:P1=0xff;counter0=0;counter1=0;任务0为运行,任务1为就绪状态
运行至任务1中的起始处的断点时:P1=0xff;counter0=0x9b3;counter1=0;任务0为c超时(Timeout),任务1为运行状态
继续运行:P1=0xff;counter0=0x9b3;counter1=0x0c;任务0为删除状态,任务1为运行状态,之后将一直在运行任务1
通过以上两个测试可以深刻地观察和理解RTX51实时系统的任务状态的转换。当然通过调试器的反汇编界面也可以清楚地看到,实时系统是如何进行任务间的切换的,尤其是相关寄存器、现场和状态的保护的。
用户1144655 2010-7-24 21:07
tengjingshu_112148725 2010-1-20 00:29