linux实时操作系统xenomai看门狗(watchdog)机制及作用介绍

版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100。如有错误,欢迎指正。

文章目录

    • 一、前言
      • PREEMPT-RT(RT Throttling)
    • 一、xenomai watchdog介绍
    • 二、xenomai watchdog工作原理
    • 三、使用场景

本文介绍xenomai watchdog,有什么用?它是如何工作的?

一、前言

介绍xenomai watchdog之前,有必要先介绍操作系统对实时任务的调度,实时任务的调度是指在满足实时任务时间约束的情况下,对任务进行排队和执行的策略。两种常见的实时任务调度算法是RR调度(Round Robin,轮转调度)和FIFO调度(First In First Out,先进先出调度)。

正常情况下,高优先级实时任务对CPU时间绝对的优先权。如果此时最高优先级任务存在bug,出错或进入一个不存在主动和被动让出CPU资源的逻辑时,系统中的鼠标、键盘、屏幕等非实时任务将会因为得不到CPU运行时间饿死,导致系统失去响应。

为此PREEMPT-RT和xenomai给出了不同的解决方案。

PREEMPT-RT(RT Throttling)

对于PREEMPT-RT,PREEMPT-RT提供了一个机制,确保非实时任务能在某个时间点执行,该机制也被称为RT限流(RT Throttling),它由两个值决定:

  • /proc/sys/kernel/sched_rt_period_us 定义了微秒级别的窗口,在这个窗口里调度器会在实时和非实时任务之间共享资源,默认1 s。

  • /proc/sys/kernel/sched_rt_runtime_us 则规定了在上述窗口中为实时任务分配的时长比例。默认值950000us,即95%。意味着实时任务在每 1 秒内最多可以使用 950 毫秒的 CPU 时间,剩余的 50 毫秒留给其他非实时任务。

可以通过以下方式修改这些值:

echo 950000 > /proc/sys/kernel/sched_rt_runtime_us
echo 1000000 > /proc/sys/kernel/sched_rt_period_us

需要注意的是,修改这些值需要超级用户(root)权限。

RT Throttling保证了即使实时任务出现错误或者无限循环,也会为非实时任务预留一定的CPU运行时间,方便我们定位和debug。

xenomai也有实时任务的限制措施xenomai watchdog,但与PREEMPT-RT的RT Throttling不同。

一、xenomai watchdog介绍

xenomai watchdog是xenomai内核提供的一个检测xenomai实时任务是否长期占用CPU机制,内核编译时通过以下配置启用该功能。

[*] Xenomai/cobalt  ---> [*]   Debug support  --->[*]   Watchdog support(4)     Watchdog timeout 

其中Watchdog timeout是看门狗动作的超时时间,时间单位是秒,允许配置的默认最大时间为60秒。内核启用后,看门狗超时时间还可通过内核参数watchdog_timeout在启动时修改,单位:秒,值不受限制。

当xenomai watchdog触发时,watchdog会向当前cpu运行的线程发送SIGDEBUG signal,该信号会使实时任务结束,同时内核会输出信息,实时任务结束后系统恢复响应,通过demsg命令可以看到。

[Xenomai] watchdog triggered on CPU #0 -- runaway thread 'RT_Thread' signaled

那xenomai watchdog是如何工作的?有什么局限?不使用会发生什么?

二、xenomai watchdog工作原理

我们知道Xenomai 是一个双调度核操作系统,它在内核态添加了一个高优先级的实时调度核 Cobalt 来管理实时任务。Cobalt 调度核与 Linux 调度核共存,通过 Ipipeline 机制将两个调度上下文分为实时域和非实时域,Ipipeline 确保了 Cobalt 内核(实时域)的优先级高于 Linux 内核(非实时域,也称root domain),linux内核退化为成为 Cobalt 内核的idle任务,从而保障实时任务的实时性;(有关该部分,请查阅本博客其他文章)。

实时域和非实时域会随着任务的运行情况而来回切换。当没有实时任务需要运行释放CPU资源给linux非实时任务,或者实时任务调用了linux提供的系统资源的实时,会切换到非实时域。
在这里插入图片描述

