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

2009年11月12日 22:02    发布者:alpha321
  RTX51是一款非常紧凑的用于51单片机的嵌入式系统,支持多任务、中断和时间片调度。特别是RTX51 Tiny,能用于真正的51单片系统。该系统在Keil UV2上可用,且带调试支持。经过多年的改进,RTX51已经很成熟。
    本人认为,在51的简单应用中,这个轻量级的RTX51还是很实用的。有哪位用过,不妨交流一下自己的看法,本人在此先行谢过。
  RTX51很容易使用,在此提供一个例子,单片机控制两个LED亮灭闪烁。
4159
其中设置如下

该文章有附件资料,如需下载请访问 电脑版

网友评论

lelee007 2009年11月12日
这个OS局限性太大,没什么大的实际用途

对网络应用支持么?

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

RTX51学学就可以了
alpha321 2009年11月13日
非常感谢,楼上说的没错,RTX51专用于51单片机。
如果需要网络应用,可以选其它架构的片子。
在这里我不妨就事论事,在可以用51的场合,51芯片和RTX51还是搭配的。
试看更低端的MCU,有的连C都不支持。好在51的资料丰富,开发工具还算不错,也很便宜。
alpha321 2009年11月13日
如果我没有记错,wangkj的显卡就用了51,“stc51单片机主控,cpld+sdram实现显卡硬件”。当然,这位的应用做得很高端,本人望尘莫及。
alpha321 2009年11月13日
一个简单的例子,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);
        }
}

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

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

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

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

我想说的是, 搞论文别搞51, 搞51别搞论文. 这甚至可以说不是同一个行业. 我也实话说如果想解决学习或应用中的问题, 可以适当参考一下我的帖子, 如果做论文, 不只是我的帖子, 就是这个网站, 恐怕也难满足这样的期望吧.
alpha321 2010年03月15日
有一阵子没时间来发帖了, 对不住关注该话题的各位. 有机会我会把以前做过的一些应用贴上来, RTX51 和 UC/OS-II的都有, 希望对各位有用.  现在的问题是我有好长时间不搞51了, 也没时间整理那些东西, 非常抱歉.
ncschen 2010年05月17日
学习学习
alpha321 2010年05月19日
RTX51应用中的各任务多由 task 0 创建, 在建立各任务后, 在 task 0 的最后将该任务本身删除: os_delete_task( 0 );
supergame111 2010年06月30日
好好学习学习
yuzhigan 2010年07月06日
回复17楼supergame111:
值得好好学习
yuzhigan 2010年07月06日
谢谢分享,好东西
irzn 2010年07月07日
不提供源代码很不方便啊
hyingsheng 2010年07月08日
收藏了 谢谢啊 很好
alpha321 2010年07月28日
回复20楼irzn:
这的确是一个缺点,不过uc/os-II是提供源码的,可是并不太适合51。事实上,我们在做PC编程时,windows的API还是VC/VB的控件,都是不提供源码的,不过这也没影响我们的正常开发.
alpha321 2010年07月28日
RTX51中很有意义的一个特点是为系统进入待机(Idle)或掉电(Power down)状态提供了一个实现空闲任务Idle task的宏, 在系统各个任务都不执行(执行条件未满足)时, 使系统自动进入休眠状态, 为降低系统功耗提供了操作的可能. 各种51芯片的待机和掉电操作略有不同, 唤醒方式也有所差别. 应用时可视所用芯片适当选择. 文档中提供的一个例子, 是使通常的51单片机进入待机模式的宏定义:
CPU_IDLE MACRO
ORL PCON,#1 ; set 8051 CPU to IDLE
ENDM
在conf_tny.a51中, 定义CPU_IDLE_CODE为空闲任务的开关,设为1时,允许进入空闲任务.此时必须定义CPU_IDLE的宏.
另外,CPU_IDLE也可以不进入休眠状态,而是点亮一个空闲状态指示灯,或熄灭忙碌状态指示灯,或设置一个其他状态, 具体操作可根据应用而定.
alpha321 2010年07月28日
说点关于操作系统的题外话. 当前炙手可热的LINUX, 其前身实际是大名鼎鼎的UNIX, 后者在从巨型机到微型机/工作站上长期居于领导地位, 经过多年的发展, 达到了相当高的技术水准, 同时其结构也演化得相当复杂, 多数版本难以在微型机上运行, 更别说嵌入式系统了.

