125008301 发表于 2008-9-23 21:50:26

关于Small RTOS51的 OSWAIT()函数的疑问【恢复】

void Show(void)

{

    uint8 i;

    

                                            /* 初始化显示缓冲区     */    

    ShowCase = ShowTable;

    ShowCase = ShowTable;

    ShowCase = ShowTable;

    ShowCase = ShowTable;

    ShowCase = ShowTable;

    

    while (1)

    {

        for (i = 0; i < 5; i++)

        {

            P1 = 0xff;                      /* 关闭显示第i位                    */

            KdTxdByte(ShowCase);

            P1 = EbitData;               /* 显示第i位                        */ 

            OSWait(K_SIG,0);                /* 等待1/600秒(由定时器中断决定)  */

        }



        OSWait(K_SIG,0);                    /* 等待1/600秒(由定时器中断决定)  */

        OSTimeTick();                       /* 调用系统节拍处理程序             */

    }

}

/*上面是关于陈明计先生的LED显示的SHOW程序*/





********************************************************************************************************/

        void TimeSum(void)

{

    while (1)

    {

                                                        /* 让两个发光二极管闪动 */

        ShowCase = ~0xc0;

        OSWait(K_TMO,OS_TICKS_PER_SEC / 2);

        ShowCase = ~0x00;

        OSWait(K_TMO,(OS_TICKS_PER_SEC + 1) / 2);



                                                        /* 计时并显示 */

        TimeAdd++;

        if (TimeAdd>= 10)

        {

            TimeAdd = 0;

            TimeAdd++;

            if (TimeAdd>= 6)

            {

                TimeAdd = 0;

                TimeAdd++;

                if (TimeAdd>= 10)

                {

                    TimeAdd = 0;

                    TimeAdd++;

                    if(TimeAdd>= 10)

                    {

                        TimeAdd = 0;

                    }

                }

            }

        }

        ShowCase = ShowTable];

        ShowCase = ShowTable];

        ShowCase = ShowTable];

        ShowCase = ShowTable];

    }

}

/**********************end****************************************/

/*上面是关于陈明计先生的LED显示的TIME_SUM程序*/





那个LED 显示程序就是这两个 



对于show程序的OSWAIT()函数采用 OSWait(K_SIG,0),而这个 OSWait(K_SIG,0)是一直等待信息的或者说是挂起任务



我有点不明白,为什么一定要用OSWait(K_SIG,0)而不用OSWait(K_TMO,N) 难道该程序真的有信息通知到这个show任务吗



明明是只有两个函数啊 他们是怎样达到互相通知的关系啊 有点不明白



希望大侠们指点指点....小弟刚学os呢



LED程序ourdev_428154.rar(文件大小:18K) (原文件名:LED.rar)</

<font color=#699BCD>

本贴被 125008301 编辑过,最后修改时间:2008-09-23,21:51:16.

125008301 发表于 2008-9-26 08:20:51

谢谢啊&nbsp;我理解了很多呢

ATmega32 发表于 2008-9-25 19:42:01

对于show程序的OSWAIT()函数采用&nbsp;OSWait(K_SIG,0),而这个&nbsp;OSWait(K_SIG,0)是一直等待信息的或者说是挂起任务&nbsp;



我有点不明白,为什么一定要用OSWait(K_SIG,0)而不用OSWait(K_TMO,N)&nbsp;难道该程序真的有信息通知到这个show任务吗&nbsp;





由节拍定时中断发送信号到show任务,show任务分频调用OSTimeTick()得到系统节拍。



也就是说show任务执行的频率是系统节拍的N倍,

系统节拍是由show任务N分频得到的。











本贴被 ATmega32 编辑过,最后修改时间:2008-09-25,19:47:19.

rainyss 发表于 2008-9-24 14:14:58

用TINY51是稳定,可你的命也掐在人家手里了.small是开源的,吃透了之后想怎么改就怎么改.最重要的是在51这种片子上,通用操作系统的应用范围太有限了,要做高速控制通常得自已写OS,那就必须先研究透别人的OS.

本贴被 rainyss 编辑过,最后修改时间:2008-09-24,14:15:41.

