打印

关于Small RTOS51的 OSWAIT()函数的疑问

[复制链接]
2172|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
125008301|  楼主 | 2008-9-23 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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呢

相关帖子

沙发
hotyong| | 2008-9-23 22:39 | 只看该作者

re

在系统时钟中断服务程序中有:
#if EN_TIMER_SHARING > 0
    OSTimeTick();                                       /* 调用系统时钟处理函数                            */
#else
    OSIntSendSignal(TIME_ISR_TASK_ID);                  /* 唤醒ID为TIME_ISR_TASK_ID的任务                 */
#endif
这个就是给任务发送SIG;
优先级也是在建立任务就分配好了的,smallRTOS是静态建立任务,并确定了任务优先级,以下就是
void  (* const TaskFuction[OS_MAX_TASKS])(void)={Show,TimeSum};
建立了两个任务,Show,TimeSum. Show任务的优先级更高.

这两个任务之间没有通信,它们是通过系统来协调工作的.


使用特权

评论回复
板凳
125008301|  楼主 | 2008-9-24 07:57 | 只看该作者

应该是这个是时间中断的问题

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

/*这个是用自己仿真的程序,闪烁灯的 不是陈明计的学习板的*/ 
#include "config.h" 


void delay_t(unsigned int time) 

 while(time!=0)time--; 


                 
void init(void) 

P1=0x00; 
TCON=0; 
TMOD=0x01; 
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256; 
ET0=1; 
TR0=1; 




void TaskA(void) 

        while(1) 
        { 
        //delay_t(500); 
        P1=0Xff; 
        delay_t(500); 
        OSWait(K_SIG,0); 
         
        //P1=0X00; 
        //delay_t(500); 
    //OSWait(K_SIG,OS_TICKS_PER_SEC+1); 

        } 
  



void TaskB(void) 

        while(1) 
        { 
        //P1=0Xff; 

        //OSWait(K_TMO,OS_TICKS_PER_SEC/2); 
        //delay_t(500); 
        P1=0X00; 
        delay_t(500); 
        OSWait(K_SIG,0); 



        } 
  
}                        

void main(void) 

    init(); 
    OSStart(); 


出现的问题是 1:亮的时间总比灭的时间多,而且灭的时候只是一瞬间的 
             2:如果delay()函数里的数去到比较大的时候例如1000以上 出现不亮的情况啊 为什么呢 
             3:OSWait(K_TMO,OS_TICKS_PER_SEC/2); OSWait(K_TMO,(OS_TICKS_PER_SEC+1)/2);进行每隔0.5秒延时 
               又好像达不到0.5s的效果 很快地闪烁

使用特权

评论回复
地板
125008301|  楼主 | 2008-9-24 09:00 | 只看该作者

现在运行单个任务还是有问题呢

#include "config.h" 


                 
void init(void) 

P1=0x00; 
TCON=0; 
TMOD=0x01; 
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256; 
ET0=1; 
TR0=1; 




void TaskA(void) 

 while(1) 
 { 


        P1=0xff; 
        OSWait(K_TMO,OS_TICKS_PER_SEC / 2); 
        P1=0x00; 
        OSWait(K_TMO,(OS_TICKS_PER_SEC+1) / 2); 
//        OSClearSignal(0); 
//        OSSendSignal(1); 
         

         

 } 
  



void main(void) 

    init(); 
    OSStart(); 



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

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

使用特权

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

本版积分规则

23

主题

69

帖子

6

粉丝