洪妙婷
(厦门ABB低压电器设备有限公司,福建 厦门 361006)
嵌入式系统的可靠性措施
洪妙婷
(厦门ABB低压电器设备有限公司,福建厦门361006)
工业控制中的嵌入式系统可靠性是至关重要。文章结合实际,阐述了在嵌入式系统的软件设计所采取的一些措施。
嵌入式系统;可靠性;软件
随着嵌入式系统在工业控制领域广泛的应用,应用的复杂度不断提高,使人们对它的稳定性和可靠性的要求越来越高。特别是在工业应用下,这样的要求更是严苛。如果系统在某段时间无法完成预期服务,可能就会导致用户巨大的损失。本文主要探讨在嵌入式系统开发过程所采取的一系列提供软件可靠性的措施,在实际应用中验证这些措施是行之有效的。
2.1嵌入式系统的任务调度监控
实时嵌入式系统中任务之间是优先级抢占式调度,相同优先级任务之间是时间片轮转进行调度。这样可以保证重要的任务最先运行。当任务发生异常,如除零、数据溢出或者访问一个非法内存地址,CPU就会触发异常,系统会默认将任务挂起。异常之后CPU忽略挂起任务的调度,系统不会自动把有任务挂起的消息自动传递给用户,所以在任务的调度时系统会忽略处于挂起状态的任务,这样某些重要的任务由于挂起而被系统忽略,系统变得不稳定,用户任务得不到执行,用户需求得不到满足等等,甚至造成系统死机。
为了避免任务调度异常而引发的系统问题,就所有的任务调度进行调度监控,并且某个任务出现错误后,进行及时修复。因此在多个实时任务系统中应用了软件喂狗结合硬件喂狗方法。在主程序中首先创建一个监控器任务线程,它的优先级高于其他线程。监控线程在其他被监控的线程正常工作的情况下,一定时间内对看门狗进行喂狗操作,喂狗操作通过调用软件喂狗完成。如果某个线程出现故障,监控线程监控并记录该线程的看门狗计数器 和看门狗超时次数。当该线程累加看门狗超时大于预定的告警次数,就自动重启的该线程。如果监控线程自身出现故障,不能及时执行硬件喂狗操作,看门狗也自动复位重启。
我们设计中看门狗通过检查各应用任务是否在规定的时间内对其 “软件喂狗”来确定各任务的运行状态,硬件看门狗通过检查软件看门狗是否在规定的时间内对其 “喂狗”来实现对监视器任务的监视.我们的设计使用UCLinux为操作系统,系统为每个任务设定优先级和分配看门狗计时变量.系统具体的执行操作如下:
1)监控器任务在系统中有最高优先级,监控器的执行周期是1ms,其执行周期也是所有任务里最短的。监控器在执行周期会对每个被监控任务的软件看门狗计数累加。
系统中每个被监控的任务有一个软件看门狗计数器,周期性地对每个被监控任务“软件喂狗”,就是对软件看门狗计数清零处理。
监控器被监控任务的软件看门狗计数累加值,比较历史记录的最大看门狗计数值,就可以记录每个被监控任务最大间隔执行时间。
2)当某个被监控任务挂起或中断运行,软件看门狗的计数就会不断累加,且其计数器值超过预定的告警时间,该任务的看门狗喂狗超时告警次数进行累加记录。若该任务喂狗超时次数累计大于预设允许值,系统就会自动重启该任务。如果在设定的次数内不能够有效启动该任务,软件看门狗则延时喂内置硬件看门狗,硬件看门狗计数器溢出,自动重启系统。各个任务的最大间隔执行时间和喂狗超时告警次数为被存储在永久存储空间,保证数据不会因为系统故障重启而丢失,这些数据可以用于日后的系统故障分析和性能评估。
3)监控器任务在每个循环周期性会进行硬件喂狗,累计硬件看门狗计数,并统计自身任务调度间隔时间。若监控器任务挂起,则硬件看门狗会因为超时而引发自动重启系统,以确保系统长时间稳定运行。如图1所示。
图1 监控器周期循环
2.2系统容错处理措施
在工业控制中,由于系统的运行环境是比较恶劣,常存在干扰源,如环境温度、电场、磁场等。干扰的信号可能导致数据采集失效、控制失灵或系统运行失常。那么在软件设计为消除或降低干扰影响采取一些措施。
2.2.1系统‘死锁’的对策
嵌入式系统运行过程中,由于干扰信号的破坏某个接口的状态,系统错误地进入外设服务,如等待接受数据,但实际没有数据到此接口,系统的资源因此就被一直占用而不能释放,其他的任务不能执行,系统出现‘死锁’现象。为了杜绝系统‘死锁’问题 ,在代码编码过程中,针对每个接口对外设的响应时间,分配最大允许响应时间。在每个接口服务加上超时判断。当干扰信号改变接口状态系统误操作,由于外设的数据一直无效,等待一段时间该外设服务任务超时退出,系统的正常执行周期不会被影响,从而解决系统‘死锁’的问题。
2.2.2软件滤波的方法
现代工业控制系统的硬件设计越来越复杂,相互干扰越来越强烈,模拟滤波电路已经不能满足要求。软件滤波是利用一定的算法,运用CPU运算和控制功能,可以实现高难度的复杂信号处理。软件滤波具有抗干扰性强,改变灵活,工作稳定等特性。实时系统中对于信号输入,可以通过多次重复采样,利用这些方法进行数字滤波处理,有算术平均滤波法、程序判断滤波法、加权递推平均滤波法、中位值滤波法等。对于信号输出,可以采用重复输出。输出的重复周期要尽可能短,这样干扰信号影响执行部件之前,正确信号又出现。
2.2.3数据的备份
工业控制系统一些关键数据需要定期进行备份,并且至少有两个以上的备份副本。这样的数据备份时,需要将数据以及数据的校验和一起保存起来。读取数据也需要对数据和校验和一起比较从而保证数据的正确性。在操作这些数据时,可以把主、副本数据进行比较,若发现数据变化,要分析原因并采取预定的方法处理。
2.3故障诊断措施
嵌入式系统在运行过程中可能出现异常导致系统重启或死机,异常又不容易重现,这样造成故障原因难于定位和解决。
我们的设计中使用ARM芯片和UCLinux操作系统,ARM提供了一些异常向量并且Linux的内核系统可以对这些向量进行异常处理。当异常发生时,ARM根据当前的工作模式跳转到不同的异常地址并执行异常例程。系统异常发生后利用Backtrace可以在程序异常退出时寻找错误原因。是其原理是回溯堆栈,列出函数的调用关系。也就是在异常例程里对CPU寄存器现场的分析,找到异常发生时的函数地址和堆栈的帧地址,再分析上层函数的堆栈,再找再上层的帧地址……一直找到最顶层为止。帧地址指的是一块在堆栈上存放局部变量,上层返回地址,及寄存器值的空间。因此我们利用Linux提供的库函数Backtrace并加以改进,在异常处理例程里将系统异常时被调用的函数地址列表和CPU寄存器保存到永久存储空间作为故障日志。我们的设计的实现是将程序编译成ELF二进制格式的,只有使用这样的格式才能获取系统所有的函数名称和偏移地址的列表。在系统出现异常的时候,系统在出错时使用的CPU寄存器和被调用函数地址列表被记录到跟踪日志。由于系统上电加载的起始地址是动态变化的,跟踪日志也记录了系统加载运行时主程序入口地址。根据跟踪日志记录的出错函数地址与主程序入口地址的差值就是函数的偏移地址,对照系统函数名称和偏移地址列表,就可以定位出错的函数名称了。
图2 系统异常函数关系
如图2所示,系统异常发生是的函数及其的函数调用关系就可以清晰的呈现出,系统异常出现在touch_wdt(),其函数调用链为 timer_thread()Timer_FeedWD()Timer_touch_wdt()touch_wdt().这样设计人员可以更容易地分析出错原因和更快地修正问题。
本文概述了在嵌入式系统开发过程中为了提高系统的可靠性采取的一些软件技术措施。这些措施是在软件设计上一些经验总结,而提高系统的可靠性是一项系统工程,还需要针对具体的产品需求,把系统的硬件和软件有效的结合起来,才能设计出高质量、高可靠性的系统。
[1]唐明.WatchDog在嵌入式应用中的问题[J].单片机与嵌入式系统应用,2007(11):70-71.
[2] Jean J.Labrosse.嵌入式实时操作系统uC/OS-Ⅲ[M]宫辉等译.北京:航空航天大学出版社,2012.
[3] 凌忠兴.嵌入式系统中数字滤波的算法及软件流程 [J].电测与仪表,2007.1:58-61,17.
[4] 符意德,陆阳.嵌入式系统原理及接口技术[M].北京:清华大学出版社,2007.
[5] 白国政.嵌入式软件异常处理机制的研究[J].微机发展,2005.(10):88-89,107.
TP311