ucos中消息队列的应用(二)

继续说任务间的通信。

本次的任务是在ISR中发送一个消息给任务,ucos的代码中的是非常之简洁和容易理解啊。创建,释放,等待,非常好理解,不再赘述。

说说我遇到的问题,数据帧接收完之后,向消息队列发送了消息,任务中等待接收,设置为阻塞模式,代码非常简单。

//ISR中释放			
 OSQPost((OS_Q         *)&Msg_Que_Uart2,
	(void         *)&end_flag,
	(OS_MSG_SIZE   )1,
	(OS_OPT        )OS_OPT_POST_FIFO,
	(OS_ERR       *)&err);


//任务中请求
    while (DEF_TRUE) {
    
		
	 pEndflag = OSQPend ((OS_Q         *)&Msg_Que_Uart2,
                (OS_TICK       )0,
                (OS_OPT        )OS_OPT_PEND_BLOCKING,
                (OS_MSG_SIZE  *)&size,
                (CPU_TS       *)NULL,
                (OS_ERR       *)&err);  
		
   GPSorBD_Data_read();  
			
      OSTimeDlyHMSM(0, 0, 0, 10,
                    OS_OPT_TIME_HMSM_STRICT,
                    &err);
      
    }   

  代码真是无比简洁,看起来倍舒服。然而就是这几行代码还遇到了一个大问题,花费了两天时间才解决这个问题。调试的时候请求那边死活收不到释放那边的消息内容,一直是0,进去看消息队列的结构体

struct  os_msg_q {                                          /* OS_MSG_Q                                               */
    OS_MSG              *InPtr;                             /* Pointer to next OS_MSG to be inserted  in   the queue  */
    OS_MSG              *OutPtr;                            /* Pointer to next OS_MSG to be extracted from the queue  */
    OS_MSG_QTY           NbrEntriesSize;                    /* Maximum allowable number of entries in the queue       */
    OS_MSG_QTY           NbrEntries;                        /* Current number of entries in the queue                 */
    OS_MSG_QTY           NbrEntriesMax;                     /* Peak number of entries in the queue                    */
};

  我定义的消息队列只接受一个字节的内容,只有接收到以后,下一个消息才能传进来。调试中NbrEntries这个值(指的是当前队列中的消息数量)一直为0,也就是释放信号量那边的数据一直没有传送过来。百思不得其解。

       我尝试着把释放消息这段放到任务中间去,变成任务与任务之间的消息传递,通信正常了。应该是中断中传送的数据没有送到,为什么呢,请注意仔细的看消息内容的这段定义:消息的内容必须一直保持可见性,可见性是指代表消息的变量必须在接收消息的任务代码范围内有效。这是因为发布的数据采用的是指针传递,也就是引用传递,并不是值传递。也就是说,发布的消息本身并不产生拷贝,我们可以使用动态内存分配的方式来给消息分配一个内存块,或者,也可以传递一个指向全局变量、全局数据结构、全局数组或者函数的指针。

猜你喜欢

转载自www.cnblogs.com/tec-jing/p/10524761.html
今日推荐