查看: 25183|回复: 62

RTX51——Keil的专用于51单片机的嵌入式系统

[复制链接]
发表于 2009-11-12 22:02:03 | 显示全部楼层 |阅读模式
关键词: 兴趣
  RTX51是一款非常紧凑的用于51单片机嵌入式系统,支持多任务、中断和时间片调度。特别是RTX51 Tiny,能用于真正的51单片系统。该系统在Keil UV2上可用,且带调试支持。经过多年的改进,RTX51已经很成熟。
    本人认为,在51的简单应用中,这个轻量级的RTX51还是很实用的。有哪位用过,不妨交流一下自己的看法,本人在此先行谢过。
  RTX51很容易使用,在此提供一个例子,单片机控制两个LED亮灭闪烁。
rtx_tes.rar (669 Bytes)
其中设置如下
rtx_cfg1.JPG
rtx_cfg.JPG
发表于 2009-11-12 22:24:35 | 显示全部楼层
这个OS局限性太大,没什么大的实际用途

对网络应用支持么?

而且现在的MCU越来越便宜了,复杂、对性能有需求的,51很难胜任

RTX51学学就可以了
 楼主| 发表于 2009-11-13 10:31:24 | 显示全部楼层
非常感谢,楼上说的没错,RTX51专用于51单片机。
如果需要网络应用,可以选其它架构的片子。
在这里我不妨就事论事,在可以用51的场合,51芯片和RTX51还是搭配的。
试看更低端的MCU,有的连C都不支持。好在51的资料丰富,开发工具还算不错,也很便宜。
 楼主| 发表于 2009-11-13 10:46:14 | 显示全部楼层
如果我没有记错,wangkj的显卡就用了51,“stc51单片机主控,cpld+sdram实现显卡硬件”。当然,这位的应用做得很高端,本人望尘莫及。
 楼主| 发表于 2009-11-13 17:47:58 | 显示全部楼层
一个简单的例子,51直接驱动两个LED亮灭闪烁。
// ===========================================
//                        test project for RTX51 Tiny
// ===========================================
#include   
// 包含RTX51 tiny头文件
#include   

// ---------------------------------------------------------------
// 指示灯口线定义
sbit LED0 = P1^0;
sbit LED1 = P1^1;

// ---------------------------------------------------------------
// 定义闪烁周期。为突出差异,两个周期设为不同的值。
const unsigned char ucDly0 = 53;
const unsigned char ucDly1 = 137;

// =========================================
// 第一个任务“_task_ 0”,系统启动默认加载的任务
void job0(void) _task_ 0
{
    static bit LED_Flag = 0;

        // 加载另一个任务
        os_create_task(1);
        
        while(1)
        {
                // 指示灯输出
                LED0 = LED_Flag;
                // 位寄存器取反
                LED_Flag = ~LED_Flag;
                // 延时等待,RTX51系统过程调用
                os_wait2(K_TMO, ucDly0);
        }
}

// ---------------------------------------------------------------
// 第二个任务,除了没有“加载另一个任务”外与第一个任务基本相同
void job1(void) _task_ 1
{
    static bit LED_Flag = 0;

        while(1)
        {
                LED1 = LED_Flag;
                LED_Flag = ~LED_Flag;
               
                os_wait2(K_TMO, ucDly1);
        }
}

// =========================================
 楼主| 发表于 2009-11-19 14:45:13 | 显示全部楼层
上面是该例子的源代码,其中没有用到时间片调度,CONF_TNY.A51中只改了两个默认的参数:INT_CLOCK,设为9216是为在fosc = 11.0592MHz时得到10MS的系统调度周期;TIMESHARING设为0,禁止时间片调度。
 楼主| 发表于 2009-11-21 09:23:18 | 显示全部楼层
  该例子中可以看出RTX51应用的特点,没有C程序中常用的main()过程,只有用_task_关键字定义的任务,每个任务是一个封闭闭的循环。main()的功能已被RTX51接管了;系统等待调用os_wait2()。其实还有os_wait1(),os_wait()两个等待过程,三者之间功能略有差异,具体可参考“C:\Keil\C51\HLP\TR51.CHM”。
  还有其它可供调用的RTX51系统例程,可以参考RTX51的函数说明。
 楼主| 发表于 2009-12-5 08:00:15 | 显示全部楼层
RTX51用MCS51汇编语言写成,KEIL是不提供源码的,但不影响正常使用。UV2中附带的例子很不错,TRAFFIC是一个应用RTX51 TINY的交通灯控制程序,其中用了UART通信,重写了putchar()、getkey()等过程,以适应RTX51任务调用。
 楼主| 发表于 2009-12-11 10:11:30 | 显示全部楼层
