发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
为什么这个任务一直切换不了?
93 cpu 串口
分享
有个任务功能是向串口发送数据并利用与串口相连的模块以短信的方式发送出去,但是任务执行完后一直不释放CPU,而是在一直执行这个任务,请问是什么原因呢?
//短信发送任务
void TR800_task(void *pdata)
{        
    u8 sms_count=3;            
    u8 pData_2[]="53F757307EBF5DF26210529F64584E0BFF01";
    u8 pData_3[]="53F757307EBF5DF2630263A56210529FFF01";
    u8 pData_4[]="0020002000200020002000300030003053F7652F67F1\x1A\x00";                                                            
        while(1)
        {
                 IF(send_flag2==0x0f)  
                {
                   OSIntEnter();
                   send_flag2=0x00;
                   sms_count--;
                   packSms_PDU(sms_count,pData_3,pData_4);
                  OSIntExit();                           
                    }  
         OStimeDlyHMSM(0,0,1,0);
   }
}
void USART2_IRQHandler(void)
{  
   u8 temp;
#ifdef OS_CRITICAL_METHOD         //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
        OSIntEnter();   
#endif
   temp=USART2->DR;
   rx_buffer2[rx_counter2]=temp;    //接收来自的数据
   G=temp;
//   G=0x06;
   rx_counter2++;
   if(temp==10)
   //用C51汉字解决方案转换过来,回车符"0x0D"换行符"0x0A",所以我认为语句
   //temp == 10中的10(十六进制的A)代表的就是0x0A,也就是说是换行符
     {
      STA=1;
      rx_flag2--;
      if(rx_flag2==0)
      {
            rx_len2= rx_counter2;
            rx_counter2=0;
            rx_buffer_oveRFlow2=0xff;  
      }
     }
#ifdef OS_CRITICAL_METHOD         //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
        OSIntExit();                                                                                          
#endif
}
0
2019-11-3 20:37:45   评论 分享淘帖 邀请回答

相关问题

13个回答
[C] 纯文本查看 复制代码
void packSms_PDU(u8 phone_count_tmp,u8 tmp[],u8 tmp1[]){u8 pOut1[12]="AT+CMGS=69\r"; u8 pOut2[255]="0011000D91688187495163F10008AA36003100320033003400350036003753F757307EBF5DF2630263A56210529FFF010020002000200020002000300030003053F7652F67F1\x1A\x00";//十位,七位+三位的支柱号OS_ENTER_CRITICAL();//进入临界区(无法被中断打断)       SendCmm2(pOut1,12);    //pOut1[]="AT+CMGS=43\r";   AT+CMGS表示发送信息    delay_ms1(200); SendCmm2(pOut2,148); delay_ms1(3000);OS_ENTER_CRITICAL();//进入临界区(无法被中断打断)   //    UartPutChar2("0011000D91688187495163F10008AA36003100320033003400350036003753F757307EBF5DF2630263A56210529FFF010020002000200020002000300030003053F7652F67F1\x1A\x00",148);    }试试
2019-11-4 06:56:00 评论

举报

                   OSIntEnter();//这个是进中断才需要用到的中断嵌套用的吧?你task里用这个干啥?
                   send_flag2=0x00;
                   sms_count--;
                   packSms_PDU(sms_count,pData_3,pData_4);
                  OSIntExit();//这个是进中断才需要用到的中断嵌套用的吧?你task里用这个干啥?     
2019-11-4 07:09:20 评论

举报

调用的函数里有延时,不加这个函数执行不下去
2019-11-4 07:26:56 评论

举报

调用函数有延时那系统不是有问题啊!?延时想办法自己做一个和ostimedly有关的计时即可啊,不影响任务切换
2019-11-4 07:45:20 评论

举报

自己加了一个延时函数,把OSIntEnter去掉还是不能切换
2019-11-4 07:54:53 评论

举报

你用的IAR的话看一下任务死在哪里了,还有看看任务优先级以及堆栈大小是否有冲突和过小的。
2019-11-4 08:04:06 评论

举报

你对这方面很懂吗?可不可以加你,有些问题咨询你。
2019-11-4 08:10:47 评论

举报

不能叫很懂,但是有问题就一定有原因,有原因就能找到解决方法,主要还是需要多遇到问题才能学到东西。你有什么问题字节论坛留下来不好吗?以后不记得还能找到
2019-11-4 08:21:19 评论

举报

2019-11-4 08:28:59 评论

举报

所有任务里面的延时都使用OSTimeDlyHMSM(0,0,1,0);,只有这样才会调用OS_Sched();                              /* Find next task to run!  */
要不然任务无法切换的(邮箱信号等发送也会触发一次任务切换如果需要的话)
2019-11-4 08:41:22 评论

举报

原本程序里的delay_ms();也具有任务切换的功能,换成这个也不行。我发现主要是SendCmm2(pOut1,12);SendCmm2(pOut2,148); ,去掉这两句能正常切换,不知道什么原因。
2019-11-4 09:01:16 评论

举报

非常感谢,可以切换了
2019-11-4 09:06:46 评论

举报

//彩信
void CAMERA_task(void *pdata)
{
//    OS_CPU_SR cpu_sr=0;
           while(1)
         {
           if(send_flag2==0x0f)
             {
//                   OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)
                   send_flag2=0x00;
                jpg_upload(PIC_BUFFER);   //CAMER+MMS
                   BEEP_BL(1000);
//                   OS_EXIT_CRITICAL();                                  //退出临界区(可以被中断打断)
                 }
           delay_ms(10);
         }
}
这个任务又切换不了了,您再给看看
实验54 UCOSII实验2-信号量和邮箱.rar (1.29 MB )
2019-11-4 09:26:17 评论

举报

只有小组成员才能发言,加入小组>>

163个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

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