问题
在嵌入式设计中,一般不建议在中断函数中调用打印函数printf来打印调试信息,如果真这么做了,可能发生的结果包括:
- 打印不完整或者根本无法打印
- 程序能执行,但是行为异常
- 程序无法执行
为什么会发生这些现象呢?
分析
需要分各种情况讨论。
按照中断函数的行为,有些中断函数为了防止中断嵌套,会将中断临时禁用。
按照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/
网友评论