UCOS开发手册中关于OSQPend()函数讲

转自:http://www.openedv.com/thread-44168-1-1.html

UCOS开发手册中 第十章  UCOSIII消息传递 章节中关于等待消息队列的函数OSQPend()讲解有误,OSQPend()函数各个参数含义如下

[C]  纯文本查看  复制代码
?
1
2
3
4
5
6
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)

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错误,更新后的任务函数如下:

[C]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//按键处理任务的任务函数
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
     }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值