OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11738|回复: 11

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

[复制链接]

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-12-21 21:31:10 | 显示全部楼层 |阅读模式
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联系我。


UCOS 实验例程V2.1.zip

15.79 MB, 下载次数: 955

STM32F4 UCOS开发手册V2.1.pdf

4.8 MB, 下载次数: 12483

开往春天的手扶拖拉机
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-21 22:36:41 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-12-22 08:08:03 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥这沙发坐的稳稳的啊,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
 楼主| 发表于 2014-12-22 10:20:42 | 显示全部楼层
回复【3楼】八度空间:
---------------------------------
谁让你不及时啊,要是在我给你说的那个时候评价你就是沙发了,自己手慢,怪不得别人啊
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-12-22 13:51:22 | 显示全部楼层
回复【4楼】zuozhongkai:
---------------------------------
没怪人好吧,汗。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2015-10-5
在线时间
9 小时
发表于 2015-10-11 20:26:11 | 显示全部楼层
资料真心不错,感谢!
回复 支持 反对

使用道具 举报

9

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-7-8
在线时间
181 小时
发表于 2016-5-6 13:53:23 | 显示全部楼层
一定要回复啊!
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-3
在线时间
29 小时
发表于 2017-2-20 09:27:30 | 显示全部楼层
请教下,我的板子是探索者,我在NETCOON_TCP Client的列子中加入了NETCOON_TCP服务器的线程。想同时开启client和Server。但是发现单独开任何一个线程都可以,如果同时起,Server线程中的netconn_accept总是超时,跟踪了下是在sys_arch_mbox_fetch中的OSQPend超时,这是怎么回事呀,有什么解决办法嘛?
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
 楼主| 发表于 2017-2-20 09:43:54 | 显示全部楼层
45度斜向上 发表于 2017-2-20 09:27
请教下,我的板子是探索者,我在NETCOON_TCP Client的列子中加入了NETCOON_TCP服务器的线程。想同时开启cli ...

有可能是UCOS系统中配置的消息邮箱数量少了,导致无可用的消息邮箱了。把消息邮箱的数量改大一点。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-3
在线时间
29 小时
发表于 2017-2-20 10:20:26 | 显示全部楼层
zuozhongkai 发表于 2017-2-20 09:43
有可能是UCOS系统中配置的消息邮箱数量少了,导致无可用的消息邮箱了。把消息邮箱的数量改大一点。

我把MAX_QUEUES  从10变成了20,问题还是一样
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-3
在线时间
29 小时
发表于 2017-2-20 14:39:43 | 显示全部楼层
我打印了下发现跑到了OSQPend函数中的这个分支:
case OS_STAT_PEND_TO:
default:
             OS_EventTaskRemove(OSTCBCur, pevent);
             pmsg = (void *)0;
            *perr =  OS_ERR_TIMEOUT;                  /* Indicate that we didn't get event within TO   */
             printf("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\r\n");
             break;

不知道为什么
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-3
在线时间
29 小时
发表于 2017-2-20 15:02:08 | 显示全部楼层
在OSQPend中    pq->OSQEntries 一直为0.
   pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
    if (pq->OSQEntries > 0u) {                   /* See if any messages in the queue                   */
        pmsg = *pq->OSQOut++;                    /* Yes, extract oldest message from the queue         */
        pq->OSQEntries--;                        /* Update the number of entries in the queue          */
        if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the queue */
            pq->OSQOut = pq->OSQStart;
        }
        OS_EXIT_CRITICAL();
        *perr = OS_ERR_NONE;
        return (pmsg);                           /* Return message received                            */
    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 11:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表