阅读背景:

中断处理程序中的printf

来源:互联网 
对于vxworks,在进入中断处理程序去处理中断后,首先会屏蔽相同的中断直至中断处理程序完成(有些处理器本身甚至在硬件上就已经屏蔽了同级和更低级的中断)。 vxworks之所以不用printf,是因为printf()是将信息输出到标准输出设备(STDOUT)中,如果此时设备正在工作,那么就会发生阻塞(在printf里边会有获取信号量的semTake的操作,这个互斥信号量就是保护这个标准输出设备资源)。vxworks属于硬实时操作系统,不能在规定的时间内完成操作即会死机或复位,所以vxworks不用printf的原因在于阻塞而不是因为不可重入。 网上说printf 因为引用全局变量stdout,所以是不可重入的。这个稍微解释一下。如果用到了全局变量,但是用信号量保护,这个是线程安全的,但是是不可重入的。总之,中断处理程序因为同级中断被屏蔽,所以中断处理程序是否是可重入无关紧要,printf特点是不可重入(但线程安全),以及调用互斥信号量引起阻塞, 是后者导致其不能在中断处理程序中使用。关于可重入和线程安全的区别,下文会有详细解释: 对于vxworks,在进入中断处理程序去处理中断后,首先会屏蔽相同的中断直至中断处理程序完成(



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: