多核嵌入式实时操作系统测试方法

时间:2022-08-01 04:36:40

多核嵌入式实时操作系统测试方法

摘要:嵌入式实时操作系统测试结果是嵌入式应用软件的重要参考依据,而对多核嵌入式实时操作系统需要考虑多核的因素对其功能、性能及安全性进行测试。评估多核嵌入式实时操作系统的时间性能,设计了不同的测试方法,考虑多核情况下核间同步时间。针对某国产多核嵌入式实时操作系统的测试方法,在测试项目实施过程中方法可行。

关键词:多核嵌入式操作系统;时间性能;测试方法

中图分类号:TP316.2 文献标识码:A 文章编号:1007-9416(2017)02-0184-04

在单核操作系统中,内核负责任务管理、资源管理、中断管理、事件处理及通信管理等工作。在多核操作系统中,这些功能同样具有,除此之外,还包括核间通信与同步、核间任务调度管理、资源共享及设备管理等部分。性能方面主要考虑任务切换时间、中断响应时间、运算性能、信量延迟时间、内存读写性能等常规的嵌入式实时操作系统性能以外,针对多核还需要检测核间同步时间,针对图形的操作系统检测图形的运行性能,针对文件系统进行文件读写性能。以下是针对某国产多核嵌入式实时操作系统的测试方法。

1 功能测试

针对多核嵌入式实时操作系统以下几方面的功能进行测试:

多核管理功能:操作系统能在系统初始化阶段,完成引导可用的所有处理器核。支持处理器集合操作,对处理器核能够进行启停状态查询的功能进行测试,通过对已加载被测系统的目标机上电,在上电完成后监测所有处理器核的启停状态,验证多核管理功能的正确性。

多核同步功能:提供自旋锁、原子操作、内存屏障等机制实现多个处理器核间数据可重入的功能进行测试,通过运行测试程序,构建多个任务,对比使用和不使用自旋锁的方式访问共享的临界资源,监测这些任务对临界资源访问的正确性(符合数据的可重入),验证多核同步功能的正确性;通过在使用内存屏障的情况下,多任务并发访问同一全局变量,通过对比编译之后的汇编代码及运行结果,验证多核环境下内存屏障能够保证数据运算顺序的正确性;通过运行测试程序,对启用原子操作和不启用原子操作时程序运行结果进行对比,验证多核环境下启用原子操作能够保证运行结果的正确性。

多核调度功能:支持多核并行运行,支持核心可抢占、提供基于优先级抢占调度、时间片轮转调度,保证任务不会有饿死的情况;采用统一的任务队列管理,基于高效的核间中断机制实现多核任务统一调度,赋予多核环境中各CPU调度本地就绪队列的能力;支持处理器亲和性,提供任务和中断绑定到指定处理器核的编程接口,用户可以根据应用的需要把任务绑定到指定的处理器核上运行的功能进行测试。通过运行测试程序,测试多种优先级任务组合情况下,同时运行的环境下监测任务调度情况,查看系统中各个CPU的负载情况,验证多核调度功能的正确性。设置了如下几种优先级任务组合情况,查看是否依据任务优先级进行调度,假设任务优先级由0~255个级别。

运行4个任务,优先级相同(250),不指定运行在哪个cpu上,观察4个任务在cpu上的分布情况,之后运行4个新任务,优先级逐一提高(251、252、253、254),观察任务抢占调度。是否高优先级任务抢占低优先级任务。四个核上运行任务为(251、252、253、254),待这4个任务完成之后再运行优先级为250的4个任务。

运行4个任务,优先级各不相同(250、251、252、253),不指定运行在哪个cpu上,观察4个任务在cpu上的分布,之后运行4个新任务,优先级逐一提高(251、252、253、254),观察任务抢占调度。是否高优先级任务抢占低优先级任务。251的抢250、252的抢251、253的抢251、254的抢252,此时四个核上运行的任务应该为254、253、253、252,待任务运行完之后再按顺序调度252、251、251、250的任务。

