OpenEdv-开源电子网

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

UCOS III 消息队列

[复制链接]

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2018-5-29
在线时间
136 小时
发表于 2019-1-6 22:43:20 | 显示全部楼层 |阅读模式
1金钱
//定时器1的回调函数
void tmr1_callback(void *p_tmr,void *p_arg)
{
        u8 *pbuf;
        static u8 msg_num;
        OS_ERR err;
        pbuf = mymalloc(SRAMIN,10);        //申请10个字节
        if(pbuf)        //申请内存成功
        {
                msg_num++;
                sprintf((char*)pbuf,"ALIENTEK %d",msg_num);
                //发送消息
                OSQPost((OS_Q*                )&DATA_Msg,               
                                (void*                )pbuf,
                                (OS_MSG_SIZE)10,//发数量
                                (OS_OPT                )OS_OPT_POST_FIFO,
                                (OS_ERR*        )&err);
                if(err != OS_ERR_NONE)
                {
                        myfree(SRAMIN,pbuf);        //释放内存
                        OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1
                        tmr1sta = !tmr1sta;
                        LCD_ShowString(10,150,100,16,16,"TMR1 STOP! ");
                }
        }       
}
//显示消息队列中的消息
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);//此处显示11个字符
                myfree(SRAMIN,p);        //释放内存
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
        }
}


当msg_num加到大于9时pbuf好像超过了10字节吧,不明白 说好的是发送10个字节,接收的是11个字节。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-7 02:01:09 | 显示全部楼层
malloc的最小单位是并不是10字节,你可以看看单位是多少哦?
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2018-5-29
在线时间
136 小时
 楼主| 发表于 2019-1-7 21:30:48 | 显示全部楼层
正点原子 发表于 2019-1-7 02:01
malloc的最小单位是并不是10字节,你可以看看单位是多少哦?

我是说发送10个字节消息队列,接收确实11个字节
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2018-5-29
在线时间
136 小时
 楼主| 发表于 2019-1-7 21:50:15 | 显示全部楼层
CLLS2080000 发表于 2019-1-7 21:30
我是说发送10个字节消息队列,接收确实11个字节

确实在读取size的值是一直是10,当msg_num加到10时 执行sprintf((char*)pbuf,"ALIENTEK %d",msg_num);时,以pbuf位首地址的字符是11个,LCD显示“”ALIENTEK 10“”,共11个字符。当请求到消息时没有读取消息长度,而直接给是字符串首地址。从而造成发送10个字节的消息,收到11个消息。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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