精华内容
下载资源
问答
  • Linux RTOS 有什么区别

    千次阅读 2020-10-30 21:00:00
    关注+星标公众号,不错过精彩内容作者 | arvin来源 | CSDN(ID:CSDNnews)你知道哪个操作系统是世界上最受欢迎的操作系统吗?是Linux!它一般运行于服务器超级计算...

    关注+星标公众,不错过精彩内容

    作者 | arvin

    来源 | CSDN(ID:CSDNnews)

    你知道哪个操作系统是世界上最受欢迎的操作系统吗?是Linux!它一般运行于服务器和超级计算机上,我们日常访问网站背后的数百万台服务器很有可能运行着的操作系统就是Linux。在本文中,我们将学习Linux是什么以及它来自何处,常用的Linux知识以及想要在这个令人兴奋的平台上畅游所需的命令。

    1

    什么是Linux?

    就像Windows或Apple的mac OS一样,Linux也是一个操作系统。操作系统是管理计算机中不同设备和应用程序软件的集合。举例来说,其中的部分软件负责着关闭、启动计算机,有些软件提供与键盘和鼠标等设备交互界面等功能。

    学习使用Linux系统是熟悉命令行的绝佳机会,命令行是与计算机进行通信的最明确的方式。此外,当你尝试不同的项目时,你将会学习软件仓库,程序包管理,文件权限,用户管理等更多信息。如果你有使用npm和GitHub的经验,那么程序包管理和软件仓库可能是你已经熟悉的概念。

    2

    为什么Linux如此流行?

    Linux在企业计算,大数据和科学(联想下超级计算机)世界中独树一帜。主要原因如下

    • Linux是免费的。你不需要为使用Linux而付费,你可以自由查看,编辑和分发源代码。当你购买装有Windows或macOS的计算机时,这些操作系统的费用其实已包含在价格中。

    • Linux是灵活的。Linux被用于许多不同类型的计算机中,包括智能烤面包机和冰箱,其他物联网设备,互联网路由器,Android智能手机等,简直不胜枚举。你现在可以立即在笔记本电脑或台式机上安装Linux,而无需进行任何设置即可启动和运行!这种灵活性之所以成为可能,是因为Linux操作系统被设计为既可以简单地完成一项工作又能使用功能更完善的工具来完成工作。你可以组装一个适用于你的设备并针对你的需求进行过优化的Linux版本。

    3

    Unix哲学

    Linux是一个“类Unix”操作系统,这意味着它的大部分功能派生自Unix操作系统,并且通常遵循Unix的设计原则。理想的Unix程序是简单,模块化和可扩展的。Unix程序确实能很好地完成一些任务,并且被设计为可以与其他程序很好地协同工作,而不必依赖太多其他程序。该系统通过利用程序的协作而变得强大,而不是因为程序本身超级强大。

    关于Linux,我最喜欢的一点是一切都是文件。你在终端中运行的命令和程序被抽象成文件。用来快速打开自己喜欢的应用程序的桌面图标也被抽象成文件。系统检查应用程序更新的代码库如何处理?当然也是写在文件里。所有可能导致混乱的都可以用文件解决。Linux就是这么透明、富有动力和优雅。你可以想象一下,你可以随心设置自己的Linux安装程序,同时拥有对系统的完全控制权,只要你想要的,完全甩掉你不想要的,这非常酷炫!

    这些原则如实地说明了Linux的灵活性。怪不得它被用于许多应用中。

    4

    一切都是文件,文件是一切的最终归宿

    接下来,我将向你展示Linux中的典型系统树或文件系统层次结构。你可以在我的其他文章中(https://dev.to/emtes/learning-data-structures-trees-2p5g)阅读有关树状数据结构的更多信息。如果你要在自己的Linux系统上进行操作,你的目录可能跟我的不完全一样,可能具有更多或更少的目录。如果你想详细了解这些目录(文件夹),请在Linux终端中敲入man hier并运行该命令来阅读手册。我个人的习惯是,将喜欢的搜索引擎放在附近,以随时查找我不知道含义的新名称。

    / 这是根目录(文件夹),文件系统树(数据结构????)的根

    /bin 包含二进制文件,系统启动需要的可执行程序

    /boot 包含机器启动时所需的内核和文件

    /dev包含设备节点,与连接到计算机的物理设备一起使用的指令/接口

    /etc包含系统范围的配置文件(发音为etsy),大型软件包(如gtk,python,X11)一般也在此处存储配置文件。

    /home 包含系统用户的目录(每个用户的下载,图片等)

    /lib 包含启动计算机的核心程序所必需的共享库

    /lost+found 包含由于系统崩溃或驱动器错误而放错位置的数据

    /media 包含用于USB,CD和DVD等媒体设备的安装点

    /mnt 是临时文件系统的挂载点(例如用来安装系统的内容)

    /opt包含程序的其他程序包。在我的机器中,Google Chrome和Minecraft Launcher将文件保存在此处。

    /proc 包含与内核和正在运行的进程有关的文件

    /tmp 包含在执行程序时可能创建的临时文件

    /usr包含一个次要的只读系统树,用于与某些程序共享或用于安装在其他Linux系统上。上面存在许多目录也存在这里,并包含一些其他文件

    /var 包含随时间变化其大小发生变化的文件,例如日志和备份

    如果你经常使用Linux,可能偶尔会觉得需要在某个奇怪的目录中编辑或写入文件。我希望当你知道这些目录名称的通常含义后可以对你有所帮助!

    5

    命令行基础

    之前我说过“与Linux机器通信的最明确的方法是命令行”,我是认真的。接下来,让我们开始学习一些基本的命令行或终端命令,这些命令将使你开始熟悉系统。如果你当前使用图形用户界面进行开发,当你熟悉命令行后,你可能会发现从终端执行操作会更加快捷和安全。

    你和终端之间有一个名为shell(可以理解为操作系统内核外围的壳)的程序。Shell是解释文本命令并将其发送到操作系统以执行的程序。最常见的shell程序是Bash,大多数Linux发行版中都包含该程序。对于macOS用户来说,Apple最近将macOS的Shell程序切换为zsh。macOS实际上也是一个类似Unix的操作系统。当然你也可以随意更改shell!

    6

    终端命令的结构

    因为文章已经论述的够多了,所以我不会在这篇文章中分享太多命令,要注意的是学习模式更为重要。通常,终端命令遵循非常相似且可预测的结构:

    program_name [--optional flags] [optional arguments]

    标志(flag)可以出现在参数之后,并且通常缩短到一个字母和一个破折号,例如-f。标志是更改程序行为方式的选项。比如-h或者--help是常用的帮助性质的标志,程序收到该标志后会提供给你哪些标志可供使用的信息。

    参数通常是文件,但也可以是字符串和数字。

    你可以从系统中任何目录调用程序,也可以将系统中任何目录的文件用作参数。你可以这么做的原因是你可以在Linux中使用相对或绝对路径来命名文件。相对路径是相对于当前目录的,你可以使用.表示当前目录(下文会详述)。绝对路径从系统根目录/开始,你需要指明每一级的目录以获取所需的文件。

    7

    命令索引

    • pwd 打印你当前所在的目录(print working directory,即打印工作目录)

    • cd将目录更改为你指定的参数(changes directory)。如果不提供任何参数,则默认进入用户目录,你也可以在路径中使用~进行跳转。.和.. 分别代表当前目录和父目录,并且也是cd命令的有效的参数。

    • ls列出指定参数目录中的文件(list),默认参数为当前目录,即.。该-a标志可以非常方便地查看隐藏文件。在linux中,你可以通过以.开头的文件名称来隐藏文件以减少混乱,示例如.gitignore。

    ls -a ~/Documents
    

    8

    文件操作

    • mv 将文件或目录移动到你指定的目录(move)。

    mv fun-letter.text ~/Documents/letters/
    
    

    你还可以使用mv重命名文件和目录:

    mv fun-letter.txt hilarious-letter.txt
    
    

    其含义就是将其移动到名为新名称的位置

    • cp在指定目录中复制文件(copy)。使用-r标志递归复制目录,就像使用mv重命名文件一样,你可以使用类似的方法来重命名文件和目录。

    • mkdir创建新目录,其中新目录名称作为参数。你还可以使用-p标志在尚不存在的目录下建立新目录。

    mkdir -p code/web-stuff/html notes
    
    
    • touch 创建新文件,其中文件名称作为参数。

    你很快就会发现自己想要做更复杂的事情,因此请阅读这些命令的更多信息并保留备忘单????。

    8

    日常使用的Linux

    我不会说2020年将是Linux在台式机世界的元年,但我要分享的是,有许多Linux发行版已经能够做到开箱即用,我们可以使用非常简单的方法进行安装。如果你被Shell的功能所吸引,或者担心使用其他操作系统带来的隐私泄露风险,或者只是喜欢黑客攻击等技术,那么Linux很适合你。作为开发人员,这也是一个很棒的平台,因为它是在考虑其他开发人员的情况下制作的。Linux发行版(例如Ubuntu,Linux Mint和Fedora)可以快速启动并运行。这些发行版背后有着庞大的社区支持,社区成员很愿意帮助他人。我最后想提醒的是,记住备份所有重要的文件!

    ------------ END ------------

    推荐阅读:

    SEGGER的三款RTOS有什么特点?

    Keil MDK如何将变量存储在指定内存地址

    几款优秀的支持C、C++等多种语言的在线编译器

    关注微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。

    长按前往图中包含的公众号关注

    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看

    展开全文
  • 对实时操作系统(RTOS)特性进行比较分析。对于我们刚接触这个操作系统时一定要对他们要有一定的了解,我们先对实时操作系统来了解下,它就是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的...
  • 自己根据自己掌握的知识写得一个小对比,比较适合初级入门者,大神勿喷!
  • RTOSlinux区别

    万次阅读 2016-09-20 17:40:27
    嵌入式Linux 系统是在原来Linux的发行版本之上进行了优化改进的,用于嵌入式的移动终端等设备的嵌入式Linux系统现在基本上都是实时性较高的,但有些LiNUX系统还是分时系统,实时操作系统 实时操作系统 ...

    一句话解释:
    linux是分时系统,不过可以通过配置内核改成实时。
    嵌入式Linux 系统是在原来Linux的发行版本之上进行了优化和改进的,用于嵌入式的移动终端等设备的嵌入式Linux系统现在基本上都是实时性较高的,但有些LiNUX系统还是分时系统,


    实时操作系统  实时操作系统
      英文称Real Time Operating System,简称RTOS。
      1.实时操作系统定义
       实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系 统作出快速响应,并控制所有实时任务协调一致运行的操作系统。因而,提供及时响应和高可靠性是其主要特点。实时操作系统有硬实时和软实时之分,硬实时要求 在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改 变之后就可以变成实时操作系统。
      实时操作系统是保证在一定时间限制内完成特定功能的操作系统。例如,可以为确保生产线上的机器人能获取某个物 体而设计一个操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,生产线仍然 能继续工作,但产品的输出会因产品不能在允许时间内到达而减慢,这使机器人有短暂的不生产现象。一些实时操作系统是为特定的应用设计的,另一些是通用的。 一些通用目的的操作系统称自己为实时操作系统。但某种程度上,大部分通用目的的操作系统,如微软的Windows NT或IBM的OS/390有实时系统的特征。这就是说,即使一个操作系统不是严格的实时系统,它们也能解决一部分实时应用问题。
      2.实时操作系统的特征
      1)多任务;
      2)有线程优先级
      3)多种中断级别
      小的嵌入式操作系统经常需要实时操作系统,内核要满足实时操作系统的要求。
      3.实时操作系统的相关概念
      (1)基本概念
      代码临界段:指处理时不可分割的代码。一旦这部分代码开始执行则不允许中断打入;
      资源:任何为任务所占用的实体;
      共享资源:可以被一个以上任务使用的资源;
      任务:也称作一个线程,是一个简单的程序。每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。典型地,每个任务都是一个无限的循环,每个任务都处在以下五个状态下:休眠态,就绪态,运行态,挂起态,被中断态;
      任务切换:将正在运行任务的当前状态(CPU寄存器中的全部内容)保存在任务自己的栈区,然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行;
      内核:负责管理各个任务,为每个任务分配CPU时间,并负责任务之间通讯。分为不可剥夺型内核于可剥夺型内核;
      调度:内核的主要职责之一,决定轮到哪个任务运行。一般基于优先级调度法;
      (2)关于优先级的问题
      任务优先级:分为优先级不可改变的静态优先级和优先级可改变的动态优先级;
      优先级反转:优先级反转问题是实时系统中出现最多的问题。共享资源的分配可导致优先级低的任务先运行,优先级高的任务后运行。解决的办法是使用“优先级继承”算法来临时改变任务优先级,以遏制优先级反转。
      (3)互斥
      虽然共享数据区简化了任务之间的信息交换,但是必须保证每个任务在处理共享共享数据时的排他性。使之满足互斥条件的一般方法有:关中断,使用测试并置位指令(TAS),禁止做任务切换,利用信号量。
      因为采用实时操作系统的意义就在于能够及时处理各种突发的事件,即处理各种中断,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑应该是中断响应时间了。中断响应时间通常被定义为:
      中断响应时间=中断延迟时间+保存CPU状态的时间+该内核的ISR进入函数的执行时间[2]。

      中断延迟时间=MAX(关中断的最长时间,最长指令时间) + 开始执行ISR的第一条指令的时间[2]。

    分时操作系统  【词语】:分时操作系统
      【注音】:fēn shí cāo zuò xì tǒng
      【英文】:Time-sharing Operating System
       【释义】:使一台计算机同时为几个、几十个甚至几百个用户服务的一种操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空 间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户的感觉就像他独占计算机一样。分时操作系统的特点是可有效增加资源的 使用率。例如UNIX系统就采用剥夺式动态优先的CPU调度,有力地支持分时操作。
      产生分时系统是为了满足用户需求所形成的一种新型 OS 。它与多道批处理系统之间,有着截然不同的性能差别。用户的需求具体表现在以下几个方面: 人—机交互 共享主机 便于用户上机
      分时系统的基本思想
      时间片 :是把计算机的系统资源(尤其是 CPU时间)进行时间上的分割,每个时间段称为一个时间片,每个用户依次轮流使用时间片。
      分时技术:把处理机的运行时间分为很短的时间片,按时间片轮流把处理机分给各联机作业使用。
      分时操作系统:是一种联机的多用户交互式的操作系统。一般采用时间片轮转的方式使一台计算机为多个终端服务。对每个用户能保证足够快的响应时间,并提供交互会话能力。
      设计目标: 对用户的请求及时响应,并在可能条件下尽量提高系统资源的利用率。
      适合办公自动化、教学及事务处理等要求人机会话的场合。
      工作方式:
      一台主机连接了若干个终端;每个终端有一个用户在使用;交互式地向系统提出命令请求;系统接受每个用户的命令;采用时间片轮转方式处理服务请求;并通过交互方式在终端上向用户显示结果;用户根据上步结果发出下道命令
      分时系统实现中的关键问题:及时接收。及时处理。
      特征:
      交互性:用户与系统进行人机对话。
      多路性:多用户同时在各自终端上使用同一CPU。
      独立性:用户可彼此独立操作,互不干扰,互不混淆。
      及时性:用户在短时间内可得到系统的及时回答。

      影响响应时间的因素:终端数目多少、时间片的大小、信息交换量、信息交换速度。

    例子:
    分时——现在流行的PC,服务器都是采用这种运行模式,即把CPU的运行分成若干时间片分别处理不同的运算请求
    实时——一般用于单片机上,比如电梯的上下控制中,对于按键等动作要求进行实时处理

    linux是分时系统,不过可以改成实时的如:UCOS就是linux修改而来的实时系统,至于他们的区别,下以引用百度中的类似回答,个人感觉简单明了:“分时系统是 一个系统可以同时为两个或两个以上的账户服务!
    实时系统 是能立即对指令做出反应的操作系统!微软的常见系统不能吧!而且还死机!战斗机中的操作系统就是实时的系统,想想如果别人打仗时战斗机中的电脑反应的是飞行员上一条指令或死机了,谁还敢开这架飞机呢?”

    以下对四种实时操作系统(RTOS)特性进行分析和比较。它们是:Lynx实时系统公司的LynxOS、QNX软件系统有限公司的QNX以及两种具有代表性的实时Linux–新墨西哥工学院的RT-Linux和堪萨斯大学的KURT-Linux。
      近年来,实时操作系统在多媒体通信、在线事务处理、生产过程控制、交通控制等各个领域得到广泛的应用,因而越来越引起人们的重视。
      1、基本特征概述
      QNX是一个分布式、嵌入式、可规模扩展的实时操作系统。它遵循POSIX.1、(程序接口)和POSIX.2(Shell和工具)、部分遵循POSIX.1b(实时扩展)。它最早开发于1980年,到现在已相当成熟。
      LynxOS是一个分布式、嵌入式、可规模扩展的实时操作系统,它遵循POSIX.1a、POSIX.1b和POSIX.1c标准。它最早开发于1988年。
      RT-Linux是一个嵌入式硬实时操作系统,它部分支持POSIX.1b标准。
      KURT-Linux不是为嵌入式应用设计的,不同于硬(hard)实时/软(soft)实时应用,他们提出”严格(firm)”实时应用的概念,如一些多媒体应用和ATM网络应用,KURT是为这样一些应用设计的”严格的”实时系统。
      2、体系结构异同
      实时系统的实现多为微内核体系结构,这使得核心小巧而可靠,易于ROM固化,并可模块化扩展。微内核结构系统中,OS服务模块在独立的地址空间 运行,所以,不同模块的内存错误便被隔离开来。但它也有弱点,进程间通信和上下文切换的开销大大增加。相对于大型集成化内核系统来说,它必须靠更多地进行 系统调用来完成相同的任务。
      QNX是一个微内核实时操作系统,其核心仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX核心非常小巧(QNX4.x大约为12Kb)而且运行速度极快。
      LynxOS目前还不是一个微内核结构的操作系统,但它计划使用所谓的”Galaxy”技术将其从大型集成化内核改造成微内核,这一技术将在 LynxOS 3.0中引入。新的28Kb微内核提供以下服务:核心启动和停止、底层内存管理、出错处理、中断处理、多任务、底层同步和互斥支持。
      RT-Linux实现了一个小的实时核心,仅支持底层任务创建、中断服务例程的装入、底层任务通信队列、中断服务例程(ISR)和Linux进 程。原来的非实时Linux核心作为一个可抢先的任务运行于这个小核心之上,所有的任务都在核心地址空间运行。它不同于微内核和大型内核,属于实时 EXE(realtime executive)体系结构。其可靠性和可维护性对电信服务系统来说都不够理想。
      KURT-Linux核心包括两个部分:内核和实时模块。内核负责实时事件的调度,实时模块为用户进程提供特定的实时服务。它不属于微内核结构。
      3、调度策略分析
      任务调度策略是直接影响实时性能的因素。尽管调度算法多种多样,但大多由单调率算法(RM)和最早期限优先算法(EDF)变化而来。前者主要用 于静态周期任务的调度,后者主要用于动态调度,在不同的系统状态下两种算法各有优劣。在商业产品中采用的实际策略常常是各种因素的折中。
      QNX 提供POSIX.1b标准进程调度:
      32个进程优先级;
      抢占式的、基于优先级的正文切换;
      可选调度策略:FIFO、轮转策略、适应性策略。
      LynxOS 其调度策略为:
      LynxOS支持线程概念,提供256个全局用户线程优先级;
      硬实时优先级调度:在每个优先级上实现了轮转调度、定量调度和FIFO调度策略;
      快速正文切换和阻塞时间短;
      抢占式的RTOS核心。
      RT-Linux
      在操作系统之下实现了一个简单的实时核心,Linux本身作为一个可抢占的任务在核内运行,优先级最低,随时会被高优先级任务抢占。
      用户可自行编写调度程序,它们可实现为可加载的核心模块;
      已实现的调度程序有:基于优先级的抢占式调度和EDF调度;
      基于优先级的调度使用”单调率算法”,它直接支持周期任务。
      KURT-Linux
      可运行在两种状态之下:通常状态和实时状态。在通常状态下,所有进程都可以运行,但某些核心服务将带来中断屏蔽的不可预期性。实时模式只允许实时进程运行。
      支持FIFO调度策略、轮转调度策略和UNIX分时调度策略;
      增加了SCHED-KURT调度策略,这是一种静态调度策略,使用一个特殊的调度文件记录预先定义好的待调度进程的参数。
      从以上简略描述可以看出,前三种调度策略实现较规范,特别是两种商业RTOS,遵循或部分遵循POSIX.1b实时调度标准。
     4、操作系统服务比较
      4.1 QNX的系统服务:
      多种资源管理器,包括各种文件系统和设备管理,支持多个文件系统同时运行,包括提供完全POSIX.1及UNIX语法的POSIX文件系统,支 持多种闪存设备的嵌入式文件系统,支持对多种文件服务器(如Windows NT/95、LAN Manager等)的透明访问的SMB文件系统、DOS文件系统、CDROM文件系统等。
      设备管理。在进程和终端设备间提供大吞吐量、低开销接口服务。
      图形/窗口支持。包括QNX Windows、X Window System for QNX、对MS Windows NT/95和X Window系统的远程图形连接。
      TCP/IP for QNX。
      高性能、容错型QNX网络–FLEET,使得所有连入网络的计算机变成一个逻辑上的超级计算机。
      透明的分布式处理。FLEET网络处理与消息传递和进程管理原语的集成,将本地和网络IPC统一起来,使得网络对IPC而言是透明的。
      4.2 LynxOS的系统服务:
      网络和通信。由于使用UNIX/POSIX API,Lynx很适合于数据通信和Internet应用。又由于系统的开放性,网络软件很容易移植到Lynx上。同样,Lynx亦提供关键的电话通信协议,使之适用于电信系统的基础架构、操作和多媒体应用。
      TCP/IP协议栈。Lynx自带优化的TCP/IP协议栈,提供高性能服务,如TCP头预测、高级路由算法、IP级多址广播和链路级高速缓冲。
      Internet工具。包括,Telnet、Ftp、tftp、PPP、SLIP、实时调度的嵌入式Java虚拟机、嵌入式HTTP server、bootp、ARP/RARP、DNS域名服务、电子邮件、Perl、电话通信协议等。
      SVR3流。LynxOS流机制为开发和移植基于流的驱动程序和应用提供了核心支持。
      文件系统。实时的类UNIX层次结构文件系统:连续结构文件、带缓冲/不带缓冲、原始分区和原始设备访问。
      基于Motif的图形用户接口。
      分布式计算资源。SCMP与VME总线上的多处理结合,PCI桥服务、CompactPCI Hot-swap Services、Lynx/HA-DDS分布式数据系统。
      4.3 Linux的系统服务:
      近来,很多基于Linux的实时应用被开发出来,它具有成熟和丰富的资源。
      UNIX用户的开发工具和应用软件都被移植到Linux上。
      TCP/IP网络协议。
      各种Internet客户/服务端软件。
      X Window。
      C/C++、Java等语言编译器。
      上述系统的共同点是都提供了图形界面、各种网络支持等必要工具。QNX是一个更加符合传统”分布式”概念的操作系统,目标是把整个局域网变成一 个大的超级计算机,使得网络的存在对用户透明,文件系统提供的服务也很丰富。但是,分布式的程度越高也意味着系统开销的增大。LynxOS则着意于提供丰 富的网络服务,而Linux的最大优势则是经济,还可以通过新闻组或mailing
      5、系统开放性对比
      对于很多大、中型系统来说,大多数软件都是为UNIX平台编写的,因此RTOS是否提供POSIX/UNIX API就显得很重要。
      5.1 QNX的开放性
      QNX的POSIX兼容性和其提供的UNIX特色的编译器、调试器、X Window和TCP/IP都是UNIX程序员所熟悉的。
      支持多种CPU:AMD ElanSC300/310/400/410、Am386 DE/SE、Cyrix MediaGX、x86处理器(386以上)、Pentium系列、STMicroelectronics 的STPC。
      多种总线:CompactPCI、EISA、ISA 、MPE (RadiSys)、STD、STD 32、PC/104、PC/104-Plus、PCI、PCMCIA、VESA、VME。
      各种外设:多种SCSI设备、IDE/EIDE驱动器、10M/100M以太网卡、Token Ring网卡、FDDI接口卡、多种PCMCIA设备、闪存、声卡等等。
      5.2 LynxOS的开放性
      POSIX.1a、1b、1c及BSD4.4等兼容性,使得遵循POSIX 1003或用于UNIX的程序很容易移植到LynxOS上。
      支持多种CPU主板:包括CompactPCI(6U/3U)和标准PCI、VME/Eurobus、PC/104和PC/AT硬件等。
      各种外设适配器:10/100BaseT Ethernet、SCSI接口、单/多通道串行控制器、单/双工并行口、时钟、计时器、IDE接口、高分辨率显示适配器等。
      5.3 Linux的开放性
      用户可得到UNIX的全部开发工具。
      可使用市场上便宜又常见的硬件。
      通过分析,可以看到以上系统各有优势,因此,在平台搭造过程中,用户应根据自己的实际需要并结合性能价格比进行选择。

    展开全文
  • RTOS系统与Linux系统的区别

    万次阅读 多人点赞 2016-12-30 00:57:49
    Linux是时分系统,不过可以通过配置内核改成实时系统 实时操作系统  英文称Real Time Operating System,简称RTOS。  1.实时操作系统定义  实时操作系统(RTOS)是指当外界事件或数据产生时,能够...

    RTOS是实时操作系统

    Linux是时分系统,不过可以通过配置内核改成实时系统


    实时操作系统
      英文称Real Time Operating System,简称RTOS。

      1.实时操作系统定义
       实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系 统作出快速响应,并控制所有实时任务协调一致运行的操作系统。因而,提供及时响应和高可靠性是其主要特点。实时操作系统有硬实时和软实时之分,硬实时要求 在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改 变之后就可以变成实时操作系统。
      实时操作系统是保证在一定时间限制内完成特定功能的操作系统。例如,可以为确保生产线上的机器人能获取某个物 体而设计一个操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,生产线仍然 能继续工作,但产品的输出会因产品不能在允许时间内到达而减慢,这使机器人有短暂的不生产现象。一些实时操作系统是为特定的应用设计的,另一些是通用的。 一些通用目的的操作系统称自己为实时操作系统。但某种程度上,大部分通用目的的操作系统,如微软的Windows NT或IBM的OS/390有实时系统的特征。这就是说,即使一个操作系统不是严格的实时系统,它们也能解决一部分实时应用问题。
      2.实时操作系统的特征
      1)多任务;
      2)有线程优先级
      3)多种中断级别
      小的嵌入式操作系统经常需要实时操作系统,内核要满足实时操作系统的要求。
      3.实时操作系统的相关概念
      (1)基本概念
      代码临界段:指处理时不可分割的代码。一旦这部分代码开始执行则不允许中断打入;
      资源:任何为任务所占用的实体;
      共享资源:可以被一个以上任务使用的资源;
      任务:也称作一个线程,是一个简单的程序。每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。典型地,每个任务都是一个无限的循环,每个任务都处在以下五个状态下:休眠态,就绪态,运行态,挂起态,被中断态;
      任务切换:将正在运行任务的当前状态(CPU寄存器中的全部内容)保存在任务自己的栈区,然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行;
      内核:负责管理各个任务,为每个任务分配CPU时间,并负责任务之间通讯。分为不可剥夺型内核于可剥夺型内核;
      调度:内核的主要职责之一,决定轮到哪个任务运行。一般基于优先级调度法;
      (2)关于优先级的问题
      任务优先级:分为优先级不可改变的静态优先级和优先级可改变的动态优先级;
      优先级反转:优先级反转问题是实时系统中出现最多的问题。共享资源的分配可导致优先级低的任务先运行,优先级高的任务后运行。解决的办法是使用“优先级继承”算法来临时改变任务优先级,以遏制优先级反转。
      (3)互斥
      虽然共享数据区简化了任务之间的信息交换,但是必须保证每个任务在处理共享共享数据时的排他性。使之满足互斥条件的一般方法有:关中断,使用测试并置位指令(TAS),禁止做任务切换,利用信号量。
      因为采用实时操作系统的意义就在于能够及时处理各种突发的事件,即处理各种中断,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑应该是中断响应时间了。中断响应时间通常被定义为:
      中断响应时间=中断延迟时间+保存CPU状态的时间+该内核的ISR进入函数的执行时间[2]。
      中断延迟时间=MAX(关中断的最长时间,最长指令时间) + 开始执行ISR的第一条指令的时间[2]。



    分时操作系统  
      英文:Time-sharing Operating System
       释义:使一台计算机同时为几个、几十个甚至几百个用户服务的一种操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空 间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户的感觉就像他独占计算机一样。分时操作系统的特点是可有效增加资源的 使用率。例如UNIX系统就采用剥夺式动态优先的CPU调度,有力地支持分时操作。
      产生分时系统是为了满足用户需求所形成的一种新型 OS 。它与多道批处理系统之间,有着截然不同的性能差别。用户的需求具体表现在以下几个方面: 人—机交互 共享主机 便于用户上机
      分时系统的基本思想
      时间片 :是把计算机的系统资源(尤其是 CPU时间)进行时间上的分割,每个时间段称为一个时间片,每个用户依次轮流使用时间片。
      分时技术:把处理机的运行时间分为很短的时间片,按时间片轮流把处理机分给各联机作业使用。
      分时操作系统:是一种联机的多用户交互式的操作系统。一般采用时间片轮转的方式使一台计算机为多个终端服务。对每个用户能保证足够快的响应时间,并提供交互会话能力。
      设计目标: 对用户的请求及时响应,并在可能条件下尽量提高系统资源的利用率。
      工作方式:
      一台主机连接了若干个终端;每个终端有一个用户在使用;交互式地向系统提出命令请求;系统接受每个用户的命令;采用时间片轮转方式处理服务请求;并通过交互方式在终端上向用户显示结果;用户根据上步结果发出下道命令
      分时系统实现中的关键问题:及时接收。及时处理。
      特征:
      交互性:用户与系统进行人机对话。
      多路性:多用户同时在各自终端上使用同一CPU。
      独立性:用户可彼此独立操作,互不干扰,互不混淆。
      及时性:用户在短时间内可得到系统的及时回答。
      影响响应时间的因素:终端数目多少、时间片的大小、信息交换量、信息交换速度。


    例子:

    分时—— 现在流行的PC,服务器都是采用这种运行模式,即把CPU的运行分成若干时间片分别处理不同的运算请求
    实时—— 一般用于单片机上,比如电梯的上下控制中,对于按键等动作要求进行实时处理


    以下对四种实时操作系统(RTOS)特性进行分析和比较。它们是:Lynx实时系统公司的LynxOS、QNX软件系统有限公司的QNX以及两种具有代表性的实时Linux--新墨西哥工学院的RT-Linux和堪萨斯大学的KURT-Linux。

      近年来,实时操作系统在多媒体通信、在线事务处理、生产过程控制、交通控制等各个领域得到广泛的应用,因而越来越引起人们的重视。

      1、基本特征概述

      QNX是一个分布式、嵌入式、可规模扩展的实时操作系统。它遵循POSIX.1、(程序接口)和POSIX.2(Shell和工具)、部分遵循POSIX.1b(实时扩展)。它最早开发于1980年,到现在已相当成熟。
      LynxOS是一个分布式、嵌入式、可规模扩展的实时操作系统,它遵循POSIX.1a、POSIX.1b和POSIX.1c标准。它最早开发于1988年。
      RT-Linux是一个嵌入式硬实时操作系统,它部分支持POSIX.1b标准。
      KURT-Linux不是为嵌入式应用设计的,不同于硬(hard)实时/软(soft)实时应用,他们提出"严格(firm)"实时应用的概念,如一些多媒体应用和ATM网络应用,KURT是为这样一些应用设计的"严格的"实时系统。

      2、体系结构异同

      实时系统的实现多为微内核体系结构,这使得核心小巧而可靠,易于ROM固化,并可模块化扩展。微内核结构系统中,OS服务模块在独立的地址空间 运行,所以,不同模块的内存错误便被隔离开来。但它也有弱点,进程间通信和上下文切换的开销大大增加。相对于大型集成化内核系统来说,它必须靠更多地进行 系统调用来完成相同的任务。

      QNX是一个微内核实时操作系统,其核心仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX核心非常小巧(QNX4.x大约为12Kb)而且运行速度极快。

      LynxOS目前还不是一个微内核结构的操作系统,但它计划使用所谓的"Galaxy"技术将其从大型集成化内核改造成微内核,这一技术将在 LynxOS 3.0中引入。新的28Kb微内核提供以下服务:核心启动和停止、底层内存管理、出错处理、中断处理、多任务、底层同步和互斥支持。

      RT-Linux实现了一个小的实时核心,仅支持底层任务创建、中断服务例程的装入、底层任务通信队列、中断服务例程(ISR)和Linux进 程。原来的非实时Linux核心作为一个可抢先的任务运行于这个小核心之上,所有的任务都在核心地址空间运行。它不同于微内核和大型内核,属于实时 EXE(realtime executive)体系结构。其可靠性和可维护性对电信服务系统来说都不够理想。

      KURT-Linux核心包括两个部分:内核和实时模块。内核负责实时事件的调度,实时模块为用户进程提供特定的实时服务。它不属于微内核结构。

      3、调度策略分析

      任务调度策略是直接影响实时性能的因素。尽管调度算法多种多样,但大多由单调率算法(RM)和最早期限优先算法(EDF)变化而来。前者主要用 于静态周期任务的调度,后者主要用于动态调度,在不同的系统状态下两种算法各有优劣。在商业产品中采用的实际策略常常是各种因素的折中。

      QNX 提供POSIX.1b标准进程调度:
      32个进程优先级;
      抢占式的、基于优先级的正文切换;
      可选调度策略:FIFO、轮转策略、适应性策略。
      LynxOS 其调度策略为:
      LynxOS支持线程概念,提供256个全局用户线程优先级;
      硬实时优先级调度:在每个优先级上实现了轮转调度、定量调度和FIFO调度策略;
      快速正文切换和阻塞时间短;
      抢占式的RTOS核心。

      RT-Linux
      在操作系统之下实现了一个简单的实时核心,Linux本身作为一个可抢占的任务在核内运行,优先级最低,随时会被高优先级任务抢占。
      用户可自行编写调度程序,它们可实现为可加载的核心模块;
      已实现的调度程序有:基于优先级的抢占式调度和EDF调度;
      基于优先级的调度使用"单调率算法",它直接支持周期任务。

      KURT-Linux
      可运行在两种状态之下:通常状态和实时状态。在通常状态下,所有进程都可以运行,但某些核心服务将带来中断屏蔽的不可预期性。实时模式只允许实时进程运行。
      支持FIFO调度策略、轮转调度策略和UNIX分时调度策略;
      增加了SCHED-KURT调度策略,这是一种静态调度策略,使用一个特殊的调度文件记录预先定义好的待调度进程的参数。

      从以上简略描述可以看出,前三种调度策略实现较规范,特别是两种商业RTOS,遵循或部分遵循POSIX.1b实时调度标准。

     4、操作系统服务比较

      4.1 QNX的系统服务:

      多种资源管理器,包括各种文件系统和设备管理,支持多个文件系统同时运行,包括提供完全POSIX.1及UNIX语法的POSIX文件系统,支 持多种闪存设备的嵌入式文件系统,支持对多种文件服务器(如Windows NT/95、LAN Manager等)的透明访问的SMB文件系统、DOS文件系统、CDROM文件系统等。
      设备管理。在进程和终端设备间提供大吞吐量、低开销接口服务。
      图形/窗口支持。包括QNX Windows、X Window System for QNX、对MS Windows NT/95和X Window系统的远程图形连接。
      TCP/IP for QNX。
      高性能、容错型QNX网络--FLEET,使得所有连入网络的计算机变成一个逻辑上的超级计算机。
      透明的分布式处理。FLEET网络处理与消息传递和进程管理原语的集成,将本地和网络IPC统一起来,使得网络对IPC而言是透明的。

      4.2 LynxOS的系统服务:

      网络和通信。由于使用UNIX/POSIX API,Lynx很适合于数据通信和Internet应用。又由于系统的开放性,网络软件很容易移植到Lynx上。同样,Lynx亦提供关键的电话通信协议,使之适用于电信系统的基础架构、操作和多媒体应用。
      TCP/IP协议栈。Lynx自带优化的TCP/IP协议栈,提供高性能服务,如TCP头预测、高级路由算法、IP级多址广播和链路级高速缓冲。
      Internet工具。包括,Telnet、Ftp、tftp、PPP、SLIP、实时调度的嵌入式Java虚拟机、嵌入式HTTP server、bootp、ARP/RARP、DNS域名服务、电子邮件、Perl、电话通信协议等。
      SVR3流。LynxOS流机制为开发和移植基于流的驱动程序和应用提供了核心支持。
      文件系统。实时的类UNIX层次结构文件系统:连续结构文件、带缓冲/不带缓冲、原始分区和原始设备访问。
      基于Motif的图形用户接口。
      分布式计算资源。SCMP与VME总线上的多处理结合,PCI桥服务、CompactPCI Hot-swap Services、Lynx/HA-DDS分布式数据系统。

      4.3 Linux的系统服务:

      近来,很多基于Linux的实时应用被开发出来,它具有成熟和丰富的资源。

      UNIX用户的开发工具和应用软件都被移植到Linux上。
      TCP/IP网络协议。
      各种Internet客户/服务端软件。
      X Window。
      C/C++、Java等语言编译器。

      上述系统的共同点是都提供了图形界面、各种网络支持等必要工具。QNX是一个更加符合传统"分布式"概念的操作系统,目标是把整个局域网变成一 个大的超级计算机,使得网络的存在对用户透明,文件系统提供的服务也很丰富。但是,分布式的程度越高也意味着系统开销的增大。LynxOS则着意于提供丰 富的网络服务,而Linux的最大优势则是经济,还可以通过新闻组或mailing

      5、系统开放性对比

      对于很多大、中型系统来说,大多数软件都是为UNIX平台编写的,因此RTOS是否提供POSIX/UNIX API就显得很重要。

      5.1 QNX的开放性

      QNX的POSIX兼容性和其提供的UNIX特色的编译器、调试器、X Window和TCP/IP都是UNIX程序员所熟悉的。
      支持多种CPU:AMD ElanSC300/310/400/410、Am386 DE/SE、Cyrix MediaGX、x86处理器(386以上)、Pentium系列、STMicroelectronics 的STPC。
      多种总线:CompactPCI、EISA、ISA 、MPE (RadiSys)、STD、STD 32、PC/104、PC/104-Plus、PCI、PCMCIA、VESA、VME。
      各种外设:多种SCSI设备、IDE/EIDE驱动器、10M/100M以太网卡、Token Ring网卡、FDDI接口卡、多种PCMCIA设备、闪存、声卡等等。

      5.2 LynxOS的开放性

      POSIX.1a、1b、1c及BSD4.4等兼容性,使得遵循POSIX 1003或用于UNIX的程序很容易移植到LynxOS上。
      支持多种CPU主板:包括CompactPCI(6U/3U)和标准PCI、VME/Eurobus、PC/104和PC/AT硬件等。
      各种外设适配器:10/100BaseT Ethernet、SCSI接口、单/多通道串行控制器、单/双工并行口、时钟、计时器、IDE接口、高分辨率显示适配器等。

      5.3 Linux的开放性

      用户可得到UNIX的全部开发工具。
      可使用市场上便宜又常见的硬件。


    展开全文
  • 对实时操作系统(RTOS)特性进行比较分析。对于我们刚接触这个操作系统时一定要对他们要有一定的了解,我们先对实时操作系统来了解下,它就是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的...
  • RTLinux和RTOS基本知识

    千次阅读 2021-07-12 11:38:40
    RTLinux和RTOS基本知识

    1 SoC中断
    1.1 ARMv8中断
    IPI:inter-processer interrupt 中断号0 - 15
    PPI:per processor interrupts 中断号16 - 31
    SPI:shared processor interrupts 中断号 32 - 224
    SGI:software generated interrupts (SGI)
    设备树是用来描述硬件信息的,因此里面不涉及软件中断SGI,在arm-gic.h文件中定义的只有SPI和PPI。
    #define GIC_SPI 0
    #define GIC_PPI 1

    一般设备树中的中断都是SPI,那么interrupts = <0 208 1>;是什么意思呢?
    X:GIC_SPI或者GIC_PPI
    Y:物理中断号 - 32,SA8155
    Z:触发方式
    1 = low-to-high edge triggered
    2 = high-to-low edge triggered (invalid for SPIs)
    4 = active high level-sensitive
    8 = active low level-sensitive (invalid for SPIs)

    HCR_EL2: Hypervisor Configuration Register, Trapping and emulation就需要配置该寄存器

    1.2 临界区开关CPU中断API
    arm:local_irq_disable() / local_irq_enable() 在ARM V6以上使用汇编指令CPSID / CPSIE(Current Program Status Interrupt Disable / Enable)用于快速的开关中断,早期版本使用汇编指令mrs和msr去更新cpsr。

    x86:local_irq_disable调用汇编指令CLI(clear interrupt-enable flag,IF);local_irq_enable调用汇编指令STI(set interrupt-enable flag,IF)。

    arm的cpsid和x86的CLI同时禁止了核间中断(IPI),CPU-x还会用IPI通知CPU-y进行resched,但是CPU-y可能已经禁用了中断而不会响应。

    在中断中不能产生调度,在中断返回时才可能发生调度。事实上,早期的内核很大程度上是依赖local_irq_disable来做资源保护,这个看看2.4的内核源码就很清楚了,里面有大量的对local_irq_disable函数的直接调用。

    1.3 Linux Kernel中断处理
    request_threaded_irq() - 实时中断处理,比较好。

    如果成功注册了一个中断(中断号为300,中断名字为oem),那么通过ps命令可以看到该线程
    irq/300-oem

    中断优化:
    echo 1 > /proc/sys/kernel/sched_boost

    2 Linux内存管理
    2.1 free命令
    swapoff -a && swapon -a

    free -h
    显示的cache是指disk cache,也即是磁盘文件在内存中的缓存。
    1) Clear PageCache only
    # sync; echo 1 > /proc/sys/vm/drop_caches

    2) Clear dentries and inodes
    # sync; echo 2 > /proc/sys/vm/drop_caches

    3) Clear PageCache, dentries and inodes
    # sync; echo 3 > /proc/sys/vm/drop_caches

    2.2 内存页表
    CONFIG_PTDUMP_CORE
    CONFIG_PTDUMP_DEBUGFS

    /sys/kernel/debug/kernel_page_tables

    page-types工具
    tools/vm/page-types.c
    make -C tools/vm

    2.3 栈空间
    Linux查看修改线程默认栈空间大小(ulimit -s,单位KB),Linux默认是8MB。

    2.3.1 kmalloc
    用于kmalloc可分配的内存大小范围在32~131027(128k)字节,并且由于它用slab分配器来分配内存的,所以得到的内存大小可能比你申请的要大一些(它向上取2的N次幂整数)。而且如果开启了CONFIG_LARGE_ALLOCS选项,这个值可以更大,可以达到了32M。

    2.3.2 malloc
    malloc申请的空间大于128KB的话,使用mmap系统调用在stack 和 heap中间的区域(共享内存映射区域)进行虚拟内存分配,其大小应该就是栈底与heap顶之间的空间最大值。

    此时mmap()使用MAP_ANONYMOUS,并且不关心文件描述符fd的值;通过strace跟踪进程可以看到大量的带有MAP_ANONYMOUS的mmap()。

    dlopen isn't a system call, it's a library function in the libdl library. Only system calls show up in strace.
    On Linux and on many other platforms (especially those that use the ELF format for executables), dlopen is implemented by opening the target library with open() and mapping it into memory with mmap(). mmap() is really the critical part here, it's what incorporates the library into the process' address space, so the CPU can execute its code. But you have to open() the file before you can mmap() it!

    mmap vs read()/write()/lseek()

    2.4 buddy and slab
    Buddy APIs:alloc_pages()和__get_free_pages()等。

    因为内存初始化的时间比分配和释放时间长好多,slab增加一个类似对象池的特性,slab会缓存已经被“释放”的对象,以便下次重用,不必再初始化。对象用该高速缓存结构kmem_cache描述。通过kmem_cache_create创建。虽然名为高速缓存,但是它不是硬件上的高速缓存,它只是主存上的区域,但是和硬件上的高速缓存高度相关。

    2.5 ZONE_HIGHMEM
    当内核空间大小是3GB – 4GB时,并不是所有的物理内存都是映射的,而是部分映射,需要时再动态将需要访问的物理内存映射到(3.896GB - 4GB)地址空间。使用CONFIG_HIGHMEM来配置。
    vmalloc和kmalloc的区别:
    - vmalloc分配的一般为高端内存,只有当内存不够的时候才分配低端内存;kmalloc从低端内存分配
    - vmalloc分配的物理地址一般不连续,而kmalloc分配的物理地址连续,两者分配的虚拟地址都是连续的
    - vmalloc分配的一般为大块内存,而kmalloc一般分配的为小块内存(不超过128k)

    2.6 64位CPU地址空间布局
    查看物理和虚拟地址位数:/proc/cpuinfo
    2.6.1 x86_64地址空间布局
    - 64bit = 16MegaT
    - x86_64使用了40位物理地址线,48位虚拟地址空间
    - 用户空间128T:0x0000,0000,0000,0000到0x0000,7fff,ffff,f000(最后12位不是fff,保留了一个页面)
    - 内核空间128T:0xffff,8000,0000,0000到0xffff,ffff,ffff,ffff;注意:该地址前4个都是f,这是因为目前实际上只用了64位地址中的48位(高16位是没有用的)
    - 从地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中间是一个巨大的空洞,是为以后的扩展预留的

    2.6.2 ARM64地址空间布局
    - ARM64使用了48位物理地址线,64位虚拟地址空间
    - 用户空间128T:0x0000,0000,0000,0000到0x0000,7fff,ffff,ffff
    - 内核空间256T:0xffff,0000,0000,0000到0xffff,ffff,ffff,ffff

    3 Linux scheduler
    3.1 time slice
    SCHED_NORMAL time_slice =
        (int)((1 - priority / 140.0) x 290 + 0.5) + 10

    time_slice range [10, 300] ms
    scheduler_tick()

    #include <sched.h>
    int sched_rr_get_interval(pid_t pid,
        struct timespec *tp);
    SCHED_RR = 100 ms

    echo  5 > \
    /proc/sys/kernel/sched_rr_timeslice_ms

    3.2 调度策略
    linux的实时进程有两种调度策略,SCHED_FIFO和SCHED_RR(类似于打麻将,轮流坐庄),SCHED_FIFO是简单的队列调度,并且没有timeslice的限制,谁先来谁运行,除非是阻塞或者主动yield,否者将一直占用CPU,即使关中断也不能阻止优先级高的进程被调度运行。

    实时进程从不激活到激活状态时,根据进程的优先级,找到对应的优先级列表头,然后插入到该优先级列表尾部。多个实时进程在SMP之间采用push和pull调度机制。

    对于普通进程,是通过nice系统调用来调整优先级的。从内核角度讲[100,139]是普通进程的优先级的范围,100最高,139最低,默认是120。普通进程的优先级的作用和实时进程不同,普通进程优先级表示的是占用CPU的时间。深入linux内核架构中提到,普通优先级越高(100最高,139最低),享受的CPU time越多,相邻的两个优先级,高一级的进程比低一级的进程多占用10%的CPU,比如内核优先级数值为120的进程要比数值是121的进程多占用10%的CPU。

    我们知道,linux的进程调度时机有:
    1、进程状态转换的时刻:进程终止、进程睡眠
    2、当前的进程的时间片用完(current->counter = 0)
    3、设备驱动程序主动调用schedule
    4、进程从中断、异常及系统调用返回用户态

    struct sched_param {
        /* ... */
        int sched_priority;
        /* ... */
    };

    int sched_setscheduler (pid_t pid,
        int policy,
        const struct sched_param *sp);

    sched_setscheduler函数的第二个参数调度方法 :
    #define SCHED_NORMAL 0
    #define SCHED_FIFO 1
    #define SCHED_RR 2
    #ifdef __USE_GNU
    # define SCHED_BATCH 3
    #endif

    SCHED_NORMAL(以前叫SCHED_OTHER)表示普通进程,对于普通进程,第三个参数sp->sched_priority只能是0
    SCHED_FIFO 和SCHED_RR表示实时进程的调度策略,第三个参数的取值范围为[1,99]。
    如果sched_setscheduler 优先级设置的值和调度策略不符合的话,会返回失败的。

    3.3 ARM big.LITTLE
    ARM的big.LITTLE架构的调度器经历了IKS(In Kernel Switcher)-> HMP/GTS(Global Task Scheduler)-> EAS(Energy Aware Scheduler,based on CFS)。

    /proc/sys/kernel/sched_downmigrate
    这个值是个百分比,任务需求相对cpu能力的百分比。降低此值将会阻止任务迁移到小核上,对性能有利。

    /proc/sys/kernel/sched_upmigrate
    这个值是个百分比,任务需求相对cpu能力的百分比。提高这个值将会阻止任务往大核迁移,有利于功耗,不利于性能。

    echo 1 > /proc/sys/kernel/sched_boost

    3.4 进程抢占
    在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢占。
    spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。

    举个例子:进程A中调用了spin_lock(&lock)然后进入临界区,此时来了一个中断(interrupt),该中断也运行在和进程A相同的CPU上,并且在该中断处理程序中恰巧也会spin_lock(&lock)试图获取同一个锁。由于是在同一个CPU上被中断,进程A会被设置为TASK_INTERRUPT状态,中断处理程序无法获得锁,会不停的忙等,由于进程A被设置为中断状态,schedule()进程调度就无法再调度进程A运行,这样就导致了死锁!

    但是如果该中断处理程序运行在不同的CPU上就不会触发死锁。 因为在不同的CPU上出现中断不会导致进程A的状态被设为TASK_INTERRUPT,只是换出。当中断处理程序忙等被换出后,进程A还是有机会获得CPU,执行并退出临界区。

    所以在使用spin_lock时要明确知道该锁不会在中断处理程序中使用。

    3.5 Linux ps命令返回参数解释
    PPID:Parent Process ID
    VSIZE:Virtual Size,进程的虚拟内存大小
    RSS:Resident Set Size,实际驻留“在内存中”的内存大小
    WCHAN:Wait Channel(as an address),休眠进程在内核中的地址
    PC:Program Counter,程序CPU指针

    3.6 kworker是什么
    显示格式:kworker/[u]%d:CPU_ID

    u:是unbound的缩写,代表没有绑定特定的CPU,kworker/u8:0中的8是work_pool的ID。不带u的就是绑定特定cpu的workerq,它在init_workqueues中初始化,给每个cpu分配worker,如果该worker的nice小于0,说明它的优先级很高,所以就加了H(High)属性。通过ps可以看到内核创建的所有kworker。

    譬如为CPU0创建的3个kworker:kworker/0:0、kworker/0:0H、kworker/u8:0

    4 RTLinux
    4.1 prio和rt_priority的区别
    - 实时进程的优先级(rt_priority)数字越大则优先级越高,99最高,0最低;而普通进程正好相反,优先级(static_prio)数字越大则优先级越低,100最高,139最低(对应nice值-20 ~ 19)
    - 内核调度是按照task_struct中的prio来调度的,prio的值越小,优先级就越高。实时线程的rt_priority转换成prio:prio = MAX_RT_PRIO - 1 - p->rt_priority;普通线程的static_prio转换成prio:prio = static_prio = MAX_RT_PRIO + nice + 20
    - 进程创建时的默认优先级是120,对应的nice值为0

    4.2 priority inheritance
    in kernel/locking/rtmutex.c
    rt_mutex_adjust_prio() - 适用于优先级值小于100的实时任务

    in kernel/sched/core.c
    rt_mutex_setprio()

    4.3 中断线程化
    in kernel/irq/manage.c
    setup_irq()

    4.4 aarch64 cyclictest
    zcat /proc/config.gz

    rt-tests.git
    # CROSS_COMPILE = \
    # /path/to/bin/aarch64-linux-gnu-
    CC = $(CROSS_COMPILE)gcc
    LD = $(CROSS_COMPILE)ld

    time unit: micro seconds
    ./cyclictest -p 80 -t 5 -n

    5 STM32中断
    5.1 STM32中断编号
    CMSIS IRQn = NVIC IRQn - 16
    1)NVIC IRQn从1开始,所以NVIC中断1(Reset异常)对应CMSIS中断编号-15,NVIC中断16对应CMSIS中断编号0。
    2)NVIC IRQn of SysTick等于15。
    3)NVIC IRQn of PendSV等于14。

    STM32的中断服务程序的名字不能自定义,必须使用官方已经定义好的名字,名字可参考如下的文件。
    @ Drivers\CMSIS\Device\ST\STM32L0xx\Source\Templates\iar\startup_stm32l061xx.s
    当然服务程序的具体内容还是自己写,放在stm32f10x_it.c里。

    5.2 BASEPRI
    FreeRTOS中进入临界区时没有关闭所有中断,而是使用优先级屏蔽寄存器BASEPRI(= configMAX_SYSCALL_INTERRUPT_PRIORITY)关闭了部分中断;这个寄存器最多有9位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0也是缺省值。

    FreeRTOS任务代码中临界段的进入和退出主要是通过操作寄存器BASEPRI实现的。进入临界区BASEPRI关闭了所有大于等于宏定义configMAX_SYSCALL_INTERRUPT_PRIORITY所定义的中断优先级,这样临界段代码就不会被中断干扰到,而且实现任务切换功能的 PendSV 中断和SysTick滴答定时器中断是最低优先级中断,所以此任务在执行临界段代码期间是不会被其它高优先级任务打断的。退出临界段时重新操作BASEPRI寄存器,即打开被关闭的中断(这里我们不考虑不受FreeRTOS 管理的更高优先级中断)。

    Cortex-M内核的“中断优先级寄存器”是以最高位(MSB)对齐的。STM32使用了优先级寄存器中的4位,则这4个位位于中断优先级寄存器的bit 4、bit5、bit6、bit7位。剩余的bit0 ~ bit3可以设置成任何值。所以FreeRTOS中的中断优先级计算是有移位操作的。

    CMSIS以及不同的微控制器供应商提供了可以设置某个中断优先级的库函数。一些库函数的参数使用最低位对齐,另一些库函数的参数可能使用最高位对齐,所以,使用时应该查阅库函数的应用手册进行正确设置。

    可以在FreeRTOSConfig.h中设置宏configMAX_SYSCALL_INTERRUPT_PRIORITY和configKERNEL_INTERRUPT_PRIORITY的值。(关于这两个宏可以参考参数设置一章,网址:http://openmcu.net/post/kernel-config.html)。这两个宏需要根据Cortex-M内核自身的情况进行设置,要以最高有效位对齐。比如某MCU使用中断优先级寄存器中的4位,设置configKERNEL_INTERRUPT_PRIORITY的值为5,则代码为:
    #define configKERNEL_INTERRUPT_PRIORITY (5<<(8-4))

    对于每一个官方FreeRTOS演示例程,这也是在FreeRTOSConfig.h中要设置宏configKERNEL_INTERRUPT_PRIORITY为最低优先级时,为什么要将它设置为255(1111 1111B)的原因。使用这种方式指定这个值的原因是:FreeRTOS内核是直接在Cortex-M内核硬件上运行的(没有使用第三方接口库函数),要比大多数库函数先运行。现在也有开发第一个Cortex-M库函数计划。

    5.3 IPR
    typedefstruct
    {
        vu32 ISER[2];
        u32 RESERVED0[30];
        vu32 ICER[2];
        u32 RSERVED1[30];
        vu32 ISPR[2];
        u32 RSERVED2[30];
        vu32 ICPR[2];
        u32 RSERVED3[30];
        vu32 IABR[2];
        u32 RSERVED4[30];
        vu32 IPR[15];
    } NVIC_TypeDef;

    NVIC IPR[15]:Interrupt Priority Registers,中断优先级控制寄存器组。STM32的中断分组与这个寄存器密切相关。因为STM32的中断多达60多个,所以STM32采用中断分组的办法来确定中断的优先级。IPR寄存器由15个32bit的寄存器组成,每个可屏蔽中断占8bit,这样总共可以表示15x4=60个可屏蔽中断。IPR[0]的[31:24],[23:16],[15:8],[7:0]分别对应中断3到0,总共对应60个外部中断。而每个可屏蔽中断占用的8bit并没有全部使用,只用了高4位。这4位又分为抢占优先级和子优先级。这两个优先级要根据SCB->AIRCR(System Control Block,Application Interrupt and Reset Register)中断分组的设置来决定。

    简单介绍STM32的中断分组:STM32将中断分为0~4共5个组,该组是由SCB->AIRCR寄存器的bit10:8来定义的。具体优先级的确定和嵌套规则:
    (1)只能高抢先优先级的中断可以打断低抢占优先级的中断服务,构成中断嵌套;
    (2)当2个(N个)相同抢占优先级的中断出现,他们之间不能构成中断嵌套,但STM32首先响应子优先级高的中断;
    (3)当2个(N个)个抢占优先级和子优先级相同的中断出现,STM32首先响应中断通道所对应的中断向量地址低的中断,就是谁先发生谁先被执行。

    5.4 SHPRx - System Handler Priority Registers
    SHPR1至SHPR3,3个32位寄存器,每8位设置一个中断优先级,共12个可配置的系统中断,8为里面用了高位configPRIO_BITS,其它位写无效,读为0。还有3个中断的优先级系统默认为-3、-2、-1。

    5.5 示例代码
    /* interrupt priority register */
    static int command_dump_ipr(cli_node_t *cmd,
        int argc, char **argv)
    {
        const volatile uint8_t
            *const pcInterruptPriorityRegisters =
            (const volatile uint8_t * const)0xE000E3F0;
        uint8_t i;

        console_puts_lite(""CR_LF);
        console_puts_lite(
            "configPRIO_BITS = %d"CR_LF,
            configPRIO_BITS);
        console_puts_lite(
            "configKERNEL_INTERRUPT_PRIORITY = 0x%02x"CR_LF,
            configKERNEL_INTERRUPT_PRIORITY);
        console_puts_lite(
            "configMAX_SYSCALL_INTERRUPT_PRIORITY = 0x%02x"CR_LF,
            configMAX_SYSCALL_INTERRUPT_PRIORITY);
        console_puts_lite(""CR_LF);

        /* (4-7, 8-11, 12-15) */
        console_puts_lite(
            "System Handler Priority Registers"CR_LF);
        for (i = 0; i < 12; i++){
            console_puts_lite(
                "PRI_%d - 0x%02x"CR_LF,
                (4 + i),
                SCB->SHP[i]);
        }
        console_puts_lite(""CR_LF);

        console_puts_lite(
            "User Interrupt Priority Registers"CR_LF);
        for (i = 16;
            i < (16 + IRQ_NUMBER_MAX);
            i++) {
            console_puts_lite(
                "IRQ%d - 0x%02x"CR_LF,
                (i - 16),
                pcInterruptPriorityRegisters[i]);
        }
        return 0;
    }
    DECLARE_CONSOLE_COMMAND(
        dump_ipr,
        command_dump_ipr,
        NULL);

    5.6 中断延迟
    性能相关的另外一个指标是中断延迟。这通常用从中断请求到中断服务程序第一条指令执行的时钟周期数来衡量。

    6 FreeRTOS优先级反转
    6.1 优先级反转
    优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源。高优先任务由于因资源缺乏而处于受阻状态,一直等到低优先级任务释放资源为止。而低优先级获得的CPU时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务反而超过这两个任务而获得CPU时间。如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,因为此时低优先级进程无法与高优先级进程争夺CPU时间,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资源而继续推进。

    6.2 解决方案
    (1)设置优先级上限,给临界区一个高优先级,进入临界区的进程都将获得这个高优先级,如果其他试图进入临界区的进程的优先级都低于这个高优先级,那么优先级反转就不会发生。

    eCos优先级上限(ceiling)例子:
    @ packages/kernel/v3_0/src/sync/mutex.cxx
    cyg_bool
    Cyg_Mutex::lock(void)
    {
        [...]
    }

    void
    Cyg_Mutex::unlock(void)
    {
        [...]
    }

    (2)优先级继承,当一个高优先级进程等待一个低优先级进程持有的资源时,低优先级进程将暂时获得高优先级进程的优先级别,在释放共享资源后,低优先级进程回到原来的优先级别。嵌入式系统FreeRTOS和VxWorks就是采用这种策略。

    eCos优先级继承例子:
    @ packages/kernel/v3_0/src/sync/mutex.cxx
    cyg_bool
    Cyg_Mutex::lock(void)
    {
        [...]
    }

    void
    Cyg_Mutex::unlock(void)
    {
        [...]
    }

    FreeRTOS优先级继承例子:
    @ tasks.c
    vTaskPriorityInherit() - 需要mutex的高优先级Task,发现mutex被低优先级的Task持有。调整持有mutex的Task优先级等于当前等待mutex的Task优先级,这样持有mutex的低优先级Task获得了运行机会。
    xTaskPriorityDisinherit() - 返回原来的优先级

    (3)第三种方法就是使用中断禁止,通过禁止中断来保护临界区,采用此种策略的系统只有两种优先级:可抢占优先级和中断禁止优先级。前者为一般进程运行时的优先级,后者为运行于临界区的优先级。火星探路者正是由于在临界区中运行的气象任务被中断发生的通信任务所抢占才导致故障,如果有临界区的禁止中断保护,此一问题也不会发生。

    7 Abbreviations
    ARM CM4 BASEPRI:优先级屏蔽寄存器最多有9位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0也是缺省值。FreeRTOS进入临界区时BASEPRI的值等于configMAX_SYSCALL_INTERRUPT_PRIORITY
    BFS:Brain Fuck Scheduler,又称脑残调度器
    CM4 R13:for MSP & PSP,the tasks are using the PSP(Process Stack Pointer), while the interrupts are using the MSP(Main Stack Pointer)
    CMSIS:Cortex-Microcontroller Software Interface Standard
    NVIC:Nested Vectors Interrupts Controller
    NVIC IPR:Interrupt Priority Registers
    PendSV:Pendable 服务是一个中断请求,如果没有其他中断需要响应时,系统将强制执行上下文切换
    pi_waiters:priority inheritance,优先级继承
    SVCall:SuperVisor Call由SVC指令触发,FreeRTOS用它来启动任务调度
    SCHED_RR:Round-Robin,轮流调度算法(实时调度策略)
    SHPRx:CM4 System Handler Priority Registers
    STM32 AIRC:Application Interrupt and Reset Register
    TIF_NEED_RESCHED:Thread Info Flag
    Bionic brk():break(堆顶端称作program break)
    intercepting:拦截系统调用
    ptrace:process trace
    pt_regs:ptrace registers(对应命令PTRACE_GETREGS)
    strace:system call trace

    展开全文
  • 关注、星标公众号,不错过精彩内容作者:arvin转载:CSDN(ID:CSDNnews)你知道哪个操作系统是世界上最受欢迎的操作系统吗?是Linux!它一般运行于服务器超级计算机上,我...
  • 本文介绍了实时操作系统从RTOS移植到实时Linux
  • 在过去的10年中,Linux成功地取代了一些最主要的传统RTOS平台,成为了各种各样的嵌入式设备应用中首选的新的嵌入式操作系统。尽管一度曾被认为是不重要的平台,但今天嵌入式Linux已经成为主流,并引领着如下重要...
  • 前言近些年,RTOS在国内发展迅猛,尤其是国产操作系统RT_Thread更是隐隐成为国内RTOS一哥。随着RTOS生态不断完善,资料也逐渐齐全,相信不少工程师已经涉猎颇深。笔者也有过约两...
  • RTOS一样进行Linux的pthread多线程编程 举一个简单的例子,话不多说,上代码 #include <stdio.h> #include <unistd.h> #include <stdint.h> #include <pthread.h> pthread_t MyTaskID_...
  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板。仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。 1、 Esp8266之 搭建开发环境,开始一个“hellow world”串口...
  • RTOSLinux的应用移植.pdf
  • RTOS VxWorks应用迁移Linux的技术实现.pdf
  • 通过Linux学习RTOS

    千次阅读 2016-01-20 18:13:39
    Linux的开发资源非常丰富,而RTOS因为种类繁多,开发人员分散,开发资源比较匮乏,通过学习Linux的内部机理来学习RTOS是一个不错的选择。
  • Linux平台RTOS通用仿真环境的设计与实现.pdf
  • 获取更多相关的笔试面试题,可收藏系列博文,持续更新中:C语言|BSP开发|嵌入式软件|Linux驱动|笔试面试题汇总帖 什么是实时操作系统(RTOS)? 什么样的系统可以被称作实时操作系统(RTOS)? Real-Time ...
  • Linux是时分系统,不过可以通过配置内核改成实时系统实时操作系统  英文称Real Time Operating System,简称RTOS。  1.实时操作系统定义  实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够...
  • 电脑架构课本,经常使用,非常好用,绝对不容许错过
  • 嵌入式 Linux 已经在很多应用领域显示出优势,比如SOHO家庭网络成像/多功能外设。在(NAS/SAN)存储,家庭数字娱乐(HDTV/PVR/DVR/STB),手持设备/无线设备,特别是数字移动电话更获得大幅度发展。  嵌入式Linux...
  • This book is intended to provide the practicing engineer with the necessary background to apply real-time theory to the design of embedded components and systems in order to successfully field a real-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,616
精华内容 3,446
关键字:

rtos和linux的区别

linux 订阅