4

随想录(安全关键系统和rtos)

 3 years ago
source link: https://feixiaoxing.blog.csdn.net/article/details/104024600
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

随想录(安全关键系统和rtos)

费晓行 2020-01-17 21:07:16 398
分类专栏: 随想录

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    safety critical system,国内一般翻译成安全关键系统。安全,就是说系统必须能够长时间稳定运行、并且不可以发生故障,同时任何时候都不能对人造成伤害(包括失效的情况下),比如飞机控制系统、电梯系统、汽车自动驾驶系统等等。但是,我们都知道,即使代码测试了很长时间,还是存在失效的风险,所以工程师一般会采用多余度的方法来解决安全的问题。而另外一个词关键,简单说软件必须在规定的时间点,或者是规定的时间范围内做特定的事情。同样以汽车为例,假设汽车发现了行人,如果没有及时进行刹车,那么势必会造成十分严重的后果。

    如果说安全多是从硬件、系统的角度进行设计,那么关键更多的是由软件来完成的。实现这一方法的重要手段就是使用rtos。那么是不是使用了rtos就是满足实时性的关键系统了,也不是。

1、定时中断

    满足实时性的前提,就是在特定的时间点开始任务,并且在特定的时间范围内完成任务。所以,这个时候,系统任务什么时候唤醒、优先级如何设计都必须考虑到。越是关键的任务,优先级越高。然而,关键任务也不能太多。任务多了,实时性可能够了,但是数据吞吐量就要大大折扣了。所以,一般实时的任务少而精,高吞吐量、非实时的任务可以逻辑稍微复杂一些。

2、中断嵌套

    如果嵌入式硬件提供的中断过多,那么系统实时性分析起来就要考虑中断等各种因素,这对整个系统的设计其实是不利的。很容易在代码软件中引入不可控的因素,能用定时轮询的就不要用中断了。在软件开发过程中,也有必要统计一下关中断、开中断的最大时间。

    实际应用中,只需要一个定时中断,其他类型的中断都可以忽略。比如说切分成n个ms之间的中断,如果任务在n毫米内可以完成,那么只需要一个函数入口。如果任务不能再n毫米内完成,那么需要手动切分成若干个时钟周期。这个n可以根据你自己的项目来设定,比如1、2、3、4、5、6、7、8......

    如果外设过多,可以将部分功能交由fpga来完成,这样可以减轻soc的负担。目前fpga可以完成的功能很多,简单的串口、gpio,复杂的编码、解码都可以胜任。这样也就不存在多中断嵌套的问题了。

    一般的实时系统都会提供关抢占、开抢占的功能。但是抢占一旦被关闭,那么高优先级的任务就没有办法按时执行了。所以,必须少使用或者不使用这个功能,这样整个流程才是确定的、也是唯一的。即使使用,也要严格判断关抢占、开抢占的最大时间是多少。

    为保证确定性,尽量减少抢占的使用。

4、线程通信

    不同线程之间进行数据通信是少不了的。在读书的时候,一种常用的方法就是pv操作(生产者-消费者),所谓的一个发消息、一个收消息。然而,因为pv操作会频繁使用mutex和semaphore,这会涉及到很多的任务切换,所以个人建议关键任务最好的方法还是用共享内存的方法来解决。

5、时间统计和约束

    任务的时间点都是有严格要求的,因此有必要在任务切换的时候统计一下,看看花了多长时间、什么时候切换进来的、什么时候切换出去的,总共花了多久时间,有没有发生超时等等。

    网上有一个开源的匿名飞控代码,大家可以参考一下。它将任务简单分成了前后台任务,关键任务都是在周期中断内完成的,其他任务都是放在后台完成,这也是一种处理方法。不管什么样的关键系统,它的行为都必须要是在规定的时间开始、规定的时间结束、整个行为和流程是确定和唯一的,只要做到这一点,就可以说这是一个满足硬实时性的关键系统。

    安全关键,安全就是稳定、可靠、有保障,关键就是实时、唯一、确定。

    多余度管理是安全关键系统另外一项重要的技术,也是需要好好掌握的。不过相对于分布式系统,这部分多选用硬件来做,特别是cpld、fpga来完成的居多。常用的系统多以双余度、三余度为主,少部分系统甚至会采用四余度。双余度意味着如果一套电路失效了,可以依靠另外一套电路紧急接管、处理,并且在短时间内慢慢让系统停止运行、保证人能够不受伤害。三余度则不然,一套电路失败了,依靠另外两套板子仍能工作,也就是说三余度可以接受一套电路完全失效。依次类推,四余度的话,可以有两次失败机会。当然,子系统越多,逻辑也越复杂,成本也越高,这中间需要权衡。

    目前这块领域,arinc653,也就是航空电子操作系统标准,算是要求比较高的,可以用来借鉴一下。  


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK