打印

在STM32上应用ucosII单步执行与全速执行

[复制链接]
2868|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiepengchenghn|  楼主 | 2011-7-10 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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会出现这个问题?
沙发
iesmile| | 2014-9-3 15:05 | 只看该作者
楼主如何解决这个问题的啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

267

帖子

1

粉丝