运行4个任务,优先级相同(250),不指定运行在哪个cpu上,观察4个任务在cpu上的分布,之后运行4个新任务,优先级逐一提高(251、252、253、254),观察任务抢占调度;之后动态调整优先级252任务的优先级到249,观察任务抢占调度。是否高优先级任务抢占低优先级任务。动态调整优先级252任务的优先级到249后,252任务运行的核被优先级为250的任务抢占。

运行4个任务,优先级各不相同(250、251、252、253),指定cpu(对应顺序0、1、2、3),观察4个任务在cpu上的分布。是否每个任务运行在指定的核上。

运行4个任务,优先级各不相同(250、251、252、253),指定cpu(对应顺序0、1、2、3),观察4个任务在cpu上的分布;之后运行4个新任务,不指定CPU,优先级254,观察任务抢占调度。是否高优先级任务抢占低优先级任务。四个核上运行的任务应该均为254,待任务运行完之后再按指定的CPU调度253、252、251、250的任务。

运行4个任务,优先级各不相同(250、251、252、253),指定cpu(对应顺序0、1、2、3),观察4个任务在cpu上的分布;之后运行1个新任务,优先级252,指定CPU0(对应优先级250的任务),观察任务抢占调度。是否高优先级任务抢占低优先级任务。优先级为252的任务抢占优先级250的任务运行在CPU0上,待任务运行完之后CPU0再运行优先级250的任务。

运行4个任务,优先级各不相同(245、246、247、248),不指定cpu,观察4个任务在cpu上的分布,之后运行4个新任务,优先级为250、251、252、253,指定CPU(对应顺序0、1、2、3),观察任务抢占调度。是否高优先级任务抢占低优先级任务。优先级为250、251、252、253的任务运行在指定的核上,待运行完毕后再运行优先级245、246、247、248的任务。

运行4个任务,优先级各不相同(245、246、247、248),指定CPU(对应顺序0、1、2、3),观察4个任务在CPU上的分布,之后运行4个新任务,优先级为250、251、252、253,指定CPU(对应顺序3、2、1、0),观察任务抢占调度。是否按照指定的核进行任务抢占,250抢248运行在CPU3上,251抢247运行在CPU2上,252抢246运行在CPU1上,253抢245运行在CPU0上,待新任务运行完毕后,优先级245、246、247、248的任务再运行在指定的核上。

运行2个任务,优先级各不相同(250、251),指定CPU0和1,观察2个任务在CPU上的分布;之后运行1个新任务,优先级252,指定CPU0(对应优先级250的任务),观察任务抢占调度。高优先级任务抢占低优先级任务。优先级252的任务抢占CPU0,待运行完毕后CPU0再运行优先级250的任务。

运行2个任务,优先级各不相同(250、251),指定CPU0和1,观察2个任务在CPU上的分布;之后运行1个新任务,优先级252,指定CPU0(对应优先级250的任务),观察任务抢占调度;之后取消优先级250任务的CPU绑定,观察任务抢占调度。高优先级任务抢占低优先级任务。优先级252的任务抢占CPU0,取消优先级250任务的CPU绑定后,优先级250的任务选择空闲CPU继续运行。

2 性能测试

2.1 任务切换时间

任务切换时间,即CPU 的控制权由运行任务主动转移到另外一个就绪任务时所花费的时间。任务切换时间包括保存当前运行任务上下文的时间、选择下一个任务的调度时间以及将要运行任务的上下文恢复时间。

为了测试任务切换时间,需要制造任务之间的切换事件。在非抢占情况下,制造的测试场景是让当前正在执行的任务激活另一个任务,然后自身挂起,那么,被激活的任务将处于就绪状态,从而引起调度。切换过程包含了一系列的操作,如当前任务上下文的保存、新任务上下文的恢复等,这一过程所需要的时间开销就是任务切换时间。

设当前正在运行的任务为TASK[i],将要运行的新任务为TASK[i+I]。用T1表示新任务TASK[i+I]的激活时刻,T2表示新任务TASK[i+I]表示新任务开始运行的时刻,可以用T2.T1来近似地表示两个任务之间的切换时间。

