APP下载

基于C环境的面向间隙的单片机日志系统开发思想

2020-12-11梁雪涛李升建张延良薛雷宋业栋

中国科技纵横 2020年13期
关键词:单片机

梁雪涛 李升建 张延良 薛雷 宋业栋

摘 要:本文详细介绍了一种系统编纂设备日志的方法。通过面向间隙的思想,优化软件结构,简便有效的创建一种基于C语言的日志系统。以实现软件状态的监测,切实有效的提高故障排查效率,为软件开发和维护提供一种高效的开发方案。

关键词:面向间隙;单片机;编程思维及方法

中图分类号:TP311.52 文献标识码:A 文章编号:1671-2064(2020)13-0047-02

0引言

近年来,随着物联网产业的发展和相关政策的落地,市场对于简单可靠的单片机数采设备需求量越来越高。而目前对于这种小型硬件,Linux系统占据着无可置疑的统治地位。但是对于更小的硬件,以成本经济性考虑并未植入Linux系统。在缺少成型操作系统支持的情况下,日志、任务调度等重要功能的缺失使得简单单片机程序设计思想已无法满足日益增长的功能需求。而在开发过程中,日志系统在排查bug和程序检测方面均具有重要意义。本文立足于朴素单片机环境,提出一种简单有效的日志系统建立方法和编程思想,为此细分领域的程序开发提供一种切实有效的开发方案。

1面向间隙的基本理念

众所周知,目前的大多数程序,其结构大抵按照OSI七层模型构建[1],如图1所示。

按照此模型,各代码层之间通过接口交互,实现彼此间的数据交换和功能实现。如应用层仅会调用底层的功能接口,并由程序员手动对接口的返回结果进行校验[2]。在此过程中的一切处理皆因调用位置不同而异,调用十次即需重写十次校验结果和校验后的处理代码。一方面难以生成系统的日志和错误警报,另一方面极易缺失结果校验,造成后期bug排查困难,耗时长,效率低。

在JavaSpringBoot[3]中,存在人为构建切面作为日志监控点的思想。而面向间隙的思想与其类似,只是监控点无需人为特意搭建,而是直接监控接口。在各代码层发生交互的间隙内组织监控代码,实现对接口调用的实时监控,并自主生成相应日志,完成对接口反馈的校验和错误报警,最终实现对软件运行状况的实时监控。

2间隙层的结构

对于间隙层,其主体结构可分为两个部分:包装层、引用层。

2.1包装层

包装层主要负责对结构进行额外包装,包装内容包括接口反馈校验、日志主体代码及其他额外内容。

2.1.1接口反馈校验

此部分即为对接口返回值的第一次校验,如接口反馈失败,应向日志内写入报错相关信息。反馈成功则应视其重要性生成相关日志信息。

2.1.2日志主体代码

此部分负责记录接口引用位置、引用时间、引用者、接口反馈结果等日志基本信息。

2.1.3其他额外内容

此部分可提供空函数指针,用于后期视需求拓展其他代码,如回调函数。

2.1.4包装层的具体示例

下面以GenSend接口為例:

此接口的具体信息如下:

名称:bool GenSend(u8* Dat,u16 Datlen)

功能:发送数据

输入: Dat发送数据的地址

Datlen发送数据的长度

返回: ture发送成功

false发送失败

此接口可被包装为一个新接口GenSendPacked

新接口的具体信息如下:

名称:bool GenSendPacked(u8* Dat,u16 Datlen,u8 Sign)

功能:发送数据,生成相关日志

输入: Dat发送数据的地址

Datlen发送数据的长度

Sign调用标志符

返回: true调用成功

false调用失败

具体代码如下:

bool GenSendPacked(u8* Dat,u16 Datlen,u8

Sign,void(*fp)(void))

{

//日志主体部分

LogWrInfor(GENSEND,Sign);

//可扩展函数

fp();

if(GenSend(Dat,Datlen))

{//返回值校验

LogWrError(GENSEND);

return false;

}

else return true;

}

在GenSendPack接口中,日志主体部分LogWrInfor函数引用了GENSEND宏和Sign变量来描述此接口的引用状况。GENSEND宏用于描述接口ID,以在日志中说明是哪一个接口被引用。Sign变量则用于描述引用位置,在日志中描述其在程序的哪个位置被引用。

fp()为空置的函数指针,用于之后的扩展内容。

LogWrError的功能为向日志中写入错误信息,使用其引用的接口ID宏(此例中即为GENSEND)描述错误状态。

如上包装后,每次底层接口被引用时则会在日志中写入引用记录和可能存在的报错信息。但包装层无法解决另一问题:每次对接口的引用都必须校验结果。为了解决此问题,本文引入了面向间隙的第二个主要部分——引用层。

2.2 引用层

引用层主要负责对接口进行宏包装,使得后续编程引用此接口时无需再进行繁琐的校验过程。

所谓宏包装,是指利用宏可定义变量的句法特点,将接口与其校验过程定义为宏。

