当前位置:众信范文网 >专题范文 > 公文范文 > 基于VxWorks的一种串口调试打印和输出管理方法

基于VxWorks的一种串口调试打印和输出管理方法

时间:2022-10-27 10:25:04 来源:网友投稿

摘要:为了提升在VxWorks开发过程中的调试效率和灵活性,提出一种串口调试信息组合打印和输出管理方法。將时间信息和文件信息组合输出,通过调试信息编号与调试信息等级进行打印输出管理,同时支持颜色控制和文件保存。实验仿真表明,借助该方法能够快速实现定位和故障现场恢复,使软件调试、运行监测和系统维护更加清晰直观,满足大系统集成的需要。

关键词:VxWorks;串口调试;输出管理

中图分类号:TP31文献标志码:A文章编号:1008-1739(2019)22-57-3

0引言

在嵌入式VxWorks[1]软件开发过程中,通过串口输出打印信息,串口终端监控调试信息是一种常用的调试手段。在VxWorks实时操作系统中,打印输出接口主要使用printf, logMsg函数。printf函数是一个参数个数可变的函数,功能是按照用户指定的格式,将数据按一定的格式输出若干个任意类型的数据[2]。如果其他任务正在使用,则因临界资源问题会堵塞[3]当前任务,因此不可用于中断。中断服务程序应尽快结束,否则将引起阻塞,有许多函数不可调用,如:printf(),malloc(),semTake()函数等,但可以使用semGive(),logMsg(),msgQSend(),bcopy()[4]。

与之对应的logMsg函数为任务式打印输出函数、非实时性打印输出,且固定为6个参数。VxWorks内核创建优先级为0的tLogTask打印任务,通过信号量同步消息,格式化调试信息后打印输出,也同时打印输出对应调用的任务名。

在实际应用时,直接使用printf, logMsg都存在不足。为了方便调试和开发,本文结合二者优点,提出一种串口调试打印输出管理方法。此方法使用通用的宏定义,支持可变参数和非实时性打印输出,支持多核多任务系统使用,在调试信息打印输出时同时输出当前时间、文件名称和对应行数,并支持颜色控制和文件保存,支持通过调试信息编号和等级管理输出内容。

1软件设计

方法设计时使用标准C/C++开发,操作系统使用VxWorks5.5.1,开发环境使用Tornado,硬件通信方式使用SecureCRT[5],打印输出使用logMsg,仿真环境使用VxSim。目标仿真器VxSim提供了与真实目标机一致的调试与仿真运行环境,用户不需要目标机和操作系统配置即可在Tornado环境中迅速开发调试[6]。

定义此软件名为log4m,初始化完成后,对调试信息编号和等级进行管理,如果允许输出则先加锁,组合当前时间、调试信息等级、调试信息内容、文件名称和对应行数,并进行颜色控制和文件保存,调用logMsg打印输出,解锁后完成一次调试信息的有效输出。软件运行流程图如图1所示。

1.1实现方式

在软件实现时,存在常用的4种实现方式。

方式1:使用临时变量作为缓存空间,无需资源互斥锁,但存在临时变量被系统回收后打印乱码的问题,且消耗任务堆栈[7]资源。

方式2:使用new堆栈的方式作为缓存空间,但反复new, delete,存在软件设计内存溢出和越界的风险。

方式3:使用全局变量作为缓存空间,需要二进制信号量互斥锁,同时为了防止打印乱码需要使用数据输出循环缓存方式。此方式可增加调试信息保存到文件中,因为在读写文件时同样需要使用资源互斥锁。二进制信号量能有效对共享资源的访问进行互锁,来实现互斥。

方式4:使用创建任务方式,将打印输出放入缓存列表中,通过低优先级任务输出,保证当前运行任务的实时性能,存在输出打印实时性变差的问题。

结合实际使用情况,本文设计使用方式3,在开发阶段牺牲了一定的实时性能,但无需反复申请堆栈,同时满足调试打印的实时性。产品交付后,可通过输出管理直接关闭打印输出,减少因打印导致系统实时性能减弱的问题。

1.2打印输出管理

在打印输出管理时,使用调试信息编号ID管理和调试信息等级LEVEL管理。

调试信息编号ID管理,设计10个调试信息ID,其中ID为0是默认ID号,通过对外的接口控制相应的ID号是否输出。调试信息ID的设计根据调试信息的类别进行区分,将一个大系统中的多种类多任务调试信息打印分开管理,防止打印信息过多导致实时性能减弱和延误查找调试信息。

