基本功能思路如下:采用的是ucos系统
两个串口,一个串口UART1收上位机的数据包,另一个串口USART2重新打包后发给下位机;
任务1 将USART收到的数据包放入一个队列FIFO,
任务2 定时读取FIFO的数据包转发给下位机
void USART1_IRQHandler (void)
{//串口1中断
....
OSSemPost(BeginRcv);一个数据包收完后发送一个信号给任务1处理
}
void TaskWithHost(void * data) //与上位机通信任务
{
OSSemPend(BeginRcv,0, &err);//等待处理信号量
....其中有这样一个处理
en_queue(&FIFO_SlaveCRT, (u8 *)&e, sizeof(struct event));//放入FIFO队列
}
void TaskWithSlaveCRT1(void * data)//转发下位机任务
{
...
len=queue_len(&FIFO_SlaveCRT);//读取队列的数据包长度
..//重新打包转发给下位机
DLY10MS(10);
}
这样就有可能两个任务同时操作队列FIFO_SlaveCRT,一个写,一个读,造成死机,
加了互斥信号量,也死机
//OSMutexPend(FIFOmutex, 0, &perr);
//len=queue_len(&FIFO_SlaveCRT);
//OSMutexPost(FIFOmutex);
读写时都如上操作,一样死机,不知道应该怎样处理
------解决方案--------------------
TaskWithHost 也加互斥了?
不要在中断里面加这些。
不清楚你的queue_len en_queue 是怎么实现的,一个读一个写一般不会出现问题不加同步。
------解决方案--------------------
看不出问题
另外,为毛不用UCOS自己的队列?