看门狗的触发逻辑是这样的,**当进入实时任务调度上下文的时候,看门狗启动开始定时,离开实时上下文(实时任务调用了非实时服务或者主动睡眠让出 cpu) 停止,**只要看门狗超时说明实时任务在这段时间内一直在运行,看门狗看管的是整个实时任务集合,不是某个特定任务,看门狗超时触发的时候会把当前 cpu 运行的任务 kill 掉,任何一个实时任务都有可能在watchdog触发这个时间点上

在这里插入图片描述

具体代码如下:

static inline void enter_root(struct xnthread *root)
{struct xnarchtcb *rootcb __maybe_unused = xnthread_archtcb(root);#ifdef CONFIG_XENO_OPT_WATCHDOGxntimer_stop(&root->sched->wdtimer);
#endif/*...*/
}static inline void leave_root(struct xnthread *root)
{struct xnarchtcb *rootcb = xnthread_archtcb(root);struct task_struct *p = current;/*...*/#ifdef CONFIG_XENO_OPT_WATCHDOGxntimer_start(&root->sched->wdtimer, get_watchdog_timeout(),XN_INFINITE, XN_RELATIVE);
#endif
}

而看门狗处理逻辑也很简单,如果当前处于是root域,不处理;若当前是用户态实时任务,则直接发送信号;若当前运行的内核态实时任务,则将当前任务状态设置为XNKICKED并取消运行。

static void watchdog_handler(struct xntimer *timer)
{struct xnsched *sched = xnsched_current();struct xnthread *curr = sched->curr;if (likely(xnthread_test_state(curr, XNROOT))) {/*当前处于root域*/xnsched_reset_watchdog(sched);return;}if (likely(++sched->wdcount < wd_timeout_arg))return;trace_cobalt_watchdog_signal(curr);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);/** On behalf on an IRQ handler, xnthread_cancel()* would go half way cancelling the preempted* thread. Therefore we manually raise XNKICKED to* cause the next call to xnthread_suspend() to return* early in XNBREAK condition, and XNCANCELD so that* @thread exits next time it invokes* xnthread_test_cancel().*/xnthread_set_info(curr, XNKICKED|XNCANCELD);}xnsched_reset_watchdog(sched);
}

三、使用场景

xenomai watchdog会导致出问题的实时任务退出,所以一般在实时软件开发阶段,开启watchdog可以尽早暴露实时应用潜在的出错或无限循环问题,避免软件发布后产生严重后果。

如果实时应用发布后,在特定场景下出现系统无响应问题,可用启用watchdog来排查定位。

下一篇文章,我将给大家介绍一个真实生产环境中遇到的问题,一个外部条件触发低优先级实时任务进入无限循环逻辑后,导致整个系统实时任务调度异常的问题,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】字符串左旋的三种解题方法详细分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;方法一&#xff1a;逐字符移动法&#x1f4af;方法二&#xff1a;使用辅助空间法&#x1f4af;方法三&#xff1a;三次反转法&#x1f4af;方法对…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊&#xff0c;时代发展这么快&#xff0c;在时代的洪流下&#xff0c;我们个人能抓住些什么呢。我问了大模型&#xff0c;文心一言是这样回答的&#xff1a; 在快速发展的时代背景下&#xff0c;个人确实面临着诸多挑战&#xff0c;但同时也充满…

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…

nodepad配置c/c++ cmd快速打开创建项目文件

前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器&#xff0c;执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…

每日一题 LCR 060. 前 K 个高频元素

