general111 发表于 2012-7-12 21:28:38

在lpc2136下跑ucosII,有一个任务没执行或只跑一次?

如题,在lpc2136下跑ucosII,有四个任务。task1:点灯,优先级2,task2:uart0发数据,优先级6,task3:uart1发数据,优先级3,task4:uart1接数据,优先级4。当光炮前三个任务时,正常;添加任务四时,当任务四跑一次后,任务2就停止了,任务四也不跑了,只有灯闪烁;当加大任务2的堆栈大小时,任务4一直不执行,这是怎么一回事啊?

general111 发表于 2012-7-12 21:29:50

等待高手指点。

general111 发表于 2012-7-13 17:16:09

本帖最后由 general111 于 2012-7-13 17:19 编辑

#include "config.h"
#include "stdlib.h"

#defineUART0_BPS 9600   // 定义通讯波特率
#defineUART1_BPS 115200   // 定义通讯波特率

#define Task0StkLengh    100          //Define the Task0 stack length 定义用户任务0的堆栈长度
#define Task1StkLengh    300
#define Task2StkLengh    100
#define Task3StkLengh    200

uint8 Flag_Sms=0;
uint8 Flag_buf=0;
uint8 Flag_gIsNewMsg=0;
uint8 Flag_gmax=0;
uint8 Flag_pass=0;
uint8 Flag_telcompare=0;
uint8 Flag_revsms=0;
uint8 Flag_task2=0;
uint8 Flag_task3_1=0;
uint8 Flag_task3_2=0;
uint8 Flag_task3_3=0;
uint8 Flag_task3_4=0;
uint8 Flag_task3_5=0;
uint8 Flag_task3=0;

OS_STKTask0Stk ;   //Define the Task0 stack 定义用户任务0的堆栈
OS_STKTask1Stk ;
OS_STKTask2Stk ;
OS_STKTask3Stk ;


void    Task0(void *pdata);         //Task0 任务0
void    Task1(void *pdata);
void    Task2(void *pdata);
void    Task3(void *pdata);

int main (void)
{
    OSInit ();
    OSTaskCreate (Task0,(void *)0, &Task0Stk, 2);
        OSTaskCreate (Task1,(void *)0, &Task1Stk, 5);
        OSTaskCreate (Task2,(void *)0, &Task2Stk, 3);
        OSTaskCreate (Task3,(void *)0, &Task3Stk, 4);

    OSStart ();
    return 0;
}

/*********************************************************************************************************
**                            Task0 任务0
**                工作灯
********************************************************************************************************/

void Task0(void *pdata)          
{
       
        pdata = pdata;

    TargetInit ();

    GpioInit();                //led 初始化

        Uart1Init(UART1_BPS);//Uart1 初始化
        SIM300Init();//初始化SIM300



    while (1)
    {   
       if ((IO0SET & RUN) == 0)
                {
                        IO0SET = RUN;//运行状态指示灯
                        OSTimeDly(50);
                        }
                else
                {
                        IO0CLR = RUN;
                        OSTimeDly(50);
                        }
          OSTimeDly(50);

    }
}
/*********************************************************************************************************
**                            Task1 任务1
**                查询记录
********************************************************************************************************/
//union uint_2uchar Com_Rec_Chk;      // /lzp 接收命令校验和计算寄存器 /lzp

void Task1(void *pdata)
{
    uint8 pp[]="Uart0 is OK! welcome to LPC!";
       

        uint8 i;

        pdata = pdata;
       
        if(Uart0Init(UART0_BPS))
        {
                Uart0SendData(pp);
        }
        OSTimeDly(50);
       

        while(1)
        {
               
                SendData_CHD802();//顺序查询历史记录CHD802的协议       
          
           OSTimeDly(200);           //等待接收完毕
          

        }
}
/*********************************************************************************************************
**                            Task2 任务2
**                通过uart0接收数据,有刷卡事件时通过短信发送
********************************************************************************************************/


