Linux-rt下卡死之hrtimer分析
Linux-rt下卡死之hrtimer分析
日志

超时读过程分析
#define readl_poll_timeout(addr, val, cond, delay_us, timeout_us) \readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us)34 #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \
35 ({ \
36 u64 __timeout_us = (timeout_us); \
37 unsigned long __sleep_us = (sleep_us); \
38 ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \
39 might_sleep_if((__sleep_us) != 0); \
40 for (;;) { \
41 (val) = op(addr); \
42 if (cond) \
43 break; \
44 if (__timeout_us && \
45 ktime_compare(ktime_get(), __timeout) > 0) { \
46 (val) = op(addr); \
47 break; \
48 } \
49 if (__sleep_us) \
50 usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
51 } \
52 (cond) ? 0 : -ETIMEDOUT; \
53 })2375 void __sched usleep_range(unsigned long min, unsigned long max)
2376 {
2377 ktime_t exp = ktime_add_us(ktime_get(), min);
2378 u64 delta = (u64)(max - min) * NSEC_PER_USEC;
2379
2380 for (;;) {
2381 __set_current_state(TASK_UNINTERRUPTIBLE); //设置当前进程为不可中断状态
2382 /* Do not return before the requested sleep time has elapsed */
2383 if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS)) //注意这个hrtimer_mode 在rt-linux中有很大用处
2384 break;
2385 }
2386 }
2387 EXPORT_SYMBOL(usleep_range);2172 int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta, const enum hrtimer_mode mode)
2174 {
2175 return schedule_hrtimeout_range_clock(expires, delta, mode, CLOCK_MONOTONIC); //CLOCK_MONOTONIC:clock_id
2177 }
2178 EXPORT_SYMBOL_GPL(schedule_hrtimeout_range);2275 int __sched
2276 schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
2277 const enum hrtimer_mode mode, clockid_t clock_id)
2278 {
2279 struct hrtimer_sleeper t;
2280
2281 /*
2282 * Optimize when a zero timeout value is given. It does not
2283 * matter whether this is an absolute or a relative time.
2284 */
2285 if (expires && *expires == 0) {
2286 __set_current_state(TASK_RUNNING);
2287 return 0;
2288 }
2289
2290 /*
2291 * A NULL parameter means "infinite"
2292 */
2293 if (!expires) {
2294 schedule();
2295 return -EINTR;
2296 }// 实时任务,设置延迟时间为0,时间更精确
2302 if (rt_task(current))
2303 delta = 0;
2304
2305 hrtimer_init_sleeper_on_stack(&t, clock_id, mode);
2306 hrtimer_set_expires_range_ns(&t.timer, *expires, delta);
2307 hrtimer_sleeper_start_expires(&t, mode);
2308
2309 if (likely(t.task))
2310 schedule();
2311
2312 hrtimer_cancel(&t.timer);
2313 destroy_hrtimer_on_stack(&t.timer);
2314
2315 __set_current_state(TASK_RUNNING);
2316
2317 return !t.task ? 0 : -EINTR;
2318 }
2319 EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock);
hrtimer定时器分析
1、定义struct hrtimer_sleeper t;
135 struct hrtimer_sleeper {
136 struct hrtimer timer;
137 struct task_struct *task;
138 };
38 enum hrtimer_mode {
39 HRTIMER_MODE_ABS = 0x00,
40 HRTIMER_MODE_REL = 0x01,
41 HRTIMER_MODE_PINNED = 0x02,
42 HRTIMER_MODE_SOFT = 0x04,
43 HRTIMER_MODE_HARD = 0x08,2、hrtimer_init_sleeper_on_stack(&t, clock_id, mode);
443 void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl,
444 clockid_t clock_id, enum hrtimer_mode mode)
445 {
446 debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr);
447 __hrtimer_init_sleeper(sl, clock_id, mode);
448 }
449 EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack);1799 static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
1800 clockid_t clock_id, enum hrtimer_mode mode)
1801 {
1821 if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
1822 if (task_is_realtime(current) && !(mode & HRTIMER_MODE_SOFT))
1823 mode |= HRTIMER_MODE_HARD; //根据上边的分析,此处会设置为硬中断上下文进行回调
1824 }
1825
1826 __hrtimer_init(&sl->timer, clock_id, mode); //初始化hrtimer
1827 sl->timer.function = hrtimer_wakeup; //唤醒函数
1828 sl->task = current; //当前进程
1829 }1376 static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
1377 enum hrtimer_mode mode)
1378 {
1379 bool softtimer = !!(mode & HRTIMER_MODE_SOFT); //由上可知此处为false
1380 struct hrtimer_cpu_base *cpu_base;
1381 int base;1389 if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(mode & HRTIMER_MODE_HARD))
1390 softtimer = true;
1391
1392 memset(timer, 0, sizeof(struct hrtimer));
1393
1394 cpu_base = raw_cpu_ptr(&hrtimer_bases);
1395 1401 if (clock_id == CLOCK_REALTIME && mode & HRTIMER_MODE_REL)
1402 clock_id = CLOCK_MONOTONIC;
1403
1404 base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0;
1405 base += hrtimer_clockid_to_base(clock_id);
1406 timer->is_soft = softtimer; //false
1407 timer->is_hard = !softtimer; //true
1408 timer->base = &cpu_base->clock_base[base];
1409 timerqueue_init(&timer->node); //加入定时队列
1410 }3、hrtimer_set_expires_range_ns(&t.timer, *expires, delta);
251 static inline void hrtimer_set_expires_range_ns(struct hrtimer *timer, ktime_t time, u64 delta)
252 {
253 timer->_softexpires = time; //软超时时间
254 timer->node.expires = ktime_add_safe(time, ns_to_ktime(delta)); //超时范围
255 }4、hrtimer_sleeper_start_expires(&t, mode);
1782 void hrtimer_sleeper_start_expires(struct hrtimer_sleeper *sl,
1783 enum hrtimer_mode mode)
1784 {
1792 if (IS_ENABLED(CONFIG_PREEMPT_RT) && sl->timer.is_hard)
1793 mode |= HRTIMER_MODE_HARD;
1794
1795 hrtimer_start_expires(&sl->timer, mode);
1796 }
1797 EXPORT_SYMBOL_GPL(hrtimer_sleeper_start_expires);426 static inline void hrtimer_start_expires(struct hrtimer *timer,
427 enum hrtimer_mode mode)
428 {
429 u64 delta;
430 ktime_t soft, hard;
431 soft = hrtimer_get_softexpires(timer);
432 hard = hrtimer_get_expires(timer);
433 delta = ktime_to_ns(ktime_sub(hard, soft));
434 hrtimer_start_range_ns(timer, soft, delta, mode);
435 }
相关文章:
Linux-rt下卡死之hrtimer分析
Linux-rt下卡死之hrtimer分析 日志 超时读过程分析 #define readl_poll_timeout(addr, val, cond, delay_us, timeout_us) \readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us)34 #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \…...
【AI日记】25.01.24
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales 读书 书名:法治的细节作者:罗翔 律己 AI:8 小时,良作息:00:30-8:30&…...
React 中hooks之useSyncExternalStore使用总结
1. 基本概念 useSyncExternalStore 是 React 18 引入的一个 Hook,用于订阅外部数据源,确保在并发渲染下数据的一致性。它主要用于: 订阅浏览器 API(如 window.width)订阅第三方状态管理库订阅任何外部数据源 1.1 基…...
C++11新特性之decltype
1.decltype的作用 decltype是C11新增的一个关键字,与auto的功能一样,都是在编译期间推导变量类型的。不了解auto的可以转到——C11新特性之auto。 为什么引入decltype?看过上边那篇博客的读者应该知道auto在有些场景中并不适用,所以引入declt…...
二叉树相关oj题 1. 检查两颗树是否相同。
二叉树相关oj题 检查两颗树是否相同。OJ链接 另一颗树的子树。OJ链接 if(rootnull)易漏掉 会导致空指针异常翻转二叉树。OJ链接...
element tbas增加下拉框
使用Tabs 标签页的label插槽,嵌入Dropdown 下拉菜单,实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"(这个事件当中到拥有下拉框的tab里时,可以存一下Dropdown 第一个菜单的id,实现点击到拥有…...
新浪安卓(Android)开发面试题及参考答案(68道题,9道手撕题)
链表判环,找入口 思路: 判断是否有环:使用快慢指针,快指针每次走两步,慢指针每次走一步,如果它们相遇,说明有环。找出环入口:当判断出有环后,将慢指针重新指向头节点,然后快慢指针同时以相同速度移动,再次相遇的节点就是环的入口。以下是判断链表是否有环以及找出环…...
Zbrush导入笔刷
Zbrush笔刷目录: ...\Zbrush\ZStartup\BrushPresets...
实战演示:利用ChatGPT高效撰写论文
在当今学术界,撰写论文是一项必不可少的技能。然而,许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是,人工智能的快速发展为我们提供了新的工具,其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台,…...
大数据学习之SCALA分布式语言三
7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…...
k8s简介,k8s环境搭建
目录 K8s简介环境搭建和准备工作修改主机名(所有节点)配置静态IP(所有节点)关闭防火墙和seLinux,清除iptables规则(所有节点)关闭交换分区(所有节点)修改/etc/hosts文件&…...
深入理解MySQL事务(万字详)
文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)非正常演示2 - 证明commit了…...
微信小程序使用picker根据接口给的省市区的数据实现省市区三级联动或者省市区街道等多级联动
接口数据如上图 省市区多级联动,都是使用的一个接口通过传参父类的code。返回我们想要的数据 比如获取省就直接不要参数。市就把省得code传给接口,区就把市的code作为参数。 <picker mode"multiSelector" :range"mulSelect1" …...
Go Fx 框架使用指南:深入理解 Provide 和 Invoke 的区别
1. 什么是 Fx 框架? Fx 是一个基于 Go 语言的依赖注入框架,专注于简化应用程序的生命周期管理和依赖的构建。在复杂的应用程序中,Fx 通过模块化的设计方式将组件连接起来,使开发者能够更高效地管理依赖关系。 Fx 的核心理念是&a…...
VSCode+Continue实现AI辅助编程
Continue是一款功能强大的AI辅助编程插件,可连接多种大模型,支持代码设计优化、错误修正、自动补全、注释编写等功能,助力开发人员提高工作效率与代码质量。以下是其安装和使用方法: 一、安装VSCode 参见: vscode安…...
阿里云服务器在Ubuntu上安装redis并使用
1、redis安装 sudo apt install lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgecho "deb [signed-by/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.…...
Blazor-Blazor呈现概念
静态和交互式呈现概念 在Blazor开发中,Razor 组件具备两种重要的呈现方式,分别是静态呈现和交互式呈现。 静态呈现 也被称为静态渲染,是一种典型的服务器端方案。在这种模式下,组件呈现时,用户与.NET/C# 代码之间缺…...
14-6-2C++的list
(一)list对象的带参数构造 1.list(elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…...
StarRocks常用命令
目录 1、StarRocks 集群管理&配置命令 2、StarRocks 常用操作命令 3、StarRocks 数据导入和导出 1、StarRocks 集群管理&配置命令 查询 FE 节点信息 SHOW frontends; SHOW PROC /frontends; mysql -h192.168.1.250 -P9030 -uroot -p -e "SHOW PROC /dbs;"…...
激光雷达和相机早期融合
通过外参和内参的标定将激光雷达的点云投影到图像上。 • 传感器标定 首先需要对激光雷达和相机(用于获取 2D 图像)进行外参和内参标定。这是为了确定激光雷达坐标系和相机坐标系之间的转换关系,包括旋转和平移。通常采用棋盘格等标定工具&…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
