安全性结构设计-电动汽车电子零件

十多年前,我从学校大学毕业,聘用某电动汽车电子零件从事电动汽车电子零件的产品研制。

当时首份组织工作就是汇整并译者认知电动汽车电子零件的软硬体结构导则化。

并且负责管理每晚一般来说一半小时向全部门的技师介绍规范化要求。

这本组织工作对我后的研制组织工作负面影响巨大。在后的从业人员职业生涯中,我严苛遵从该规范化结构设计应用软件和硬体,并不断归纳健全,形成了自己独一无二的两套嵌入式应用软件结构设计经验和组件。

1. 应用软件排程-排序命令

不能将排序命令数用作计时器目的,即使这种作法会使网络系统应用软件、硬体的发生变动相当脆弱。命令排序可用作下层的硬体USB。该个别情况的原因理应明确的历史记录,并对标识符进行完备注解。要对下述个别情况列详尽的目录,在结构设计审核中详述排程排序方法、电脑系统类型、计时器器速度及计时器器的预扩频、PLLG640。

2. MCU增设-掌控暂存器的创下

负面影响组件正常操作的MCU掌控暂存器要以<=5S的间距间歇创下。每晚登位时,那些暂存器都要重新调用。

假如在午睡状况下选用HTTP商业模式, 那么在午睡状况下,那些暂存器<=5S的间距间歇创下。假如没有选用HTTP商业模式,在MCU被唤起时,暂存器要创下。

对MCU的所有输入,在增设方向暂存器之前要恰当增设数据暂存器。

对载入值会造成非预期副负面效应的暂存器或者纸制载入暂存器,流程要以完全相同的创下周期监视暂存器的值,一旦暂存器值改变,流程要强制性MCU登位。

即使积体电路工艺技术的瑕疵,暂存器长期的电荷泄漏会导致其值的改变。该要求是为了增加应用软件的鲁棒性,减少被误操作的风险。这条要求对长期上电的组件尤其重要。

3. CPU负荷

对新开发的组件,在CP阶段,最坏情况下的CPU负荷不得超过CPU时80%,在JOB1阶段,不得超过90%,任何组件,最坏情况下的CPU负荷不得超过95%。

最坏情况下的CPU中断负荷不能超过30%的CPU带宽。

4. 未编写的流程存储器

运行未编写的流程存储器应对MCU进行登位。一旦PC指针超出流程存储器的地址范围,登位是PC指针清零,以及暂存器重新调用的最安全、有效的方式。

5. 非易失存储器的数据完备性

假如使用了非易性存储器,要通过一些方法来验证数据的完备性(比如checksum)。

在数据调用的过程中验证数据的完备性,调用后也应定期验证。

一旦验证出数据完备性被破坏,要历史记录错误信息,并在随后采取错误抑制策略。

错误抑制策略要要解决下述问题:

  1. 如何重新调用存储器(新的值从何而来)
  2. 何时重新调用存储器。
  3. 何时执行登位操作。

6. 动态内存分配

不要使用内存分配函数(比如C语言中的malloc)来定义动态数据结构(甚至最简单的原子数据类型)。

内存分配功能仅限于静态的数据结构。

由编译器定义及管理的局部变量不受此限制。

该要求的目的在于通过消除内存碎片,内存泄露及内存与堆的冲突来增强应用软件的鲁棒性。

7. 汇编语言

应用流程应该用高级语言编写,而不能使用汇编语言。

特例:汇编语言可用作下层的硬体访问(关闭中断,使能中断,空操作,暂存器访问)以及中断服务流程。

假如使用了汇编语言,要用函数或宏定义隔离出来,明确历史记录;而且标识符要完备注解。应用软件结构设计审核要提供汇编语言使用情况的完备目录并得到批准。

目的在于增加应用软件的安全性,可读性和可维护性。另一方面,自动的静态分析工具以及复杂性度量工具一般不支持汇编语言。

8. 面向对象的语言

由于嵌入式的C++使用较少,而且缺乏公开而且广为接受应用软件标准,不允许使用面向对象的语言。一般而言,BCM不需要那些语言的复杂性和功能。

9. 电脑系统的选择-客户定制的MCU

按照以往经验,和标准MCU相比,定制的MCU的升级路径有限。MCU产商对标准的MCU在制造和工程上将给予更大的支持。另一方面,一些工具对定制MCU的支持更具局限性。这包括:编译器,连接器,仿真设备。

因此,不能使用定制的MCU。定制的MCU是指购买量超过厂商最销售50%的MCU。

10. MCU存储器空间

应用和诊断内存的分配中,应保留备用资源,如下:

RAM 流程标识符空间 EEPROM

报价阶段 30% 30% 30%

样车确认阶段 20% 20% 20%

整车投产阶段 10% 10% 10%

备注:作为以上备用资源分配的替代方案为,有一个MCU机的升级路径,这个升级路径(有更大的RAM, Flash 和 EEPROM)要是使用完全相同的封装。

11. 应用软件循环

等待某一事件的循环,除了看门狗登位以外,要有替代的退出机制。

12. 实时的边界检查

关键的输入和数据要经过合法边界值的校验。

13. 非易失存储器的数据更新

修改的NVRAM数据应在获取数据后的25ms内完成存储组织工作。

要经常修改的数据同样允许在积累多次变更后再载入内存,避免损耗NVRAM。然而,只有具有最小更新频率规定的数据项目才适用。

多字节的数据据可能超过25ms,但是至少以25ms/字节的速度更新。

14. 非易失存储器-可靠的载入排程

系统结构设计要要保证非易失存储器载入排程的完备性。甚至在组件掉电时也应如此。

15. 非易失存储器的使用寿命

在NVRAM整个使用寿命中所载入NVRAM任何一个存取单元的读写次数都不能超过NVRAM制造商所规定的NVRAM最大允许读载入次数。

组织工作温度对NVRAM的使用寿命有一定的不良负面影响。

16. 非易失存储器的调用

所有组件在出厂前要对非易失存储器进行调用。

17. 看门狗

要使用看门狗防止流程跑飞。

最坏情况下的看门狗计数器周期要至少超过最坏情况下喂狗周期20%,包括公差累积以及最坏情况下的中断。

只能在一般来说的应用软件存储单元内喂狗,而且不应在中断服务流程中进行。喂狗要依靠计时器器的恰当操作。因此要求直接通过计时器器掌控喂狗时间,Watchdog 允许在其它的一些存储单元内进行清理,例如登位调用,一些很长和低功耗商业模式存储单位。

备注:登位调用和唤起调用不同。

18. 外部中断

不允许外部的输入造成CPU的中断。

假如确实需要外部中断:

a. 输入端口要使用硬体的低通滤波器

b. 削波频率要至少比预计的最差情况下的频率高5%

c. 具有削波频率的中断不会超过最坏情况的CPU负荷

19. 计时器器预扩频及PLL

只有在下述情况下改变MCU的计时器器预扩频及PLL:

a. 在登位调用时

b. 在进入低功耗(午睡)商业模式之前

c. 在退出低功耗(午睡)商业模式后

只要MCU的计时器器预扩频及PLL有改变,那么标识符应该考虑在MCU规格书中要求的稳间歇间。

20. 值比较

a. 整型变量(非枚举或布尔)只能使用不等号进行比较。

b. 循环中止语句要用不等号进行比较。

c. 不要比较浮点型变量是否相等。即使浮点型变量本身就不准确。

下述情况例外:

  1. 申明为整数,却用作枚举类型的变量。
  2. 将一个整数与其代表的最大值和最小值进行比较。
  3. 将一个整数和零做比较。