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