您的位置:首页 > 其它

ucosII多任务调度实例

2017-04-16 13:29 155 查看
这是一个ucosII多任务调度实例实现TaskADC、TaskRTC、TaskUART、TaskGPIO四个任务之间的调度,在写代码过程中要特别注意定时器可能引起任务初始化还未完成就被中断,导致程序无法正常运行问题。尾处有代码的proteus8的电路图。(使用的是keil4,注释的中文代码有些乱码)

#include "config.h"

#include "stdlib.h"

#define    TaskStkLengh    64                //Define the Task0 stack length ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»³¤¶È         

OS_STK    TaskGRIOStk [TaskStkLengh];        //Define the Task0 stack ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»

OS_STK  TaskADCStk[TaskStkLengh];

OS_STK    TaskRTCStk [TaskStkLengh];        //Define the Task0 stack ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»

OS_STK  TaskUARTStk[TaskStkLengh];   

OS_EVENT *Str_Box;  

void  TaskGPIO(void *pdata);            

void  TaskADC(void  *pdata);

void  TaskRTC(void  *pdata);

void  TaskUART(void  *pdata);

void __irq EInt0(void);

void __irq EInt1(void);

void __irq EInt2(void);

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

**                            Çý¶¯Ïà¹Ø

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

//Òý½Å¶¨Òå  

#define      LEDCON           0x00000004   /*P0.2Òý½Å¿ØÖÆLED,µÍµçƽµãÁÁ*/

#define      KEY             0x00000008   /*P0.3Òý½ÅÁ¬½Ó°´¼ü*/

//GPIO0 µÚ2,3½ÅΪGPIO,ÉèÖÃP0.27¡¢P0.28Á¬½Óµ½AIN0¡¢AIN1

#define IOINIT() {      \

                  PINSEL0 &= 0Xffffff0f;\

                                    PINSEL0 |= 0Xa0000000;\

                                    PINSEL1 |= 0x01400001;\

                  IO0DIR |= LEDCON; \

                                    IO0DIR &= ~KEY; \

                 }

//ÍⲿÖжϳõʼ»¯(VICVectAddr0ºÍVICVectCntl0²»ÄÜÓã¬ÒѾ­±»¶¨Ê±Æ÷0(ÓÃÀ´ÊµÏÖϵͳ½ÚÅÄ)Õ¼Ó㬷ñÔò»áÒýÆðIRQÒì³£)

#define EINIT() {      \

                  VICIntSelect=0;\

                                    VICIntEnable|=0x0001c000;\

                                    VICVectCntl3=0X0000002e;\

                                    VICVectCntl1=0X0000002f;\

                                    VICVectCntl2=0X00000030;\

                                    VICVectAddr3=(int)EInt0;\

                                    VICVectAddr1=(int)EInt1;\

                                    VICVectAddr2=(int)EInt2;\

                                    EXTINT=0x07;\

                 }

uint8 int0_flag=0;

uint8 int1_flag=0;

uint8 int2_flag=0;

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

**                            main

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

int main (void)

{

    // É豸³õʼ»¯

    TargetInit();

    // Initialize uCOS-II.

    OSInit ();

    // IO³õʼ»¯

    IOINIT();    

    EINIT();

    Str_Box = OSMboxCreate ((void*)0);  //´´½¨ÓÊÏä

    OSTaskCreate(TaskADC, (void *) 0, &TaskADCStk[TaskStkLengh-1], 7);

    OSTaskCreate(TaskRTC, (void *) 0, &TaskRTCStk[TaskStkLengh-1], 8);

    OSTaskCreate(TaskUART, (void *) 0, &TaskUARTStk[TaskStkLengh-1], 9);

    OSTaskCreate(TaskGPIO, (void *) 0, &TaskGRIOStk[TaskStkLengh-1], 10);//ÓÅÏȼ¶Ó¦¸Ã×îµÍ £¬·ñÔò»á¿¨ÔÚ°´¼üɨÃè´¦

    // Start multitasking.

    OSStart ();

    return 0;                                                            

}

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

**                            TaskGPIO ÈÎÎñ

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

void  TaskGPIO (void  *pdata)

{

    uint8 flag=0;

    pdata = pdata;

    while (1)

    {

        if((IO0PIN&KEY)==0)

        {

            flag=~flag;

            if(flag)

                IO0SET=LEDCON;

            else

                IO0CLR=LEDCON;

        }

        OSTimeDly(100);

    }

}

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

**                            TaskUART ÈÎÎñ

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

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

* Ãû    ³Æ£ºUART0SendByte()

