RTOS论文笔记(二)

2023-05-16

李在林,韩宏克.嵌入式Linux实时性分析及改造.2010

Linux 的实时性测试——中断延迟测试

在Linux中,内核或驱动程序显式地关/开中断,一般是通过调用_cli()/_sti()来进行操作的。在调用_cli()时,记录系统的时间值,读出当_sti()被调用的系统时间,它们之间的时间差就是关中断时间。关中断时间测试程序重写了_cli()/_sti()宏,以允许记录调用它们的文件以及在何处调用,记录这些信息,以分析在Linux中哪些关中断时间比较长。

注:作者利用关中断时间代表中断延迟时间可能不太合适,以下是我在网上搜到的

(Interrupt Latency) 中断延迟,是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。
也就是:计算机接收到中断信号到操作系统作出响应,并完成换到转入中断服务程序的时间。
不严格地,也可以表述为:(外部)硬件(设备)发生中断,到系统执行中断服务子程序(ISR)的第一条指令的时间。
另外,如果尽可能严格地考虑问题,那么还要考虑下列情况:
1.中断的详细情况就是:外界硬件发生了中断后,CPU到中断处理器读取中断向量,并且查找中断向量表,
找到对应的中断服务子程序(ISR)的首地址,然后跳转到对应的ISR去做相应处理。
此部分时间,我称其为:识别中断时间
2.在允许中断嵌套的实时操作系统中,中断也是基于优先级的,允许高优先级中断抢断正在处理的低优先级中断,如ucOS/II,所以,如果当前正在处理更高优先级的中断,即使此时有低优先级的中断,
系统也不会立刻响应,而是等到高优先级的中断处理完之后,才会响应。
而即使在不支持中断嵌套,即中断是没有优先级的,中断是不允许被中断的,所以,如果当前系统正在处理一个中断,而此时另一个中断到来了,系统也是不会立即响应的,而只是等处理完当前的中断之后,才会处理后来的中断。
此部分时间,我称其为:等待中断打开时间
3.在嵌入式系统中,如ucOS/II,(其他类似系统中也有此情况),
常用开关中断来实现共享区的互斥访问。
所以,会出现这种情况:当前中断来了,但由于之前某个程序访问共享区,
而关闭中断了,导致当前中断得不到处理。而只有等待其访问完成共享区之后,再开中断。
(不过,一般来说,关中断的时间都很短,否则也就不适合用开关中断的方法来实现共享区互斥访问,
而应该用信号量或者其他手段实现。因为关中断时间长短,是衡量一个实时系统性能好坏的一个重要指标)
此部分时间,我称其为:关闭中断时间
所以,总的中断延迟时间就可以表示为:
中断延迟 = 识别中断时间 + [等待中断打开时间] + [关闭中断时间]

Linux实时改造——双内核法

双内核法

这种方法是在同一硬件平台上采用了2个相互配合、共同工作的系统核心,一个具有精确的实时多任务管理功能,另一个具有复杂的非实时通用功能。实时核心层负责硬件管理并提供实时任务管理,Linux核心是实时核心中优先级最低的,只有当没有可运行的实时任务时,Linux核心才被调度使用[]

RTLinux的实现方法

RTLinux将Linux内核当做一个任务,在一个小的实时操作系统下运行,只有在没有实时任务需要运行的空闲状态时Linux(作为一个任务)才能投入运行。动态地看,Linux的运行不断地被实时任务打断。作为任务的Linux内核永远不能关闭中断,也就是不能避免自己被实时中断任务先占。实现的关键技术是用软件来模拟一个控制中断的硬件,将实时中断和非实时中断区别对待。Linux为了取得某些操作的同步,经常要关中断,这是造成其不可先占的根本原因。在RTLinux中,当Linux通知CPU关闭中断时,实时内核截获这个请求,并把它记录下来,然后,返回Linux继续运行(注意:并未真的将中断关闭,但CPU标志寄存器的中断标志位IF仍为"1"),所以,Linux并没有真正禁中断。无论Linux处在什么状态,它都不会对实时系统的中断响应增加任何延迟。当一个中断信号到来时,实时内核截获这个中断信号,并识别其类型(是实时中断还是Linux中断);如果是实时的,则唤醒其处理函数;如果不是实时的,或者虽是实时的但其处理函数表明要同Linux共同处理这个中断,则对之作“待处理”标记,并送入一个队列排队等候。

