这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UCOS 请功大家共同讨论学习,UCOS三任务切换程序:

共2条 1/1 1 跳转至

UCOS 请功大家共同讨论学习,UCOS三任务切换程序:

院士
2006-09-17 18:14:16     打赏
UCOS 请功大家共同讨论学习,UCOS三任务切换程序:



关键词: 请功     大家     共同     讨论     学习     任务     切换     程序    

院士
2006-12-22 22:43:00     打赏
2楼
问 #include "config.h"

#define    TaskStkLengh    64            // ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»³¤¶È
#define    UART_BPS    115200            /* ¶¨ÒåͨѶ²¨ÌØÂÊ */

OS_STK    TaskStk [TaskStkLengh];        // ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»
OS_STK    TaskStk1 [TaskStkLengh];
OS_STK    TaskStk2 [TaskStkLengh];

OS_EVENT  *TASK1;         
OS_EVENT  *TASK2;    
OS_EVENT  *TASK3;    

//OS_STK    TaskStk2 [TaskStkLengh];
void     Task0(void *pdata);            //Task0 ÈÎÎñ0
void     Task1(void *pdata);    
void     Task2(void *pdata);    

uint8 err;
/****************************************************************************
* Ãû³Æ£ºUART0_Ini()
* ¹¦ÄÜ£º³õʼ»¯´®¿Ú0¡£ÉèÖÃΪ8λÊý¾Ý룬1λֹͣ룬ÎÞÆæżУÑ飬²¨ÌØÂÊΪ115200
* Èë¿Ú²ÎÊý£ºÎÞ
* ³ö¿Ú²ÎÊý£ºÎÞ
****************************************************************************/
void  UART0_Ini(void)
{  uint16 Fdiv;

   U0LCR = 0x83;                    // DLAB = 1£¬¿ÉÉèÖò¨ÌØÂÊ
   Fdiv = (Fpclk / 16) / UART_BPS;  // ÉèÖò¨ÌØÂÊ
   U0DLM = Fdiv / 256;                            
   U0DLL = Fdiv % 256;                        
   U0LCR = 0x03;
}
void  UART0_SendByte(uint8 data)
{  U0THR = data;                    // ·¢ËÍÊý¾Ý

   while( (U0LSR&0x40)==0 );        // µÈ´ýÊý¾Ý·¢ËÍÍê±Ï
}

int main (void)
{
    OSInit();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);     
    TASK1=    OSSemCreate(0);
    TASK2=    OSSemCreate(0);  
    TASK3=    OSSemCreate(0);     
    TargetInit();
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 ÈÎÎñ0
********************************************************************************************************/

    void Task0    (void *pdata)
{
    UART0_Ini();
        OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 10); /* ´´½¨ÈÎÎñ     */
        OSTaskCreate(Task2, (void *)0, &TaskStk2[TaskStkLengh-1], 12); /* ´´½¨ÈÎÎñ     */
        OSSemPost(TASK1);       
        for (;;)
        {     
              OSSemPend(TASK1,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
    
             if(err==OS_NO_ERR)
               {
                     
               UART0_SendByte(0x01);              
               OSSemPost(TASK2);
            }
       
        }
}
/*********************************************************************************************************
**                            Task1 ÈÎÎñ1
********************************************************************************************************/


    void Task1    (void *pdata)
{
    
        UART0_Ini();
        for (;;)
        {
             OSSemPend(TASK2,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
    
             if(err==OS_NO_ERR)
             {        
            
               UART0_SendByte(0x02);
            
               OSSemPost(TASK3);   //将此句改为OSSemPost(TASK2); 能够 交替输出1,2,1,2...

             }
       
        }
}


    void Task2    (void *pdata)
{
    
        UART0_Ini();
        for (;;)
        {
             OSSemPend(TASK3,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
    
             if(err==OS_NO_ERR)
               {
                      
               UART0_SendByte(0x03);
             
               OSSemPost(TASK1);
             }
       
        }
}


去掉Task2,其它2任务执行正常,交替输出1,2,1,2...
加上Task2,只能输出1,2.

请高手帮忙,也请大家共同讨论学习.
1: 更正://将此句改为OSSemPost(TASK1); 能够 交替输出1,2,1,2... 2: re在OS_CFG.H中把OS_MAX_EVENTS设为3了吗? 3: 看看是不是超时了!看看task2的OSSemPend(TASK3,10,&err);把超时时间改长点看看 4: 以上2位大哥说的都试了,结果不变. 5: re检查一下
int main (void)
{
    OSInit();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);     
    TASK1=    OSSemCreate(0);
    TASK2=    OSSemCreate(0);  
    TASK3=    OSSemCreate(0);     
    TargetInit();
    OSStart ();
    return 0;                                                            
}
中 OSSemCreate、OSTaskCreate 的返回值,
另,你为什么老去初始化 UART0_Ini(); 呢 6: 已搞定,多谢以上大侠. 7: 楼主应该写出问题出在哪里,解决方法,方便后来人。也是对关注者的一个交待。 8: 响应深思版主要求,确实忘了说的结果:问题出在任务的中断优先级上,需要改最低优先级培植,否则TASK2的优先级被系统占用.
  不知这样解释大家能否明白. 9: 大家认真研究这个例子后:大家认真研究这个例子后,应该能对最简单的多任务切换有个了解,尤其是信号量的学习.
欢迎共同学习,共同进步,同是也希望能继续得到大家的帮助!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]