这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 51单片机上固化uCOS51的说明

共1条 1/1 1 跳转至

51单片机上固化uCOS51的说明

助工
2015-05-06 17:28:17     打赏
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用于时钟节拍发生器 
//***************************************************************************** 
//初值计算公式: 
//        (2^16-x)*F=Fosc/12 
//    其中:F=时钟节拍频率tick;Fosc=晶体或晶振频率;x=初值; 
//    本例中,F=50;Fosc=21.1184MHz;所以x=0x7000。 
//***************************************************************************** 

定时器1用于波特率发生器 
//***************************************************************************** 
//初值计算公式: 
//        TH1=256-(2^SMOD/32*Fosc/12*1/Bound) 
//    其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率 
//    本例中,SMOD=0;Fosc=21.1184MHz;Bound=19200,所以TH1=0xFD。 
//***************************************************************************** 

    demo程序项目中增加按如上方法改写的startup.a51后,在我的用户板硬件上运行正确。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]