接下来,假如Linux已经开放中断,实时内核就用软中断指令唤醒Linux的中断处理函数,同时,使CPU重新开放中断,以允许实时中断进入。这样Linux的所有中断处理机制都能得到满足;当它关闭中断时,实时内核就不启动任何Linux中断处理函数,当然也就不会引起任何混乱。从以上机制可以看出,驱动Linux中断处理函数的,实际上是实时内核,硬件发出的中断信号完全由实时内核接管,实时内核是如何截获Linux的中断操作信号的呢?Linux是用"cli"和"sti"宏来操作关中断和开中断的。在标准的Linux中,这些宏只是简单地执行相应的X86指令。RTLinux对这些宏作了修改,当Linux用"cli"关闭中断时,它并不是真正屏蔽所有中断,而是转去执行一些RTLinux代码。

由此可知,硬件中断信号完全由实时内核接管,而与Linux完全无关。无论Linux正在做什么,不管它是在内核状态还是用户状态下运行,中断是开放的还是关闭的,也不管它是否正运行在回旋锁状态,实时系统总能够对中断做出及时响应。

下面,从CPU的中断机制角度说明RTLinux模拟中断分类硬件的方法。由前述可见,在RTLinux中,Linux内核永远不能关闭中断,实时内核为了不错过任何一个中断也不会轻易关中断,所以,每一个中断都会引发相应中断处理子程序的执行。在RTLinux中,在保留标准Linux的IDT(中断描述符表)的同时,实时内核另造了一个IDT,并使CPU的IDTR(中断描述符表寄存器)指向这个IDT,当一个中断信号到来时,CPU会自动用这个中断信号的中断类型码(由中断控制器8259A提供)由IDTR指向IDT中的相应位置,获取中断处理子程序的入口地址并转入执行。

在中断处理子程序中作如下处理:如果它是一个实时中断,则转去执行相应的实时处理函数;如果它是一个Linux中断并且Linux处于开中断状态,则使IDTR重新指向Linux的IDT并发出一个软中断,激活Linux的中断处理函数,如果Linux处于关中断状态,则使这个中断进入等候队列。

RTLinux的调度算法