LINUX的作者别开生面, 将UNIX结构作了一个恰当的修改(这种修改现在被认为是独创), 得到了LINUX内核. 该内核生逢其时, 有GNU的支持, 不同的版本被大量用于服务器和嵌入式系统, 伸缩性很强的系统性能使这只小企鹅大显神威.

诸位可看看该系统的特点, 实时性能不比UCOSII, 图形性能不比WINDOWS, 难学难用更是其他系统不及的. 通用设备的驱动程序更是奇缺.

为此, 多个公司对LINUX进行了再开发, 比如著名的REDHAT, 还有国内的红旗LINUX. 然而, 这样一来, LINUX不再是自由的了, 要获得使用权得交费了. 还能称之为自由软件吗?

也许这种局面将来会有改观. 关于这个问题, 有兴趣的朋友不妨谈谈看法.
alpha321 2010年08月05日
LINUX能发展到今天而且很流行,自有它的道理,暂且不提。搞嵌入式系统,选LINUX是不错的,但不能因此一叶障目,认为除LINUX以外再无其它嵌入式系统,须知山外青山,艺无止境。
alpha321 2010年08月05日
前面提的RTX51,多指RTX51 tiny, 这是RTX51的一个片内RAM支持版本, 随KEIL编译器一块提供,占用很小的内部RAM空间,完成任务的调度. RTX51 FULL为片外RAM支持版本, 进程调度现场保存较大的在片外RAM中, 支持的系统数据交换方式也更丰富, 如数据邮箱等(RTX51 tiny 只支持信号).
xubin_hh 2010年08月05日
先看看
alpha321 2010年08月19日
RTX51 Tiny固定用定时器T0作为系统时钟发生器,一般系统中设置系统时钟周期为10ms左右.如上面例子中定时常数设为"9216".但对于时间要求很苛刻的应用,如LED数码管扫描,将其作为独立的任务来调度,10ms左右的周期太长了.在RTX51 Tiny中提供了在T0系统时钟中断例程中执行代码的方式,可用来保证满足这种实时限制,把动态LED数码显示的周期性扫描驱动独立成为一个子过程,在T0中断例程中调用即可.
hotpower 2010年08月25日
不错,先学好这些。
去掉51两字即可用于ARM
alpha321 2010年09月03日
感谢hotpower.
在Keil RealView中,RTX系列中间件更全面,包括RTX内核、IP协议栈、SD卡文件系统等,都是基于ARM的32位组件。关于这些组件,本人并不太了解,因此不敢在此妄加评论。但可以肯定的是,RTX应该比我前边提到的RTX51功能更强大。对此有了解的朋友,不妨介绍介绍RTX。
daoyuan79 2010年09月06日
感觉这方面的资料很少,
alpha321 2010年09月08日
回复31楼daoyuan79:
不是资料少,是国内用的人少.其实在每个Keil的版本下都有RTX51的,还有详细的文档和例子.只不过这些文档是英文的,看的人不多.
mqxc 2010年09月15日
谢谢分享
noescape 2010年09月17日
学习学习了
wenjin0386 2010年09月19日
做个记号!
alpha321 2010年09月28日
RTX51 TINY对资源的占用很少,其用户指南上边提到所需代码空间(CODE)最大为900字节,实际应用中可能比该值小.占用的内部数据空间(DATA)为7字节,另外每增加一个任务,堆栈空间会多占用3字节,但任务最多为16个.RTX51 TINY固定占用T0作为系统定时器,用寄存器组(BANK)0作为系统使用的组,但允许用户的中断例程使用其他寄存器组.
alpha321 2010年09月30日
通常在C51中,如果选择只用一个寄存器组,则在进入中断例程时,将PSW,ACC,R0-R7全部压入堆栈,即使该中断例程没有使用其中的任何寄存器.如果为中断例程分配了寄存器组,则进入中断时仅切换寄存器组,R0-R7并不压栈.
zengguangjun 2010年09月30日
资源紧张时可以选择ProtoThread,有兴趣的可以试试。
alpha321 2010年10月08日
回复38楼zengguangjun:
感谢38楼!
这也是一种不错的方案,http://code.google.com/p/protothread/有这种内核的介绍.
@︻$▅▆▇◤ 2010年10月09日
LZ不错哦。
学东西最好是从最小的东西学起,这样慢慢延伸出去,效果最好。
renmingcan 2010年10月10日
:P 我就会用51tiny显示个LED
alpha321 2010年10月12日
象其它的嵌入式操作系统一样,RTX51Tiny在具体应用的时候,也需要根据项目的功能设计做相应的任务划分,明确各任务担当的具体功能以及任务之间的联系.这个问题似乎与RTX51Tiny本身无关,只要做过设计的都明白这些,不管是否用嵌入式操作系统,这个思路是最基本的.
  在我前面举的LED的例子中,两个任务之间是没有联系的,实际应用中很少有这种相互之间完全独立的任务共存于一个完整的应用系统中.比如一个数据采集-控制系统中,可能有这样的任务:
