OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3538|回复: 11

用UCOSII创建两个任务,一个测距一个发短信,当距离稳定满足条件后给手机发一条短信,现在发完一条后就一直在执行发短信任务

[复制链接]

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
发表于 2016-2-1 11:09:39 | 显示全部楼层 |阅读模式
1金钱
用UCOSII创建两个任务,一个测距一个发短信,当距离稳定满足条件后给手机发一条短信,现在发完一条后就一直在执行发短信任务的while循环,测距就不执行了,请问大神是怎么回事?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-2-1 11:09:40 | 显示全部楼层
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-1 13:59:15 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2016-2-1 14:02 编辑

贴代码
小小蜗牛
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-2-1 15:14:45 | 显示全部楼层

[mw_shl_code=c,true]//GPRS数据传输任务
//设置任务优先级
#define TR800_TASK_PRIO                                9
//设置任务堆栈大小
#define TR800_STK_SIZE                                  512
//任务堆栈       
OS_STK TR800_TASK_STK[TR800_STK_SIZE];
//任务函数
void TR800_task(void *pdata);
//超声波测距任务
//设置任务优先级
#define CHAOSHENG_TASK_PRIO                               6
//设置任务堆栈大小
#define CHAOSHENG_STK_SIZE                                          64
//任务堆栈       
OS_STK CHAOSHENG_TASK_STK[CHAOSHENG_STK_SIZE];
//任务函数
void CHAOSHENG_task(void *pdata);
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
        pdata = pdata;                   
        msg_key=OSMboxCreate((void*)0);        //创建消息邮箱
        sem_beep=OSSemCreate(0);                //创建信号量                                           
        OSStatInit();                                        //初始化统计任务.这里会延时1秒钟左右       
        OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)                                                      
        OSTaskCreate(CHAOSHENG_task,(void *)0,(OS_STK*)&CHAOSHENG_TASK_STK[CHAOSHENG_STK_SIZE-1],CHAOSHENG_TASK_PRIO);                                                                                                                 
        OSTaskCreate(TR800_task,(void *)0,(OS_STK*)&TR800_TASK_STK[TR800_STK_SIZE-1],TR800_TASK_PRIO);                                           
        OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
        OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
}       
//超声波测距任务
int k=30;
void CHAOSHENG_task(void *pdata)
{             
        u8 time;        
        while(1)
        {
           CS_T1();
         if(k<700)
       {                 
         if((TIM4->CNT>20)&&(TIM4->CNT<50))
           {     
              time=TIM4->CNT;                                    
                 if( ((time_buf-3)<time)&&(time<(time_buf+3)))
                           {  
                              k++;
                              time_buf=time;
                           }
                         else  
                           {
                              k=0;
                              time_buf=time;
                           }
             }
        }         
      else
        {CS_T2();}
                disbuff[0]=S/1000;
               disbuff[1]=S%1000/100;
            disbuff[2]=S%1000%100/10;
            disbuff[3]=S%1000%10%10;
            LCD_ShowNum(180,74,disbuff[0],1,16);
            LCD_ShowNum(188,74,disbuff[1],1,16);
            LCD_ShowNum(196,74,disbuff[2],1,16);
            LCD_ShowNum(204,74,disbuff[3],1,16);
            LCD_ShowString(212,74,200,16,16,"cm");
                delay_ms(10);
        }
}
//短信发送任务
void TR800_task(void *pdata)
{
        while(1)
        {
                  if(send_flag2==0x0f)  
                {
                      send_flag2=0x00;
                  if(sms_count==3)
                   {
                    send_flagMMS=1;
                   }
                      else  
                   send_flagMMS=0;
                   sms_count--;
                   packSms_PDU(sms_count,pData_3,pData_4);
               
                           if(sms_count==0)
                            {
                              send_flag3=0x00;
                              send_flag4=0xff;
                                  GPSOUT=1;
                            }         
                        }       
              if((send_flag2==0xf0)&&(send_flag4==0xff))  
                {
                  send_flag2=0x00;
                      packSms_PDU(sms_count,pData_2,pData_4);
                      sms_count++;
                      if(sms_count==3)
                {
                              send_flag4=0x00;
                          k=0;
                              send_flag3=0xff;
                        }
                      BEEP_BL(100);
                }
         delay_ms(10);
   }
}[/mw_shl_code]
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-1 16:11:57 | 显示全部楼层
上面任务是不是delay写错地方了?能每次有延时吗?
小小蜗牛
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-2-1 16:55:07 | 显示全部楼层
jiutianshenjian 发表于 2016-2-1 16:11
上面任务是不是delay写错地方了?能每次有延时吗?

板子例程每个while循环里都有一个delay
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-2-2 08:14:39 | 显示全部楼层
楼主将delay_ms换成系统的那个试下OSTimeDlyHMSM()
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-2-2 08:14:59 | 显示全部楼层
我发现有时候用delay_ms不行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-2 09:52:55 | 显示全部楼层
我是说你延时写到else里面,if的时候没延时,一直占着不让,就会一直while。
小小蜗牛
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-2-2 11:26:52 | 显示全部楼层
jiutianshenjian 发表于 2016-2-2 09:52
我是说你延时写到else里面,if的时候没延时,一直占着不让,就会一直while。

[mw_shl_code=c,true]void TR800_task(void *pdata)
{
        while(1)
        {
                  if(send_flag2==0x0f)
                   {
                   sms_count--;                               
                  packSms_PDU(sms_count,pData_3,pData_4);
                   }
              delay_ms(10);
   }
}
[/mw_shl_code]
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-2-2 11:27:57 | 显示全部楼层
jiutianshenjian 发表于 2016-2-2 09:52
我是说你延时写到else里面,if的时候没延时,一直占着不让,就会一直while。

改成这样也不行
回复

使用道具 举报

3

主题

95

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2451
金钱
2451
注册时间
2015-11-1
在线时间
300 小时
发表于 2016-2-2 18:24:43 来自手机 | 显示全部楼层
短信发完后,再把这个任务挂起。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 20:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表