当前位置: 代码迷 >> 单片机 >> ucos两个任务同时访问全局变量 死机的有关问题
  详细解决方案

ucos两个任务同时访问全局变量 死机的有关问题

热度:65   发布时间:2016-04-28 15:28:50.0
ucos两个任务同时访问全局变量 死机的问题
基本功能思路如下:采用的是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自己的队列?