关于中断函数的一个BUG

前段日子,我尝试自己写一遍STM32的串口接收函数,然后顺便调试一下重定义C语言的getchar函数,但是程序没有一点现象,检查了好久才发现这个问题,所以在这里记录一下。

事情是这样的,我重定义getchar函数前,已经调试过了串口的发送和接收函数,还有printf函数的重定义,这些一切都是正常的,但是当我重定义getchar函数时,我的串口助手一直没有反应,我就很好奇,然后我查找了别人写好的重定义函数看了一下,发现和我的代码并没有什么不同。

最后通过单步调试发现,程序死在了一个中断函数里面了,那就是串口的中断处理函数,看了一下之后,我真的可以被自己的错误气死。

中断函数bug

看我第二行代码,这里我使能了串口的接收中断,这部分的代码是我在调试串口接收时写的,写完这部分内容之后,我就把相关的代码注释调了。当时我觉得这个中断使能的代码影响不大,毕竟我又不用他,然后也就没有注释这一行代码。

但是,在移植ST的代码的时候,我们文件中已经有一个关于中断函数的文件了。

stm32f4xx_it.c这个文件中存放着我们一堆外设的一堆函数,但是这些函数都是空的,但是,由于我使能了串口的接收中断,所以程序检测到中断的时候就会进这个文件里面找相应的中断函数,也就是上面说的空函数,然后就导致程序一直死在里面了,当然也就没有输出了。

所以,在我们使用中断的时候,要注意关掉不用的中断使能,防止程序跑进了空函数里面。还有就是,使能了相应的中断,就一定要写相关中断的中断函数!!!你不写中断函数就是向我上面遇到的情况。

一个小小的BUG,当时找了很久都找不出原因,一是自己对STM32内容的不熟悉,还有就是不懂得怎么调试代码,直到最后才使用KEIL的调试功能,一使用就找出问题了,所以,KEIL的调试功能还是挺好用的。

0%