vxworks *** 作系统如何实现实时性

vxworks *** 作系统如何实现实时性,第1张

对你这个话题感兴趣,搜了一下,一起学习:

摘 要: 本文分析了适用于测控领域的4种实时 *** 作系统,并对比了它们实时性能的重要指标,归纳了实时性设计和实现中的若干问题。

引言

20世纪70年代以来嵌入式系统的硬件和软件技术的飞速进步,使得嵌入式应用得到了蓬勃发展,在这些应用中实时 *** 作系统起着决定性的作用。

在复杂测控应用中,必须使用对实时性要求非常高的实时 *** 作系统。例如在工业控制、交通管理、机器人、航空航天、武器装备等领域,系统事件的响应如果不能准时或超时,就可能导致巨大的损失和灾难。因而,选择 *** 作系统时,对实时性的仔细考虑至关重要。本文从实时性的角度细致的分析对比了适用于此类有苛刻实时性要求的4种 *** 作系统——VxWorks、mC/OS-II、RT-Linux、QNX,为系统选型提供一定参考。

实时性能主要实现技术

实时 *** 作系统的实时性是第一要求,需要调度一切可利用的资源完成实时任务。根据响应时间在微秒、毫秒和秒级的不同,可分为强实时、准实时和弱实时三种。强实时系统必须是对即时的事件作出反应,绝对不能错过事件处理时限。例如测控领域就是要求强或接近强实时系统。在机顶盒、PDA、信息家电等应用领域,系统负荷较重的时候,允许发生错过时限的情况而且不会造成太大的危害,准和弱实时系统就可满足应用。一个强实时的 *** 作系统通常使用以下技术:

● 占先式内核

当系统时间响应很重要时,要使用占先式内核。当前最高优先级的任务一旦就绪,总能立即得到CPU的控制权,而CPU的控制权是可知的。使用占先式内核使得任务级响应时间得以最优化。

● 调度策略分析

任务调度策略是直接影响实时性能的因素。强实时系统和准实时系统的实现区别主要在选择调度算法上。选择基于优先级调度的算法足以满足准实时系统的要求,而且可以提供高速的响应和大的系统吞吐率。当两个或两个以上任务有同样优先级,通常用时间片轮转法进行调度。对硬实时系统而言,需要使用的算法就应该是调度方式简单,反应速度快的实时调度算法了。尽管调度算法多种多样,但大多由单一比率调度算法(RMS)和最早期限优先算法(EDF)变化而来。前者主要用于静态周期任务的调度,后者主要用于动态调度,在不同的系统状态下两种算法各有优劣。在商业产品中采用的实际策略常常是各种因素的折中。

● 任务优先级分配

每个任务都有其优先级。任务越重要,赋予的优先级应越高。应用程序执行过程中诸任务优先级不变,则称之为静态优先级。在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。反之,应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级。

● 时间的可确定性

强实时 *** 作系统的函数调用与服务的执行时间应具有可确定性。系统服务的执行时间不依赖于应用程序任务的多少。系统完成某个确定任务的时间是可预测的。

实时性能重要指标

衡量实时 *** 作系统实时性能的重要指标有:

● 任务切换时间

当多任务内核决定运行另外的任务时,它把正在运行任务的当前状态(即CPU寄存器中的全部内容)保存到任务自己的栈区之中。然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。CPU的寄存器越多,额外负荷就越重。

● 中断响应时间(可屏蔽中断)

计算机接收到中断信号到 *** 作系统作出响应,并完成切换转入中断服务程序的时间。对于占先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。占先式内核的中断响应时间由下式给出:

中断响应时间=关中断的最长时间

+保护CPU内部寄存器的时间

+进入中断服务函数的执行时间

+开始执行中断服务例程(ISR)的第

一条指令时间

中断响应时间是系统在最坏情况下响应中断的时间,某系统100次中有99次在50ms之内响应中断,只有一次响应中断的时间是250ms,只能认为中断响应时间是250ms。

表2列出了部分体现实时性能重要指标的典型值,它们的测试平台和测试方法不完全相同,影响了数据的可比性,但我们仍可作为参考。

另外,还有系统响应时间(系统发出处理要求到系统给出应答信号的时间)、最长关中断时间、非屏蔽中断响应时间等辅助的衡量指标。

若干问题

虽然当今的实时 *** 作系统已日臻完善,但仍有一些问题存在并干扰着强实时的实现。我们应充分的重视,并通过合理的安排程序减少它们的危害。

● 优先级反转

这是实时系统中出现得最多的问题。优先级反转是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果这时有中等优先级的就绪任务,阻塞会进一步恶化。它严重影响了实时任务的完成。

为防止发生优先级反转,一些商业内核(如VxWorks)使用了优先级继承技术,当优先级反转发生时,优先级较低的任务被暂时地提高它的优先级,使得该任务能尽快执行,释放出优先级较高的任务所需要的资源。但它也不能完全避免优先级反转,只能称其减轻了优先级反转的程度,减轻了优先级反转对实时任务完成的影响。

优先权极限是另一种解决方案,系统把每一个临界资源与1个极限优先权相联系,这个极限优先权等于系统此时最高优先权加1。当这个任务退出临界区后,系统立即把它的优先权恢复正常,从而保证系统不会出现优先权反转的情况。采用这种方案的另一个有利之处,是仅仅通过改变某个临界资源的优先级就可以使多个任务共享这个临界资源。

● 任务执行时间的抖动

各种实时内核都有将任务延时若干个时钟节拍的功能。优先级的不同、延时请求发生的时间、发出延时请求的任务自身的运行延迟,都会造成被延时任务执行时间不同程度的提前或滞后,称之为任务执行时间的抖动。可能的解决方案有:

a. 增加微处理器的时钟频和时钟节拍的频率;b 重新安排任务的优先级;c 避免使用浮点运算等。

强实时系统中,我们必须综合考虑,充分利用各种手段,尽量减少任务执行时间的抖动。

● 任务划分

程序在CPU中是以任务的方式在运行,所以我们要将系统的处理框图转化为多任务流程图,对处理进行任务划分。任务划分存在这样一对矛盾:如果任务太多,必然增加系统任务切换的开销;如果任务太少,系统的并行度就降低了,实时性就比较差。在任务划分时要遵循HGomma原则:

a. I/O原则:不同的外设执行不同任务;

b. 优先级原则:不同优先级处理不同的任务;

c. 大量运算:归为一个任务;

d. 功能耦合:归为一个任务;

e. 偶然耦合:归为一个任务;

f. 频率组合:对于周期时间,不同任务处理不同的频率。

如果我们在具体分析一个系统的时候发生原则冲突的话,则要为每一个原则针对具体的系统设定“权重”,必要的时候可以通过计算“权重”来最终确定如何去划分任务。

总结

VxWorks、mC/OS-II、RT-Linux、QNX都是优秀的强实时 *** 作系统,各有特色:VxWorks的衡量指标值最好;mC/OS-II最短小精悍;RT-Linux支持调度策略的改写;QNX支持分布式应用。当我们充分理解和掌握它们实现技术、衡量指标的不同,注意所存在的问题,就能在实时性应用中游刃有余。

