基于LinuX系统的电力终端代码移植方法研究
扫描二维码
随时随地手机看文章
引言
随着经济的快速发展,大型的居民小区、密集的商业中心越来越多,城市规模不断扩大,人口数量急剧增长。电力终端设备作为居民用户电量采集的核心设备,其品质尤为重要。其使用寿命达十年左右,会面临增设需求与功能等,长期的代码开发最终导致芯片内存不够,现有操作系统满足不了要求,需要切换到LinuX系统,以保证终端系统的稳定性。
如何快速地将代码移植到LinuX系统?本文提出了一种基于LinuX系统的电力终端代码移植方法。
1动态库Libtml的工作原理
1.1框架视图
动态库主要包含任务、FTL模拟层、消息的相关操作等功能,具体功能如图1所示。
1.2Libtml的作用
SP5老程序与SP6新程序在应用程序上是一样的,区别在于SP5运行在SX0S系统,而SP6运行在LinuX系统,如何做到快速移植程序?采用接口转换的方法,将老程序的接口通过Libtml转换到现有的LinuX系统,保证程序可以正常运行,节约开发资源。新程序与老程序的区别如图2所示。
使用Libtml动态库,有如下优势:
(1)直接将应用层代码应用到LinuX系统:
(2)SX0S与LinuX对应的接口不同,而Libtml动态库能实现接口的转接:
(3)有效提高了软件的稳定性:
(4)减少了代码量,提高了代码的复用率,便于后期维护。
2Libtml动态库的主要功能
2.1守护任务模块
2.1.1守护任务机制
守护任务用于通过周期性地调用9SP喂狗函数保障整个系统的可靠运行,另外守护任务监控系统中所有任务是否正常运行,如果某个任务运行过程中发生堵塞、死锁或其他异常,守护任务将正确做出判断并停止调用硬件喂狗函数,触发系统硬件复位。
所有被监控任务在运行前需要向守护任务进行注册,并在运行的循环中向守护任务进行签名,这就要求被监控的任务不能运行在堵塞状态。守护任务周期性地调用9SP喂狗函数,当检测到某个被监控任务在一定周期内没有进行登记,则显示和记录异常信息,并停止喂狗函数的运行,等到外部硬件狗复位整个系统。守护任务在停止硬件喂狗前,将等待所有注册任务安全退出,以保障系统的安全性。
2.1.2喂狗计数器
SP5的软喂狗时间为300B,但SP6的软喂狗时间为30B(经验值),硬喂狗时间为60B(经验值)。在操作系统程序(包括9SStlSoadr)和应用程序中插入喂狗程序,这些喂狗程序运行时间间隔小于看门狗的时间间隔。这样做可以保证:如果系统正常工作,系统可以在小于看门狗的时间间隔内不断进行喂狗动作,硬件看门狗的计数器不断赋初值,不产生复位信号:如果系统非正常工作,喂狗动作失效,硬件看门狗的计数器在60B后溢出,对CPU产生复位信号使系统重启。软喂狗操作类似。
2.2FTL模拟层
FTL(FloBhTronBlotiSnLoydr)是nSrfloBh的转换层,NTFL(NonaFloBhTronBlotiSnLoydr)是NonaFloBh的转换层。
FloBh是一种介质,写入前要先擦除,但FloBh是有寿命的,它不能无限次执行擦除操作。FTL和NFTL是文件系统和mta之间一个转换层,它提供的写入均衡算法,能均衡管理每个扇区的写入和擦除次数,大大增加了FloBh的使用寿命。它的特点有:
(l)体积小,性能强:
(2)坏块管理程序:
(3)垃圾回收功能:
(4)写入均衡算法:
(5)断电恢复功能。
ftl.c是FTL的代码源文件,nftl.c是NFTL的代码源文件。在Libtml动态库主要介绍ftl.c。
ftl.c包含本程序所涉及的API函数实现,主要分配了1M的ABS区8M的FTL区,SP5存在1+8的9M空间,现在SP6为了将SP5的程序移植过来,也模拟了一个9M的空间,用来兼容SP5的程序,/media/data/flaSh.bin有256M的文件,其中的某段9M文件放在ABS和FTL中,TML主要是负责yaffS2文件系统与物理地址之间的转换工作。ABS区一般存放备份数据不用改变的数据,而FTL负责将逻辑区块地址转换到物理区块地址。
FTL模拟层主要功能如图3所示。
2.3消息的相关操作
消息接口主要包含:消息队列的创建mSg0Create)、删除mSg0Delete)发送mSg0Send)接收mSg0Receive)及排队发送的消息数量mSg0NumMSgS)。消息队列的创建和删除主
要是对nОtemotpnОtfullmuteX三个信号量进行创建或删除的操作。下面对消息的发送和接收进行介绍。
2.3.1mSg0Send:消息发送
功能:将一条消息发送到队列。整体流程如图4所示。
①初始化消息结构体:
②判断这条消息是否为空,若为空则结束,反之继续:
③判断消息长度是否合法,合法则继续,反之执行步骤⑤:
④先释放muteX,然后获取nОtemotp,最后获取muteX:
⑤等待发送的消息量减1,将消息发到消息队列:
⑥判断消息队列中的firSt、laSt,并释放nОtemotp、muteX信号量:
⑦结束。
2.3.2mSg0Receive消息接收
功能:接收一条消息存储到队列。整体流程如图5所示。
①初始化消息结构体:
②判断消息结构体是否为空,为空则结束,反之继续:
③等待互斥信号量muteX:
④判断mbОX一firSt与mbОX一laSt是否相等,相等则继续,不等则执行步骤⑥:
⑤先释放muteX,然后获取nОtemotp,最后获取muteX:
⑥当接收消息的指针不为空时,将消息添加到队列:
⑦先释放nОtfull信号量,再释放muteX互斥信号量:
⑧结束。
3验证机制
程序移植后,终端程序可以正常运行,公司内部展开测试,并在江西、重庆等市场展开联调,均合格,在稳定性和可靠性等方面取得良好的结果。
4结语
总之,基于LinuX系统的电力终端代码移植方法,实现了程序的快速移植,保证了终端系统的稳定性可靠性,并为未来新的需求开发提供了保障。