论坛元老 
   
	- 积分
 - 4493
 
        - 金钱
 - 4493 
 
       - 注册时间
 - 2016-8-2
 
      - 在线时间
 - 51 小时
 
 
 
 | 
 
5金钱 
我使用UCOSIII内建消息机制,想通过任务A给任务B发送一个消息,任务B根据接收到消息并打印,同时任务B还有其他工作要做,想通过OS_OPT_PEND_NON_BLOCKING,检查如果没有接收到A的消息就继续循环,不对任务B进行阻塞。 
问题是:使用了OS_OPT_PEND_NON_BLOCKING之后,程序一直在任务B中循环不会再切换到任务A中运行了。 
以下是任务B的接收函数 
void modbus_tcp_thread(void *arg) 
{ 
        struct netbuf *p; 
        u8 i = 0; 
        u8 buf[10]; 
        OS_MSG_SIZE size; 
        OS_ERR err; 
//        printf("**modbus_tcp_thread任务开始:\r\n"); 
        printf("**modbus_tcp_thread任务 任务优先级:%d\r\n",MODBUSTCP_PRIO);         
        eMBEnable( ); 
        while (1) 
        { 
                eMBPoll(); 
                 
                //请求消息OS_OPT_PEND_BLOCKING 如果没有任何消息存在的话就阻塞任务,一直等待,直到接收到消息 
                p=OSTaskQPend((OS_TICK                )0, 
                      (OS_OPT                )OS_OPT_PEND_NON_BLOCKING,//OS_OPT_PEND_NON_BLOCKING 如果消息队列没有任何消息的话任务就直接返回 
                      (OS_MSG_SIZE*        )&size, 
                      (CPU_TS*                )0, 
                      (OS_ERR*      )&err ); 
                 
                if(err == OS_ERR_NONE) 
                { 
                        printf("size:%d",size); 
                        memcpy(buf,p,size); 
                        printf("Modbus接收数据:"); 
                        for(i=0;i<size;i++) 
                        { 
                                printf("%d,",buf[i]); 
                        } 
                        printf("\r\n"); 
                         
                } 
                myfree(SRAMIN,p);        //释放内存 
                                 
        } 
} 
 
 
以下是任务A的发送函数: 
printf("第%d组数据:",j); 
                                for(i=0;i<10;i++) 
                                { 
                                        buf[i] = i*j; 
                                        printf("%d,",buf[i]); 
                                } 
                                 printf("\r\n"); 
                                 
                                //发送消息 
                                OSTaskQPost((OS_TCB*        )&ModbusTCPTaskTCB,        //向任务Msgdis发送消息 
                                                        (void*                )buf, 
                                                        (OS_MSG_SIZE)10, 
                                                        (OS_OPT                )OS_OPT_POST_FIFO, 
                                                        (OS_ERR*        )&err1); 
 
 
 |   
 
 
最佳答案
查看完整内容[请看2#楼] 
那消息的OS_OPT_PEND_NON_BLOCKING功能好像就没有用处了,只要打开他,他所有在的任务就一直占用着CPU,除非延时或者定期调用它了!!!!! 
 
 
 
 
 
 
 |