/注明/ 文章内容由汽车功能安全行业工程师口述及参考行业资料整理,仅代表个人观点,如果更好的建议和补充,可以留言互动!
软件架构设计应被开发到能够识别出软件单元的程度。这意味着在进行软件架构设计时,需要将软件系统分解到最小的、可独立测试的软件单元级别,以便于对软件进行开发、测试和维护,也有利于确保软件架构能够满足软件安全需求和其他功能需求,实现对软件功能在软件组件层面的有效分解。 软件安全要求应按层次分配给软件组件,直至软件单元。每个软件组件应按照分配给它的任何需求的最高的 ASIL 等级来进行开发。这样可以保证软件系统中的每个组件都能满足相应的安全要求,从整体上提高软件系统的安全性和可靠性,确保软件在不同安全等级要求下的正确运行,降低因软件故障导致的风险。 软件架构设计应描述软件架构要素的静态设计方面和动态设计方面。
今天主要聊聊静态设计和动态设计相关:
静态设计方面
软件单元结构:需清晰描述软件单元的组成结构,包括软件单元的层次划分、模块组成等。软件架构应呈现出清晰的分级层次结构,明确划分不同的软件层次和模块,例如将汽车软件系统分为应用层、中间件层和驱动层等,使软件的组织架构一目了然,便于开发、维护和管理。在比如在汽车电子系统软件架构中,明确划分出传感器数据处理模块、控制算法模块、执行器驱动模块等不同层次的软件单元,以及它们之间的包含或从属关系。 接口定义:详细规定软件单元之间的接口,包括接口的类型(如函数调用接口、消息传递接口等)、接口的参数定义(参数的类型、范围等)、接口的语义(接口实现的功能和行为的说明)。比如,传感器数据处理模块向控制算法模块提供数据的接口,要明确数据的格式、数据的更新频率等信息。 清晰地定义软件组件的外部接口,包括接口的名称、参数列表、返回值类型等,明确软件组件与外部环境或其他组件之间的交互方式和协议。 对于嵌入式软件,要专门定义其与外部硬件设备、其他嵌入式软件或系统的接口,涵盖通信协议、信号格式、电气特性等方面的内容。 资源分配:说明软件单元对各种资源的分配情况,如内存资源(每个软件单元占用的内存大小、内存的分配方式等)、存储资源(数据存储的位置、存储容量等)。像在存储控制策略相关数据的软件单元,要指出其占用的内存地址范围和存储容量。对嵌入式软件所需的各类资源进行上限预估,包括执行时间、存储空间(如 RAM 和 ROM)、通信资源等,以便合理分配资源,避免资源不足导致软件运行错误或性能下降。 数据结构:阐述软件单元内部和软件单元之间使用的数据结构,包括数据的组织形式(如数组、链表等)、数据的类型(基本数据类型、自定义数据类型等)。例如,在处理车辆行驶状态数据的软件单元中,说明使用数组来存储不同时刻的车速、加速度等数据,以及每个数据项的数据类型。要对全局变量进行严格管理,明确其名称、数据类型、作用域以及初始化值等,控制全局变量的使用,避免因过多使用导致软件的可维护性和可测试性下降。
动态设计方面
执行行为:描述软件单元在运行时的执行行为,如软件单元的执行顺序、执行的触发条件等。例如,在车辆启动时,先执行系统初始化软件单元,然后根据传感器信号触发相应的功能软件单元。描述软件组件在不同输入和环境条件下的功能行为,包括数据处理流程、算法执行逻辑、状态转换等,例如说明一个发动机控制软件在不同转速、负荷等条件下的控制策略和输出结果。定义软件在遇到异常情况(如硬件故障、数据错误、通信中断等)时的行为,包括错误检测、错误处理、恢复机制等,确保软件在异常情况下能够保持安全状态或进行合理的故障处理。 任务调度:说明软件单元之间的任务调度策略,包括任务的优先级分配(高优先级任务优先执行等)、任务的并发执行方式(多线程、多进程等)。比如,在汽车紧急制动系统中,制动控制任务的优先级高于一些非关键的信息显示任务。 通信机制:介绍软件单元之间的数据通信机制,如实时通信(在规定的时间内完成数据传输)、异步通信(数据传输不依赖于特定的时间顺序)等,以及通信的协议和方式(如 CAN 总线通信协议等)。例如,在汽车的不同电子控制单元之间,通过 CAN 总线进行实时的数据通信。 状态转换:描述软件单元在运行过程中的状态转换情况,包括状态的定义(如初始化状态、运行状态、故障状态等)、状态转换的条件和触发事件。比如,当电池管理系统检测到电池电量过低时,软件单元从正常运行状态转换到低电量报警状态。