1)系统初始化;
2)传感器数据采集;
3)数据换算和处理;
4)控制运算和输出;
5)数据和状态显示;
6)参数设定.
  这是一个简单的例子,除任务1)外,其他任务都是在系统中循环执行的,任务3)需要任务2)的输出数据作为运算的基础,任务4)需要任务3)的结果作为控制的依据.任务5)则作为当前状态的显示,采用其他任务的状态信息和数据.任务6)的设定结果则作为其他任务的输入信息.
  设想这样一个应用功能的系统,尽量简化它的具体操作,然后划分成几个任务,分别按RTX51Tiny的任务编写要求写好任务,调试并运转正常.然后看看这样的任务在不用RTX51Tiny的前后台系统中又如何实现调度.这将对理解嵌入式操作系统有帮助.有兴趣的不妨将这些任务移植到其它操作系统上试试,比如LINUX上(当然不是51平台了).
alpha321 2010年10月16日
这也是题外话. 具体的应用和操作系统本身没有必然的关系, 比如可以在一个复杂的操作系统上做一个相对简单的应用, 也可以基于一个简单的操作系统甚至是前后台做一个相当复杂的应用,这都有现成的很多例子.
  当然, 随着越来越复杂的应用需求, 平台也越来越复杂, 操作系统功能也越来越强, 这也是有目共睹的事实. 作为嵌入式操作系统内核学习的实验, 我们不妨以简单直观的LED灯作为应用, 在此基础上举一反三, 掌握核心的知识并达到运用自如.
dory 2010年10月21日
xuexi!!!
dory 2010年10月21日
再xuexi !!!!
deedzhaoyun 2010年10月21日
写的好,下载回去看看.
alpha321 2010年10月26日
前边提到的中断例程问题, 其实很多相对简单的中断例程不妨用汇编语言编写, 比如前边提到的LED数码管动态扫描, 可以避免C51在进入中断例程时把没有影响到的R0-R7,PSW逐个入栈,退出中断例程前又逐个出栈形成的执行时间(这个有时很重要)和代码及堆栈空间上的浪费. 毕竟51的速度和空间都是有限的. 有些特殊的地方, 汇编语言能发挥独到的优势.
hzndskj 2010年10月27日
正在搞这个,有帮助。
ddllxxrr 2010年12月23日
好资料我正找呢
hzh557 2011年03月02日
呵呵,强
ywwork2011 2011年03月04日
:victory:
linhao2011 2011年03月10日
学习,以后的再谦虚点,牛人太多了,呵呵
alpha321 2011年03月13日
还是题外话,
如果大家不嫌51太老,我推荐一款很经典的片子,CY7C68013,支持USB2.0的FULL SPEED 及 HIGH SPEED 的 DEVICE端接口,51的架构能做到如此高速实属不易。更可取的是,该芯片系列支持二次枚举,即芯片内部不用事先写入固件程序,在插到PC机的USB口时,驱动程序将MCU所需的目标程序通过USB下传到片内RAM开始执行。这个特性比较适合仅和PC机连接工作的高速设备。
海中孤岛 2011年03月20日
学习
dadaowai 2011年04月12日
学习,以后的再谦虚点,牛人太多了,呵呵
klyzh2003 2011年04月20日
51装操作系统,有点小材大用嫌疑!
kongchau 2011年04月29日
学习中。。。
古木风 2013年05月27日
:o原来我想多了
18821911106 2014年07月27日

谢谢分享,好东西
JZS 2015年01月23日
刚入门的,来看看
pcbkey 2015年02月22日
支持一下
lucent 2015年05月26日
呵呵。技术不分高大尚,够用为原则。
red178 2020年05月29日
学习中……。