一、标准库
在标准库中是在中断处理函数中,完成对接收数据的处理,当产生串口接收中断,程序会终止运行主函数,自动跳转到对应的中断函数。
优点:简单直接
缺点:如果程序停留在中断处理函数的时间太久,会耽误主函数的时间。也会让其他中断受阻,其他中断需要等待当前中断处理完成后,才能进行下一个中断处理。
二、HAL库
为了解决中断的问题,HAL库函数改用中断回调函数的方式处理中断事件。
在HAL库程序中,当产生中断事件,程序依然会跳转到中断处理函数,但中断处理函数中只简单标注了中断来源,然后就快速退出中断,回到主函数。回到主函数后并不是继续执行之前的中止的程序,而是自动调用中断回调函数,对中断事件的处理都放在了回调函数里。由于程序已经退出了中断状态,回归主函数,所以其他中断不会受阻。
关于中断回调函数还有一个弱函数定义的概念
__weak 前缀的作用是定义一个弱函数,弱函数相当于后补球员,如果正式球员在场,候补球员不能上场。如果正式球员缺席,候补球员补位,保证比赛正常进行。
当在usart.c文件中定义了中断回调的正式函数,弱函数不会被编译,假如我们的程序中不需要串口中断功能,删除了usart.c文件,中断函数被删除了,此时将会编译中断回调的弱函数,如果程序中没有若函数当候补,删除正式函数后,就会因为编译器找不到中断回调函数而报错。