硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5573|回复: 8
收起左侧

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

[复制链接]

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2017-4-13 11:25:25 | 显示全部楼层 |阅读模式
各位大神,请教一下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[100];
    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->saveIndex] = 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);
    }
}
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
 楼主| 发表于 2017-4-13 11:27:13 | 显示全部楼层
补充一下,SERIAL_ReadDat 函数里调用来等待中断释放信号的
        if(xSemaphoreTake(pDev->xSemaISR, pDev->frameTimeOut ) != pdTRUE){
        pDev->rxStatus = SERIAL_IDLE;
        return 0;
    }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2017-4-13 12:05:29 | 显示全部楼层
没发现什么问题,帮顶。
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
 楼主| 发表于 2017-4-13 14:09:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:没发现什么问题,帮顶。 (2017-04-13 12:05) 
硬汉哥你都不知道原因么,[s:128][s:128]
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
 楼主| 发表于 2017-4-22 08:49:31 | 显示全部楼层
结帖,刚学使用FREERTOS,使用的是STEMWIN的例程,NND,中断配置问题,改了中断管理后,没有问题了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2017-4-22 10:03:07 | 显示全部楼层
原来如此,串口中断优先级高了,不受FreeRTOS中断优先级管理了。
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2020-1-13 21:57:29 | 显示全部楼层
遇到同样问题了死在该函数内部,但原因没找到。
回复

使用道具 举报

21

主题

48

回帖

111

积分

初级会员

积分
111
发表于 2020-1-21 16:23:00 | 显示全部楼层
我也遇到同样的问题。开机运行的时间到死机,时间不确定。有时候一直就没事,有时候就卡在这个函数这里了。
回复

使用道具 举报

21

主题

48

回帖

111

积分

初级会员

积分
111
发表于 2020-1-21 16:25:40 | 显示全部楼层
我也遇到这样的问题,但是死机不是每次都有,偶尔会发生。死机后也是停在了这个函数这里。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 20:16 , Processed in 0.187027 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表