* ¹¦    ÄÜ£ºÏò´®¿Ú·¢ËÍ×Ö½ÚÊý¾Ý£¬²¢µÈ´ý·¢ËÍÍê±Ï¡£

* Èë¿Ú²ÎÊý£ºdata  Òª·¢Ë͵ÄÊý¾Ý

* ³ö¿Ú²ÎÊý£ºÎÞ

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

void  UART0SendByte(uint8 data)

{  

    U0THR = data;                            // ·¢ËÍÊý¾Ý

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

}

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

* Ãû    ³Æ£ºUART0SendStr()

* ¹¦    ÄÜ£ºÏò´®¿Ú·¢ËÍÒ»×Ö·û´®

* Èë¿Ú²ÎÊý£ºsrt        Òª·¢Ë͵Ä×Ö·û´®µÄÖ¸Õë

* ³ö¿Ú²ÎÊý£ºÎÞ

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

void  UART0SendStr(char *str)

{  

    while(1)

    {  

        if( *str == '\0' ) break;

        UART0SendByte(*str++);                // ·¢ËÍÊý¾Ý

    }

}

void  TaskUART (void  *pdata)

{

    uint8 err;

    char* str;

    pdata = pdata;

    while (1)

    {

        str = (char *)OSMboxPend(Str_Box,0,&err);//½ÓÊÕÓÊÏäÐÅÏ¢

        UART0SendStr(str);

        OSTimeDly(20);

    }

}

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

**                            TaskADC ÈÎÎñ

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

void  TaskADC (void  *pdata)

{

    uint32  ADC_Data;

    char    str[20];

    pdata = pdata;

     /* ½øÐÐADCÄ£¿éÉèÖã¬ÆäÖÐx<<n±íʾµÚnλÉèÖÃΪx(Èôx³¬¹ýһ룬ÔòÏò¸ßλ˳ÑÓ) */

    ADCR = (1 << 0)                     |        // SEL = 1 £¬Ñ¡ÔñͨµÀ0

           ((Fpclk / 1000000 - 1) << 8) |         // CLKDIV = Fpclk / 1000000 - 1 £¬¼´×ª»»Ê±ÖÓΪ1MHz

           (0 << 16)                    |        // BURST = 0 £¬Èí¼þ¿ØÖÆת»»²Ù×÷

           (0 << 17)                    |         // CLKS = 0 £¬Ê¹ÓÃ11clockת»»

           (1 << 21)                    |         // PDN = 1 £¬ Õý³£¹¤×÷ģʽ(·Çµôµçת»»Ä£Ê½)

           (0 << 22)                    |         // TEST1:0 = 00 £¬Õý³£¹¤×÷ģʽ(·Ç²âÊÔģʽ)

           (1 << 24)                    |         // START = 1 £¬Ö±½ÓÆô¶¯ADCת»»

           (0 << 27);                            // EDGE = 0 (CAP/MATÒý½ÅϽµÑØ´¥·¢ADCת»»)

    OSTimeDly(10);                                

    ADC_Data = ADDR;                            // ¶ÁÈ¡ADC½á¹û£¬²¢Çå³ýDONE±ê־λ

    while (1)

    {

                ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24);    // ÉèÖÃͨµÀ1£¬²¢½øÐеÚÒ»´Îת»»

        while( (ADDR&0x80000000)==0 );                // µÈ´ýת»»½áÊø

        ADCR = ADCR | (1 << 24); 
ae74
                   // ÔÙ´ÎÆôÔËת»»

        while( (ADDR&0x80000000)==0 );              // µÈ´ýת»»½áÊø

        ADC_Data = ADDR;                            // ¶ÁÈ¡ADC½á¹û

        ADC_Data = (ADC_Data>>6) & 0x3FF;           // ÌáÈ¡ADת»»Öµ

        ADC_Data = ADC_Data * 3300/1024;                 // Êýֵת»»

       

        sprintf(str, "VIN1=%dmV \r", ADC_Data);            

        OSMboxPost(Str_Box, (void *)&str);//·¢ËÍÓÊÏäÏûÏ¢

        OSTimeDly(50);

         

        ADCR = (ADCR&0x00FFFF00)|0x02|(1 << 24);    // ÉèÖÃͨµÀ2£¬²¢½øÐеÚÒ»´Îת»»

        while( (ADDR&0x80000000)==0 );                // µÈ´ýת»»½áÊø

        ADCR = ADCR | (1 << 24);                    // ÔÙ´ÎÆôÔËת»»

        while( (ADDR&0x80000000)==0 );              // µÈ´ýת»»½áÊø

        ADC_Data = ADDR;                            // ¶ÁÈ¡ADC½á¹û

        ADC_Data = (ADC_Data>>6) & 0x3FF;           // ÌáÈ¡ADת»»Öµ

        ADC_Data = ADC_Data * 3300/1024;                 // Êýֵת»»

       

        sprintf(str, "VIN2=%dmV \r", ADC_Data);           

        OSMboxPost(Str_Box, (void *)&str);

        OSTimeDly(50);

    }

}

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

**                            TaskRTC ÈÎÎñ

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

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

*Ãû³Æ: RTCIni()

*¹¦ÄÜ: ³õʼ»¯ÊµÊ±Ê±ÖÓ

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

void RTCIni(void)

{ PREINT=Fpclk/32768-1;           //ÉèÖÃÔ¤·ÖƵÆ÷

  PREFRAC=Fpclk-(Fpclk/32768)*32768;

  YEAR=2017;                      //³õʼ»¯Äê

  MONTH=4;                        //³õʼ»¯ÔÂ

  DOM=9;                         //³õʼ»¯ÈÕ

  HOUR=8;

  MIN=30;

  SEC=0;

  CIIR=0x01;                      //ÉèÖÃÃëÖµµÄÔöÁ¿²úÉúÒ»´ÎÖжÏ

  CCR=0x01;                       //Æô¶¯RTC

}

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

*Ãû³Æ: SendTimeRtc()

*¹¦ÄÜ: ¶ÁÈ¡RTCµÄʱ¼äÖµ£¬²¢½«¶Á³öµÄʱ·ÖÃëÖµÓÉ´®¿Ú·¢Ë͵½ÉÏλ»úÏÔʾ

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

void SendTimeRtc(void)

{ char send_buf[16];           //UART0Êý¾Ý½ÓÊÕ»º³åÇø

    char const MESSAGE[]="RTC Time is:";

  uint32 times;

  uint8 bak;

  times=CTIME0;                  //¶ÁÈ¡ÍêÕûʱÖӼĴæÆ÷0

  bak=(times>>16)&0x1F;          //È¡µÃʱµÄÖµ

  send_buf[0]=bak/10+'0';

  send_buf[1]=bak%10+'0';

  send_buf[2]=':';

  bak=(times>>8)&0x3F;           //È¡µÃ·ÖµÄÖµ

  send_buf[3]=bak/10+'0';

  send_buf[4]=bak%10+'0';

  send_buf[5]=':';

  bak=times&0x3F;                //È¡µÃÃëµÄÖµ

  send_buf[6]=bak/10+'0';

  send_buf[7]=bak%10+'0';

  send_buf[8]='\r';

    if(!int0_flag)

        UART0SendStr((char*)MESSAGE);

    OSMboxPost(Str_Box, (void *)&send_buf);//·¢ËÍÓÊÏäÏûÏ¢

    OSTimeDly(20);

}

void  TaskRTC (void  *pdata)

{

    pdata = pdata;

    RTCIni();

    while (1)

    {

        if(1==(ILR&0x01))    //µÈ´ýRTCÔöÁ¿Öжϱê־λ

    {

            ILR=0x01;                 //Çå³ýÖжϱê־λ

            SendTimeRtc();            //¶ÁȡʱÖÓÖµ£¬²¢ÏòUART0·¢ËÍ

        }

        OSTimeDly(100);

    }

}

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

**                            Öжϴ¦Àí³ÌÐò

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

//Èç¹ûÈÎÎñ»¹Ã»³õʼ»¯Íê±Ï¾Í´¥·¢Öжϣ¬»á³öÏÖÎÊÌâ

void __irq EInt0(void)

{

    OSIntEnter();

    while(EXTINT &(1<<0))

        EXTINT=1<<0;

    int0_flag=~int0_flag;

    if(int0_flag)

        OSTaskSuspend (9);

    else

        OSTaskResume(9);    

    VICVectAddr=0;

    OSIntExit();

}

void __irq EInt1(void)

{

    OSIntEnter();

    while(EXTINT &(1<<1))

        EXTINT=1<<1;

    int1_flag=~int1_flag;

    if(int1_flag)

        OSTaskSuspend (7);//¹ÒÆðTaskADC

    else

        OSTaskResume(7);    //»Ö¸´TaskADC

    VICVectAddr=0;

    OSIntExit();

}

void __irq EInt2(void)

{

    OSIntEnter();

    while(EXTINT &(1<<2))

        EXTINT=1<<2;

    int2_flag=~int2_flag;

    if(int2_flag)

        OSTaskSuspend (8);//¹ÒÆðTaskRTC(×èÈû̬)

    else

        OSTaskResume(8);

    VICVectAddr=0;

    OSIntExit();

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息