当从ISR调用来自VxWorks中的ISR的阻塞函数(例如,msgQsend
并且msgQ
缓冲区已满时(假设msgQsend
被WAIT_FOREVER
调用时)会发生什么? 1}})?
注意:我认为它会在调度程序中失败。如果是这种情况,VxWorks调度程序如何知道它是从ISR调用的?
感谢。
答案 0 :(得分:1)
这里有多个问题,我会按相反顺序回答:
VxWorks调度程序如何知道它是从ISR调用的?
它使用来自intLib()的intContext():
BOOL intContext (void)
DESCRIPTION
This routine returns TRUE only if the current execution
state is in interrupt context and not in a meaningful task context.
下一个问题:
当VxWorks中的ISR阻塞函数
时会发生什么
VxWorks检查您是否尝试在中断级别调用阻塞函数,并在执行时返回ERROR。
答案 1 :(得分:1)
从ISR调用msgQSend
时,超时值必须为0.如果尝试将其与其他值一起使用,则会返回错误并将错误号设置为S_msgQLib_NON_ZERO_TIMEOUT_AT_INT_LEVEL
。
答案 2 :(得分:0)
我不确定旧版本和新版本,但我可以通过个人经验告诉您,在x86架构中从VX调用阻塞函数的VxWorks 6.x导致立即重启或严重系统挂起,具体取决于BSP的设置。
无论如何你可以自己看看,试试吧!
答案 3 :(得分:-1)
为什么不试试呢?创建一个完整的msgQ,生成中断并尝试将消息放入队列......
我的猜测是孔系统会挂起,因为(在许多系统上)ISR必须在另一个中断处理之前完成...但这在很大程度上取决于你正在运行的系统。
请记住:在ISR中,您在外面"操作系统!