交通灯控制程序TRAFFIC,其功能是控制一个供行人通过的路口的交通指示灯,忙碌时段内车辆通行方向为绿灯,行人通行方向为红灯。行人要通过时,按下按键,交通灯转换为车辆通行方向为红灯,行人通行方向为绿灯,让行人通过,稍后恢复为车辆通行。空闲时段内车辆通过方向黄灯亮灭闪烁。如果系统与串行终端连接,则终端上显示控制器内部的实时时间,可以通过终端设置控制器的时间,忙碌时段的开始时间和结束时间。
这是一个典型的过程控制例子,其中的单片机系统等待的时间较长,工作状态转换也较频繁,程序如果用前后台方式设计,工作量大而且容易出错。用RTX51 则程序很简洁,实时性能也不错。
 楼主| 发表于 2009-12-11 10:31:54 | 显示全部楼层
TRAFFIC中有效的任务划分为:
1)实时时间计时CLOCK;
2)行人通过时的按键输入KEYREAD;
3)忙碌时交通灯控制LIGHTS;
4)空闲时交通灯控制BLINKING;
5)终端命令接收COMMAND;
6)终端输入时ESC捕获GET_ESC。
其中KEYREAD、COMMAND和CLOCK始终运行,LIGHTS和BLINKING交替运行,GET_ESC只在终端输入时运行。
 楼主| 发表于 2009-12-19 17:08:28 | 显示全部楼层
其实,用RTX的更方便的是功能的裁剪。TRAFFIC中的功能,用前后台编程也可以很方便地实现,有兴趣的可以试试。但是,以上提到的各个任务,在前后台系统中要做增减是很费劲的,而用RTX则很方便,删除一个任务本身和等待该任务的信号的操作即可,修改的地方很少,几乎不留痕迹。可以试试在前后台系统上的修改过程是如何繁琐。
发表于 2010-2-2 11:01:11 | 显示全部楼层
支持LZ。像TRAFFIC这样的例子,如果不使用RTX51,即使高手也做不了那么完善。

看到不少研究生以RTX51_TINY应用方法做论文课题,其实教授也用不好,愿意的话在这里贴几篇硕士论文,结果是用错了。当然评委也是蒙古教授,学生能研究到这个程度就不错了,毕竟中国还没有一个博士或者教授能写的出来51_RTOS 呀.
 楼主| 发表于 2010-3-15 00:09:15 | 显示全部楼层
非常感谢楼上的回帖!

其实我是这样理解的, 国内不是写不出51_RTOS, 很大程度上是不屑于去写. 我从来不敢低估各位国内同行的实力, 甚至我都认为某些国内同行技术实力和创造性绝不亚于国外同行. 政策和资金方面的引导那不是咱搞技术的能确定的, 在此不提.

其实51是不适合用来做论文的,就算做出来也不见得能通过答辩或发表, 在这方面它显得技术含量不高, 没人会当回事. 前几年我接触过一个研究生, 做DSP + ARM9 + USB + FS + IP/TCP, 视频采集处理 + 压缩存储 + 主机端程序.  不到一年时间, 从原理图, PCB, 算法, 软件都搞定. 结果有人给评优秀, 根本不问那是怎么搞出的.

我想说的是, 搞论文别搞51, 搞51别搞论文. 这甚至可以说不是同一个行业. 我也实话说如果想解决学习或应用中的问题, 可以适当参考一下我的帖子, 如果做论文, 不只是我的帖子, 就是这个网站, 恐怕也难满足这样的期望吧.
 楼主| 发表于 2010-3-15 00:14:46 | 显示全部楼层
有一阵子没时间来发帖了, 对不住关注该话题的各位. 有机会我会把以前做过的一些应用贴上来, RTX51 和 UC/OS-II的都有, 希望对各位有用.  现在的问题是我有好长时间不搞51了, 也没时间整理那些东西, 非常抱歉.
发表于 2010-5-17 13:57:19 | 显示全部楼层
学习学习
 楼主| 发表于 2010-5-19 00:34:23 | 显示全部楼层
RTX51应用中的各任务多由 task 0 创建, 在建立各任务后, 在 task 0 的最后将该任务本身删除: os_delete_task( 0 );
发表于 2010-6-30 15:23:42 | 显示全部楼层
好好学习学习
发表于 2010-7-6 21:25:22 | 显示全部楼层
回复17楼supergame111
值得好好学习
发表于 2010-7-6 21:25:47 | 显示全部楼层
谢谢分享,好东西
发表于 2010-7-7 15:45:43 | 显示全部楼层
不提供源代码很不方便啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表