ucosII多任务调度实例

这是一个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);                    // ÔÙ´ÎÆôÔËת»»
        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();
}







  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值