美文网首页
为什么在中断函数中不能使用printf打印函数

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

作者: 铜锣饼 | 来源:发表于2021-07-28 14:46 被阅读0次

    问题

    在嵌入式设计中,一般不建议在中断函数中调用打印函数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/

    相关文章

      网友评论

          本文标题:为什么在中断函数中不能使用printf打印函数

          本文链接:https://www.haomeiwen.com/subject/spezmltx.html