ucosii消息队列学习

近期在学习ucosii的内容使用的平台为STM32F103C8T6最小系统板。
今日关于消息队列的使用遇到了一些问题。
基本情况:移植代码为正点原子ucosiii消息队列、信号量集和软件定时器例程。
主要新建两个任务post_task用以发送信号量集get_task用以接收信号量集,两者具体代码如下:

void post_task(void *pdata)
{
	u8* p;	 
	u8 err;
	static u8 msg_cnt=0;	//msg编号	  
	while(1)
	{
		p=mymalloc(SRAMIN,13);	//申请13个字节的内存
		if(p)
		{
			sprintf((char*)p,"ALIENTEK %03d",msg_cnt);
			sprintf((char*)asd,"ALIENTEK %03d",msg_cnt);
			
			msg_cnt++;
			if(msg_cnt>=250)
				msg_cnt=0;
			err=OSQPostFront(q_msg,p);	//向消息队列q_msg发送消息p
			if(err!=OS_ERR_NONE) 	//发送失败 ?为什么是这种处理方式
			{
				myfree(SRAMIN,p);	//释放内存
				
			}
		}
		delay_ms(10);
	};
}
void get_task(void *pdata)
{
	u8 *p;
	u8 err;
	while(1)
	{
		p=OSQPend(q_msg,0,&err);
		  printf("1:%s\r\n",p);
			myfree(SRAMIN,p);
		len=((OS_Q*)(q_msg->OSEventPtr))->OSQEntries;
		printf("%d\r\n",len);
		
		delay_ms(100);
			 
	};
}

问题描述:使用串口观察get_task任务输出数据发现数据输出不连续,一下为示例。

ALIENTEK 001
ALIENTEK 011
ALIENTEK 021 

经过测试比较后发现为post_task发送消息的速度过快导致消息队列过早饱和而导致msg_cnt只进行自增却并没有将该消息发送成功,而产生10的等差的原因在于get任务与post任务的延时刚好为10倍的关系,也就是说msg_cnt变量自增10次,get任务读取1次消息队列,消息队列空出1个空位。post任务将这自增10次后的值发送到消息队列中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值