前言
在上一家公司的时候,有幸参加过公司内部的技术分享会,有一个同事跟我们分享了功能安全的一些内容。在提问环节,我问了一个问题“什么是功能安全?”他回答不上来。这也是我们很多人在工作中常犯的一个问题:我们做了某件事,但是我们往往不知道为什么要做这件事。
在弄清楚什么是功能安全之前,我们先弄清楚为什么要做功能安全?
一、ISO26262定义
ISO26262-part1:随着技术复杂性、软件内容和机电一体化的日益增加,在实施过程中,系统故障和随机硬件故障的风险越来越大,这些被认为是在功能安全的范围内。
描述了与安全相关的故障是E/E系统产生的,而不是一些自然灾害,人为破坏等。
初步来看,功能的安全是由故障产生的,那我们在发布软件之前进行测试,将所有的故障都消除掉,是不是可以了?很显然并不是,测试消除掉的是BUG,这是软件发布时不允许有的。功能安全做的并不是消除由BUG引起的故障,而是那些原本好的电子电气由于老化等不可能控的原因造成的。
二、为什么要做功能安全?
在讲为什么要做功能安全之前,我先跟大家讲一个例子。在也是我当初在日企,一个日本的功能安全工程师给我们讲解的一个例子,我觉得特别好,虽然他讲的日语我完全没听懂,好在这个例子,我记住了。
火车,相信大家都知道。如下图,火车在下面的轨道上行驶,汽车,羊群,在自己的道路上移动,看着是没有问题的。但是如果火车来了,汽车也来了,他们速度很快,没刹住,是不是就撞上了。
他们有可能一辈子也不会相撞,但是只要撞上了一次,就是一个事故,这是我们不允许的。
所以,如何避免这样的事情发生呢?
机制的你可能想到了,如下图,加个红绿灯,就可以了。理想很美好,但是显示啊,往往总是差强人意。 并不是所有人都遵守交通规则,闯红灯的比比皆是,那么还是不安全啊。
那我们就再加一个栏杆,加一个看守员不就好了,在火车来之前几分钟,把栏杆落下来。 火车走后,再把栏杆抬起来,这样就能完美解决问题了。
看到这里,你对功能安全是不是有一点点了解了?
三、功能安全做什么?
通过上面的例子,我想机智的你们应该大概能猜到,功能安全要做什么了,当然上述的例子只是整个功能安全中的一部分。
ISO26262-Part1中如下描述:
简单来说就是对流程,生产,交付做了一些约束;对硬件设计,软件代码,做了一些故障的检测。
比如在通信的时候,为了保证数据的完整性及连续性: 我们用CRC, Rolling counter来确保
堆栈的溢出:我们增加堆栈溢出的检测
内存的错误:MCU支持ECC内存错误检测
代码有没有跑飞:使用看门狗来保证
等等。。。
检测到故障是第一步, 然后就是要根据故障的严重程度,对车辆进行功能降级啊,或者功能完全禁止啊又或者其他的一些列操作,来使车辆进入一个安全的状态。