打印

在使用keil RTX51Tiny中遇到的一些问题,希望能够得到指点

[复制链接]
7621|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xjycug|  楼主 | 2010-2-6 23:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在论坛里扒了半天,看了看原来关于RTX51Tiny的帖子,发现达人还是挺多的,我是个新手,刚开始弄,希望得到大家的指点。
是关于我在做试验中遇到一些问题。资料我也是泛泛的看了下,我平时开发都是用C8051f040单片机,好象看到有资料说c8051f040不支持RTX51Tiny操作系统,c8051f020是支持的,不知道是不是因为f040因为有page的设置,所以不支持还是有别的原因。这是开头话,由于不能在通常使用的单片上跑这个对于我来说的新东西。我就拿了一个简单的单片AT89S51来做试验。
我是想在一个单片机上简单的跑一个多任务的程序。
我做了几个试验。
第一个试验是软仿真,我将..\Keil\C51\RtxTiny2\Examples目录下的EX2例程拷出来,将工程中
RTX_EX2.C的文件中稍加修改。程序如下:
#include <rtx51tny.h>               
long counter0;                       
long counter1;
job0 () _task_ 0  {                  
  os_create_task (1);
  while (1)  {                       
    counter0++;                     
    os_wait (K_TMO, 5, 0);            
  }
}

job1 () _task_ 1  {
  while (1)  {                       
    counter1++;                       
    os_wait (K_TMO, 10, 0);         
  }
}
比较简单吧。包含的文件"Conf_tny.A51"文件中的设置我也没有改动,我在"counter0++"和"counter1++"处设置断点,然后使用RTX-Tiny Tasklist观察窗口观察。开始运行后,程序指针能够进入两个任务中,在RTX-Tiny Tasklist观察窗口也能观察到,两个任务在Running与Waiting之间交替。注意工程中默认使用的器件是Philips的80C32。由于我想在单片机AT89S52中运行,所以,我更换了器件,在device选择中,我选择了Atmel公司的AT89S51,可是当我仅仅更换了器件选择设置
后,我再进行如上的软件仿真操作时,却无法达到task 1任务中的断点。而且在Output Windows的
Command窗口中还有如下出错提示:"*** error 65: access violation at I:0xFF : no 'write' permission",我有些疑惑。仅仅更换了器件选择设置,怎么就会有问题呢?仿真的程序代码内容与硬件没有关系啊??

我又做了第二个试验,
在硬件上跑程序。我采用的是单片机AT89S51,晶振是11.0592Mhz。
我将程序做了一些修改,程序首先是如下,
#include <rtx51tny.h>               
#include <reg51.h>
sbit P2_0 = P2^0;
long counter0;
job0 () _task_ 0  {
  while (1)  {                       
    counter0++;
    P2_0 = !P2_0;                     
    os_wait (K_TMO, 5, 0);            
  }
}
文件"Conf_tny.A51"中的内容我没有做改动,INT_CLOCK值是10000, TIMESHARING值是5.这个程序是一个单任务,程序运行中,每约50ms,P2^0口的电平会做一次翻转。我将该程序编译,并将生成的.hex文件在
线下载到单片机中,断电后重行上电运行,单片机 P2^0口的电平确实是约50毫秒翻转一次,因为晶振使用的是11.0592Mhz,所以将INT_CLOCK值改为9216,则是准准的50ms翻转一次。注意这里我直接在"Conf_tny.A51"文件中修改后,直接编译工程,将生成的.hex文件在线下载到单片机中。波形周期也得到修正。我在看一些论坛中其他的帖子说要运行..\Keil\C51\RTX_TINY文件夹中的GENRTX.BAT生成新
的.lib文件,我不是很明白,我也看了手册,也不是很明白是为什么??希望能够得到大家的指点。

这里继续我的试验。单任务试验完了,试验多任务了,我将我的程序代码再做修改,如下:
#include <rtx51tny.h>               
#include <reg51.h>
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
long counter0;
job0 () _task_ 0  {
  os_create_task (1);
  while (1)  {                       
    counter0++;
    P2_0 = !P2_0;                     
    os_wait (K_TMO, 5, 0);            
  }
}
job1 () _task_ 1  {
  while (1)  {                       
    P2_1 = !P2_1;                       
    os_wait (K_TMO, 8, 0);         
  }
}
这里我主要是想看看两个任务之间来回切换,在任务0中,建立(我不是很专业,这里的词可能也不专业)
了任务1,在任务0进入时间等待的过程中,可以执行任务1.这样P2^0,P2^1都可以有波形输出。P2^0的周
期是100ms,而P2^1周期是160ms,但是当我把编译所得到的.hex在线下载到单片机中,P2^0端口输出的波形
是乱的,频率大概是几百Hz,肯定不对,而P2^1干脆是高电平,没有变化。我不知道问题是出在哪儿了。
也没觉得有什么错误。希望大家能帮忙分析分析问题出在哪儿了呢??是哪儿的设置不对??还是在程序的编译下载上出了问题??谢谢!!

