UCOS开发手册中关于OSQPend()函数讲解错误声明贴

2019-07-20 16:49发布

UCOS开发手册中 第十章  UCOSIII消息传递 章节中关于等待消息队列的函数OSQPend()讲解有误,OSQPend()函数各个参数含义如下
[mw_shl_code=c,true]void *OSQPend (OS_Q *p_q, OS_TICK timeout, OS_OPT opt, OS_MSG_SIZE *p_msg_size, CPU_TS *p_ts, OS_ERR *p_err) [/mw_shl_code]
p_q            指向一个消息队列。 timeout      等待消息的超时时间,如果在指定的时间没有接收到消息的话,任务就会被唤醒, 接着运行。这个参数也可以设置为0,表示任务将一直等待下去,直到接收到消息。 opt            用来选择是否使用阻塞模式,有两个选项可以选择。                      OS_OPT_PEND_BLOCKING      如果没有任何消息存在的话就阻塞任务,一直等待,直到接收到消息。                      OS_OPT_PEND_NON_BLOCKING    如果消息队列没有任何消息的话任务就直接返回。 p_msg_size:   指向一个变量用来表示接收到的消息长度(字节数) p_ts           指向一个时间戳,表明什么时候接收到消息。如果这个指针被赋值为NULL的话,说明用户没有要求时间戳。 p_err         用来保存调用此函数后返回的错误码。

在V2.0版本UCOS开发手册中关于函数OSQPend()中参数p_msg_size的讲解是错误的,已经更新UCOS开发手册至V2.1版本,见附录。同样,例程10-1也是错误的,主要是在两个任务函数Keyprocess_task()和msgdis_task()中调用OSQPend()请求消息队列时的参数p_msg_size错误,更新后的任务函数如下: [mw_shl_code=c,true]//按键处理任务的任务函数 void Keyprocess_task(void *p_arg) { u8 num; u8 *key; OS_MSG_SIZE size; OS_ERR err; while(1) { //请求消息KEY_Msg key=OSQPend((OS_Q* )&KEY_Msg, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE* )&size, (CPU_TS* )0, (OS_ERR* )&err); switch(*key) { case WKUP_PRES: //KEY_UP控制LED1 LED1 = ~LED1; break; case KEY2_PRES: //KEY2控制蜂鸣器 BEEP = ~BEEP; break; case KEY0_PRES: //KEY0刷新LCD背景 num++; LCD_Fill(126,111,233,313,lcd_discolor[num%14]); break; case KEY1_PRES: //KEY1控制定时器1 tmr1sta = !tmr1sta; if(tmr1sta) { OSTmrStart(&tmr1,&err); LCD_ShowString(10,150,100,16,16,"TMR1 START!"); } else { OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1 LCD_ShowString(10,150,100,16,16,"TMR1 STOP! "); } break; } } } //显示消息队列中的消息 void msgdis_task(void *p_arg) { u8 *p; OS_MSG_SIZE size; OS_ERR err; while(1) { //请求消息 p=OSQPend((OS_Q* )&DATA_Msg, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE* )&size, (CPU_TS* )0, (OS_ERR* )&err); LCD_ShowString(5,270,100,16,16,p); myfree(SRAMIN,p); //释放内存 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s }[/mw_shl_code] 由于本人理解错误导致此等错误的发生,在此向那些在学习过程中由于这个错误造成困扰的朋友们道歉,希望你们谅解!同时希望大家能够及时的指出文档中其他的错误之处,可以通过站内短信联系我,或者通过群333121886联系我。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
45度斜向上
1楼-- · 2019-07-21 13:47
请教下,我的板子是探索者,我在NETCOON_TCP Client的列子中加入了NETCOON_TCP服务器的线程。想同时开启client和Server。但是发现单独开任何一个线程都可以,如果同时起,Server线程中的netconn_accept总是超时,跟踪了下是在sys_arch_mbox_fetch中的OSQPend超时,这是怎么回事呀,有什么解决办法嘛?
taizonglai
2楼-- · 2019-07-21 19:07
45度斜向上 发表于 2017-2-20 09:27
请教下,我的板子是探索者,我在NETCOON_TCP Client的列子中加入了NETCOON_TCP服务器的线程。想同时开启cli ...

有可能是UCOS系统中配置的消息邮箱数量少了,导致无可用的消息邮箱了。把消息邮箱的数量改大一点。
45度斜向上
3楼-- · 2019-07-21 20:46
zuozhongkai 发表于 2017-2-20 09:43
有可能是UCOS系统中配置的消息邮箱数量少了,导致无可用的消息邮箱了。把消息邮箱的数量改大一点。

我把MAX_QUEUES  从10变成了20,问题还是一样
45度斜向上
4楼-- · 2019-07-21 22:24
 精彩回答 2  元偷偷看……
45度斜向上
5楼-- · 2019-07-22 02:08
 精彩回答 2  元偷偷看……

一周热门 更多>