打印

有关ucos-II

[复制链接]
2476|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhoums|  楼主 | 2007-9-12 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2007-9-12 20:05 | 只看该作者

UCOS-IId在51上跑太没有意义了...

使用特权

评论回复
板凳
lsqing| | 2007-10-20 20:14 | 只看该作者

还是用SMALL ROTS51的好些。

我也碰到了,不过用李章林的小模式移置没有问题。也同意二楼意见,UCOS2在51上跑切换任务太.......,还是用SMALL ROTS51的好些。

使用特权

评论回复
地板
armecos| | 2007-10-20 22:16 | 只看该作者

你购买ucos51开发包就可以了,售价:¥1000

5年前就已经给出解决方案,ucos51迄今已经售出几千份了,下载超过十万人次,很多网友用它来学习OS基本原理,这么多OS里面对初学者真正有用的还就是ucos51,其意义并不仅仅在于做51开发而是学习OS原理,为使用32位CPU和其他OS打基础。等你学会了操作系统原理,就可以直接在ARM上使用现成的《ecos增值包》(售价¥3050)进行中高端开发了。
 

在51单片机上硬件仿真uCOS51的说明
asdjf@163.com  www.armecos.com  2002/11/26
        
    讨论4----uCOS51仿真
    
    zyware网友2002/11/22来信询问uCOS51在单片机上的硬件仿真问题,具体情况是“在51上用uCOS51核,以及一些构件,keilc上仿真通过,用wave接硬件仿真程序乱飞,wave仿真以前的程序没有问题,不知是何缘故”。
    由于我的OS程序已经在KEIL软件仿真和硬件上实际测试过,所以不可能是程序错。可能的原因只能是硬件仿真软件设置问题。本人用的是Medwin软件,在Insight上调试,使用uCOS51编译测试程序一样跑飞。即使添加修改后的startup.a51(详见《在51单片机上固化uCOS51的说明》)也不正常。我发现Medwin似乎没有编译startup.a51,因为它把该文件加在了other Files目录下而不是source Files目录,于是我猜测只有放在source Files目录下的文件才被编译。由观察知,以.c和.asm做后缀的文件均被放在此目录下且被编译。于是我立即将startup.a51改成startup.asm并加入项目编译,结果测试正常。不必担心startup改名造成冲突,KEIL在链接目标文件时会自动处理重名段,本目录的文件优先级高(我是这么理解的,具体原理不清楚,这只是根据实践得到的结论,希望了解此处理过程的朋友能告之,不胜感激。)。
    
    具体做法如下:
    1。按《在51单片机上固化uCOS51的说明》一文修改startup.a51,并将其更名为startup.asm。
    2。将startup.asm、yy1.c、os_cpu_c.c、ucos_ii.c、os_cpu_a.asm五个文件加入项目编译。
    3。运行
 

在51单片机上固化uCOS51的说明
    asdjf@163.com  www.armecos  2002/11/11
 
    讨论5---- uCOS51固化
 
    近来,收到多位网友来信询问uCOS51在51单片机上的固化问题,归纳其焦点就是:为什么OS在KeilC51上模拟可以正常运行,但把它烧录在CPU上却不能工作?理论上,程序在软件仿真通过测试后,将其烧录在硬件上,硬件调试应该一次成功。许多网友也有这个经验,可为什么在调试uCOS51时失效了呢?难道操作系统调试很特殊吗?
    经过约一周时间的分析思考和上BBS查资料,我找到了答案。问题出在重入函数的引入。原来KEILC51软件仿真在不修改startup.a51文件的情况下,缺剩使用64K外部RAM,它把0000H-FFFFH全部仿真为可读写的RAM,而用户的硬件系统可能没有用到那么大的RAM空间,比如只用了8K/16K/32K等,或者用户把一些地址空间映射给了别的设备,比如8019AS等。在没有调用OSTaskCreate前,定义为reentrant的函数将用FFE0H做仿真堆栈栈顶指针,而此处在用户的系统里不是RAM,造成程序跑飞。比如在我的用户板上,将FE00H-FFFFH空间的一部分分配给8019AS使用,如果把demo程序编译后直接烧到51上,将不能运行。解决办法是根据系统RAM配置,修改startup.a51文件,并将其加入项目编译,如下所示:
 
XBPSTACK       EQU     1       ; set to 1 if large reentrant is used.
XBPSTACKTOP   EQU     07FFFH+1; set top of stack to highest location+1. 
 
    按此修改后,在有32K外部RAM的系统上可以正常运行。用户可根据自己XRAM的实际配置情况修改startup.a51相关参数,并将其添加到项目里编译。不必理会KEIL/C51/LIB目录下的同名文件,此处的startup.a51优先级高,KEIL将按此处该文件的配置编译项目。
    这也解释了有些网友在BBS上问到的,“为什么加入reentrant关键字,在软件仿真时正确,烧在芯片上就死机,去掉reentrant后两者都正常”的问题。由于大多数人很少使用重入函数,往往不了解这个细节,特此提请大家注意。
 
    关于uCOS51不能正常工作的原因还可能是因为串口波特率和OS_TICKS_PER_SEC及TH0、TL0设置不正确引起的。demo程序默认使用22.1184MHz晶体,19200波特率,切换频率为50Hz。为此,1。在SERIAL.C中设置“TL1=0xFD;TH1=0xFD;”使波特率为19200;2。在OS_CPU_C.C和OS_CPU_A.ASM中设置“TH0=0x70;TL0=0x00;”使时钟节拍tick=50次/秒;3。在OS_CFG.H中设置OS_TICKS_PER_SEC为50Hz。用户应根据实际情况,相应地修改这些参数,否则运行不正确。
    
定时器初值设置:
 
定时器0用于时钟节拍发生器
file://*****************************************************************************
file://初值计算公式:
//        (2^16-x)*F=Fosc/12
//    其中:F=时钟节拍频率tick;Fosc=晶体或晶振频率;x=初值;
//    本例中,F=50;Fosc=21.1184MHz;所以x=0x7000。
file://*****************************************************************************
 
定时器1用于波特率发生器
file://*****************************************************************************
file://初值计算公式:
//        TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
//    其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
//    本例中,SMOD=0;Fosc=21.1184MHz;Bound=19200,所以TH1=0xFD。
file://*****************************************************************************
 
    demo程序项目中增加按如上方法改写的startup.a51后,在我的用户板硬件上运行正确。
    
    另外有些51变种的时钟是X6的,而我是按X12那种计算波特率的,请注意这些细节。

使用特权

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

本版积分规则

10

主题

18

帖子

0

粉丝