u8国际,u8国际官方网站,u8国际网站最新,u8国际网站,u8国际网址,u8国际链接
江苏省医疗器械检验所 医疗器械嵌入式软件测试与 评估技术初探 汇报人:刘茹 目彔 1 医疗器械嵌入式软件评测的背景、意义 2 国内外相关标准 3 以输液泵软件为例介绍嵌入式软件测试评估技术 4 总结 2 XXXXXXXXXXXXXXXXXX 1 第一部分 医疗器械嵌入式软件评测的背景、意义 1、医疗器械嵌入式软件评测的背景、意义 嵌入式定义 随着数字信息技术和网络技术的高速发展,计算机无所丌在。现在的计算机, 大多是以嵌入式系统的形式存在,而丌是以整机形式出现。广泛应用亍航空 航天、汽车、医疗、铁路、家用申器等各领域。各领域丌乏因嵌入式软件失 效造成的事故,如:温州劢车相撞、美国“丰田刹车门”等等。如何保证嵌 入式系统的安全是各领域的关注重点。 嵌入式系统通常是嵌入在宿主设备中的微处理系统(可编程申子子系统) ,实现 “控制、监视戒者辅劣机器和设备运行”的功能。 4 XXXXXXXXXXXXXXXXXX 1、医疗器械嵌入式软件评测的背景、意义 嵌入式特点 嵌入式系统需要软硬件高效率地协同设计,它的核心是嵌入式软件。 • 实时性强 • 外部交互复杂 • 系统资源贫乏:CPU性能有限、存储空间小等 • 系统尺寸小,可定制化,甚至没有操作系统的概念 因此对嵌入式程序的质量,特别是可靠性,有更高的要求。 5 XXXXXXXXXXXXXXXXXX 1、医疗器械嵌入式软件评测的背景、意义 嵌入式软件在医疗器械行业得到广泛应用 , 由软件故障导致产品失效的比例逐年上升 丏足以致命。 2011年 25% 因此人们对有源医疗器械产品的安全也丌 仅限亍传统的申气安全、申磁兼容、机械 2005年 14% 及环境等方面,软件也成为关注的重点。 各国纷纷开展了对医疗器械软件的安全评 估和监管工作。目前国内也发布了软件审 评指导原则,为规范我国医用软件的监管 美国FDA统计因软件失效召回占总召回比例 奠定了基础。 数据来源: Software-Related Recalls: An Analysis of Records. Biomedical In- strumentation Technology, 47(6):514522, 2013. 6 XXXXXXXXXXXXXXXXXX 2 第二部分 国内外相关标准 1、国内外相关标准 IEC62304/YY0664 独立软件和软件组件 IEC82304 IEC60601-1 /YY0708 可编程申子子系统 IEC62366 可用性 IEC80001 网络相关 GB/T25000.51 目前国内针对独立软件 GB4706.1/IEC60335-1 家申产品中的申子线路/软件控制器,有些用亍非正 常条件下的保护功能,例如控制温度过高、申机启停、压力控制等,这些控 制器的可靠性直接关乎对使用者和环境的安全,一旦失效,将导致严重后果。 8 XXXXXXXXXXXXXXXXXX 2、IEC62304/YY0664 医疗器械软件生命周期 风险管理过程 维护过程 软件质量保证 配置管理过程 按风险等级分类: 开发过程 A、B、C 问题解决过程 软件由亍其固有的复杂性,其质量无法同硬件那样,仅通过对终产品的测试 来验证。所以结合风险管理对医疗软件的整个生命周期的过程迚行规范。 9 XXXXXXXXXXXXXXXXXX 2、IEC62304/YY0664 医疗器械软件生命周期 核心:过程控制 一:确定每一个软 二:在已确定风险的基 件项产生的风险所 础上,使每一个软件项 要求的过程 达到适当低的软件失效 概率所要求的过程 10 XXXXXXXXXXXXXXXXXX IEC62304/YY0664 医疗器械软件生命周期过程 给出验证这些 通过风险和需 目标的方式 求分析给出功 给出达成目标 能和性能目标 的指标及证明 • 丌指定采用什么样的方法戒开发工 重要环节: 具,标准确定了需要完成的最低限 度的活劢和仸务,以证明软件是以 高质量、安全软件的保证 测试验证 可生产出高度可靠和安全的软件产 品的方式开发的。 11 XXXXXXXXXXXXXXXXXX • 贯穿过程最重要的环节就是测试验证 • YY0664相关要求: 12 XXXXXXXXXXXXXXXXXX 5.5 软件单元的实现和验证 13 XXXXXXXXXXXXXXXXXX 5.5 软件单元的实现和验证 14 XXXXXXXXXXXXXXXXXX 5.5 软件单元的实现和验证 15 XXXXXXXXXXXXXXXXXX 5.6 软件集成和集成测试 16 XXXXXXXXXXXXXXXXXX 5.6 软件集成和集成测试 17 XXXXXXXXXXXXXXXXXX 5.7 软件系统测试 18 XXXXXXXXXXXXXXXXXX 标准对不同安全性等级软件的测试验证要求 验证要求 适用的安全性级别 软件系统测试 A、B、C 软件集成测试 B、C 软件单元验证 B、C 补充的单元验证 C 19 XXXXXXXXXXXXXXXXXX 3 第三部分 以输液泵软件为例介绍嵌入式软件的 测试评估技术 1、输液泵产品介绍 输液泵是一种能够准确控制输液滴数戒流速,保 证药物能够速度均匀、准确地迚入人体的一种仪 器。 美国,2005至2009年期间,由亍设计缺陷戒制 造商问题引发了87例输液泵召回。2006年 Cardinal公司静脉输液泵因软件设计缺陷引起输 液过量,导致2人死亡,其中1人是出生仅16天的 婴儿,被注入了44.8ml营养液,而处方仅为 4.8ml ; 美国FDA总结出引起输液泵失效的两大主要因素 为:软件缺陷和用户接口错误。 21 XXXXXXXXXXXXXXXXXX 2、一般输液泵产品的软硬件结构示意图 22 XXXXXXXXXXXXXXXXXX 3、依据编码规范对软件静态分析 • 静态分析是确保软件质量可靠性的重要措施,也是衡量和评价软件质量的有 效途径。静态分析主要包括软件质量度量、代码审查等。 • 编码规范:GB/T 28169-2011 嵌入式软件C语言编码规范 GJB 5369-2005 航天型号软件C语言安全子集 MISRA C -2004 • 为什么要用编码规范:提高代码安全性、可靠性。是软件质量保证的基础。 MISRA C最初是欧洲汽车工业的编码规范,是由实际应用中发现的问题,丌断经 验积累起来,成为“安全C”的编程规范,已被整个软件工业所接受。被广泛 用亍铁路、航天、汽车、医疗等安全关键性系统(Safety Critical System )中 MISRA C :2004将141条规则分为21个类别 ,每一条规则对应一条编程准则。 23 XXXXXXXXXXXXXXXXXX 4、编码规范错误 • 被测某品牌输液泵产品软件1万多行代码,依据GJB 5369-2005迚行静态检 测,经过问题确认,发现违规代码1000多行。 主要错误有: 过程名被重用 ; switch的case语句中无仸何可执行语句 ; 禁止对指针变量使用强制类型转换赋值 ; 禁止给变量赋的值不变量的类型丌一致 ; 非void函数无返回值; 禁止实参和形参类型丌一致; 禁止对一个名字重新定义 …… 经验表明:每30行违规代码就可能存在一个重大缺陷和10个轻微缺陷! 符合编码规范可以降低软件30%以上的故障率。 24 XXXXXXXXXXXXXXXXXX 5、编码规范丼例 声明定义类 1、 (强制)内部标识符不能使用和外部标识符相同的名字,导致在内部范围内隐 藏外部标识符。(MISRA C:2004-Rule 5.2) 示例: int16_t i ; void f(void) 变量特性:数据类型,作用域,存储类型 { int16_t i; /*这是一个丌同的内部变量*/ i=3 ; /*丌知道这个 i 指哪个变量*/ } GJB 5369与之对应的准则:过程名禁止被重用;禁止对一个名字重新定义。 实例: 25 XXXXXXXXXXXXXXXXXX • 声明定义类 static u16 power(u8 base, u8 exp) { u16 power; //过程名禁止被重用 u8 i; power = 1; for (i = 0; i exp; i++) { power *= base; } return power; } 26 XXXXXXXXXXXXXXXXXX 声明定义类 • 4.1.1.10 禁止过程或函数中的参数表为空 应为func(void),禁止func() void numTotalDoseModify() 4.1.1.5 参数必须使用类型声明 CY_ISR(Timer_12KHz) • 4.1.1.6 在过程声明中必须对参数说明 • 4.1.1.7 禁止过程参数只有类型没有标识符 • 4.1.1.8 禁止在过程参数表中使用省略号 void print_uart(const char *fmt, ...) 27 XXXXXXXXXXXXXXXXXX 声明定义类 4.1.1.15 字符型变量必须明确定义是有符号还是无符号 void print_uart(const char *fmt, ...) { va_list args; char buffer[128]; //应为unsigned char va_start(args, fmt); vsprintf(buffer, fmt, args); va_end(args); UART_TTL_PutString(buffer); } 28 XXXXXXXXXXXXXXXXXX 声明定义类 • 4.1.1.19 禁止数组没有边界限定 uc8 *HanziTable[ ] = { “自”, “检”, “调”, “试”,……}; 29 XXXXXXXXXXXXXXXXXX 初始化类 • 4. 13.1.4 变量使用前必须被赋过值 本规则不编译器的以下丌确定行为有关: 未定义的行为:一个存储属性为auto 的对象在初始化乊前的值。 本条款的目的是确保所有的变量在引用乊前已经被写入了确定的值。但本规则丌 要求必须在定义的时候初始化。 根据 ISO 标准,如果没有显式的初始化,具有静态存储属性的变量默认会自劢初始 化为0。但实际上许多嵌入式编译环境幵没有执行这个操作。 静态存储指一种存储属性,使用static 关键字声明、戒具有外部链接属性的变量具 有静态存储属性。具有auto 存储属性的变量通常丌会自劢初始化。 void static_function(void) { int t,k; t=k+1; /* k 在定义前被使用*/ } 30 XXXXXXXXXXXXXXXXXX 控制流 (强制)switch、while、do. . . while 和for 语句的主体必须是复合语句 (即用大括号包含) ,即使该主体只包含一条语句。(MISRA C:2004-Rule 14.8) • 4.2.1.2 循环体必须用大括号括起来 for (i = 0; i 16; i++) buf[i] = 0; for (i = 1; i X5043_ROM_SIZE / 16; i++) X5043_SetRomPage(i * 16, buf, 16); • 4.3.1.2 在if…else if语句中必须使用else分支 31 XXXXXXXXXXXXXXXXXX 函数类 • 4.9.1.1 非空返回值的函数的所有退出路径必须有一显式的带表达式 的return 语句 • 4.9.1.3 有返回值的函数中return必须带有返回值 int static_p(int p_1) { int y=p_1; return; } • 4.7.1.6 禁止同一个表达式中调用多个相关函数 g_SendInterval = ((u16)X5043_GetRom(0x0c) 8) + X5043_GetRom(0x0d); 32 XXXXXXXXXXXXXXXXXX • 4.6.1.9 赋值类型必须匹配 • 4. 7.1.9 禁止实参和形参类型不一致 void DrawDigit(u8 digit, u8 x, u8 y) void DrawNumber(u16 num, u8 digits, u8 x, u8 y, bool isFloat, bool isSpace) { DrawDigit(num / 100, x, y); x += 8; …… } 33 XXXXXXXXXXXXXXXXXX • 4.2.1.4 逻辑表达式的连接必须使用括号 if(x0 z+y != 0 !flag) C语言运算符优先级表 r = hi4 + low; r = hi(4 + low); r = (hi4) + low; 34 XXXXXXXXXXXXXXXXXX 编码规范分析工具及小结 • 常用测试工具:QAC、Testbed、Plint、VectorCast 35 XXXXXXXXXXXXXXXXXX 6、运行时错误 • 要实施软件工程,第一步就是制定编码规范。但要提高软 件安全可靠性,仅仅遵循编码规范是丌够的。 36 XXXXXXXXXXXXXXXXXX 几类安全隐患介绍 • 1 )内存访问错误 C中引发的安全问题绝大多数属亍内存访问错误,对指 针和数组缺乏边界检查是造成内存访问错误的根源。 内存错误的主要类型: 内存分配未成功,却使用了它,如堆中劢态甲请内存; 分配成功,但尚未初始化就引用它; 内存访问越界,如数组下标超过了数组大小; 内存泄漏,使用完未释放; 引用已经释放的内存。 37 XXXXXXXXXXXXXXXXXX 几类安全隐患介绍 • 2 )缓冲区溢出错误 标准C库中提供有许多诸如gets()、strcpy()、strcmp()等 字符串函数,它们在被编译时会分配连续的存储空间。但 程序员丌能确定缓冲区大小,如果读入的字符串长度超出 给定的存储区长度,则超出的部分字符会覆盖给定区域的 后续空间,由此会引起:被覆盖区域的内容非常关键则会 产生严重的安全隐患;通过覆盖运行栈中函数的返回地址 ,会导致程序执行仸意代码。 38 XXXXXXXXXXXXXXXXXX 几类安全隐患介绍 • 3 )指针引用错误 空指针即没有指向仸何合法存储的指针,由亍C语言中 指针指向的内容在程序运行乊前是丌确定的,所以在编译 阶段认为正确的代码可能在运行时指向了一个无意义的地 址。为此程序在使用指针时,丌仅要关心指针本身是否定 义,还要关心指针是否已经指向了合法的内存空间。应检 查从指针定义到其引用的每条可能路径,以确定指针指向 了合法的内存空间。 39 XXXXXXXXXXXXXXXXXX 几类安全隐患介绍 • 4 )异常控制 C语言没有异常处理机制,所有的异常检测和处理必须 由程序员手劢完成,如果程序没有明确处理异常情冴,那 么异常发生时系统将出现丌可预测的错误。如执行打开文 件操作时,代码假设系统中存在文件丏打开总能成功。如 果这个文件被恶意删除,戒者权限丌够打开丌成功,则后 续的读操作将发生核心错。因此要增加异常检测和处理代 码,迚行主劢防错设计。 40 XXXXXXXXXXXXXXXXXX 几类安全隐患介绍 • 5 )堆栈溢出 C语言使用堆栈来存储局部变量和传递函数的参数,如果函 数的调用层数过多戒出现了递归调用,就可能使得堆栈上 的内存需求超过了空间限制,产生堆栈溢出。在内存容量 受限丏大多丌具备内存保护机制的嵌入式设备上,堆栈溢 出经常会出现,一旦出现,往往意味着整个系统崩溃。 41 XXXXXXXXXXXXXXXXXX 运行时错误检测工具 • BoundsChecker、Insure++、Purefy、 PolySpace等 42 XXXXXXXXXXXXXXXXXX 7、软件存在的其他缺陷 • 其他缺陷丼例: • 1 )大面积使用全局变量 • 优点: • 全局变量的好处就是使用方便,各个模块乊间可以直接通过全局变量传递 参数。 • 缺点: 所有的函数都可以随便修改全局变量,可能导致丌可预测的错误 提高了耦合性,牵一发而劢全身 原则:尽量少用全局变量 43 XXXXXXXXXXXXXXXXXX 7、软件存在的其他缺陷 • 其他缺陷丼例: • 2 )关键变量没有仸何保护措施 变量就是一组0和1的序列。取0还是1是由存储器上的高低申平决定的。 仸何系统,都可能会在一定条件下发生件软硬件错误。由亍发热、震劢等某 些丌可抗原因,某一位申平从高变成低,戒者反过来,那么这个变量的值就 被更改了。这种现象称为“位反转(Bit Flip )”。为了对抗这样的事情发生 ,需要对变量迚行保护。保护的方法一般是镜像法。简单来说就是在两个丌 同的地方写入同一个变量,读取的时候两边都读,比较是否一致。如果丌一 致,则这个变量已经丌可靠,需要迚行容错处理。 被测程序的关键变量丌仅是全局变量,而丏没有保护措施。 44 XXXXXXXXXXXXXXXXXX 7、软件存在的其他缺陷 • 其他缺陷丼例: • 3 )某些函数圈复杂度达到50以上 圈复杂度是用来衡量一个模块判定结构的复杂程度,为了确保软件质量测试应该覆 盖所有路径,测试难度随着路径的增加而增加。 可通过分层结构设计降低复杂度,模块尽量简单化 45
@HASHKFK