本帖最后由 xiepengchenghn 于 2011-7-10 09:42 编辑
以前只碰到过使用Jlink单步执行出现问题,全速执行正常的情况,这次正好反过来。
程序架构是在中断中置位事件标志组,在任务中OSFlagPend。
我在STM32的DMA传输全部完成所产生的中断中使用OSFlagPost,然后执行OSIntExit后进入HardFault,但是如果用单步执行就能正常回到任务中执行。此外,如果在中断中不使用OSFlagPost,程序虽然回不到任务中了,但是也不会HardFault。这是怎么回事呢?
附上部分代码:
中断中:
/*******************************************************************************
* Function Name : DMA1_Channel5_IRQHandler
* Description : This function handles DMA1 Channel 5 interrupt request.
* Input : None
* Output : None
* Return : None
* 备注 :本中断用于串口1的接收DMA中断
*******************************************************************************/
uint16_t gDebug;
void DMA1_Channel5_IRQHandler(void)
{
INT8U err;
int i;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
if (DMA_GetITStatus(DMA1_IT_TC5) != RESET)
{
DMA_ClearITPendingBit(DMA1_IT_TC5);
DMA_Cmd(DMA_USART1_RX_CHANNEL, DISABLE);
DMA_ITConfig(DMA_USART1_RX_CHANNEL, DMA_IT_TC, DISABLE);
OS_ENTER_CRITICAL();
/* 将数据存入缓冲区 */
EnQueue(&gRecvdDataQueue, &gRecvBuffer_a[0], USART_RxLength);
OSFlagPost(gpRecvFlag, USART_RX_OK, OS_FLAG_SET, &err);
// memset(gRecvBuffer_a, 0, dataLength);
OS_EXIT_CRITICAL();
DMA_Configuration(DMA_USART_DATA_IN, gRecvBuffer_a, 4);
DMA_ITConfig(DMA_USART1_RX_CHANNEL, DMA_IT_HT, ENABLE);
}
else if (DMA_GetITStatus(DMA1_IT_HT5) != RESET)
{
DMA_ClearITPendingBit(DMA1_IT_HT5);
DMA_Cmd(DMA_USART1_RX_CHANNEL, DISABLE);
DMA_ITConfig(DMA_USART1_RX_CHANNEL, DMA_IT_HT, DISABLE);
memcpy(&USART_RxLength, gRecvBuffer_a, sizeof(USART_RxLength));
DMA_Configuration(DMA_USART_DATA_IN, gRecvBuffer_a, USART_RxLength);
DMA_ITConfig(DMA_USART1_RX_CHANNEL, DMA_IT_TC, ENABLE);
}
OSIntExit();
}
任务中:
while (1)
{
OSFlagPend(gpRecvFlag, USB_RX_OK | USART_RX_OK | CAN_RX_OK | ETH_RX_OK, OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME, 0, &err);
//省略部分
}
求教各位。有两个很奇怪的地方:1.为什么单步执行可以,而全速执行不行? 2.为什么在中断中使用OSFlagPost会出现这个问题? |