论坛元老
 
- 积分
- 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,除非延时或者定期调用它了!!!!!
|