来源:[>

Tornado之TrueFFS编程者指南(一)

seasoblue

按:这篇文章主要根据tornado20 for Arm的在线帮助写成,前面大部分是翻译过来的,后面将详细介绍MTD驱动的编写,并会给出实际的例子。TrueFFS对于作嵌入式系统来说非常有用,我希望这儿的每一个开发者都能掌握它。我对TrueFFS的研究还很浅薄,所以如果有信口开河的地方还请大方之家斧正。如果能对大家有所帮助,也就无枉此笔了。

一. 概述

1.简介

Tornado的TrueFFS是和vxworks兼容的一种M-Systems Flite实现方式,版本为20。它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。

有了Tornado的TrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的 *** 作一样。这样TrueFFS就屏蔽了下层存储介质的差异,为开发者提供了统一的接口方式。然而,当你设计一个嵌入式系统的时候,了解flash存储器和磁碟设备的不同之处还是很重要的。尽管flash存储器不可能适用于所有的嵌入式系统,但由于flash存储器具有体积小,耗电省,非易失存储的特性,在许多的环境下尤其在移动设备和手持设备领域里它成为了理想的选择。

Flash存储器在拥有众多优点的同时也有一些自身的缺点。首先,它在写之前必须要进行擦除 *** 作,而且不能一个字节一个字节的擦,它只能以一个扇区、一个块或者整片的方式进行擦 *** 作。它的写和擦 *** 作都需要较复杂的步骤才能完成,这就降低了它的易使用性。另外,Flash存储器最大的一个缺点就是寿命有限,可擦除的次数因不同厂商而有所不同,一般都在1万到10万次左右。

一个运行在flash存储器上性能良好的块设备应该能针对可移动的媒体(如flash卡)处理各种复杂的情况。比如,完全有这样的可能:当驱动程序正在进行写 *** 作时用户却把flash卡抽出来了。这有时会造成灾难性的后果。幸运的是,TrueFFS在设计时已经仔细考虑了flash存储器的各种特性,以及掉电和用户由于不耐烦或好奇的原因而猛地拔出flash卡想看看发生了什么事的情况。

2.TrueFFS和块数据

Flash存储器不能无限次重复使用。它的每个扇区的擦除次数虽然很大,但却有限。因此,随着使用次数的加长,它最终会变成只读状态。所以我们应该尽最大可能延长它的寿命。行之有效的方就是平衡使用所有的存储单元,而不让某一单元过度使用。这种技术被称之为wear leveling。TrueFFS使用一种基于一张动态维护表的block-to-flash(块对应于flash)传输系统来实现wear leveling技术。当块数据被修改、移动,或碎片回收后,这张维护表会自动调整。

就象块设备驱动需要的那样,TrueFFS把flash存储空间映射到一个特殊的连续存储块队列中,以便文件系统可以对它进行数据的读写。这些块被从0开始连续编号。

从一个数据块中读取数据的 *** 作非常直接。文件系统请求指定块的内容,TrueFFS响应后将块号传送到flash存储匹配器(flash memory coordinates)中,找到之上的数据,然后把数据返回给文件系统。向块写数据也一样的直接,只要这个块还没有被写过。TrueFFS要作的就是传送块号到flash存储匹配器(flash memorycoordinates)中,并写数据到所指定的地址。

但如果写请求试图修改一个已经写过了的块设备内容,情况就复杂了。TrueFFS先是找到flash空间中一个已经可写的区域,然后把修改后的块数据写到那里。当数据安全地写完后,TrueFFS更新它的block-to-flash映射结构,以使块现在映射的区域为放置修改后数据的区域。这就保证了一定程度上的wear leveling。然而,如果存储在flash上的一些数据本质上是静态的,只有在修改时wear leveling才会产生一种被称为静态文件锁定的问题。

存储这些静态数据的区域根本不会被循使用,这将降低flash期望的生命值。TrueFFS通过强制转移静态区域的方成功克服了静态文件锁定的问题。因为block-to-flash映射表是动态的,TrueFFS能够以对文件系统不可见的方式管理这些wear-leveling转移。由于绝对强制wear-leveling方式会对性能产生一些负面的影响,所以TrueFFS采取了一种非绝对wear-leveling的算。它保证了所有空间的使用近似平等。

最后,TrueFFS的wear-leveling算更增强了突破被称为死锁这种模式的性能。

所谓死锁就是一些简单的wear-leveling算只是两个或多个单元长时间循环而忽略了其余的单元的现象。

3.碎片回收

块数据的修改使得flash的一些块区域不再包含合的数据,并且这些区域在擦除之前变得不可写。如果没有机制来回收这些区域,flash很快就会变成只读的状态了。不幸的是由于这些块不可以单独擦除,回收这些块就有些复杂了。单次擦除被限制在一个叫作擦除单元(erase unit)的较大范围内。如对于Intel的flash器件来说是64k字节。

TrueFFS使用一种被称为碎片回收(garbage collection)的机制来回收那些不再包含有效数据的块。该机制从一个预擦除单元(source erase unit)内拷贝所有的有效数据块到另一个新的被称为转移单元(transferunit)的擦除单元。TrueFFS然后更新block-to-flash映射表再擦除这个废旧的预擦除单元。

这样,原来的块出现在外界时仍然包含了原来的数据,虽然这些数据现在已经存放在flash存储器的其它空间。

怎样触发碎片回收功能呢?如果太频繁,则会降低wear-leveling的效果,并影响整个flash的性能。因此在TrueFFS内部,碎片回收只是在块分配算需要的时候才会触发。块分配算尽量保持在同一个擦除单元(erase unit)内有一段连续的自块池。如果块池变得太小,块分配算就会马上采用碎片回收算进行碎片回收。然后碎片回收算就会找到并回收和下面标准最吻合的擦除单元(erase unit):

l 废块最多

l 擦除周期数据最少

l 最静态的区域

另外,碎片回收算也会采用随机选择的处理方。这样可以保证回收处理能够均匀地覆盖整修存储空间,而不会由于应用程序使用数据的方式而偏差。

运行方式

1、rtpSp "/ata0a/RTPtest2vxe"(shell或超级终端)或rtpSp"/ata0a/RTPtest2vxe \"100\" \"0x10000\""

2、应用程序(工程类型downloadable kernel project)

const char argv[] = {"/ata0a/RTPtestvxe", NULL};

rtpSpawn (argv[0], argv, NULL, 100, 0x10000, 0, 0);

用NDK编译成so,并写jni接口以便给java调用。 如果用NDK编译? 1、到android开发网下载NDK开发包,里面有document 2、把opencv用NDK的方法编译可以通过以下的思路: (1)第一种方法:看看opencv官方的编译文档,是否已经支持NDK的编译脚本或选

以上就是关于vxworks *** 作系统如何实现实时性全部的内容,包括:vxworks *** 作系统如何实现实时性、vxworks5.5上跑程序出现死机现象,怎么解决、请教如何在vxworks上构建文件系统等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10631814.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存