如题所述
第1个回答 2022-06-07
在嵌入式设计中,一般不建议在中断函数中调用打印函数printf来打印调试信息,如果真这么做了,可能发生的结果包括:
需要分各种情况讨论。
按照中断函数的行为,有些中断函数为了防止中断嵌套,会将中断临时禁用。
按照printf的实现方式,有些会通过轮询方式实现;优先会通过串口中断方式实现。
如果中断函数中禁用了中断
-- 如果调用的printf依赖中断打印,则会造成printf无法完成打印
-- 如果调用的printf通过轮询方式实现,打印一段字符的时间过长,大大降低中断处理效率,而且在中断禁用期间可能会错失很多其他中断
如果中断函数中没有禁用中断
-- printf函数执行过程中,可能主中断可能会再次被触发,从而再次调用printf,造成printf函数的重入。而很多printf函数由于调用了全局资源,是不支持可重入的,会造成灾难性后果。
最好的实现方式就是,发生中断时,设置标志,构造一个尽量简短的ISR,将printf等其他工作单独创建相应的线程去执行。
需要分各种情况讨论。
按照中断函数的行为,有些中断函数为了防止中断嵌套,会将中断临时禁用。
按照printf的实现方式,有些会通过轮询方式实现;优先会通过串口中断方式实现。
如果中断函数中禁用了中断
-- 如果调用的printf依赖中断打印,则会造成printf无法完成打印
-- 如果调用的printf通过轮询方式实现,打印一段字符的时间过长,大大降低中断处理效率,而且在中断禁用期间可能会错失很多其他中断
如果中断函数中没有禁用中断
-- printf函数执行过程中,可能主中断可能会再次被触发,从而再次调用printf,造成printf函数的重入。而很多printf函数由于调用了全局资源,是不支持可重入的,会造成灾难性后果。
最好的实现方式就是,发生中断时,设置标志,构造一个尽量简短的ISR,将printf等其他工作单独创建相应的线程去执行。