printf影响单片机中断速度

首页    嵌入式软硬件    printf影响单片机中断速度

printf是我们常用的调试程序的手段,在第一版程序中,经常会使用printf来验证程序是否工作正确。这样的调试手段应该在正式版的程序发布前注释掉或者删除。而且不当地使用printf也会带来某些功能性问题,例如,在某项目中,需要快速响应一个触发信号,在该触发信号到来时,对触发信号计数,并分别对不同的数字做出不同的反应,代码如下图所示:

void SIGTRIG_IRQHandler(void)
{
  //满洲里国峰电子科技
  //www.guofengdianzi.com
  //微信:guofengdianzi
  
  //确保是否产生了EXTI Line中断
  if(EXTI_GetITStatus(SIGTRIG_EXTI_LINE) != RESET) 
  {    
    TrigNum++;
    // just 4 channels
    if(TrigNum>3)
      TrigNum=0;
    printf("num=%d \r\n", TrigNum);  
    //清除中断标志位
    EXTI_ClearITPendingBit(SIGTRIG_EXTI_LINE);     
  } 
}

在上述代码中,使用printf验证是否每次的触发信号均被正确捕捉,然而我们在测试中发现,这个printf影响了该中断函数的速度,这个触发信号的频率大约是200us,测试时发现响应动作的周期却远大于200us,经排查是printf引起,将其注释后,恢复正常。

void SIGTRIG_IRQHandler(void)
{
  //满洲里国峰电子科技
  //www.guofengdianzi.com
  //微信:guofengdianzi
  
  //确保是否产生了EXTI Line中断
  if(EXTI_GetITStatus(SIGTRIG_EXTI_LINE) != RESET) 
  {    
    TrigNum++;
    // just 4 channels
    if(TrigNum>3)
      TrigNum=0;
    //printf("num=%d \r\n", TrigNum);  
    //清除中断标志位
    EXTI_ClearITPendingBit(SIGTRIG_EXTI_LINE);     
  } 
}