完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用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任务开始:rn"); printf("**modbus_tcp_thread任务 任务优先级:%drn",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 printf("%d,",buf); } printf("rn"); } myfree(SRAMIN,p); //释放内存 } } 以下是任务A的发送函数: printf("第%d组数据:",j); for(i=0;i<10;i++) { buf = i*j; printf("%d,",buf); } printf("rn"); //发送消息 OSTaskQPost((OS_TCB* )&ModbusTCPTaskTCB, //向任务Msgdis发送消息 (void* )buf, (OS_MSG_SIZE)10, (OS_OPT )OS_OPT_POST_FIFO, (OS_ERR* )&err1); |
|
相关推荐
2个回答
|
|
补充以下:使用OS_OPT_PEND_BLOCKING,当任务A给任务B发送消息后,任务B就会执行下面的打印。假如A不发送消息任务B就会被挂起,直到有消息接收。目前就是想让任务B在没有消息接收的时候也进行while()大循环!!!!
|
|
|
|
这个可以用来检测信号有没有,而不用等待。windows上的事件也是可以这样。有时我自是想判断一下这个信号量/消息等的状态,可以用这个,有没有别的用法我就不清楚了。我一般只用这种情况。
|
|
|
|
只有小组成员才能发言,加入小组>>
880 浏览 0 评论
1195 浏览 1 评论
2574 浏览 5 评论
2909 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2770 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1230浏览 3评论
220浏览 2评论
495浏览 2评论
402浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
483浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-30 13:02 , Processed in 0.807264 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号