vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vxworks属于硬实时操作系统,不能在规定的时间内完成操作即会死机或复位。所以vxworks不用printf的原因在于阻塞。 网上说printf 因为引用全局变量stdout,所以是不可重入的。这个稍微解释一下。如果用到了全局变量,但是用信号量保护,是线程安全的,但是不可重入的(会导致死锁,譬如一个任务或中断处理程序调用了printf,被另一个高优先级中断打断,那么就会形成死锁而导致系统复位)。 所以这里的阻塞和不可重入都是因为对共享变量的保护而采用互斥锁引起的,而这里的阻塞是不可重入的一个真子集。(例如:可能有些函数对静态或全局变量没有锁保护,因此是非线程安全,也是非可重入的,此时并没有阻塞在静态或全局变量上,所以不可重入的概念要大。)。因此printf不能用在中断处理程序中的根本原因在于使用了全局变量后采用了锁机制,而锁机制会导致阻塞,阻塞是不可重入的真子集。 所以网上说printf因为不可重入,也会说得过去的(但不可重入还有其他非阻塞的场景)。更准确的说法是因为阻塞在全局变量STDOUT上)。关于可重入和线程安全的区别,下文会有详细解释:
中断处理程序不能使用printf的本质
最新推荐文章于 2023-04-06 08:30:00 发布
博客探讨了中断处理程序为何不能使用printf,并通过func()函数的例子解释了线程安全和可重入的概念。强调了如何修改函数以实现线程安全和可重入,如strtok、strtok_r的比较。
摘要由CSDN通过智能技术生成