|
知识路径: > 嵌入式系统软件基础知识 > 嵌入式系统程序设计 > 嵌入式软件开发过程 > 嵌入式软件设计 >
|
相关知识点:32个
|
|
|
|
嵌入式软件在设计过程要遵循一些国家标准、军用标准、行业标准、企业标准或特定型号标准,在这些标准中通常会对软件的设计提出一些约束,包括模块接口设计约束、中断设计约束、异常设计约束、数据安全设计约束、余量设计约束及其他方面的设计约束。
|
|
|
|
(1)模块的参数定义应与该模块接受的输入参数定义一致,包括参数的个数、属性、单位和次序。
|
|
|
(2)传送给被调用模块的参数定义应与该模块的参数定义一致,包括参数的个数、属性、单位和次序。
|
|
|
(3)模块内部函数调用时,参数的个数、属性、单位和次序一致。
|
|
|
|
(5)全局变量在所有引用它们的模块中有相同的定义。
|
|
|
(6)模块间传递的参数个数不超过5个。当需要传递的参数过多时,采用结构体传递参数。
|
|
|
(7)模块间的数据通信可采用操作系统提供的通信接口实现。
|
|
|
|
(1)系统初始化阶段屏蔽无用中断,并对无用中断设置入口并返回。
|
|
|
(2)中断初始化要初始化中断所需的全部资源,包括中断向量号、触发方式、中断服务程序等。
|
|
|
(3)分析系统出现的假中断或频繁中断的影响,给出处理措施。
|
|
|
(4)程序中开关中断位置要仔细分析,避免关闭范围过大或过小。
|
|
|
(5)尽量避免使用中断嵌套的功能,进入中断后关掉不希望嵌套的中断。
|
|
|
(6)避免在中断服务程序中使用跳转语句或子程序返回直接跳出中断。
|
|
|
(7)与操作系统配合完成中断现场的保存和恢复,对于操作系统未处理的现场,在用户连接的中断处理程序中要辅助保存和恢复。
|
|
|
(8)应考虑不同优先级的中断处理程序,以及中断处理与普通程序之间临界区保护问题。
|
|
|
(9)中断处理程序尽可能简短,不要在中断处理程序中调用操作系统的资源申请或时间等待服务。
|
|
|
|
(1)除中断服务程序外,模块应采用单入口和单出口的控制结构。
|
|
|
(2)控制模块的扇入扇出数。将模块在逻辑上划分为层次结构,并在不同层次上定义不同扇入扇出。
|
|
|
(3)通过提高模块内聚度和降低耦合度,提高模块独立性。通常采用模块变量局部化、限制模块间参数传递、采用模块调用等方式实现。
|
|
|
(4)对于模块间耦合方式,按照数据耦合、控制耦合、外部耦合、公共数据耦合、内容耦合的优先顺序进行处理。
|
|
|
(5)对于模块内聚,按照功能内聚、顺序内聚、通信内聚、时间内聚、逻辑内聚、偶然内聚的优先顺序进行处理。
|
|
|
(6)禁止使用递归设计。嵌入式系统的资源有限,任务栈通常不会很大,递归调用容易产生栈溢出问题。
|
|
|
|
(1)软件设计时应对所有可能发生的异常状态进行接管。
|
|
|
(2)设计或使用统一的异常处理机制,使得发生异常时系统能够转入安全状态。
|
|
|
(3)要充分分析外购软件或重用软件中的异常处理,是否与系统的异常处理相适应。
|
|
|
|
(1)规定数据的合理范围,包括值域、变化速率。如果数据超出范围,应进行出错处理。
|
|
|
(2)数值运算时注意数值范围及误差,保证输入、输出及中间计算结果不超过机器数值表示范围。
|
|
|
(3)保证运算所要求的精度,充分考虑到计算误差、舍入误差,选定足够的数据有效位。
|
|
|
(4)在软件入口、出口和关键点上,对重要物理量范围进行合理性检查,并定义出错时的隔离措施。
|
|
|
(5)考虑浮点数接近零时的处理方式,避免下溢。避免对于浮点数进行相等关系的判断。
|
|
|
(6)定期检查存储器、指令和数据总线。测试指令序列的设计必须确保单点或很可能的复合失效能够被检测出来。加载时必须进行数据传输的检查及程序加载验证检查,并在此后定期进行,以确保安全关键代码的完整性。
|
|
|
|
(1)在资源分配和余量要求上,应确定软件模块存储量(包括内存、固存)、输入/输出吞吐率及处理时间,满足系统规定的余量要求。通常系统未确定情况下,一般应留有不少于20%的余量。
|
|
|
(2)在时间安排和余量要求上,应根据被控对象确定各种周期,包括控制周期、数据处理周期、采样周期、自检测周期、输入/输出周期等。在同一个时间轴上进行各个周期的安排,当安排不下时,应提高系统硬件处理能力或采用并行处理方式。
|
|
|
|
(1)如果应用任务对系统响应时间要求非常高,应使用抢占式的调度方法。抢占式调度总能保证最高优先级的任务在运行,并且该最高优先级任务的执行是确定的,其任务级响应时间可以最小化。
|
|
|
(2)如果系统采用并发处理方式,那么就应该考虑函数的可重入性。正在执行非可重入函数的任务被抢占后,可能会导致数据的破坏。采用可重入函数可以解决上述问题。可以通过仅使用局部变量(CPU寄存器变量或栈中的变量),或者在使用全局变量时对其进行互斥保护来实现可重入。
|
|
|
(3)如果软件需要使用互斥机制,那么优先考虑使用操作系统提供的互斥机制。当多个任务间通过共享数据结构进行通信时,需要实现互斥,以保证数据不会被破坏。如果选用了操作系统,优先考虑使用操作系统提供的互斥机制,如互斥信号量等。
|
|
|
(4)任务与任务之间、任务与中断之间需要访问共享资源时应使用互斥机制。共享资源包括全局数据、端口、内存地址等,对这些共享资源进行访问需采用互斥机制。
|
|
|
(5)调用函数后,检查返回值。不应认为调用的函数一定是正确执行的,建议调用后立即检查其返回值,并做相应处理。
|
|
|
(6)对于计算系统的安全关键子系统编写故障检测和隔离程序。故障检测程序必须设计成在这些有关安全关键功能执行之前检测潜在的安全关键失效。故障隔离程序必须设计成将故障隔离到实际的最低级,并向操作员或维护人员提供这个信息。
|
|
|
(7)通过数据隐藏的方式实现全局数据的保护。借鉴面向对象设计中数据封装的思想,将全局数据封装为抽象数据类型,不允许任务直接访问该全局数据,而是通过与该全局数据配套的函数来访问,并且在访问该全局数据时进行互斥保护。
|
|
|
(8)仅在软件初始化时完成空间分配。软件正常状态不释放内存。动态的内存释放与分配会导致产生内存碎片,可能存在空闲空间总和满足要求,却申请不到内存的情况,从而导致软件行为的不确定性。
|
|
|
(9)变量使用前应初始化。特别是静态变量,不能依赖编译器对其进行初始化设置,应将其人工设置为特定的值。
|
|
|
(10)应将硬件设备初始化为确定状态。不能想当然地认为硬件设备上电后就处于某种状态,而应该人工将其设定为某种状态。
|
|
|
(11)延时设计应避免采用循环的方法。采用循环方法延时在代码优化时可能出现错误。建议借助硬件高精度时钟实现延时。如由于硬件条件限制只能采用循环延时方法,应考虑编译器优化和硬件特性问题,并在软件设计文档中进行特别说明,如增加防止编译优化,及要求使用何种硬件。
|
|
|
(12)应确保延时使用的时钟精度满足延时误差的要求。
|
|
|