5.3.4 ipipe_flags之TIP_MAYDAY
第一,什么是MAYDAY紧急情况
“MAYDAY” 作为紧急情况的信号,源于航空和海事通信领域。它是一个国际公认的无线电求救信号,用来表示船只、飞机或其他交通工具遇到了严重的、直接威胁到生命或安全的紧急状况。选择 "MAYDAY" 这个词是因为它在法语中的发音类似于 "m'aider" 或 "m'aidez",意为“帮助我”。这个词清晰易读,即使在嘈杂或干扰严重的环境下也能被正确理解。
在Xenomai中,什么被定义成紧急情况?
(1)watchdog_handler 函数
watchdog_handler 函数,用于处理看门狗定时器的触发事件。这个函数的主要功能是检测软件死锁,并采取相应的措施来恢复系统的正常运行。
if (xnthread_test_state(curr, XNUSER)) {
printk(XENO_WARNING "watchdog triggered on CPU #%d -- runaway thread "
"'%s' signaled\n", xnsched_cpu(sched), curr->name);
xnthread_call_mayday(curr, SIGDEBUG_WATCHDOG);
} else {
printk(XENO_WARNING "watchdog triggered on CPU #%d -- runaway thread "
"'%s' canceled\n", xnsched_cpu(sched), curr->name);
xnthread_set_info(curr, XNKICKED|XNCANCELD);
}
如果是用户空间线程,则打印一条警告信息,表明看门狗定时器已经触发,并且当前线程可能是一个失控的线程。然后调用 xnthread_call_mayday -> pipeline_raise_mayday -> ipipe_raise_mayday 函数,向当前线程发送一个 SIGDEBUG_WATCHDOG 信号,强制线程退出primary模式,进入secondary模式,即从Xenomai迁移到Linux。
(2)处理SIGKICK信号
SIGKICK信号,用于强制线程退出主模式,即从Xenomai迁移到Linux:
__cobalt_kill ->xnthread_kick->__xnthread_kick->pipeline_raise_mayday
#define SIGSUSP (SIGRTMAX + 1) //挂起线程
#define SIGRESM (SIGRTMAX + 2) //恢复线程
#define SIGRELS (SIGRTMAX + 3) //解除阻塞线程
#define SIGKICK (SIGRTMAX + 4) //强制线程退出主模式
#define SIGDEMT (SIGRTMAX + 5) //将线程降级到 SCHED_OTHER 调度类
这些信号仅在使用 pthread_kill() 函数时可用,用于同步地挂起、恢复、解除阻塞线程,强制它们退出主模式,甚至将它们降级到 SCHED_OTHER 调度类。这些信号不能被阻塞、排队,甚至不能设置在信号集中。它们是非常不规范的,是为了满足特定的实时系统需求而提供的。
第二,MAYDAY运行机制
TIP_MAYDAY仅仅是struct thread_info中的ipipe_flags的标志位。怎么告诉Xenomai去处理呢?需要利用TIP_NOTIFY中的trap机制,并且专门定义了一个TRAP类型IPIPE_TRAP_MAYDAY。
当利用ipipe_raise_mayday标记TIP_MAYDAY紧急情况时,需要确保其依赖的TIP_NOTIFY是否置位了。

IPIPE在处理系统调用(ipipe_handle_syscall)和中断(__ipipe_exit_irq)的过程中,会通过如下过程处理MAYDAY:
__ipipe_call_mayday
->__ipipe_notify_trap
->ipipe_trap_hook
->handle_mayday_event
->xnthread_relax
具体的展开过程如下:
当利用__ipipe_call_mayday处理TIP_MAYDAY时,实际上是调用__ipipe_notify_trap发送IPIPE_TRAP_MAYDAY给ipipe_trap_hook函数。

Xenomai实现的ipipe_trap_hook总是先处理IPIPE_TRAP_MAYDAY!

最终,handle_mayday_event调用xnthread_relax将实时线程切换到Linux中运行。
小结:TIP_MAYDAY定义了一种紧急情况,依赖TIP_NOTIFY中的trap机制,在不同的场景下,最终将实时线程切换到Linux中运行。
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

673

被折叠的 条评论
为什么被折叠?



