调试的代码片段如下,程序运行到代码片段(1)时,xMB_GetData(&data)的返回值为QUEUE_FALSE;后经过分析,xMBRxSQ队列的信号量没有初始化。增加“xMBRxSQ.sem_usart = OSSemCreate(0);”后可以顺利出列。
(1)
if(xMB_GetData(&data) == QUEUE_SUCCESS)
{
...
}
(2)xMB_GetData的原型
QueueState xMB_GetData(uint8_t *pdata)
{
QueueState st;
st = Queue_Out(&xMBRxSQ, pdata, 1);
return st;
}
(3)Queue_Out的原型
QueueState Queue_Out(Queue *q,unsigned char* outdata,unsigned int timeout)
{
INT8U err;
OSSemPend(q->sem_usart,timeout,&err);
if(err!=OS_ERR_NONE)
{
*outdata=0;
return QUEUE_FALSE;
}
else
{
if(Queue_Empty(q)==QUEUE_FALSE)
return QUEUE_FALSE;
else
{
*outdata=q->data[q->rear];
q->rear=(q -> rear + 1) % QUEUE_SIZE;
q->entries--;
return QUEUE_SUCCESS;
}
}
}
本文介绍了一个关于队列操作的问题,即在尝试从一个未正确初始化的队列中获取数据时遇到错误。通过添加信号量初始化代码解决了问题,并确保了程序能够正常运行。

被折叠的 条评论
为什么被折叠?