调度程序的工作,实际上就是采用某种调度算法从就绪队列中挑选出一个任务,使之投入运行,RTLinux实时内核的调度程序采用纯粹的优先级/时间驱动的调度策略,也就是说,在RTLinux中,永远是优先级最高的就绪任务投入运行,直到它将自己挂起或者有更高优先级任务就绪。如果数个任务具有相同的优先级,且它们都是就绪队列中优先级最高的任务,RTLinux调度器将按先入先出的策略进行调度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTOS论文笔记(二) 的相关文章

  • 基于深度学习的IQA论文整理

    文章目录 经典的CORNIA 经典的BRISQUE 用CNN进行质量评价的典型文章 最近的一些新颖的方法 经典的CORNIA Unsupervised Feature Learning Framework for No reference
  • 论文笔记:Adaptive Graph Convolutional Recurrent Network for Traffic Forecasting

    NIPS 2020 1 abstract intro 当前的大多数深度学习方法基于共享参数设计模型 不同节点对应同一套参数 但是 由于每条道路的具体情况不一样 使用同一套参数无法捕捉细粒度的数据模式 gt 这篇论文设计了节点自适应参数学习
  • 论文笔记:Temporal Regularized Matrix Factorization forHigh-dimensional Time Series Prediction

    0 摘要 时间序列预测问题在现代应用中变得越来越高维 如气候学和需求预测 例如 在需求预测中 项目数量可能高达50 000个 此外 数据通常是嘈杂的 充满缺失值 因此 现代应用程序需要高度可伸缩的方法 并且能够处理损坏或丢失值的噪声数据 然
  • 论文笔记:TEST: Text Prototype Aligned Embedding to ActivateLLM’s Ability for Time Series

    1 intro 1 1 背景 时间序列 TS 和大模型 LLM 的结合 设想了两种实现TS LLM的范例 LLM for TS 针对TS数据 从头开始设计并预训练一个基本的大型模型 然后为各种下游任务相应地微调模型 TS for LLM 基
  • OSAL

    OSAL为 Operating System Abstraction Layer 即操作系统抽象层 支持多任务运行 它并不是一个传统意义上的操作系统 但是实现了部分类似操作系统的功能 OSAL概念是由TI公司在ZIGBEE协议栈引入 他的意
  • 【论文翻译+笔记】Neural Machine Reading Comprehension: Methods and Trends

    1 Introduction 过去的MRC技术的特点 hand crafted rules or features 缺点 不能泛化 performance may degrade due to large scale datasets of
  • FreeRTOS系统配置文件详解

    简介 在实际使用FreeRTOS 的时候我们时常需要根据自己需求来配置FreeRTOS 而且不同架构的MCU 在使用的时候配置也不同 FreeRTOS 的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS
  • 论文笔记:DEEP DECLARATIVE DYNAMIC TIME WARPING FOREND-TO-END LEARNING OF ALIGNMENT PATHS

    个人感觉 可微DTW的主要优点作为一个损失函数 可以进行梯度反向传播 如果目标只是两个时间序列的相似度 可能不太需要 1 Intro 1 1 背景 DTW 笔记 Dynamic Time Warping 动态时间规整 DTW的python实
  • 【论文笔记】Masked Autoencoders Are Scalable Vision Learners

    论文 论文标题 Masked Autoencoders Are Scalable Vision Learners 发表于 CVPR2021 论文链接 https arxiv org pdf 2111 06377 pdf 论文代码 https
  • 关于Streamspot中StreamHash的介绍

    原文 Fast Memory efficient Anomaly Detection in Streaming Heterogeneous Graphs 在阅读这篇文章时 我对于文中所提到的StreamHash方法特别费解 在重复阅读了好几
  • 自己动手写RTOS:02-在M3内核上实现pendsvc

    自己动手写RTOS 自己动手写RTOS 01基础知识和理论部分 自己动手写RTOS 02 在M3内核上实现pendsvc 文章目录 自己动手写RTOS 一 M3内核的相关知识 1 1寄存器 1 2特殊寄存器 1 3堆栈 二 pendSVC实
  • 【核磁共振成像】部分傅里叶重建

    目录 一 部分傅里叶重建 二 部分傅里叶重建算法 2 1 填零 2 2 零差处理 一 部分傅里叶重建 在部分傅里叶采集中 数据并不是绕K空间中心对称收集的 而是K空间的一半是完全填充的 另一半只收集了一小部分数据 部分傅里叶采集所依据的原理
  • 论文笔记:Deep Learning for Anomaly Detection inTime-Series Data: Review, Analysis,and Guidelines

    2021 的paper 1 时间序列数据异常的定义 离群值 outlier 与其他观察结果偏差过大 以至于怀疑它是由不同机制产生的 时间序列的异常值 某一个 些时间片的数值值 展现出与先前时间步长显着不同的意外行为 根据之前的文献 作者将时
  • CAMELYON乳腺病理组织图像处理方式

    参考链接 https github com ilikewind CAMELYON
  • CLIP与CoOp代码分析

    CLIP与CoOp代码分析 CoOp是稍微改了下CLIP的text encoder CLIP代码 https github com OpenAI CLIP CoOp代码 https github com KaiyangZhou CoOp 输
  • Nuttx操作系统(三):构建模式

    1 1 Nuttx构建配置以及模式 Nuttx有三种不同的构建配置 FLAT构建 这种构建是所代码驻留在公共地址空间中 1 应用 内核以及board logic在一个flat地址环境中 2 所有的地址空间具有相同的属性 PROTECTED构
  • 像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?

    谁能告诉我 CAS 软件怎么样http www ptlsim org 工作 如果不知道每条指令使用了多少个周期 也不知道 CPU 分支预测逻辑 那么它们如何实现周期精度 或者一切都可以通过保密协议获得吗 我想它们可能可以非常准确地命中或错过
  • 多线程嵌入式软件中的原子操作

    我一直在用 C 语言开发基于 RTOS 的嵌入式软件 并且遇到了有关从多个线程访问共享资源的问题 我有两个问题 第一个是在状态机中设置和获取状态变量的值 下面是 StateMachine object 的头文件 typedef enum S
  • RT-Thread 内核基础(六)

    RT Thread内核配置示例 RT Thread的一个重要特性是高度可裁剪性 支持对内核进行精细调整 对组件进行灵活拆卸 配置主要是通过修改工程目录下的rtconfig h文件来进行 用户可以通过打开 关闭该文件中的宏定义来对代码进行条件
  • RT-Thread 内核基础(五)

    使用static修饰全局变量作用 限制作用域 如果全局变量前面加上 static 关键字 那么该变量的作用域将被限制在声明它的源文件中 即它将成为一个文件作用域的静态变量 其它源文件无法访问这个变量 这对于控制变量的可见性和避免命名冲突是有

