本帖最后由 jorya_txj 于 2015-1-17 14:09 编辑
什么是实时性?这个问题可以分几个方面回答:
1 一些实时应用都具备deadlines,硬件触发之后多久能响应处理这个事件的任务。通俗的说硬件中断来了接收到处理的数据后,多久能响应这个处理数据的任务。这个时间叫做任务延迟,如果衡量一个系统实时性的话会取这个时间的最大值叫做任务的最大延迟时间。 2 硬件中断触发了,多久能响应这个硬件中断,这个时间叫做中断延迟,取最大值叫做系统最大的中断延迟时间。
系统最大的中断延迟时间更多的是一个硬实时的标准,和我们做硬件驱动的更紧密相关,也是衡量一个系统实时性的最重要的标准。 实时性到底对我们做驱动的有啥影响。举几个例子: 假设串口的波特率是115200,硬件接收的fifo为一个字节,那么接收一个字节的时间为100us。 如果fifo到了一个字节触发中断的时候,需要在100us内把这一个字节数据取走,如果不取走的话,后面串口数据还会塞进fifo,但是fifo满了会造成数据的丢失。我们知道一个系统都会有最大的中断延迟时间,根据我个人的经验500MHz的arm11 cpu 在linux没有任何负载的情况下处理间隔为500us的中断频率会丢失中断。我有一个同事在500M Hz的arm11 cpu做过针式打印机需要在一个特定的时间内,被动接收900多个gpio的中断,中断的间隔为500us, 无论采取什么样的方式都会丢失中断,从而造成打印出问题。另外一个例子是产业线上给酒瓶加上盖子,机器加盖子的时间必须要严格控制时间,不能快也不能慢,不然盖子就会盖歪掉。所以实时性并不单单是快,更多的是在时间上的一个稳定性。 对于一个操作系统而言系统最大的中断延迟时间是天生决定的,一般很难改善,linux下的很多api都采用了spin_lock_irq这种来采取关中断保护临界区资源,而且tick 中断这种在上半部做的时间也很长,这一点决定了纯linux内核无论如何改善也不可能到达硬实时的级别。不过系统最大的关中断时间可以通过提高cpu的频率来最大改善。对于外面商用的实时操作系统而言,商家给出的数据在100Mhz 的cortex-m 系列的cpu上为30us或者更低。本人写的实时操作系统raw-os由于采用了特殊的技术,系统最大的关中断时间大致在0.6us。在100Mhz 的cortex-m系列的cpu上。
Linux目前主要用作消费类电子上,很大原因是因为硬实时这块达不到标准。工控设备更多的是采用rtos。 消费类电子对于时间不会太敏感,慢一点,快一点都能接受,因为面向的客户是人的感受。对于语音,视频,一些电信设备更多是注重软实时级别,即之前说的 任务的最大延迟时间以及关注任务的deadline时间,deadline 的时间取决于用户的应用,对于linux内核而言能提供给用户就是上面说的任务的最大延迟时间,只要压缩这个时间,对于软实时级别的实时性能大大提升从而对于上面用户的deadline时间提供更宽裕的时间。 由于linux目前内核的一些局限性,软实时级别的可能有的时候也难以满足要求,一些电信设备对于任务deadline 的时间比较敏感,普通的linux内核可能难以达到应有的效果。我有朋友在阿尔卡特做电信设备,采用的linux是windriver风河公司的实时linux做这块,不过价格昂贵达,需要一百万左右的欧元。
下面谈一下如何改造linux内核的实时性。目前有一个专门的著名linux项目叫做realtime linux patch,采用的技术是从linux内核自身去改善实时性。 大家可能知道Ingo Molnar以及Thomas Gleixner这两个人,内核的均衡调度算法是他们弄得。这个实时linux补丁也主要由他们在负责。目前有很多实时linux补丁的特性合并到了linux主内核,比如中断线程化,rtmutex 等等特性。未来几年这个补丁合并到主内核的可能性比较大。大家感兴趣的可以到这个网站了解一下: 下面简单的谈一下这个补丁具体是如何来提高linux的实时性的。
1 spinlock 不关抢占,提供抢了抢占的可能性,spinlock通过rtmutex的实现来完成这个功能。当然原先的spin_lock功能也需要保留,可以通过raw_spinlock来替代。 2 spinlock以及semaphore 也实现了优先级继承的功能。
3 整个中断线程化,softirq也搬到外部线程环境执行,不过中断注册在irq环境内也是可以的。
通过以上3点可以很大的提高linux的软实时性。下面简单的解释一下这3点的作用。 我们知道一旦一个线程关了抢占后,这个线程在执行期间内是不允许被其他线程抢占的,这样就会绑死一个cpu,即使有更高优先级的线程就绪,也只能等这个线程开抢占。Linux内核的协议栈中大量用到了spinlock ,会对任务延迟这个时间急剧的增大,从而造成实时性的降低,所以这一点是最重要的一点。 优先级反转对于实时性的损害非常之大,后面会谈到什么是优先级反转以及如何解决优先级反转的问题。所以spinlock 以及semaphore,尤其是spinlock解决优先级反转是必须要的。 我们都知道linux的中断在上半部的时候处理中断是关了cpu的中断的,这样会直接造成系统最大关中断时间的急剧上升。从而造成硬实时性能的下降。所以中断线程化也是必需的一个标准。
|