依旧以GenSend接口为例,对此接口包装如下:

#define D_GenSendPacked(a,b,c,d)  if(GenSend-Packed(a,b,c,d)) return;

在添加了引用层之后,仅需使用D_ GenSendPacked

()宏即可直接调用GenSend接口,无需进行其他多余操作。

3日志系统基本结构

使用面向间隙思维所创建的日志系统,其基本思想为使用接口ID和引用者ID来描述引用者、被引用者,并使用LogError函数来描述引用结果。同时如需必要,亦可记录接口中流通的数据体详细信息。

日志系统的基本结构可分为以下几部分:

3.1数据输入部分

面向间隙的相关监控代码块。此部分负责输入被引用接口的接口ID、引用者ID、接口中流通的数据及其他需要记录入日志的信息。

3.2存储部分

此部分可灵活使用Flash、EMCC、SD卡等物理载体,文件、Flash扇区存储方法进行存储,且应在存储满后覆盖起始部分。

3.3输出部分

此部分可视具体需求实现实时输出、按条件导出等输出模式。

4架构设计及后期移植

在七层模型中插入间隙层后,日志系统和接口校验就不再是一个需要在代码架构设计阶段需要诉诸精力的部分。且间隙层在后续的平台移植过程中,天然具有的低耦合性相比其他插入式日志系统具有较大优势。

5结语

在朴素单片机系统这一领域内,经济性和维护简易度被高度重视,因此日志系统的开发无疑具有重要的意义。目前的日志系统,搭建过程能够借鉴的编程模板极多且具有大量的成型框架,比如[4]Java的SpringBoot、Linux自带的成型日志系统或[5]其他基于串口、[6]AETA的日志系统。但对于朴素单片机终端而言,高级语言的系统移植难度极大,而Linux的内核裁剪则相对复杂繁琐,且对相关工程师的能力要求较高,较高的人力成本也拉高了产品成本。这种背景下,一种简单有效、易于维护的日志系统亟需被开发出来用于朴素单片机远程终端市场。而如本文所述,面向间隙的相关代码块与接口是一种并生关系。接口被引用时相关监控代码就会被触发。基于此,基本思想构建出的日志系统结构简单,本身与上层应用软件伴生,支持灵活的扩展及后期维护。[7]而实际上在软件中,函数和函数间亦可以认为是一个个相互隔离的面,函数间同样存在间隙。因此,面向间隙也可以和函数绑定,实现关键函数的数据孪生。以此搭建的程序在开发和维护尚对比传统程序均存在效率和成本优势,可以为物联网系统开发、高数据量应用(如VR、AR、智能驾驶、城际智能资源调度等)的底层搭建提供广阔的前景,并能为大规模铺设基础智能终端减少大量成本,推动物联网领域尽快走进智能网联时代。

参考文献

[1] 涂小琴.C语言结构化编程教学案例过程设计[J].现代计算机(专业版),2017(30):72-76.

[2] 丛刚.微型机BASIC语言结构化编程方法探讨[J].成都电讯工程学院学报,1988(s2):191-192.

[3] 宋佳,范伟,黄鹏.基于Spring的Java平台程序架构研究[J].计算机与网络,2016,42(22):68-71.

[4] 王童童.面向切面的软件容错技术研究[D].西安:西安电子科技大学,2015.

[5] 李亚洲.基于串口通信的单片机日志系统设计[J].工业控制计算机,2009,22(11):44-45.

[6] 周康生,张兴,王新安,等.一种适用于AETA的日志系統的设计与实现[J].计算机技术与发展,2019,29(12):8-13.

[7] 王兴念,吴六一,李立生,等.基于面向切面编程的跨区传输跟踪与测试技术应用[C].中国电力科学研究院有限公司、国网电投(北京)科技中心、《电信科学》杂志社.第三届智能电网会议论文集.中国电力科学研究院有限公司、国网电投(北京)科技中心、《电信科学》杂志社:国网电投(北京)科技中心,2018:118-124.

Abstract:This paper introduces a method of compiling equipment log system in detail. Through the idea of Facing-gap, the software structure is optimized, and a log system based on C language is created simply and effectively to realize the detection of software status, effectively improve the efficiency of troubleshooting, and provide an efficient development scheme for software development and maintenance.

Key words:facing-gap;singlechip;programming thinking and methods

收稿日期:2020-06-03

作者简介:梁雪涛(1996—),男,山东青岛人,本科,软件工程师,研究方向:网联终端开发。

猜你喜欢

单片机
基于单片机的SPWM控制逆变器的设计与实现
基于单片机的层次渐变暖灯的研究
基于单片机的多功能智能插排
基于单片机的便捷式LCF测量仪
小议PLC与单片机之间的串行通信及应用
MSP430单片机在仿真中要注意的几点问题
基于单片机的平衡控制系统设计
基于单片机的三维LED点阵设计
Microchip推出两个全新PIC单片机系列
基于Proteus的单片机控制系统的仿真设计