近期在学习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次后的值发送到消息队列中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)