打印
[ZLG-ARM]

请问关于UCOS的问题,谢谢!

[复制链接]
1030|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pbb1982|  楼主 | 2007-6-28 18:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, os, PDA, Box, pd
我创建了4个任务:优先级依次递减
任务1输出4个任务所用堆栈大小,只能被任务4唤起;
任务2用一个信号量控制任务3使之延时1秒; 
任务3利用邮箱给任务4传送消息并等待任务4回信;
任务4收到任务3的消息输出到串口并给任务3回信,唤起任务1。

不加任务2和信号量时,程序是好用的,加上之后串口没有输出了。
请问操作系统是怎么调度的?非常感谢!!!
程序如下:

#define     TaskStkLengh    500        
OS_STK      Task1Stk [TaskStkLengh];    
OS_STK     Task2Stk [TaskStkLengh];    
OS_STK     Task3Stk [TaskStkLengh];
OS_STK     Task4Stk [TaskStkLengh];
void      Task1(void *pdata);
void      Task2(void *pdata);
void      Task3(void *pdata);
void     Task4(void *pdata);
OS_EVENT *ackmbox;
OS_EVENT *txmbox;    
OS_EVENT *key;    

void  UART0_Init(void)
{  
    uint16 Fdiv;
    U0LCR = 0x83;                        
    Fdiv = (Fpclk / 16) /115200;        
    U0DLM = Fdiv / 256;                    
    U0DLL = Fdiv % 256;                    
    U0LCR = 0x03;
}
void  UART0_SendByte(uint8 data)
{  
    U0THR = data;                        
    while( (U0LSR&0x40)==0 );            
}
void  UART0_SendStr(uint8 *str)
{  
    while(1)
    {  
        if( *str == '\0' ) break;
        UART0_SendByte(*str++);            
    }
}

int main (void)
{
    OSInit ();
    OSTaskCreateExt (Task1,(void *)0,&Task1Stk[TaskStkLengh-1],3,1,&Task1Stk[0],TaskStkLengh,(void *)0,OS_TASK_OPT_STK_CHK);    
    OSStart ();
    return 0;                                                            
}
void Task1(void *pdata)   // 优先级3
{
    OS_STK_DATA data;
    INT8U i;
    char s[10];
    pdata = pdata;
    TargetInit ();
    PINSEL0 = 0x00000005;           
    UART0_Init ();
    OSTaskCreateExt (Task2,(void *)0,&Task2Stk[TaskStkLengh-1],4,2,&Task2Stk[0],TaskStkLengh,(void *)0,OS_TASK_OPT_STK_CHK);
    OSTaskCreateExt (Task3,(void *)0,&Task3Stk[TaskStkLengh-1],5,3,&Task3Stk[0],TaskStkLengh,(void *)0,OS_TASK_OPT_STK_CHK);    
    OSTaskCreateExt (Task4,(void *)0,&Task4Stk[TaskStkLengh-1],6,4,&Task4Stk[0],TaskStkLengh,(void *)0,OS_TASK_OPT_STK_CHK);
    while(1)
    {
       OSTaskSuspend(OS_PRIO_SELF);  // 无条件挂起任务本身
       for(i=3;i<7;i++)
       {
          OSTaskStkChk(i,&data);
          sprintf(s,"%6d,",data.OSUsed);
          UART0_SendStr((uint8 *)s);
       }
    }
}
void Task2 (void *pdata)  // 优先级4
{
    key = OSSemCreate(1);  //创建一个信号量
    while(1)
    {
     OSTimeDlyHMSM(0,0,1,0); //延时1秒
     OSSemPost(key);         //释放信号量
    } 
}
void Task3 (void *pdata)   // 优先级5
{
    uint8 txmsg = 'A';
    INT8U err;
    pdata = pdata;
    ackmbox = OSMboxCreate((void*)0);
    txmbox  = OSMboxCreate((void*)0);
    while (1)
    {
           OSSemPend(key,0,&err);    //等待信号量      
           OSMboxPost(txmbox,(void *)&txmsg);
           OSMboxPend(ackmbox,0,&err);
           if(err==OS_NO_ERR)
           {
              txmsg++;
              if(txmsg == 'Z')
                  txmsg = 'A';
           }       
    }
}
void Task4(void *pdata)   // 优先级6
{
    uint8 *rcmsg;
    INT8U err;
    pdata = pdata;
    while (1)
    {
            rcmsg = (uint8*)OSMboxPend(txmbox,0,&err);
            if(err==OS_NO_ERR)
            {
               UART0_SendStr(rcmsg);
               OSTaskResume(3);   // 唤起任务Task1()
               OSMboxPost(ackmbox,(void*)1);
            }
    }
}
    

相关帖子

沙发
liujigan| | 2007-6-29 09:49 | 只看该作者

I think

用OSSemCreat(1)创建的信号量为二值信号量,在一个任务中请求、释放应该成对出现。

使用特权

评论回复
板凳
jiangxitao| | 2007-7-5 11:37 | 只看该作者

学习

期待中

使用特权

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

本版积分规则

5

主题

5

帖子

0

粉丝