正点原子MiniFly V1.2学习笔记三---atkpRxAnlTask

  第5个任务,解析处理接收到的指令
xTaskCreate(atkpRxAnlTask, "ATKP_RX_ANL", 300, NULL, 6, NULL);
上面第1个任务,把串口接收到的数据解包后得到指令,然后把指令发送到队列rxQueue里了,该任务就是从队列里取指令,然后分析处理。

一、执行串口指令任务

void atkpRxAnlTask(void *param)
{
	atkp_t p;
	while(1)
	{
		xQueueReceive(rxQueue, &p, portMAX_DELAY);
		atkpReceiveAnl(&p);
	}
}

  这个任务相当简洁,它的优先级定义为6,比上面解包串口数据的任务优先级(5)高。也就是优先级5的任务1解包之后,解出来的指令存入到rxQueue队列,任务1就被挂起了。先执行这个更高优先级的任务,如果指令是请求数据的。该任务就把数据入队txQueue,执行完后返回到任务1,任务1继续执行,从txQueue取数据发送到串口DMA。
  任务从队列读取一条指令,复制到变量p里,然后调用函数分析指令

二、处理指令

  处理指令的函数结构如下,这个有点复杂,原理就是根据指令的msgID作出不同的响应

static void atkpReceiveAnl(atkp_t *anlPacket)
    {
    	if(anlPacket->msgID	== DOWN_COMMAND)
    	{
    		switch(anlPacket->data[0])
    		{
    			//..根据第1个数据,改变标志flyable,该标志在atkpSendPeriod函数被调用
    		}
    	}			
    	else if(anlPacket->msgID == DOWN_ACK)
    	{
    		if(anlPacket->data[0] == D_ACK_READ_PID)
    		{
    			//....如果请求PID参数,则把PID参数封装成包放入无线txQueue队列,如果USB连接了,同样把参数发送到USB的txQueue队列
    		}
    		if(anlPacket->data[0] == D_ACK_RESET_PARAM)//恢复默认参数
    		{
    			//.....恢复参数后,重新设置PID,然后把参数入队,发送给遥控器
    		}
    	}
    	else if(anlPacket->msgID == DOWN_RCDATA)
    	{//如果指令发来的是RC数据,把它存到变量rcdata 中
    		rcdata = *((joystickFlyui16_t*)anlPacket->data);
    	}
    	else if(anlPacket->msgID == DOWN_POWER)/*nrf51822*/
    	{
    		pmSyslinkUpdate(anlPacket);
    	}
    	else if(anlPacket->msgID == DOWN_REMOTER)
    	{
    		remoterCtrlProcess(anlPacket);
    	}
    	else if(anlPacket->msgID == DOWN_PID1)
    	{
    		//....如果接收到的是PID数据,把它存到变量pidRateRoll中,并返回ID和校验和
    	}
    	else if(anlPacket->msgID == DOWN_PID2)
    	{
    		//.....
    	}		
    	else if(anlPacket->msgID == DOWN_PID3)
    	{
    		//.....
    	}
    	else if(anlPacket->msgID == DOWN_PID4)
    	{
    		//.....
    	}
    	else if(anlPacket->msgID == DOWN_PID5)
    	{
    		//.....
    	}
    	else if(anlPacket->msgID == DOWN_PID6)
    	{
    		//....设置PWM
    	}
    }

  这里只是把接收到的指令,存到了相应的变量中。等待其它任务去调用这些变量。

你可能感兴趣的:(FreeRTOS)