搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2008-9-23 21:50:26 | 显示全部楼层 |阅读模式
void Show(void)

{

    uint8 i;

    

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

    ShowCase[0] = ShowTable[0];

    ShowCase[1] = ShowTable[0];

    ShowCase[2] = ShowTable[0];

    ShowCase[3] = ShowTable[0];

    ShowCase[4] = ShowTable[10];

    

    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[4] = ~0xc0;

        OSWait(K_TMO,OS_TICKS_PER_SEC / 2);

        ShowCase[4] = ~0x00;

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



                                                        /* 计时并显示 */

        TimeAdd[3]++;

        if (TimeAdd[3]>= 10)

        {

            TimeAdd[3] = 0;

            TimeAdd[2]++;

            if (TimeAdd[2]>= 6)

            {

                TimeAdd[2] = 0;

                TimeAdd[1]++;

                if (TimeAdd[1]>= 10)

                {

                    TimeAdd[1] = 0;

                    TimeAdd[0]++;

                    if(TimeAdd[0]>= 10)

                    {

                        TimeAdd[0] = 0;

                    }

                }

            }

        }

        ShowCase[0] = ShowTable[TimeAdd[0]];

        ShowCase[1] = ShowTable[TimeAdd[1]];

        ShowCase[2] = ShowTable[TimeAdd[2]];

        ShowCase[3] = ShowTable[TimeAdd[3]];

    }

}

/**********************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.

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-9-26 08:20:51 | 显示全部楼层
谢谢啊&nbsp;我理解了很多呢

出0入0汤圆

发表于 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.

出0入0汤圆

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

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

出0入0汤圆

发表于 2008-9-24 12:07:18 | 显示全部楼层
弄错了,原来以为RTOS_TNY呢,不过Small不如KC的RTOS好用,原来我用过一段时间,不是很稳定;

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

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

出0入0汤圆

 楼主| 发表于 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;可惜还是不稳定啊

出0入0汤圆

发表于 2008-9-24 08:04:37 | 显示全部楼层
OSWait()等待信号时可以用0,其实后面的参数是用于等待时间信号的的时间数

出0入0汤圆

 楼主| 发表于 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;

出0入0汤圆

发表于 2008-9-24 06:11:50 | 显示全部楼层
“等待1/600秒(由定时器中断决定)”,看到这个了吗?说明定时中断里发了信号量,去找找定时中断的服务函数

出0入0汤圆

发表于 2011-2-11 15:23:37 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 21:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表