测试用例设计,构建my_test_performance工程,通过在任务一中调用pthread_suspend(此处任务调度函数为Posic通用接口)挂起任务二,之后调用pthread_resume恢复任务二的执行,插桩获取从调用pthread_resume到任务二开始执行之间的时间,测试多核环境下的任务切换时间。

2.2 任务抢占时间

任务抢占时间,即系统将控制权从低优先级任务转移到高优先级任务所花费的时间,它包括识别引起高优先级任务就绪的事件,比较两个任务的优先级,最后进行任务的切换。

构建my_test_performance工程,通过在任务一中调用pthread_suspend挂起任务二,之后调用pthread_resume恢复任务二的执行,插桩获取从调用pthread_resume到任务二开始执行之间的时间,测试多核环境下的任务响应时间。

2.3 中断响应时间

中断响应时间,即从中断产生到开始执行中断处理程序的第一条指令之间的时间间隔。主要由系统锁中断时间和中断执行准备时间组成。

系统中断是一种重要的异步事件,使用中断的目的在于提高系统的效率。避免CPU对某些事件的轮询,占用资源。在中断驱动的系统中,CPU运行正常执行程序,当输入输出设备需要服务时,输入输出设备会通过中断的方式通知CPU,CPU通过中断服务程序对其作出快速的反应。

测试时制造场景IntrResp_test工程。安装用户自定义异常处理程序,之后触发中断,通过sys_timestamp获取从中断触发时刻到进入异常处理程序所需时间,得到多核环境下的中断响应时间。多次测试取最大值。

2.4 运算性能

多核设定不同的参与计算的CPU核数进行各种典型计算,比对消耗的运算时间,测试多核环境下CPU计算性能。PI运算、n皇后算法、Fibonacci数列算法。

此处同时还移植Linux平台测试工具CPU2006,在操作系统上运行。获取bzip、specrand、libqua、hmmer等运算处理时间。

2.5 信号量延迟时间

信号量延迟时间,即一个任务释放信号量到另一个任务等待信号量的任务获得信号量的时间间隔。当无任务等待信号量时,信号量延迟即为其释放操作和获取操作所需时间。当信号量的等待队列上有阻塞等待的任务时,信号量延迟时间包含从等待队列中解除阻塞任务,到该任务被调度执行的时间间隔。

2.6 核间同步时间

通过构建cpc_call_test工程,测试多核环境下的核间同步时间。

运行my_test_performance工程。通过启动两个优先级相同任务,任务1调用spin_lock关任务抢占再spin_unlock开抢占,任务2也调用spin_lock关任务抢占,使用Testbed RtInsight工具插桩获取从任务1调用spin_unlock开抢占到任务2spin_lock关任务抢占之间的时间,测试多核环境下的核间同步时间。多次测试取最大值。

2.7 内存读写速度

程序代码按预先分配好的地址空间存放在ROM中,不可能重新分配地址,程序的最终加载地址必须生成程序时重新分配,由于数据存储在RAM中,系统要分别对代码和数据定位,同时,为了节省昂贵的RAM,需要确定ROM中的只读数据和可变数据,大量的只读数据不用传到RAM中。嵌入式系统存储管理不仅仅包括RAM(片内RAM,SRAM)管理, 还包括ROM(MASK-ROM、FLASH)管理及虚拟内存管理(仅对含有MMU的MCU/CPU)。本文不论虚拟内存管理。嵌入式系统的内存管理可以细分为:

全局内存管理:任务共享数据管理及设备驱动的内存管理。

虚拟内存管理:主要用于需要大内存并且FLASH大的情况,虚拟内存管理是页式管理。

局部内存管理:使用全局内存管理时要内存管理状态为malloc_mem_null时调用全局内存管理并设为临界态。

系统内存管理:只能由系统使用的内存。

使用mbw测试程序进行用户内存读写速度进行测试,包含MEMCPY、DUMB、MCBLOCK(固定块大小的MEMCPY测试,默认块大小262144)。导入mbw工程,分别以参数50调用mbw运行测试,获取运行结果。

2.8 文件读写速率

