为什么在中断函数中不能使用printf打印函数

问题

在嵌入式设计中,一般不建议在中断函数中调用打印函数printf来打印调试信息,如果真这么做了,可能发生的结果包括:

  1. 打印不完整或者根本无法打印
  2. 程序能执行,但是行为异常
  3. 程序无法执行
    为什么会发生这些现象呢?

分析

需要分各种情况讨论。
按照中断函数的行为,有些中断函数为了防止中断嵌套,会将中断临时禁用。
按照printf的实现方式,有些会通过轮询方式实现;优先会通过串口中断方式实现。

如果中断函数中禁用了中断
-- 如果调用的printf依赖中断打印,则会造成printf无法完成打印
-- 如果调用的printf通过轮询方式实现,打印一段字符的时间过长,大大降低中断处理效率,而且在中断禁用期间可能会错失很多其他中断

如果中断函数中没有禁用中断
-- printf函数执行过程中,可能主中断可能会再次被触发,从而再次调用printf,造成printf函数的重入。而很多printf函数由于调用了全局资源,是不支持可重入的,会造成灾难性后果。

正确的处理方式

最好的实现方式就是,发生中断时,设置标志,构造一个尽量简短的ISR,将printf等其他工作单独创建相应的线程去执行。

参考文章

https://www.cnblogs.com/mylinux/p/5534325.html
http://blog.sina.com.cn/s/blog_5e3075450100c0my.html
https://www.bbsmax.com/A/Gkz1BBYZJR/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容