中级会员
 
- 积分
- 219
- 金钱
- 219
- 注册时间
- 2013-3-7
- 在线时间
- 6 小时
|
5金钱
各位好,我用了ucos iii 的内建消息队列,在串口收数据,然后发送到消息队列:
void USART1_IRQHandler(void)
{
OS_ERR err;
OSIntEnter();
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
test0=USART_ReceiveData(USART1);
}
if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
test0=USART_ReceiveData(USART1);
OSTaskQPost(&Job3TCB, &test0, 1, (OS_OPT) OS_OPT_POST_FIFO, &err);//发送数据到任务队列
}
OSIntExit();
}
然后在任务中接收:
while(1)
{
OSTimeDly(1000,OS_OPT_TIME_DLY,&err); //延时1S
p_msg=OSTaskQPend(0, OS_OPT_PEND_BLOCKING, &size, (CPU_TS *)&ts, (OS_ERR * )&err);//请求消息
}
问题是:
当任务中延时时间是1S的时候,或者更短的时候,我从串口发送数据,串口中断接收到,然后发到消息队列,在任务中接收是没问题的;但是,如果延时时间很长,比如
延时5S,那么需要从串口发送好几次数据,才能在任务中接收到一次消息。 后来发现,延时时间很久的时候:
OSTaskQPost(&Job3TCB, &test0, 1, (OS_OPT) OS_OPT_POST_FIFO, &err);//发送数据到任务队列
这一句会有错误提示: err=OS_ERR_Q_MAX,意思是队列满了,可是即使我隔好久发一次,还是会出现这个错误,请问出现这个错误的原因是什么呢?
|
|