|
各位大神,请教一下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);
}
} |
|