简单的嵌入式系统没有文件系统的支持,也能运行的很好,但对于现代嵌入式系统,需要管理和传输固态硬盘或U盘上的文件数据,文件系统必不可少。文件系统应具有大容量持久性存储数据管理支持功能和文件可携带。文件系统可以放在闪存Flash中,当系统启动时引导程序将文件系统拷贝到RAM中执行。一个嵌入式多任务文件系统主要具有如下功能:

实现文件命名、存取、更新及保护数据的基本功能。

提供嵌入式系统与其他系统之间的数据传输功能,处理多个用户文件I/O存取,具有文件共享功能。

具有逻辑组织数据的能力,采用随机存取数据方法,使系统能快速查找信息。

支持设备无关性,使应用程序文件操作独立于存储介质,文件操作在其所支持的每个设备上产生同样的结果。

兼容多个文件系统(FAT16,FAT32),标准的I/O接口(ANSI C、POSIX或WIN32)。

支持多种存储介质(如固态硬盘和U盘)的可靠存储。

文件系统的实现需要解决文件和目录的存储、存储介质空间的管理工作。嵌入式文件系统测试的重点在性能测试,使用iozone工具进行测试。

U盘读写速率:

使用performance_test工程,调用iozone("-i 0 r 32k s 32m")和iozone("-i 1 r 32k s 32m")分别测试文件读写速率。