调试信息等级LEVEL管理,设计4个调试信息等级,从低到高分别为LOG4M_LEVEL_DEBUG、LOG4M_LEVEL_ WARNS,LOG4M_LEVEL_ERROR,LOG4M_LEVEL_FATAL,对应调试级、警告级、错误级和重大级。调试信息等级的设计根据调试信息重要性进行区分,将重要的调试信息通过颜色控制和调试信息等级提示分开管理,提高调试效率。

1.3调试信息内容组合

在调试信息内容组合时,使用宏定义和可变参数的设计,使用时将宏定义转为格式转换程序。在preLog4m函数中,实现调试信息编号ID管理和调试信息等级LEVEL管理;使用Log4m_Event信号量,进行资源互斥锁,semTake加锁,semGive解锁;使用sprintf对可变参数进行格式转换;在makeLog4m函数中,实现调试信息组合、颜色控制和文件保存,调试信息的组合内容,包括当前时间输出、调试信息等级、调试信息内容、文件名称和对应行数;通过VxWorks系统库函数time,localtime[8]获取当前时间,通过编译器内置宏__FILE__获取文件路径,编译器内置宏__LINE__获取对应行数,使用sprintf,strcat,将当前时间、文件名称和对应行数组合,其中文件名可使用strrchr(file,’/’)分割文件路径获取。

1.4颜色控制和文件保存

使用转义字符“e”更改输出格式,根据调试信息等级调用不同的输出格式,实现颜色控制。常用的输出格式有“\e[0m”,“\e[1m”,“\e[30m”,“\e[31m”,“\e[40m”,“\e[41m”。其中,“\e[0m”标识清除所有格式,“\e[1m”标识字体加粗,“\e[30m”标识黑色字体,“\e[31m”标识红色字体,“\e[40m”标识黑色背景色,“\e[41m”标识红色背景色。需要注意不同的打印终端存在差异,实际颜色控制效果略有不同。更改输出格式后,格式更改会一直保持,需要使用“\e[0m”清除格式或退出打印终端。例如log4m_stroems标识准备输出的调试信息,LOG4M_COLOR为常量数组保存输出格式。

算法3:颜色控制程序

在具有可读写硬盘的环境下,可启用文件保存功能,将调试信息保存到硬盘中。离线调试、恢复现场和问题回溯时,可快速定位错误位置和故障原因。

2实验仿真

在VxSim中仿真模拟调试打印和输出管理过程,因VxSim中不支持转义字符“e”,仿真时不使用颜色控制。仿真程序在初始化InitLog4m完成后,使用测试程序仿真运行,程序如下:

在VxSim0中打印输出“InitLog4m started!”,对应的源码文件名为log4micro.cpp,在第149行時调用,初始化完成;在VxSim0中打印输出“test=1,info=2”,对应的源码文件名为log4micro.cpp,在第152调用,与测试要求一致。

仿真运行结果如图2所示。

3结束语

本文讨论了一种基于VxWorks串口调试信息组合打印和输出管理方法,详细介绍了软件设计中的实现方式、打印输出管理、调试信息内容组合、颜色控制和文件保存,并通过仿真模拟的方式实现了此方法。通过使用此方法,在VxWorks嵌入式实时操作系统软件联试阶段和系统集成阶段,能有效提高软件设计和调试效率,具有一定工程意义。

参考文献

[1]徐小权.基于VxWorks实时多任务的信号处理软件设计[J].电脑知识与技术, 2013,9(17):4009-4012.

[2]张菊.浅析C语言printf函数的功能及使用[J].中国科技信息,2012(10):111-116.

[3]查荣明.Linux与VxWorks的任务调度研究及应用[J].信息与电脑(理论版),2018(11):17-20.

[4]籍林峰,曹伟. VxWorks操作系统中中断的应用[J].雷达与对抗,2004(3):67-69.

[5]李进印.用SecureCRT软件实现分散宽带网络管理研究[J].无线互联科技,2013(12):10-11.

[6]许坤.VxWorks系统中任务状态转换的研究[J].舰船电子对抗,2004,27(2):28-31.

[7]朱剑锋,缪万胜,康介祥.基于堆栈回溯的异常处理[J].计算机工程与设计,2014,35(12):4176-4180.

[8]燚陈.VxWorks_for_x86系统中实时时钟的应用[J].电子元器件应用,2010,12(3):61-64.

推荐访问: 串口 调试 输出 打印 方法