嵌入式Linux实时性分析与验证林大版Word下载.docx
《嵌入式Linux实时性分析与验证林大版Word下载.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux实时性分析与验证林大版Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
但借鉴与Linux其它功能方面的表现已经非常出色,改造Linux过曾中采用如以下6个具体延迟时间指标。
(1)中断分配时间IDT(interruptdispatchtime):
当一个中断产生时,在调用中断处理程序占用CPU以前,操作系统用来保存所有的寄存器中的内容和系统中其他的关于这一任务状态的时间。
(2)中断服务时间:
IST(interruptservicetime):
中断服务程序用来从硬件设备读取信息或从操作系统收集信息所用的时间。
(3)内核抢占时间KPT(kernelpreemptiontime):
在操作系统意欲抢占当前进程与抢占实际上发生之间的时间间隔。
(4)调度延迟SD(scheduledelay):
调度程序用来调度另一个线程投入运行的时间。
(5)进程切换时间CST(contestswitchingtime):
当前线程用来保存寄存器和系统状态的时间与将要运行的线程恢复寄存器中的内容和系统状态的时间总和。
(6)系统调用返回时间RST(returnfromsystemcall):
处于内核态的线程在它返回用户态之前检查一些状态所用的时间。
其中SD,CST,RST总是固定不变的,如果内核设计得当IDT,IST和KPT可以有效得减少。
下图1-1为Linux2.4进程切换的过程图,可作为参考。
图1-1Linux2.4内核任务响应模型
1.4嵌入式实时操作系统业界水平
1.4.1VxWorks嵌入式操作系统
VxWorks是美国WindRiver公司的产品,是目前嵌入式系统领域中应用很广泛,市场占有率比较高的嵌入式操作系统。
VxWorks实时操作系统由400多个相对独立、短小精悍的目标模块组成,用户可根据需要选择适当的模块来裁剪和配置系统;
提供基于优先级的任务调度、任务间同步与通信、中断处理、定时器和内存管理等功能,内建符合POSIX(可移植操作系统接口)规范的内存管理,以及多处理器控制程序;
并且具有简明易懂的用户接口,在核心方面甚至町以微缩到8KB。
1.4.2μC/OS-II嵌入式操作系统
μC/OS-II是在μC-OS的基础上发展起来的,是美国嵌入式系统专家JeanJ.Labrosse用C语言编写的一个结构小巧、抢占式的多任务实时内核。
μC/OS-II能管理64个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
1.4.3μClinux嵌入式操作系统
μClinux是一种优秀的嵌入式Linux版本,其全称为micro-controlLinux,从字面意思看是指微控制Linux。
同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。
因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧。
1.4.4eCos嵌入式操作系统
eCos(embeddedConfigurableoperatingsystem),即嵌入式可配置操作系统。
它是一个源代码开放的可配置、可移植、面向深度嵌入式应用的实时操作系统。
最大特点是配置灵活,采用模块化设计,核心部分由小同的组件构成,包括内核、C语言库和底层运行包等。
每个组件可提供大量的配置选项(实时内核也可作为可选配置),使用eCos提供的配置工具可以很方便地配置,并通过不同的配置使得eCos能够满足不同的嵌入式应用要求。
1.4.5RTXC嵌入式操作系统
RTXC是C语言的实时执行体(Real-TimeeXecutiveinC)的缩写。
它是一种灵活的、经过工业应用考验的多任务实时内核,可以广泛用于各种采用8/16位单片机、16/32位微处理器、DSP处理器的嵌入式应用场合。
中国单片机公共实验室“经过几年的考察,认为比较适合中国的国情后,引入中国市场的”嵌入式实时多任务操作系统两者之一。
1.5RTOS硬件和软件方面的要求
1.5.1可预测性
实时系统的要求能够对实时任务的执行时间进行判断,确定是否能够满足任务的时限要求。
由于实时系统对时间约束要求的严格性,使硬件延迟的可预测性成为实时系统的一项重要性能要求。
此外,还要求操作系统,包括应用程序的响应时间是可预测的。
1.5.2可靠性
在一些重要的实时应用中,任何不可靠因素和计算机的一个微小故障,或某些特定强实时任务超过时限,都可能引起难以预测的严重后果。
为此硬件和其软件的可靠性成为衡量实时系统性能不可缺少的重要保障。
2Linux作为嵌入式实时操作系统的分析
2.1需要改进的地方
2.1.1待改善的内核结构
Linux内核采用的是单内核结构(Monolithic),整个内核是一个单独的、非常大的程序,这样虽然能够使系统的各个部分直接沟通,有效地缩短任务之间的切换时间,但与嵌入式系统存储容量小、资源有限的特点不相符合。
嵌入式系统经常采用的是另一种称为微内核(Microkernel)的体系结构,即内核本身只提供一些最基本的操作系统功能,而类似于文件系统和网络协议等附加功能则运行在用户空间中。
见下图2-1、图2-2:
微内核的执行效率虽然比不上单内核,但却大大减小了内核的体积,便于维护和移植,更能满足嵌入式系统的要求。
可以考虑将Linux内核部分改造成微内核。
2.1.2实时性方面的不足
Linux虽然符合POSIX1003.1b关于实时扩展部分的标准,但仍然存在如下缺陷:
(1)定时器问题:
Linux的周期模式定时器频率仅为1O0Hz,远不能满足实时应用的要求。
(2)调度问题:
Linux虽然给实时进程提供了较高的优先级,但是并没有加入时间限制。
另外,当多个实时进程互斥请求共享资源时,易发生优先级翻转。
(3)中断关闭问题:
Linux的内核进程经常关闭中断以尽快完成自己的任务,如果低优先级的进程关闭了中断,那么即使有高优先级进程的中断发生,系统也无法响应。
(4)中断优先级问题:
在一个有非常繁重的网络负载和I/O负载系统中,很有可能出现一直处在中断处理状态而没有机会运行任何实时任务。
(5)抢占问题:
虽然Linux2.6开始引入了可抢占内核,但它是不完全抢占的,在这种不可抢占区域还需要给予更多的抢占点才能满足实时性的要求。
(6)虚拟内存管理问题:
对于分时系统来讲这是一个好的解决办法,而对于实时系统却带来不可忍受的不可预测性。
2.2测试通用Linux实时性的方法
根据上述的实时操作系统指标将对通用的Linux内核进行实时性测试,测试的方法是用TSC对中断响应时间和调度延迟进行精确计时。
2.2.1中断响应时间测试
2.2.1.1测试原理
2.2.1.2测试环境
测试平台:
VM下的CentOS5.5Kernel:
2.6.18
CPU:
Itel(R)Celeron(R)CPU2.8GHz
内存:
1.5GB
2.2.1.3测试代码
#include<
signal.h>
#include<
stdio.h>
unistd.h>
fcntl.h>
#definerdtsc(low,high)__asm____volatile__("
rdtsc"
:
"
=a"
(low),"
=d"
(high))
staticvoidsig_usr(int);
intnow,last,high;
intmain()
{
inti=0;
if(signal(SIGINT,sig_usr)==SIG_ERR)
printf("
can'
tcatchSIGINT"
);
while(i++<
100)
{
//rdtsc(last,high);
raise(SIGINT);
rdtsc(last,high);
}
return0;
}
staticvoidsig_usr(intsigno)
if(signo==SIGINT)
rdtsc(now,high);
%d\n"
now-last);
else
receivedsignal%d\n"
signo);
return;
2.2.1.4测试结果
响应时间数量级大概在5微妙跟网上的对于2.6内核的中断响应时间的测试结果很接近。
151381538315299147841481514857148681477314847147211490014763148261479514962150151473114763149001518314721148681474214837147631479514752147841478414784147631479414753148371475314773147421482614711147741473114773147311475214731148581479514857147311485714826148681480514742148051493114773148051486814794148051421328129148471530914857147841464714878146481472114816147001469014837146581474214795146371470014805147521471114574145951463714669147321462615005146271462614753145851462714752147211465814752
2.2.2调度延迟时间测试
2.2.2.1测试原理
2.2.2.2测试环境
2.2.2.3测试代码
intmain()
intfd,high,i=0;
chardata;
registerintnow,delay,last;
while(i++<
usleep(50);
//usleep(100);
%d"
return0;
2.2.2.4测试结果
结果在1毫秒~3.4毫秒范围。
(1)usleep(50)的结果:
24367874216180528544856919033660374425112464033599879719479017024525931508658980572063143091456273328532385345550534051027562927649733330569427780485349529343436147601965347545537400510051325957688262889014067658543822353232178199303543078953993625447662539168754656283627162456009855282085347282536545854595593473473471477355013815325863545034060716044841035278394954358503671084432552881519485525866551987160098334723362548961053218415476579540393027822165364723283560954260743474219458788127895036077757466140227691025366004544803055077646113132466650455503105384432560015428261695144937536177257340395201154281043068095554629660474259828528082689407523281128672985259513274491035537994593414
(2)usleep(100)的结果
12388677528155229732856494271412846352079897727349338138892787455285301636528959653962750811584604349822715419596550108613052487039388126551653170185898485124490635692801314348564273985956530325130647390414160162383795477527408770574283813967285411053049155512952559740351620845583354313936449692405305041556372952944268406268521623253975042885326532310154348215577936523551055839635273320539655954479563151911499271855117025362150546288756484755203915537670363287174600995823852080389782843158529833254084975567446647833253043164415145545351156852145192397584184349795625399992558701853427155426053538973427405005387812558732353217265703631788811453954145480947597446950199875292703542876256440125239280
3目前业界改进Linux的典型案例
3.1Kurt-Linux
Kurt-Linux由Kansas大学开发,它可以提供微秒级的实时精度。
Kurt-Linux是在通用Linux系统的基础上实现的,它也是第一个可以使用普通Linux系统调用的基于Linux的实时系统。
它实现的技术及主要特点有:
(1).系统可运行于三种状态下:
正常态、实时态和混合态;
(2).采用oneshotmode模式;
(3).支持FIFO调度策略、轮转调度策略和分时调度策略。
Kurt-Linux将系统分为正常态、实时态和混合态。
实时任务,在混合态实时和非实时任务都可以执行。
在正常态时它采用普通的Linux的调度策略,在实时态只运行实时要求严格的任务。
在时钟精度方面Kurt-Linux采用单次触发状态(oneshotmode),精确的定时意味着我们需要时钟中断在我们需要的一个比较精确的时间发生,但并非一定需要系统时钟频率达到此精度。
在调度算法方面,Kurt-Linux采用基于时间的静态实时调度算法。
实时任务在设计阶段就需要明确地说明它们实时事件要发生的时间。
这种调度算法对于那些循环执行的任务能够取得较好的调度效果。
3.2Red-Linux
Red-Linux是加州大学Irvine分校开发的实时Linux系统,它将对实时调度的支持和Linux很好地实现在同一个操作系统内核中。
(1).同时支持Time-Driven、Priority-Dirven、Share-Driven三种类型的调度算法;
(2).采用软件模拟管理中断;
(3).在内核中插入了抢占点原语;
(4).提供了可支持多种调度算法的通用调度框架。
Red-Linux同时支持三种类型的调度算法,即:
Time-Driven、Priority-Dirven、Share-Driven。
为了提高系统的调度粒度,RED-Linux使用了软件模拟中断管理器的机制,并且提高了时钟中断频率。
另外为了解决Linux进程在内核态不能被抢占的问题,RED-Linux在Linux内核的很多函数中插入了抢占点原语,使得进程在内核态时,也可以在一定程度上被抢占。
在调度方面RED-Linux的设计目标就是提供一个可以支持各种调度算法的通用的调度框架,通过给每个任务增加必须的属性来实现此目标。
3.3MontaVista-Linux
MontaVista-Linux是MontaVista公司发布的一款主要面向各种嵌入式应用研究的Linux发布,它由公司创立者JamesReady领导开发,其前身是Hard-hatLinux。
它最大的贡献在于:
为了解决Linux在内核态不可被抢占的问题,开发了一种抢占式的内核。
它的实现技术及主要特点有:
(1).开发了抢占式(Preemptible)内核;
(2).直接修改原有Linux内核数据结构;
(3).采用高精度定时器HRT(HighResolutionPOSIXTimers);
(4).低开销固定优先级调度。
MontaVistaLinux通过对Linux内核进行内部改造,直接修改原有Linux内核的数据结构等来满足实时需要。
在时钟精度方面,MontaVistaLinux采用高精度定时器HRT(HighResolutionPOSIXTimers)使得定时器可以产生任何微秒级的中断可抢占内核的补丁包修改了spinlock的宏定义以及中断返回处理代码,若当前进程可以被"
安全"
地抢占并且有一个等待处理的重新调度请求时,系统就会调用调度程序进
行进程调度。
3.4RT-Linux及RTAI
RT-Linux是新墨西哥科技大学(NewMexicoInstituteofTechnology)的研究成果。
它的基本思想是,为了在Linux系统中提供对于硬实时的支持,它实现了一个微内核的小的实时操作系统(我们也称之为RT-Linux的实时子系统),而将普通Linux统作为一个该操作系统中的一个低优先级的任务来运行。
它们的实现技术及特点有:
(1).采用双内核机制;
(2).时钟为单次触发状态(oneshotmode);
(3).基于任务优先级抢占调度策略;
(4).使用RT_FIFO和共享内存方式进行任务间通信。
RTLinux默认情况下采用基于任务优先级抢占的调度策略。
标准Linux作为实时任务调度的最低优先级任务处于就绪状态等待调度[11]。
另外普通Linux系统中的任务可以通过FIFO和实时任务进行通信。
RT-Linux实时子系统中的任务调度可以采用RM、EDF等优先级驱动的算法,也可以采用其他调度算法。
意大利的RTAI(Real-TimeApplicationInterface)源于RT-Linux,它在设计思想上和RT-Linux类似[16]。
其关键技术主要包括通过软件来模拟硬件的中断控制器,并通过提高时钟粒度和基于抢占的实时调度来实现硬实时性能。
4改进Linux实时性的基本策略
4.1兼容内核方法
Linux作为实时系统的独立核方法是指设计一种完全独立的实时核心,但其API与Linux核心相兼容。
这种方法的理论基础是一款优秀的实时操作系统必须在其设计之初就充分考虑到系统实时性的要求,并能够提供符合标准的API。
●优点:
与LinuxAPI的兼容程度是评估这类实时系统的一个重要指标。
如果一个实时系统兼容了所有LinuxAPI,那么就允许所有Linux上的应用程序和库在其上运行使用。
这将会带来一个巨大的好处。
●缺点:
开发一款这样兼容所有LinuxAPI的实时系统决不是件容易的事,尤其是对于单个开发商。
所以大量的第三方软件并不能很容易地移植到实时系统中来,这点也使Linux的优势有些减弱。
4.2双内核方法
通过在Linux操作系统的最底层增加一层实时核心层来实现:
在同一硬件平台上采用了两个相互配合,共同工作的系统核心,一个核心提供精确的实时多任务管理,另一个核心提供复杂的非实时通用功能。
图4-1双内核结构示意图
实时核心负责硬件管理并提供实时任务管理。
实时核心还用软件“模拟”常规Linux系统对底层硬件的使用/禁止中断,而不是真正的操作中断控制寄存器。
Linux核心被看做实时核心中优先级最低的任务来调度,只有当没有可运行的实时任务时Linux核心才会被调度。
在双内核方法中,实时进程和普通进程需要通讯,其实现方法有:
共享内存和FIFO设备接口。
FIFO缓冲区在内核空间分配,实时任务FIFO的接口包括创建、销毁、读和写等操作函数,读和写都是原操作,不能被阻塞,防止了优先级反转的问题,另一方面,Linux的用户进程把FIFO看作是普通的字符设备,可以让用户使用UnixAPI的全部功能与实时任务进行通信。
由于实时核心非常小,并不会增加整个系统的负载,所有这些对开发实时性要求严格的实时软件都提供了有力保障。
实时任务的开发是直接面向提供精确实时服务的实时核心的,所以不能直接利用LinuxAPI和第三方软件及运行库。
而且在一些应用中,实时部分和非实时部分的界线并不是十分分明,期间可能存在着不同程度的软实时部分。
4.3核心内核方法
这种方法能够保证对Linux的改动与Linux的发展相一致,它并不对Linux内核大范