void Task2(void *pdata)
{
          
       uint8 buf;       
       pdata = pdata;
       OSTimeDly(50);
       
       while(1)
       {
               
               protocol();       //处理接收的协议               
               if(Ready_Flag)       //有刷卡短息 ,发卡号
                {
                      
                        Ready_Flag=0;
                        //转换为10位卡号
                        buf=(Dinfo.ID1%100/10)+'0';
                        buf=(Dinfo.ID1%10)+'0';
                       
                        buf=(Dinfo.ID2%100/10)+'0';
                        buf=(Dinfo.ID2%10)+'0';
                       
                        buf=(Dinfo.ID3%100/10)+'0';
                        buf=(Dinfo.ID3%10)+'0';
                       
                        buf=(Dinfo.ID4%100/10)+'0';
                        buf=(Dinfo.ID4%10)+'0';
                       
                        buf=(Dinfo.ID5%100/10)+'0';
                        buf=(Dinfo.ID5%10)+'0';

                        buf='\0';
                        //发英文格式短信
                        SendSms(telcode1,buf);
                        OSTimeDly(100);
                                               
                }

                OSTimeDly(50);
       }          
}
/*********************************************************************************************************
**                            Task3 任务3
**                测试SIM卡
********************************************************************************************************/
void Task3(void *pdata)
{
       /*发短消息CTL+Z={0x1a,0x0} CR=0x0d LF=0x0a*/
        /*AT+CMGS="15023664179"<CR>HELLO!<CTL+Z><CR>*/
        //       uint8 i;
       
        uint8 telSource={0};       //要修改的手机号
        uint8 telDestination={0}; //修改成的手机号
        uint8 Secret={0}; //读到的密码
        uint8 data_buf={'a','d','m','i','n',' ','1','3','7','0','5','3','3','0','9','2','9','\0',
                                                                                              '1','3','0','0','4,'5','0','1,'9,'1','5','\0',
                                                                                               '1','5','8','6','4','2','6','0','6','3','9','\0'};

        uint8 i=0,k=0,j=0;
        pdata = pdata;
        I2cInit(100000);                                                /* I2C初始化,400K                        */
        OSTimeDly(200);

        /* 往起始地址0x00开始写入39个数据        */
        I2C_WriteNByte(CAT24C16, X_ADD_8_SUBA, 0x00, data_buf, 42);
        OSTimeDly(50);

       TelphoneInit();       //Telphone初始化 : 读出Password和3个telphone NO.       
       OSTimeDly(200);


       Uart1SendData("AT+CPIN?\r");//SIM卡状态返回:+CPIN:READY , 则正常       
       OSTimeDly(100);
       while(Uart1RevBuf!=0x0)
       {
                if(Uart1RevBuf=='R'&&Uart1RevBuf=='E'&&Uart1RevBuf=='A'&&Uart1RevBuf=='D'&&Uart1RevBuf=='Y')       
                {
                        break;
                }
                Uart1SendData("AT+CPIN?\r");
                OSTimeDly(100);
       }
       
       Uart1SendData("AT+CSCA?\r");//设置短信中心号码了吗 AT+CSCA=“+8613800270500”        设置为当地运营商号码(具体而定)
       OSTimeDly(100);

       Uart1SendData("AT+CMGD=1\r");//删除所有段信   \"DEL ALL\"
       Uart1SendData("AT+CMGD=2\r");
       Uart1SendData("AT+CMGD=3\r");
       Uart1SendData("AT+CMGD=4\r");
       Uart1SendData("AT+CMGD=5\r");
       Uart1SendData("AT+CMGD=6\r");
       Uart1SendData("AT+CMGD=7\r");
       Uart1SendData("AT+CMGD=8\r");
       Uart1SendData("AT+CMGD=9\r");
       Uart1SendData("AT+CMGD=10\r");

       OSTimeDly(50);

       Uart1SendData("AT+CNMI=2,1\r");//设置短信提示功能输入指令       
       OSTimeDly(50);                                //+CMTI: "SM",1    1表示手机内短消息数量
//       OS_EXIT_CRITICAL();

       while(1)
       {
               
                RevSms();

                if(gIsNewMsg==0x0F)        //收短信并解析
                {                               
       
                        gIsNewMsg=0x0;
                        if(gMx>19)       //短信内容大于密码字节数才比较,否则删除
                        {
                       
                                for(j=0;j<Password_num;j++)           //密码
                                {
                                        Secret=newmsg;       
                                }
       
                                if(PasswordCompare(Secret)) //密码比较正确则执行下面对比
                                {
                               
                                        for(j=0;j<11;j++)
                                        {
                                                telSource=newmsg;       
                                        }
                                        telSource='\0';

                                        for(j=0;j<11;j++)
                                        {
                                                telDestination=newmsg;       
                                        }
                                        telDestination='\0';

                                        if(TelphoneCompare(telSource,telDestination))
                                        {
                               
                                                SendSms(telcode,"OK!");//发短信
                                                OSTimeDly(50);                                               
                                                               
                                        }
                                        else
                                        {
                                                SendSms(telcode,"No Match!");//发短信

                                        }
                                }
                                else
                                {       
                                        SendSms(telcode,"Password Error!");//发短信

                               }
                        }
                        gMx=0;                                 
                        //删除短信
                        Uart1SendData("AT+CMGD=");
                        Uart1SendData(msgID);
                        Uart1SendChar(0x0d);
//                        Uart1SendData("AT+CMGD= ALL\r"); //删除所有段信
                        OSTimeDly(50);
                }       
                               
                OSTimeDly(100);   
                  
       
       }
}

general111 发表于 2012-7-14 12:02:23

问题解决,是task3的程序问题。{:smile:}

dengshaozhong 发表于 2012-9-15 11:37:18

你好,能发一份模板给我吗?

dengshaozhong 发表于 2012-9-15 11:37:41

我的邮箱574151383@qq.com
页: [1]
查看完整版本: 在lpc2136下跑ucosII,有一个任务没执行或只跑一次?