(-i #n 指定的测试项,n的值为0到12,其中0=write/rewrite, 1=read/re-read。-r 为指定的文件块大小,以KB为单位。-s 为指定的文件大小,其单位为MB。)

performance_test,在C中运行iozone:

mount("dosfs","/dev/umass0p1","/c")

sp iozone,"-i 0 -i 1 -r 32k -s 32m"

2.9 图形性能测试

对于GUI图形系统的测试修改通用的性能工具DMA进行。

重点测试对于系统绘制矩形、直线、填充矩形的时间进行测试:

加载gtk_demo_new工程,通过调用canvas.c文件中的 do_canvas_test1函数,在画布上使用surface->DrawRectangle函数,得到画矩形的时间。

加载gtk_demo_new工程,通过调用canvas.c文件中的 do_canvas_test1函数,在画布上使用surface->DrawLine 和surface->DrawArc函数,得到画线的时间。

加载gtk_demo_new工程,通过调用canvas.c文件中的 do_canvas_test1函数,在画布上使用surface->FillRectangle函数填充矩形的时间。

另外对于GUI图形系统的内存使用情况进行测试。对比加速和非加速情况下内存使用情况:

加载gtk_demo_new工程,设置canvas.c文件的 do_canvas2函数, 窗口大小为400*300,编译下载到目标机,通过调用 do_canvas_test2和mi函数记录打开窗口后的内存使用情况,关闭400*300的窗口,通过调用mi函数记录打开窗口后的内存使用情况,比较内存差值。

加载gtk_demo_new工程,设置canvas.c文件的 do_canvas2函数, 窗口大小为800*600,编译下载到目标机,通过调用 do_canvas_test2和mi函数记录打开窗口后的内存使用情况,关闭800*600的窗口,通过调用mi函数记录打开窗口后的内存使用情况,比较内存差值。

加载gtk_demo_new工程,设置canvas.c文件的 do_canvas2函数, 窗口大小为1024*768,编译下载到目标机,通过调用 do_canvas_test2和mi函数记录打开窗口后的内存使用情况,关闭1024*768的窗口,通过调用mi函数记录打开窗口后的内存使用情况,比较内存差值。记录打开关闭1024*768的窗口所使用的内存差值。

加载GTK_DMA工程,确认配置文件中勾选图形系统配置和显示驱动,设置df_dok_2.c中PRIMARY为0(开启DMA加速,屏下)执行df_dok_demo2(0,0)命令获得测试结果,设置PRIMARY为1(关闭DMA加速,屏上)获得测试结果。得到开启和关闭硬加速的情况下对比数据。

3 安全性测试

操作系统安全评测的基础是需求说明,即把一个操作系统称为“安全”的真实含义是什么。一般来说,安全系统规定安全特性、控制对信息的存取,使得只有授权的用户才有读、写、建立或删除信息的存取权等。主要对以下几方面进行测试:

测试嵌入式操作系统的死锁检测机制。系统可以检测到死锁并打破死锁。

测试可能发生优先级反转的各种情况下,系y防止优先级反转的措施。系统防止优先级反转。

测试引用无效内存地址的情况下,系统能否进行出错处理。系统进行出错处理。

测试系统出现异常状况(例如:虚拟存储区缺页、算术溢出、非法操作码等)时,操作系统能否检测到异常错误并进行处理。操作系统能检测到异常错误,并由异常处理程序进行处理。

测试应用程序资源使用超出范围时,操作系统的处理能力。系统进行出错处理。

测试系统的内核运行状态监视机制。系统提供内核运行状态监视机制。

测试系统的内核故障检测能力。系统能成功检测到故障,并进行出错处理。

测试系统的应用故障检测能力。系统检测到故障并终止故障运行。

测试安全关键数据的冗余备份机制。提供安全关键数据的冗余备份。

在具有内存管理单元(MMU)的硬件平台上;设计并运行应用进程试图对内核数据进行访问的测试用例,测试系统能否给出出错提示。系统给出出错提示。

在配置网络通信模块时,设计并运行系统在一个时间段内的并发会话数量超过最大值的测试用例,测试系统能否给出出错提示。系统给出出错提示。

在配置网络通信模块时,测试操作系统能否提供端口访问控制。提供端口访问控制。

在配置网络通信模块时,y试系统对非法攻击的检测、预警和防范机制。系统提供检测、预警和防范机制。

具体方法包括:

测试方法:采用人工模拟故障的方法,验证嵌入式实时操作系统在出现异常时是否会采取保护措施不影响其他任务的执行;在操作系统使用过程中输入错误数据,验证操作系统是否具有提示或报警功能,系统资源监控功能在系统监控测试项中进行。判断准则:嵌入式实时操作系统在出现异常时能够采取保护措施不影响其他任务的执行,应对用户的错误输入具有提示或报警功能。

测试方法:操作系统与用户应用地址空间进行隔离,用户空间和内核空间将映射到不同的地址空间。用户应用地址空间进一步基于MMU机制对应用构件进行地址空间隔离,不同的应用构件将占用不同的地址。一个应用构件访问其它应用构件的地址空间时将发生异常。同时对构件中的任务栈空间作了栈溢出保护,当构件中的任务出现栈溢出时将会触发异常。对构件中的文本段也作只读保护,当试图改写时,将发生异常。判断准则:嵌入式实时操作系统在出现异常时能够采取保护措施不影响其他任务的执行,应对用户的错误输入具有提示或报警功能。

测试方法:系统在发生TLB无效异常、保留指令异常、协处理器不可用异常以及浮点异常时,若系统未掉电将能通过日志服务记录故障发生时的CPU异常信息、源文件名、行号、时间、寄存器信息、栈回溯、错误地址以及附加信息等内容。判断准则:嵌入式实时操作系统在出现异常时能够采取保护措施不影响其他任务的执行,应对用户的错误输入具有提示或报警功能。

测试方法:系统资源监控提供任务状态、内存使用情况、堆栈使用情况、CPU使用率、文件系统使用率等系统状态查询接口,通过钩子函数(Hook)支持对堆、信号量等关键资源控制接口,为支撑平台提供资源管控接口,提供一定的健康检测和恢复手段。判断准则:嵌入式实时操作系统在出现异常时能够采取保护措施不影响其他任务的执行,应对用户的错误输入具有提示或报警功能。

测试方法:通过调用taskDelete、msgQSend、semGiveForce、semTake、semBCreate接口设置异常输入参数,查看是否引起系统异常,验证操作系统对于用户输入的接口参数进行安全性保护,避免错误参数引起的系统异常。判断准则:嵌入式实时操作系统在出现异常时能够采取保护措施不影响其他任务的执行,应对用户的错误输入具有提示或报警功能。

上一篇:宏观视角下对我国茶叶价格影响因素的探析 下一篇:动态网页与FLASH技术的结合运用