打印

熟悉small rtos51时看过来,钟初始化问题...

[复制链接]
2790|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liboyang_bj|  楼主 | 2011-3-24 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这几天一直折腾small rtos51,从周立功网站上下的1.20.3版,芯片为89S51。别的没发现什么,但系统时钟总是不能更改。

我使用T0作为系统定时器,即:#define OS_TIME_ISR     1
现在只有一个任务,让一个LED间断亮灭:
void test(void)
{
while(1)
{
OSWait(K_TMO,10);
led_green = !led_green;
}
}

不管我怎么更改T0初始代码,以及OS_TICKS_PER_SEC值,这个LED亮灭时间间隔总是1秒(更改为OSWait(K_TMO,1)为100ms)。请各位帮看看我哪里写错了,谢谢!

以下为主要代码:

OS_CFG.H 如下:
    #define OS_MAX_TASKS            3           /* 最大任务数1~16                                           */
    #define OS_TICKS_PER_SEC        100         /* 声明1秒系统系统节拍数                                    */
    #define EN_USER_TICK_TIMER      0           /* 禁止(0)或允许(1)系统定时中断调用用户函数UserTickTimer()  */
    #define EN_TIMER_SHARING        1           /* 禁止(0)或允许(1)定时器中断调用OSTimeTick()               */
    #define TICK_TIMER_SHARING      1           /* 定义进入多少次硬件中断为一次系统定时器软中断             */
    #define OSWait_EN               1           /* 禁止(0)或允许(1)调用兼容函数OSWait  */
    ... ...

CONFIG.H 如下:
    /********************************/
    /*     "以下为程序配置"         */
    /********************************/
    #define m_Fosc 11059200L
    #define m_TIME 65536L - (m_Fosc / (OS_TICKS_PER_SEC * 12L))

MAIN.C 如下:
void test(void);

void main(void)
{
    TMOD = (TMOD & 0xF0) | 0x01;
    TH0 = m_TIME / 256;  
    TL0 = m_TIME % 256;  
    ET0=1;  
    TR0=1;       
    temp_led_green = 0;

    OSInit();
    OSTaskCreate(test, NULL, 0);

    while(1)
    {
        PCON = PCON | 0x01;         //CPU进入休眠状态
    }
}

void test(void)
{
while(1)
{
OSWait(K_TMO,10);
temp_led_green = !temp_led_green;
}
}

相关帖子

沙发
ayb_ice| | 2011-3-24 19:12 | 只看该作者
差括号
改#define m_TIME 65536L - (m_Fosc / (OS_TICKS_PER_SEC * 12L))
为#define m_TIME (65536L - (m_Fosc / (OS_TICKS_PER_SEC * 12L)) )

使用特权

评论回复
板凳
liboyang_bj|  楼主 | 2011-3-24 19:25 | 只看该作者
跟括号没关系,即使给TL0和TH0直接赋值。整个系统还是会按照固定的频率运行,不管怎么初始化,OSWait(K_TMO,10);都是一秒。

更改OS_TICKS_PER_SEC不起作用。

使用特权

评论回复
地板
ayb_ice| | 2011-3-24 20:29 | 只看该作者
本帖最后由 ayb_ice 于 2011-3-24 20:30 编辑

好久以前用过,现在不记得细节了,调试一下便知
好象系统定时器初始化代码不要你写的

使用特权

评论回复
5
ayb_ice| | 2011-3-25 09:41 | 只看该作者
本帖最后由 ayb_ice 于 2011-3-25 09:43 编辑

N年前买了本书,仔细研究了一段时间,好久没有搞了,都快忘了
其实没有rtx51 tiny实用,而更没有裸奔高效,
作为学习可以,主要是学习OS的编程思想,那些东西其实用裸奔也很好实现

刚下了源码分析了一下
OS_TICKS_PER_SEC这个定义确实没有起作用,是对的,因为程序根本就没有使用这个宏,这个宏是给用户程序用的
分析如下:
因为系统T0中断中没有重装初值,所以计时周期是65.536周期
OSWait(K_TMO,10);其实等待了65.536*10周期,近似0.5S,周期近似1S
要想达到LZ的目的,必须修改程序
首先使能 EN_USER_TICK_TIMER等于1,然后定义UserTickTimer()函数,在其中重装初值,中断周期为10MS,
那么OS_TICKS_PER_SEC=(1000MS/10MS)=100就有意义了,其实这个宏只是给用户用的,系统并不使用这个宏,更实用的宏应该定义成(假设10MS系统中断,1次)
#define MS      /10
#define S        *100

OSWait(K_TMO,100MS);  // 延时100MS
OSWait(K_TMO,1.5S);     // 延时1500MS

使用特权

评论回复
6
liboyang_bj|  楼主 | 2011-3-25 10:14 | 只看该作者
谢谢ayb_ice,:)

使用特权

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

本版积分规则

5

主题

13

帖子

0

粉丝