也祝大家新年快乐!!

相关帖子

沙发
冷漠| | 2010-2-7 16:03 | 只看该作者
本帖最后由 冷漠 于 2010-2-7 21:43 编辑

1、设置TIMESHARING=0关闭时间片即可。
2、要观测时间片作用,就把任务延时关闭,TIMESHARING=10或者其他值。

若要2者同时起作用,延时时间要远小于系统时隙(时间片—默认50ms。)例如若要延时160ms,  就应把TIMESHARING 设置为至少大于20(时间片200ms)。

下面是时间片作用实验:
#include <rtx51tny.h>               
#include <reg51.h>

sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
//long counter0;

job0 () _task_ 0
{
  os_create_task (1);
  while (1)  {                       
    //counter0++;
    P2_1 =0;      // !P2_0;                     
    //
}
}

job1 () _task_  1
{
  while (1)
{                       
    P2_1 = 1;            //!P2_1;                       
    //os_wait (K_TMO, 20, 0);         
  }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xjycug + 1
板凳
xjycug|  楼主 | 2010-2-12 20:40 | 只看该作者
谢谢冷漠的回帖。现在刚刚回家过年,年后再回单位做试验。
我想问问冷兄,你有没有吧程序下载到单片机中,如何下载呢?我适用的是在线编程的AT89S51单片机,呵呵,有些老了。不过单位里没怎么用过带这种带操作系统软件。所以我只是自己做做试验。不知使用了带操作系统后程序下载上有什么不同??希望能够得到冷兄的释惑。我阳历22号上班,到时再请教!!明天年三十,祝冷兄新年快乐!!祝大家新年快乐!!

使用特权

评论回复
地板
xjycug|  楼主 | 2010-2-24 22:27 | 只看该作者
仿真时采用了不同型号的单片机试验,结果发现有三个定时器的单片机仿真能够成功。
硬件试验我把原来的AT89S51换成AT89S52就可以了,感觉还是有些奇怪,继续学习与试验中!!

使用特权

评论回复
5
冷漠| | 2010-2-25 10:35 | 只看该作者

RAMTOP EQU 7FH

本帖最后由 冷漠 于 2010-2-25 11:13 编辑

原因很简单:8952(3定时器)的RAM是255,而8951(2定时器)的内部RAM只有128。而你的rtx51tny.lib 库是默认8052参数的,所以如果你用8051,肯定会出错。 修改一下很简单,假设你仍然用AT89S51(2定时器)128字节RAM。那么把Conf_tny.A51文件加入工程,修改 RAMTOP项为   EQU      7FH(128)与主函数一起编译即可。


使用特权

评论回复
6
冷漠| | 2010-2-25 11:07 | 只看该作者
本帖最后由 冷漠 于 2010-2-25 13:13 编辑

Conf_tny.A51是用户配置文件。你若使用8051,你就要把内核参数配置为8051;你若使用AT8952,就要把内核配置为8052参数。

如果不改动Conf_tny.A51,那么系统库函数内Conf_tny.OBJ自动配置的是8052参数。网上有位朋友说他灵感发现了这个奥秘:只要把修改的Conf_tny.A51 重新连接到——创建新库rtx51tny.lib 中,就一切搞定。
      ——呵呵,画蛇添足而已。——配置文件有配置文件的位置。

只需要把修改过的Cong_tny.A51加入到工程中即可。——连接程序总是首先从工程中寻找所需OBJ文件,最后才从rtx51tny.lib 库中寻找所需连接OBJ文件的。

使用特权

评论回复
7
xjycug|  楼主 | 2010-2-25 22:13 | 只看该作者
谢谢冷兄的关心与指点。哎,还应该在汇编上下点功夫,这么大的“RAMTOP”字咋一开始就没看见呢??

使用特权

评论回复
8
冷漠| | 2010-2-26 09:14 | 只看该作者
恭喜rtx51入门。TINY 简约不简单。

使用特权

评论回复
9
xjycug|  楼主 | 2010-2-26 22:08 | 只看该作者
呵呵,还没有入门呢,只是刚刚会用点,多谢冷兄。
冷兄用过rtx51完整版吗?我看了下完整版的配置,简单的看了看,发现比tiny复杂很多。
不过功能很强大。但是没试成功。
tiny有些限制吧。不过还是要了解嵌入式的思想。
自己参与一个项目,程序写了7,8千行,但是感觉写得很乱,而且使用的是所谓的超级循环结构,即伪实时系统,看了林锐博士的高质量编程,还有其他关于程序设计的书,发现可以把自己的代码写的确实是烂。希望学习嵌入式系统及操作系统的思想,提高自己的程序设计水平。

使用特权

评论回复
10
冷漠| | 2010-2-27 12:21 | 只看该作者
7、8千行!敬佩极了。我从没写过超过2K的代码。
软件发展到今天,早就不用一个人写几千行的裸奔程序了。心理学研究:60行一个模块(顶多1、2页),再多就容易出错。所以要分模块编程。7、8千行的程序假定按功能分10个模块,由10个人合作完成(中国有的是人),最后链接,这才算可靠(一个人清醒)的程序。

老板想省钱,把10个人的工作让你一个人做,也行呀,你就耗10倍的时间一个模块一个模块地分别完成,几百行一个模块应该给一个月时间。一共需要一年左右时间完成,如果10个人合作,那就是一个月左右时间完成。

更进一步,软件发展到了使用OS平台上按功能分多任务合作由OS自动或半自动管理用户任务,——一个项目划分为10个任务已经可以啦,把以前很复杂的裸奔程序抽象归纳为很简单的系统调用,很大一部分由OS系统功能指令完成了,过去需要多人合作的软件工程现在利用OS平台环境,一个人也很容易完成了。而且比10个人更可靠。

FULL能够实现抢夺式调度,用得着么?TINY一个任务开销1ms 秒都不要,什么实时任务的死线需要2ms内完成?如果你项目中真有如此快速响应任务,那你7、8千行的裸奔程序怎么运转的?又要大而全,又要响应快,又想省钱用最普通的芯片,唯独人不值钱。

使用特权

评论回复
11
xjycug|  楼主 | 2010-2-28 19:25 | 只看该作者
哎,有苦难言,用单片机控制液晶显示屏,还有触摸屏,几个按键。编写一个小的掌上测量仪器。
做了一个样机花了3个月,两个人编,还有一个写算法。两个人代码加起来有上万行了,结果编完了,领导不满意。有换了一个存储器更大的单片机,按照领导的思路写程序。第二轮的程序更大,哎,去年一年干了一个活,反正是整出来了,不过回过头再看看我的程序,觉得还是乱。进步肯定有,但是代价太大了。。。

使用特权

评论回复
12
冷漠| | 2010-2-28 21:09 | 只看该作者
这么简单的工程,关键是方法。记得有一个网友说的挺好:编软件就像盖房子,高手拎着一麻袋现成的模块——建筑模板,在已经建好的地基上像小孩子搭积木(模块)一样,很快一个标准建筑就搭建起来了。坚固的地基就是OS平台(rtx51——TNY足够了),其它都是别人做过的、书上现成的模块,拿来用就是,不一定每条都要自己做、十分搞懂,会调用就行了。

但是如果地基也自己挖,建筑模板也自己浇筑,水泥、砂浆比例、建筑结构现学,那做出来的建筑是个什么就很难说啦。乱不乱?一个人做好一件事就已经了不起了,什么都会的人实际什么都做不好。结果,中国的老板还就需要这样的员工,逼迫员工学这学那做“万金油”。难怪中国什么都做不好。

我们老板挺好的,捞到一个项目,一定是在圈子里把需要的各类专业的最好的高手找来汇集到一起帮忙。他只需要付工资,实际上一个项目好几十万,用不着省人工钱。最后老板自己赚20W,所雇来的高级帮手不过拿几千而已。结果完成的工程都是一流的。——这才是老板。如若只让我一个人完成,我只能混出个豆腐渣工程,......

使用特权

评论回复
13
xjycug|  楼主 | 2010-3-2 22:10 | 只看该作者
现实就是这么残酷。。。我的老板就喜欢所有人都是万金油。。。

使用特权

评论回复
14
xjycug|  楼主 | 2010-3-3 22:25 | 只看该作者
谢谢冷兄的帮助,我已将此贴结了,并给了分,非常感谢你的帮助希望以后有问题能够得到指点!!

使用特权

评论回复
15
江南一鸿| | 2015-4-9 15:09 | 只看该作者
你好,看到你的关于RTX51 Tiny的帖子,我现在也是刚开始接触这个操作系统,用的单片机是c8051f020,晶振18.432M,写了个测试程序,两个任务,分别控制LED的,但是不工作,调试时发现程序一直都是停在conf_tny.a51这个文件里,呃,请问大哥能给点建议么?

使用特权

评论回复
16
ningling_21| | 2015-4-9 15:59 | 只看该作者
江南一鸿 发表于 2015-4-9 15:09
你好,看到你的关于RTX51 Tiny的帖子,我现在也是刚开始接触这个操作系统,用的单片机是c8051f020,晶振18.4 ...

硬件初始化都正常吗

使用特权

评论回复
17
江南一鸿| | 2015-4-10 12:10 | 只看该作者
ningling_21 发表于 2015-4-9 15:59
硬件初始化都正常吗

你好,多谢你的回复。我后来又找了一下资料,说用户不能在自己的程序里对EA进行操作,而我却在自己程序里操作了EA位,重新改了一下程序,能顺利工作了。呃,这真是自己的不懂事啊,以后多加注意,多学习。还是谢谢你能回复我这个菜鸟。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

185

帖子

2

粉丝