mcu5i51 发表于 2008-9-24 12:07:18

弄错了,原来以为RTOS_TNY呢,不过Small不如KC的RTOS好用,原来我用过一段时间,不是很稳定;

另外延时时间最大是255个系统周期,大了就只取低位,相当于取除以256的余数

本贴被 mcu5i51 编辑过,最后修改时间:2008-09-24,12:37:15.

125008301 发表于 2008-9-24 08:55:16

#include&nbsp;"config.h"



/*

void&nbsp;delay_t(unsigned&nbsp;int&nbsp;time)

{

&nbsp;while(time>0)time--;



}

*/



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

void&nbsp;init(void)

{

P1=0x00;

TCON=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

TR0=1;



}





void&nbsp;TaskA(void)

{

&nbsp;while(1)

&nbsp;{





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=0xff;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSWait(K_TMO,OS_TICKS_PER_SEC&nbsp;/&nbsp;2);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSWait(K_TMO,(OS_TICKS_PER_SEC+1)&nbsp;/&nbsp;2);

//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSClearSignal(0);

//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSendSignal(1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;}

&nbsp;

}



/*

void&nbsp;TaskB(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;OSWait(K_TMO,OS_TICKS_PER_SEC&nbsp;/&nbsp;2);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSClearSignal(1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSendSignal(0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;









&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;

}&nbsp;&nbsp;*/

void&nbsp;main(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;init();

&nbsp;&nbsp;&nbsp;&nbsp;OSStart();

}





这个程序应该是每隔0.5s闪烁一次吧&nbsp;可惜不是啊&nbsp;闪烁的非常快啊&nbsp;&nbsp;到底哪里出错啊&nbsp;&nbsp;我现在退回只有一个任务呢&nbsp;不搞那个任务切换



就是要单个任务出现0.5闪烁一次的闪烁灯啊&nbsp;&nbsp;可惜还是不稳定啊

mcu5i51 发表于 2008-9-24 08:04:37

OSWait()等待信号时可以用0,其实后面的参数是用于等待时间信号的的时间数

125008301 发表于 2008-9-24 07:20:46

昨晚我也想过&nbsp;应该是这个是时间中断的问题&nbsp;



/*这个是用自己仿真的程序&nbsp;不是陈明计的学习板的*/

#include&nbsp;"config.h"





void&nbsp;delay_t(unsigned&nbsp;int&nbsp;time)

{

&nbsp;while(time!=0)time--;



}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

void&nbsp;init(void)

{

P1=0x00;

TCON=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

TR0=1;



}





void&nbsp;TaskA(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//delay_t(500);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=0Xff;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_t(500);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSWait(K_SIG,0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1=0X00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//delay_t(500);

&nbsp;&nbsp;&nbsp;&nbsp;//OSWait(K_SIG,OS_TICKS_PER_SEC+1);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;

}





void&nbsp;TaskB(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1=0Xff;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//OSWait(K_TMO,OS_TICKS_PER_SEC/2);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//delay_t(500);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=0X00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_t(500);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSWait(K_SIG,0);







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;

}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



void&nbsp;main(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;init();

&nbsp;&nbsp;&nbsp;&nbsp;OSStart();

}



出现的问题是&nbsp;1:亮的时间总比灭的时间多,而且灭的时候只是一瞬间的

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2:如果delay()函数里的数去到比较大的时候例如1000以上&nbsp;出现不亮的情况啊&nbsp;为什么呢

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3:OSWait(K_TMO,OS_TICKS_PER_SEC/2);&nbsp;OSWait(K_TMO,(OS_TICKS_PER_SEC+1)/2);进行每隔0.5秒延时

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;又好像达不到0.5s的效果&nbsp;很快地闪烁



&nbsp;&nbsp;

yangsen 发表于 2008-9-24 06:11:50

“等待1/600秒(由定时器中断决定)”,看到这个了吗?说明定时中断里发了信号量,去找找定时中断的服务函数

xshx 发表于 2011-2-11 15:23:37

MARK
页: [1]
查看完整版本: 关于Small RTOS51的 OSWAIT()函数的疑问【恢复】