随机推荐

  • C语言学习笔记——(2)数组

    数组 1 什么是是数组2 数组的定义2 1数组的表达2 2数组的含义2 3数组的大小 xff1a 3 字符数组4 字符串操作5 二维数组 1 什么是是数组 数组是指有序的元素序列 如果将有限个类型相同的变量的集合命名 xff0c 那么这个名
  • 多线程编程实验

    xff08 一 xff09 查看下列程序并运行 xff0c 掌握如何通过扩展Thread类创建线程 span class token keyword package span span class token namespace case1
  • 实验一:基于Ubuntu系统实现无人机自主飞行

    ps xff1a 为避免出现错误 xff0c 在进行新的一步时 xff0c 需要关闭由于上一步操作打开的终端 xff0c 并开启一个新的终端 例如 xff1a 在开始第5步 安装MAVROS 之前 xff0c 关闭由于第3步 安装ROS 打
  • 5000字学习C语言错误处理的四种方式。

    C错误处理 在C语言中 xff0c 错误处理是一个非常重要的主题 通常情况下 xff0c 程序员需要在代码中处理错误 xff0c 以保证程序能够在出现错误时正确地处理这些情况 C语言中常见的错误类型包括 xff1a 语法错误 逻辑错误 运行
  • yum 源制作

    YUM介绍 YUM主要用于自动升级 安装 移除 rpm 软件包 xff0c 它能自动查找并解决 rpm 包之间的依赖关系 xff0c 要成功的使用 YUM 工具更新系统和软件 xff0c 需要有一个包含各种 rpm 软件包的 reposit
  • MATLAB021b与VS2022混编

    MATLAB2021b与VS2022混编 前言 目前在做一个大创项目 xff0c 其中用到关于Matlab与C的混合编程 xff0c 特此记录 Matlab2021b 如图所示 xff0c 红线划出的是即将使用的 c函数 xff0c 在左侧
  • 香橙派5使用NPU加速yolov5的实时视频推理(一)

    前言 xff1a 寒假里 xff0c 博主完成了树莓派4B搭载yolofastest V2的ncnn加速 xff0c 效果挺不错的 xff0c 但总感觉还是稍微差点意思 xff0c 于是就购买了一块香橙派5 xff0c 想要用RK3588芯
  • 香橙派5使用NPU加速yolov5的实时视频推理(二)

    三 将best onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20 04系统中了 xff0c 我的Ubuntu系统中已经下载好了anaconda xff0c 使用anaconda的好处就是可以方便的安装一些库 xff0c 而且
  • 【STM32学习】——串口通信协议&STM32-USART外设&数据帧/输入数据策略/波特率发生器&串口发送/接受实操

    文章目录 前言一 串口通信1 通信接口2 串口通信 xff08 1 xff09 串口简介 xff08 2 xff09 串口硬件电路 xff08 3 xff09 串口软件部分 二 STM32的USART外设1 USART简介2 图示详解 三
  • 【STM32学习】——USART串口数据包&HEX/文本数据包&收发流程&串口收发HEX/文本数据包实操

    文章目录 前言一 数据包格式 xff08 江科大规定 xff09 1 HEX数据包2 文本数据包3 两者对比 二 数据包收发流程1 HEX数据包接收 xff08 只演示固定包长 xff09 2 文本数据包接收 xff08 只演示可变包长 x
  • buuctf simplerev 中的小头位序

    33条消息 BUUCTF SimpleRev xff08 涉及大小端序存储的问题 xff09 Ireb9z的博客 CSDN博客 buuctfsimplerev https blog csdn net afanzcf article deta
  • 简要分析网络编程——UDP编程

    计算机网络是指两台或更多的计算机组成的网络 xff0c 在同一个网络中 xff0c 任意两台计算机都可以直接通信 xff0c 因为所有计算机都需要遵循同一种网络协议 网络编程中有很多协议 xff0c 如 xff0c TCP协议 UDP协议
  • 数据结构之二叉树 Python实现

    树 树是一种非线性的数据结构 树 xff0c 它是若干结点的集合 xff0c 是由唯一的根和若个棵互不相交的子树组成的 其中 xff0c 每一棵子树又是一棵树 xff0c 也是由唯一的根结点和若干棵互不相交的子树组成的 由此可知 xff0c
  • 《奔跑吧Linux内核(第二版)》第四章笔记

    内核配置 内核配置工具常见的有 xff1a make config make oldconfig make menuconfig 内核配置工具最终会在Linux内核源码的根目录下生成一个隐藏文件 config文件 xff0c 这个文件包含了
  • GDB+QEMU调试Linux内核

    1 使用qemu创建虚拟机 使用qemu创建ARM64架构虚拟机可以参考我的另一篇博客 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08 二 xff09 2 安装gdb multiarch工具包 span
  • centos7 HA

    本文以两台机器实现双集热备高可用集群 xff0c 主机名node1的IP为192 168 122 168 xff0c 主机名node2的IP为192 168 122 169 一 安装集群软件 必须软件pcs xff0c pacemaker
  • 《奔跑吧Linux内核(第二版)》第五章笔记

    Linux内核采用宏内核架构 xff0c 即操作系统的大部分功能都在内核中实现 xff0c 比如进程管理 内存管理 进程调度 设备管理等 xff0c 并且都在特权模式下 xff08 内核空间 xff09 运行 而与之相反的另一种流行的架构是
  • 交叉编译内核模块

    本实验在x86环境中交叉编译ARM64架构模块 xff0c 然后qemu启动ARM64架构虚拟机 xff0c 加载该模块运行 1 创建ARM64虚拟机 详见 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08
  • Linux内核模块相互调用

    编写一个内核模块A xff0c 通过导出模块符号的方式来实现接口函数 编写另一个内核模块B xff0c 调用内核模块A暴露出来的接口函数 1 源文件 内核模块A xff08 test A c xff09 span class token m
  • RTOS论文笔记(二)

    李在林 韩宏克 嵌入式Linux实时性分析及改造 2010 Linux 的实时性测试 中断延迟测试 在Linux中 xff0c 内核或驱动程序显式地关 开中断 xff0c 一般是通过调用 cli sti 来进行操作的 在调用 cli 时 x