printf是我们常用的调试程序的手段,在第一版程序中,经常会使用printf来验证程序是否工作正确。这样的调试手段应该在正式版的程序发布前注释掉或者删除。而且不当地使用printf也会带来某些功能性问题,例如,在某项目中,需要快速响应一个触发信号,在该触发信号到来时,对触发信号计数,并分别对不同的数字做出不同的反应,代码如下图所示:
void SIGTRIG_IRQHandler(void)
{//满洲里国峰电子科技//www.guofengdianzi.com//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(SIGTRIG_EXTI_LINE) != RESET) { TrigNum++;// just 4 channelsif(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 //确保是否产生了EXTI Line中断if(EXTI_GetITStatus(SIGTRIG_EXTI_LINE) != RESET) { TrigNum++;// just 4 channelsif(TrigNum>3)TrigNum=0;//printf("num=%d \r\n", TrigNum); //清除中断标志位EXTI_ClearITPendingBit(SIGTRIG_EXTI_LINE); }
}