LCR 060. 前 K 个高频元素 优先队列轻松解决 struct node{int num;int cnt;node(int n){num n;cnt 0;}bool operator < (const node m) const{return cnt > m.cnt;} };class Solution { public:vector<int> topKFrequent(vector<int>& nums, int k)…

打造优秀技术文档的三大方向

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

异或-java-leetcode

1486.数组异或操作 给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的结果。 示例 1&#xff1a; 输入…

等保测评在云计算方面的应用讲解

等保测评&#xff08;信息安全等级保护测评&#xff09;在云计算方面的应用主要聚焦于如何满足等级保护相关要求&#xff0c;并确保云计算平台及其上运行的业务系统的安全性。以下是主要内容的讲解&#xff1a; 1. 云计算中的等保测评概述 等保测评是在我国网络安全等级保护制…

Xcode15(iOS17.4)打包的项目在 iOS12 系统上启动崩溃

0x00 启动崩溃 崩溃日志&#xff0c;只有 2 行&#xff0c;看不出啥来。 0x01 默认配置 由于我开发时&#xff0c;使用的 Xcode 14.1&#xff0c;打包在另外一台电脑 Xcode 15.3 Xcode 14.1 Build Settings -> Asset Catalog Compliter - Options Xcode 15.3 Build S…

如何使用GCC手动编译stm32程序

如何不使用任何IDE&#xff08;集成开发环境&#xff09;编译stm32程序? 集成开发环境将编辑器、编译器、链接器、调试器等开发工具集成在一个统一的软件中&#xff0c;使得开发人员可以更加简单、高效地完成软件开发过程。如果我们不使用KEIL,IAR等集成开发环境&#xff0c;…

Linux下挂载硬盘并只允许特定用户访问

最近课题组新买了几个硬盘&#xff0c;目前想把他们挂载到 /mnt 下&#xff0c;然后在每个硬盘下创建个人文件夹只允许特定的用户自己访问。流程如下&#xff1a; 1. 挂载硬盘 使用 blkid 查看设备的 UUID 和 LABEL&#xff1a; sudo blkid找到并记住要挂载的硬盘的UUID或者…

QUICK 调试camera-xml解析

本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架&#xff0c;只需通过配置XML文件&#xff0c;设置相机模组的相关参数&#xff0c;就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析&#xff0c;这中间需要c…

java——Tomcat连接池配置NIO、BIO、APR

Tomcat连接池的配置涉及不同的IO模型&#xff0c;包括NIO&#xff08;Non-blocking IO&#xff0c;非阻塞IO&#xff09;、APR&#xff08;Apache Portable Runtime&#xff0c;Apache可移植运行库&#xff09;和BIO&#xff08;Blocking IO&#xff0c;阻塞IO&#xff09;。以…

数据结构 (11)串的基本概念

一、串的定义 1.串是由一个或者多个字符组成的有限序列&#xff0c;一般记为&#xff1a;sa1a2…an&#xff08;n≥0&#xff09;。其中&#xff0c;s是串的名称&#xff0c;用单括号括起来的字符序列是串的值&#xff1b;ai&#xff08;1≤i≤n&#xff09;可以是字母、数字或…

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域&#xff0c;选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5&#xff08;Unreal Engine 5&#xff09;作为两大主流3D软件&#xff0c;各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…

前端开发工程师需要学什么?

‌前端开发工程师需要学习的主要内容包括HTML、CSS、JavaScript、前端框架、响应式设计、性能优化、版本控制等。‌ HTML/CSS/JavaScript ‌HTML‌&#xff1a;是网页的骨架&#xff0c;负责网页的结构和内容。‌CSS‌&#xff1a;用于美化网页&#xff0c;设计样式和布局。‌…

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…

springboot集成shiro和前后端分离配置

一&#xff0c;springboot集成shiro 1&#xff0c;导入依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.4.0</version></dependency>2&#xff0c;Real…

目标检测标注图像

labelimg2 选择使用lableimg2的原因&#xff0c;rolabelimg无法导入labelimg2和labelimg标注数据。 而labelimg2则可以正常导入其它2种标注工具的标注过的数据。不适用labelimg的原因&#xff0c;他不支持画斜框。 下载地址&#xff1a;https://github.com/chinakook/labelIm…

Unity 中 多种资源加载方式的优缺点

在 Unity 中&#xff0c;有多种方式来加载资源&#xff0c;每种方式都有其独特的用途、优缺点和限制。以下是每种方式的详细比较&#xff1a; 1. AssetDatabase 用途: 主要用于编辑器环境中的资源加载。不适合在运行时使用。 特点 编辑器专用: 只能在编辑器模式下使用。同步…