基于Linux的嵌入式设备多状态重启记录系统设计与实现
2019-05-24王晨光孙文胜
王晨光 孙文胜
摘 要:近年来,随着嵌入式技术的迅猛发展,嵌入式产品已渗透到生产与生活各个方面,嵌入式设备运行稳定性则显得愈发重要。针对嵌入式设备运行异常现场难复现的问题,设计一种基于Linux的嵌入式设备多状态重启记录系统,可为设备问题定位提供重要的系统参考数据,实现嵌入式设备多状态重启数据记录。系统选择EEPROM掉电记忆存储芯片,结合嵌入式Linux系统中的看门狗驱动、EEPROM驱动和reboot命令,完成嵌入式设备断电重启、看门狗重启与reboot命令正常重启3种重启状态统计记录。该系统为维护设备的稳定运行提供了可靠方法,具有较高的实际应用价值。
关键词:Linux;嵌入式设备;reboot;EEPROM;看门狗中断;重启记录
DOI:10. 11907/rjdk. 182250
中图分类号:TP319 文献标识码:A 文章编号:1672-7800(2019)005-0125-05
Abstract: With the rapid development of embedded technology in recent years, embedded device products have penetrated into every corner of life and production, and the stability of embedded device operation has become increasingly important. For the abnormal operation of the embedded device and difficulty to reproduce the scene, this paper proposes a multi-state restart recording system for embedded devices based on Linux to provide important system reference data for device problem location, enabling multiple times of multi-state restart data logging of embedded devices. This system selects the EEPROM power-down memory storage chip, combined with the watchdog driver, EEPROM driver and reboot command in the embedded Linux system. It completes the record of three reboot states for the embedded device power-off reboot, watchdog reboot, and reboot command normal reboot. This system provides a reliable method for stable operation and maintenance of the equipment, and has a high practical application value.
Key Words: Linux;embedded devices;reboot; EEPROM;watchdog interrupt system; reboot record
0 引言
近年來,在计算机、互联网和通信技术高速发展的同时,嵌入式系统开发技术也发展迅速,且应用范围急剧扩大[1]。然而,在嵌入式设备中软件出现故障的概率远高于硬件,成为影响系统正常运行的主要因素,主要原因是软件故障环境很难再现。软件运行状态与很多因素有关,如人为操作因素、环境因素等。由于开发环境与场外应用环境存在差异,研发人员必须亲赴现场进行故障定位,从而增加了额外投入成本。
在国外,最早由Munson等[2]提出软件黑匣子技术,其构建方法为软件故障定位提供了新途径,并且该技术在业界已有较多应用。软件黑匣子是通过对目标软件的改造,将黑匣子植入其中,在软件运行过程中将模块信息记录到内部存储器后,再慢慢转移到外部存储器件中。但其会对系统模块造成一定影响,当某部分出现问题时,将导致一些重要数据丢失。一旦发生单板重启,黑匣子则无法还原事故现场,达不到问题定位目的。为了解决该问题,业界提出采用系统内存空间或非易失性RAM作为黑匣子记录载体。该方法虽然介绍在一定程度上可以记录非断电状态下的异常数据信息,但无法统计与记录设备掉电情况,且在无人监管情况下,无法记录设备重启的历史信息数据。
实验室中的嵌入式产品在测试完成后进行实际应用时,仍会出现很多故障及不稳定现象[3]。许多文献从不同角度研究嵌入式系统的稳定性问题,并提出很多解决办法。但嵌入式系统是一个十分复杂的系统,只有从系统硬件、软件以及结构设计等方面全面考虑,对各种抗干扰技术进行综合应用,才能有效提高系统抗干扰性能[4-5]。
维护嵌入式产品运行稳定性是十分必要的,然而,当前加载有Linux系统的嵌入式设备产品(例如网络摄像机IPC)在系统运行层面仅作了看门狗保护,设备一旦出现程序运行异常,则会触发看门狗重启整个系统,以防止设备卡死[6]。这是规避嵌入式设备运行不稳定情况的一种常用方法,但对于后期问题定位与维护没有任何帮助。嵌入式设备重启方式可分为3类:断电重启,系统电源关闭后重新上电启动;非断电软重启,在系统电源工作正常的情况下,通过系统软件主动重启设备;非断电看门狗触发重启,因嵌入式设备软件运行异常导致看门狗中断重启整个系统。以某种机制记录嵌入式设备上一次重启状态类型,可为设备问题定位提供重要的系统参考数据。针对嵌入式设备系统异常重启的情况,本文参考黑匣子技术,使用掉电存储芯片作为信息记录载体,对其进行精简改进后,提出基于Linux的嵌入式设备多状态重启记录系统。
1 设备重启记录系统设计
1.1 工作原理
嵌入式设备关机重启原因大致可分为3类:设备断电后再次上电重启、设备操作人员主动重启、设备软件运行异常触发看门狗重启。在嵌入式设备工作过程中,通过设备重启记录系统将每次设备重启信息记录入EEPROM存储芯片中,可以记录以上3类设备重启状态、重启时间及系统内运行业务参数信息等[7-8]。用户可通过Linux系统的proc接口快捷查询与管理重启记录数据,以便于进行设备稳定性分析及问题定位。该重启状态记录系统涉及Linux系统与嵌入式平台多个功能模块,可结合相应模块完成对嵌入式设备多状态重启信息记录。
1.2 系统框图设计
嵌入式设备重启状态记录系统应具备以下特点:
(1)嵌入式硬件平台。该嵌入式设备可移植并运行Linux系统,为用户提供Linux终端管理环境,用户可通过终端命令管理设备硬件资源。
(2)EEPROM存储芯片。EEPROM为带电可擦除可编程只读存储器,是一种掉电后数据不会丢失的存储芯片,用于记录设备每次重启的状态数据与时间数据。通常为I2C总线式串口通信,在存储空间不足的情况下,可通过I2C总线扩展多块EEPROM存储芯片。
(3)看门狗中断机制。该嵌入式平台处理器需包含看門狗所需的特殊寄存器,如看门狗计数器及看门狗计数器溢出中断标志寄存器。
(4)reboot命令。移植Linux系统需支持reboot命令,用于处理设备主动重启状态数据记录。
(5)看门狗驱动程序。移植Linux系统需加载看门狗驱动程序,用于管理看门狗设备并记录嵌入式设备软件运行异常导致设备重启的状态信息记录。
(6)EEPROM驱动程序。移植Linux系统需加载EEPROM存储芯片驱动程序,所有设备重启信息都将通过该驱动程序记录入EEPROM芯片中。EEPROM存储芯片通常为I2C总线协议通信,即该驱动程序需完成I2C总线协议读写操作。
根据以上特点,该嵌入式设备多状态重启记录系统设计框架如图1所示。
2 系统硬件设计
嵌入式设备重启状态记录系统开发平台为JZ2440,嵌入式微处理器为S3C2440,是三星公司开发的一款基于Arm9内核的微处理器。EEPROM芯片为M24128 (128-Kbit serial I2C bus EEPROM),共16KByte。EEPROM内部存储数据地址范围为0X0000—0X3FFF。
2.1 EEPROM工作电路
意法半导体的M24128是一款128kbit的I2C串口总线EEPROM存储芯片,相对于同类其它型号的EEPROM,M24128有着最大的存储空间,可以存储更多数据,而无需通过总线扩展[9]。从成本与扩展便捷性方面考虑,EEPROM适合嵌入式设备针对少量数据的存储需求。其工作电路如图2所示。
2.2 EEPROM扩展
对于重启次数相对频繁的嵌入式设备,M24128的存储空间难以满足需求,针对该情况,可适当扩展多片EEPROM存储芯片[10]。以3块EEPROM设备通过I2C总线扩展情况为例[11],如图3所示。
3 系统软件设计
结合EEPROM驱动程序、看门狗驱动程序与reboot命令完成对嵌入式设备断电重启、看门狗重启及用户主动重启3种不同重启状态信息的记录。
3.1 EEPROM驱动程序
Linux系统驱动程序可以直接编译进内核镜像中,在内核启动过程中完成驱动程序加载,也可编译为内核模块,在Linux系统启动后,在其它脚本中加载该模块。模块一旦被加载,则与内核中其它部分完全相同[12-14]。在嵌入式设备重启状态记录系统中,EEPROM驱动程序将被编译进内核镜像中,从而省去了启动后对内核模块脚本的加载过程,同时增大了内核镜像 [15],可视具体嵌入式设备选择不同加载方法。
EEPROM驱动程序需包括基本的I2C总线读写操作功能,以实现在EEPROM存储芯片中读写数据。M24128写数据支持两种模式,一种为字节写,即一次写入1Byte数据到EEPROM中;另一种为页写,M24128页大小为64Byte,即一次写入64Byte数据。根据M24128数据手册,两种写操作速度相差不大,都在5ms之内,故EEPROM驱动程序需支持以上两种写操作模式。综合考虑设备重启信息管理效率与EEPROM存储空间利用率,将EEPROM存储空间划分为不同功能区块。
M24128芯片存储空间为16Kbyte,其可访问的地址空间为0X0000-0X3FFF,分别划分为断电重启标志区、重启次数统计区与数据记录区,如图4所示。
(1)断电重启标志区。断电重启标志区划分1Byte大小空间,访问地址为0X0000。针对嵌入式设备断电重启的情况,因断电是突然发生的,设备断电关机前无法获知即将关机信息,因此设备无法在断电之前完成设备关机重启信息记录。故在EEPROM设备中特划分此区域,用于判断上一次是否为断电重启。可在设备断电后再次上电开机后,对此次断电重启状态进行判断,并将相关数据记录入EERPOM存储芯片中。
(2)重启次数统计区。重启次数统计区划分1Byte大小空间,访问地址紧随断电重启标志区,为0X0001。该区域数据可发挥两方面作用:①用于统计嵌入式设备在各种情况下的设备重启总次数;②用于计算下一个可用存储块,并在数据记录区进行具体说明。
(3)数据记录区。在EEPROM中将数据记录区划分为多个Block块,每个Block用于记录一次嵌入式设备重启信息。综合设备重启数据信息大小与EEPROM的写效率,将每个Block大小划分为64Byte。在该情况下需要考虑,每次设备重启时,重启数据应存入哪个Block块中。该地址是根据重启次数统计区中的数据计算出的EEPROM页地址,每次重启次数加1,相应的Block存储地址则向下偏移64Byte。
3.2 watchdog驱动及看门狗中断服务函数
在嵌入式设备中,看门狗是一种常见机制,用于检测设备软件运行极端异常情况下导致的设备卡死情况,一旦发生卡死现象则重启整个嵌入式设备[16-17]。看门狗设备驱动程序包括以下两方面工作:
(1)初始化看门狗基本功能,包括看门狗启停、喂狗时间参数设置、喂狗线程创建和看门狗中断配置等。在驱动程序中注册管理看门狗设备的proc接口,提供给用户使用。
(2)在嵌入式设备重启状态记录系统中,看门狗中断服务函数[18]承担着设备运行异常重启信息记录任务,即在看门狗中断发生后,进入中断服务函数。在此需完成对EEPROM存储芯片的读写操作,将此次设备重启信息记录在EEPROM中。
看门狗工作流程如图5所示。
3.3 reboot系统命令
reboot是一个集成在Busybox工具中的命令[19],其功能是完成Linux系统重启,对于嵌入式设备而言,即重启该设备。在嵌入式设备重启状态记录系统中,需通过reboot命令实现对设备常规重启状态的信息记录,记录重启信息依赖EEPROM驱动程序提供的接口完成,所以加载EEPROM驱动程序之后,reboot命令才能将数据写入EEPROM。通过修改reboot命令源码,根据嵌入式平台重新编译Busybox工具,并将其编译到Linux内核镜像中[20-21]。
3.4 系统软件流程
从系统运行角度可将整个系统分为4个阶段:嵌入式设备启动阶段、看门狗模块加载阶段、嵌入式设备运行阶段与嵌入式设备重启阶段,下面将针对各个阶段进行详细阐述,如图6所示。
(1)嵌入式设备启动阶段主要完成EEPROM存储芯片的驱动程序加载,内核启动过程中由Linux内核完成驱动程序加载。该阶段完成的工作为读取EEPROM存储芯片上断电重启标志区,数字0表示上次设备重启为reboot重启或WatchDog重启,数字1表示上次设备重启为断电重启。若该值为0,擦除此标志区并写入1;若该值为1,将EEPROM中设备重启次数统计区数值加1,并消耗1块Block区,用于记录上次断电重启状态,并记录当前系统时间到该Block区。
(2)看门狗驱动模块加载阶段主要完成看门狗驱动程序加载与看门狗中断服务函数中对EEPROM的读写操作,为出现嵌入式设备运行异常情况作准备。一旦发生异常,系统首先进入看门狗中断服务函数中。该函数工作分为3步:①读取EEPROM设备重启次数统计区的值,将该值加1后更新此区域;②将EEPROM断电重启标志区写0;③根据步骤①统计的设备重启次数,计算出下一块可利用Block区的起始地址空间(例如:此次为第3次重启,将消耗Block3区,该区域起始地址为:0x0000+1+1+(3-1)*sizeof(Block)=0x0082,此处取sizeof(Block)大小为64Bytes,可参考图4,并将当前系统运行时间与其它关键内核信息记录入该Block区域。
(3)嵌入式设备运行阶段主要由EEPROM驱动程序支持,为用户提供proc接口,便于用户通过proc接口访问EEPROM中记录的设备重启信息并对信息进行管理,例如擦除部分或全部设备重启记录信息等,也可提供一些较高级的管理方式,如可根据EEPROM存储空间实际大小,自适应地删除较早的设备重启状态記录信息,为接下来的设备重启状态数据提供可用空间。
(4)在嵌入式设备重启阶段,系统运行过程中也在等待设备运行结束状态的到来。设备运行结束情况分为3种:第一种为设备突然断电,在下次设备启动加载EEPROM驱动时,会根据EEPROM的断电重启状态区判断上次设备重启是否为断电重启,并作相应信息记录;第二种为设备接收到软件下发的重启命令reboot,主要通过修改reboot命令源码实现,并重新编译BusyBox替换到设备中。reboot命令需完成的工作有以下3步:①写0到EEPROM断电重启标志区;②读取EEPROM设备重启次数统计区的值,并将该值加1后更新此区域;③根据步骤②统计的设备重启次数计算出下一块可用Block区的起始地址空间,并将当前系统运行时间与其它信息记录入该Block区域,最后重启设备;第三种为设备系统运行异常,导致触发看门狗中断,在看门狗中断服务函数中,写入EEPROM标志以及异常运行状态数据,并重启设备。
本系统思想逻辑梳理如下:①系统启动加载Linux内核,并加载EEPROM驱动程序;②判断是否为断电重启并作相应记录,然后初始化EEPROM断电重启标志区;③加载看门狗驱动,启动看门狗;④系统运行阶段由EEPROM驱动为用户提供proc接口,并管理EEPROM重启记录信息;⑤系统重启阶段分为3种情况:断电重启,待下次设备启动后再作记录;reboot重启,设备重启之前在EEPROM中记录下当前设备重启数据信息;WatchDog重启,系统进入看门狗中断服务函数,在EEPROM中记录此次WatchDog重启信息。整体逻辑如图7所示。
4 结语
本文在嵌入式系统中的软件黑匣子技术基础上,提出一种基于Linux系统的嵌入式设备多状态重启记录系统设计方案。通过分析重启记录系统的功能需求,将嵌入式设备重启划分为3类,分别为设备断电重启、看门狗触发重启与用户主动重启,并选用EEPROM掉电记忆存储芯片对过去多种状态下的设备重启信息进行记录。驱动层面为用户提供了便捷的设备重启信息管理接口,用户可在Linux终端管理窗口通过proc接口查询与管理设备已记录的重启信息数据。针对重启较为频繁的设备,其设备重启信息数据较多,当EEPROM存储空间不够时,还可对其进行适当扩展。对于EEPROM数据区中的具体数据,可根据嵌入式设备不同的业务能力,选择记录不同数据,该部分可结合实际应用场景作进一步研究。
参考文献:
[1] 谷中山. 嵌入式技术的实际应用及前景[D]. 北京:北京动力机械研究所,2018.
[2] 翟军治. 板载软件状态检测与异常分析[D]. 西安:西安电子科技大学,2014.
[3] 马骁骐. 实时操作系统资源预留的研究与实现[D]. 北京:中国科学院研究生院(软件研究所),2003.
[4] 尚珊珊,赵铁群. 软件可靠性综述[J]. 软件导刊,2006(15):3-5.
[5] 陈光宇,黄锡滋. 软件可靠性学科发展现状及展望[J]. 电子科技大学学报:社会科学版, 2002, 4(3):99-102.
[6] 杨玉丽. 软件可靠性研究现状与展望[J]. 电脑知识与技术,2010(1):128-129.
[7] 王成长. 一种AP设备的异常重启原因检测方法及装置[P]. 中国,106571954.A,2017-04-19.
[8] 朱靖飞. 一种查看系统异常时代码信息的方法及装置[P]. 中国,102479116.A,2012-05-30.
[9] ST.M24128-BF data sheets [EB/OL]. https://www.stmicroelectronics.com.cn/content/st_com/zh/products/memories/serial-eeprom/standard-serial-eeprom/standard-i2c-eeprom/m24128-bf.html.
[10] DP.I2C中线协议学习笔记[EB/OL]. http://dpinglee.blog.163.com/blog/static/14409775320112239374615/.
[11] 郭天祥. 51單片机C语言教程[M]. 北京:电子工业出版社,2015.
[12] 宋宝华. Linux设备驱动开发详解[M]. 北京:机械工业出版社,2015.
[13] JONATHAN CORERT,ALESSANDRO RUBINI.Linux设备驱动程序[M]. 魏永明,译. 北京:中国电力出版社,2009.
[14] 尤晋元,张亚英,戚正伟. UNIX环境高级编程[M]. 北京:人民邮电出版社,2006.
[15] 孙弋. 基于S3C2440的嵌入式Linux开发实例[M]. 西安:西安电子科技大学出版社,2010.
[16] mr_raptor.S3C2440看门狗定时器(Watchdog)[EB/OL]. https://blog.csdn.net/mr_raptor/article/details/6555704.
[17] 天王. S3C2440看门狗设置使用例程[EB/OL]. https://blog.csdn.net/skykingf/article/details/6185827.
[18] CSDN.Linux驱动中断函数参数详解[EB/OL]. https://blog.csdn.net/sum_tw/article/details/73301981.
[19] Wang-bob. 基于Linux与Busybox的Reboot命令流程分析[EB/OL]. https://blog.csdn.net/wavemcu/article/details/8544333.
[20] CCJ.Linux内核配置、编译及Makefile简述[EB/OL]. https://www.linuxidc.com/Linux/2016-12/137841.htm.
[21] 金步国. Linux-4.4-x86_64内核配置选项简介[EB/OL]. https://blog.csdn.net/wdsfup/article/details/52302142.
(责任编辑:黄 健)