OpenEdv-开源电子网

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

任务切换不了

[复制链接]

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
发表于 2016-5-1 11:42:13 | 显示全部楼层 |阅读模式
5金钱
有个任务功能是向串口发送数据并利用与串口相连的模块以短信的方式发送出去,但是任务执行完后一直不释放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
}

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]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[ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-5-1 11:42:14 | 显示全部楼层
红领巾 发表于 2016-5-13 15:18
原本程序里的delay_ms();也具有任务切换的功能,换成这个也不行。我发现主要是SendCmm2(pOut1,12);SendCm ...

[mw_shl_code=c,true]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);
   
}
试试[/mw_shl_code]
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-5-1 17:33:47 | 显示全部楼层
                   OSIntEnter();//这个是进中断才需要用到的中断嵌套用的吧?你task里用这个干啥?
                   send_flag2=0x00;
                   sms_count--;
                   packSms_PDU(sms_count,pData_3,pData_4);
                  OSIntExit();//这个是进中断才需要用到的中断嵌套用的吧?你task里用这个干啥?     
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-1 19:57:06 | 显示全部楼层
365mcu 发表于 2016-5-1 17:33
OSIntEnter();//这个是进中断才需要用到的中断嵌套用的吧?你task里用这个干啥?
     ...

调用的函数里有延时,不加这个函数执行不下去
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-5-3 08:44:49 | 显示全部楼层
红领巾 发表于 2016-5-1 19:57
调用的函数里有延时,不加这个函数执行不下去

调用函数有延时那系统不是有问题啊!?延时想办法自己做一个和ostimedly有关的计时即可啊,不影响任务切换
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-12 15:57:09 | 显示全部楼层
365mcu 发表于 2016-5-3 08:44
调用函数有延时那系统不是有问题啊!?延时想办法自己做一个和ostimedly有关的计时即可啊,不影响任务切 ...

自己加了一个延时函数,把OSIntEnter去掉还是不能切换
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-5-12 16:05:37 | 显示全部楼层
红领巾 发表于 2016-5-12 15:57
自己加了一个延时函数,把OSIntEnter去掉还是不能切换

你用的IAR的话看一下任务死在哪里了,还有看看任务优先级以及堆栈大小是否有冲突和过小的。
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-12 21:35:08 | 显示全部楼层
本帖最后由 红领巾 于 2016-5-12 21:37 编辑
365mcu 发表于 2016-5-12 16:05
你用的IAR的话看一下任务死在哪里了,还有看看任务优先级以及堆栈大小是否有冲突和过小的。

你对这方面很懂吗?可不可以加你,有些问题咨询你。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-5-13 09:11:52 | 显示全部楼层
红领巾 发表于 2016-5-12 21:35
你对这方面很懂吗?可不可以加你,有些问题咨询你。

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

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-13 11:41:45 | 显示全部楼层
365mcu 发表于 2016-5-13 09:11
不能叫很懂,但是有问题就一定有原因,有原因就能找到解决方法,主要还是需要多遇到问题才能学到东西。你 ...

我把工程上传了,您帮着给看看。

实验54 UCOSII实验2-信号量和邮箱.rar

1.38 MB, 下载次数: 2309

回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-5-13 14:22:59 | 显示全部楼层
红领巾 发表于 2016-5-13 11:41
我把工程上传了,您帮着给看看。

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

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-13 15:18:31 | 显示全部楼层
365mcu 发表于 2016-5-13 14:22
所有任务里面的延时都使用OSTimeDlyHMSM(0,0,1,0);,只有这样才会调用OS_Sched();                       ...

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

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-14 16:38:35 | 显示全部楼层
365mcu 发表于 2016-5-13 16:20
[mw_shl_code=c,true]void packSms_PDU(u8 phone_count_tmp,u8 tmp[],u8 tmp1[])
{
        u8 pOut1[12]="AT+ ...

非常感谢,可以切换了
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-1-23
在线时间
42 小时
 楼主| 发表于 2016-5-22 12:20:06 | 显示全部楼层
365mcu 发表于 2016-5-13 14:22
所有任务里面的延时都使用OSTimeDlyHMSM(0,0,1,0);,只有这样才会调用OS_Sched();                       ...

//彩信
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, 下载次数: 2369

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 05:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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