[STM32] UCOSIII任务无**常调度,求解答!!

[复制链接]
2280|2
 楼主| fgh_asd 发表于 2016-3-23 12:00 | 显示全部楼层 |阅读模式
最近在做ZigBee+GPRS与STM32网关通信实验,用的是战舰V3开发板。要实现的功能是:串口1与GPRS串口通信(GPRS暂时用PC模拟收发数据),接收PC端的命令并通过串口3发送给ZigBee协调器;串口3与ZigBee串口通信,接收ZigBee汇集的数据包并通过串口1发送给PC(GPRS)。      两个串口的中断函数都是一样的,串口1的中断函数如下:
  1. void USART1_IRQHandler(void)
  2. {
  3.     u8 res;
  4.     OSIntEnter();      //进入OS中断
  5.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
  6.     {   
  7.         res =USART_ReceiveData(USART1);      
  8.         if((USART1_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
  9.         {
  10.             if(USART1_RX_STA<USART1_REC_LEN) //还可以接收数据
  11.             {
  12.                 TIM_SetCounter(TIM3,0);//计数器清空                          
  13.                 if(USART1_RX_STA==0)                //使能定时器3的中断
  14.                 {
  15.                     TIM_Cmd(TIM3,ENABLE);//使能定时器3
  16.                 }
  17.                 USART1_RX_BUF[USART1_RX_STA++]=res; //记录接收到的值   
  18.             }else
  19.             {
  20.                 USART1_RX_STA|=1<<15;             //强制标记接收完成
  21.             }
  22.         }
  23.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除接收中断
  24.     }  
  25.     OSIntExit();     //退出OS中断   
  26. }

考虑到任务的实时性,在主程序中加入了UCOS-III操作系统,按照任务优先级先后顺序写了TOUCH任务、GPRS串口通信任务、触摸屏显示任务与LED闪烁任务。GPRS串口通信任务在任务死循环内判断USART1是否接收到PC发送的数据,然后将数据通过串口3发送出去;触摸屏显示任务也同样在任务死循环内判断USART3是否接收到ZigBee协调器发来的数据,然后将数据包进行解析、显示。
      GPRS串口通信任务如下:
  1. void GPRS_USART1_task(void *pdata)
  2. {
  3.     u8 i,rxlen;
  4.     OS_ERR err;
  5.      
  6.     while(1)
  7.     {
  8.         if(USART1_RX_STA&0x8000)  //USART1接收到GPRS发送的数据
  9.         {
  10.             rxlen=USART1_RX_STA&0X7FFF; //得到数据长度
  11.             for(i=0;i<rxlen;i++) USART3_TX_BUF[i]=USART1_RX_BUF[i];  
  12.             
  13.             USART1_RX_STA=0;            //启动下一次接收
  14.             USART3_TX_BUF[i]=0;         //自动添加结束符
  15.             printf("%s",USART3_TX_BUF);//发送接收到的数据通过串口3发送给ZigBee协调器
  16.         }
  17.         OSTimeDlyHMSM(0,0,0,20,OS_OPT_TIME_PERIODIC,&err);//延时20ms
  18.     }
  19. }

触摸屏显示任务部分代码如下:
  1. void emwindemo_task(void *p_arg){
  2. while(1)
  3.     {
  4.     if((USART3_RX_STA&0x8000) && (USART3_RX_BUF[0]=='&'))   //接收到从协调器传送的一帧数据
  5.         {
  6. //。。。。。数据解析处理、显示(祥见附件)
  7.             USART3_RX_STA=0;

  8.         }
  9.     GUI_Exec();
  10.     }
  11. }

但下载后的现象是:
      1)用串口助手先给串口1发数据能收到,再给串口3发却始终不能收到且界面也无数据显示,而且LED始终不闪烁;
      2)用串口助手先给串口3发数据能收到且界面数据显示正常,但每发一下LED就闪一下,再给串口1发这时也能收到,但再换给串口3发却又不能收到;
      我对第1个现象的理解就是:由于串口1的任务优先级最高,一旦串口1发生接收中断后始终执行串口1任务(我把它解释为任务死锁),从而导致UCOS无法发生任务调度,从而串口3和LED任务都不能运行;第2个现象,串口1的任务(优先级高)可以打断串口3(优先级低)的任务,但为什么优先级最低的LED任务只执行一次没明白。
      求教原子哥和大神们,如何解决串口通信任务死锁的问题,保证UCOS各任务正常调度?希望给与小弟指点,谢谢!
 楼主| fgh_asd 发表于 2016-3-23 12:01 | 显示全部楼层
程序源码
huangxz 发表于 2016-3-23 22:23 | 显示全部楼层
楼主还没领会UCOS操作系统的使用方法,
建议楼主先拿本操原看看,理论要先行,起码得知道几个基本概念,
,信号量,消息队列,pend, post, 以及临界态。
操作系统中中断的使用等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

168

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部