5.3.4 ipipe_flags之TIP_MAYDAY

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博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值