hejiang177 发表于 2017-4-13 11:25:25

freertos死在了vListInsert的问题,求大神

各位大神,请教一下xSemaphoreGiveFromISR中断释放的问题如下
1.xSemaphoreGiveFromISR在UART接收中断中释放,并加上portEND_SWITCHING_ISR切换,在工作一段时间后,就死在了vListInsert 函数中的for循环里了,再也出不来
2.中断组是 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);,
3.任务堆栈空间1024字节,这个是读通信数据函数,收到多少字节发送多少字节

static void commPollTask(void * pvParameters)
{
    int16u_t len;
    int8u_t buffer;
    SERIAL_Init(&serial1,USART1,200,9600);
    while(1){
      len = SERIAL_ReadDat(&serial1,buffer,100);
      if(len){
            SERIAL_SendDat(&serial1,buffer,len);
      }
    }
}
4.UART1中断配置如下

/* Enable the USART Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
4.中断函数如下

void serialRecvISR(SERIAL *pDev)
{
    static portBASE_TYPE xSerialHigherPriorityTaskWoken = pdFALSE;//pdFALSE;
    if(USART_GetITStatus(pDev->pUSART, USART_IT_RXNE) != RESET){
      while(pDev->pUSART->SR & USART_FLAG_RXNE){
            //进入临界
            portENTER_CRITICAL();
            pDev->buffer = pDev->pUSART->DR & 0x01FF;
            pDev->saveIndex++;
            if(pDev->saveIndex >= SERIAL_BUFF_SIZE){
                pDev->saveIndex = 0;
            }
            if(pDev->saveIndex == pDev->readIndex){
                pDev->readIndex++;
                if(pDev->readIndex >= SERIAL_BUFF_SIZE){
                  pDev->readIndex = 0;
                }
            }
            //退出临界
            portEXIT_CRITICAL();
      }
      USART_ClearITPendingBit(pDev->pUSART, USART_IT_RXNE);
      //USART_ClearITPendingBit(pDev->pUSART, USART_IT_TC);
      //发送信号量通知读取
      xSemaphoreGiveFromISR(pDev->xSemaISR,&xSerialHigherPriorityTaskWoken);
      portEND_SWITCHING_ISR(xSerialHigherPriorityTaskWoken);// 手动切换任务(用在中断环境)
    }
    if(USART_GetFlagStatus(pDev->pUSART,USART_FLAG_ORE)!= RESET){
      USART_ClearFlag(pDev->pUSART,USART_FLAG_ORE);    //读SR
      USART_ReceiveData(pDev->pUSART);
    }
}

hejiang177 发表于 2017-4-13 11:27:13

补充一下,SERIAL_ReadDat 函数里调用来等待中断释放信号的
      if(xSemaphoreTake(pDev->xSemaISR, pDev->frameTimeOut ) != pdTRUE){
      pDev->rxStatus = SERIAL_IDLE;
      return 0;
    }

eric2013 发表于 2017-4-13 12:05:29

没发现什么问题,帮顶。

hejiang177 发表于 2017-4-13 14:09:15

回 eric2013 的帖子

eric2013:没发现什么问题,帮顶。 (2017-04-13 12:05) images/back.gif

硬汉哥你都不知道原因么,

hejiang177 发表于 2017-4-22 08:49:31

结帖,刚学使用FREERTOS,使用的是STEMWIN的例程,NND,中断配置问题,改了中断管理后,没有问题了

eric2013 发表于 2017-4-22 10:03:07

原来如此,串口中断优先级高了,不受FreeRTOS中断优先级管理了。

xiaomeng 发表于 2020-1-13 21:57:29

遇到同样问题了死在该函数内部,但原因没找到。

wxqhit 发表于 2020-1-21 16:23:00

我也遇到同样的问题。开机运行的时间到死机,时间不确定。有时候一直就没事,有时候就卡在这个函数这里了。

wxqhit 发表于 2020-1-21 16:25:40

我也遇到这样的问题,但是死机不是每次都有,偶尔会发生。死机后也是停在了这个函数这里。
页: [1]
查看完整版本: freertos死在了vListInsert的问题,求大神