廖晓谈,陈鑫旺,宋 颖
(南京熊猫汉达科技有限公司,南京 210014)
随着卫星通信技术的快速发展,近年来卫星产业得到了巨大的发展,也带来了卫星通信设备需求的爆发。在天线控制、中频、切换矩阵、信道等卫星通信设备中存在多种多样的监控板,这些监控板的主控芯片大部分是单片机。在这些单片机中运行的软件很多都是软件工程师编写的前后台程序,没有操作系统和软件架构,可维护性和可移植性差。因为没有一套通用的监控软件架构,软件工程师各自为政,甚至同一个部门的软件工程师编写的代码框架完全不同。由于存在工程师离职、调岗等情况,新接手的软件工程师经常无法读懂前人的代码,导致推翻前人成果重新进行软件编写,而这些监控软件的无序状态都是因为没有一个统一的监控软件架构标准。所以我希望根据现有资源在我公司的通用监控板上实现一套比较简单易用的监控软件架构。
我公司的天控、中频、切换矩阵、信道等设备中存在着多种多样的监控板。这些监控板有的面临核心芯片停产的问题,有的接口资源不够丰富、处理能力弱。为了满足日益复杂的监控任务需求,减少多种不同监控板所带来的软硬件研发和生产复杂程度,设计了一种通用监控板,即使用一种外围接口固定的监控板来完成天控、中频、切换矩阵、信道设备的监控任务。通用监控板的定位孔尺寸、接插件型号和定义都是固定的,使用相同的软件驱动程序,未来可以通过更新主控制芯片来进行硬件升级。通用监控板的主要功能性能指标如下:主控制器使用ST公司32位ARM Cotex-M4内核的单片机STM32F429ZIT,最高主频为180MHz,192KB片内RAM,2MB的片内Flash;板上有配置参数存储器,容量为8KB;支持2路网络,10/100M自适应;支持8路串口(其中3路串口可以配置成RS422/RS485 电平);支持3路独立的SPI接口(其中1路SPI有6个片选端口)。
原有的监控软件都是软件工程师按照自己的想法编写的,大部分是前后台软件架构,包含大循环扫描和中断触发。这种软件架构的框图如图1所示。
图1 前后台软件架构框图
前后台软件架构的优点是简洁、明了,特别适合比较简单的应用。当软件规模较大时,我们就会发现前后台软件架构的缺点:软件难管理和维护;软件工程师必须懂硬件;实时性难以保证。所以需要使用一个嵌入式实时操作系统来解决这些问题。
针对原有监控软件架构的缺点,将嵌入式领域出现的优秀元素如RTOS、GUI、面向对象设计、分层设计等思想引入到通用监控板软件架构中,使用开源软件FreeRTOS和msOS,通过合理的组织形成完整的软件架构。此软件架构让使用者很容易读懂,并且可以很容易修改、增删,方便多位工程师协同开发系统底层,具有很好的稳定性和可重用性,软件工程师能根据自己的实际项目需求来编写应用层程序,而不需要关心通用监控板底层硬件资源管理和驱动等。通用监控板软件架构如图2所示。
图2 通用监控板软件架构
FreeRTOS是一个迷你的实时操作系统内核,主要功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可满足绝大部分监控软件的需要。FreeRTOS的源代码开源且免费,可以方便地使用ST公司的工具软件STM32CubeMX来配置生成。
嵌入式微系统msOS是一款简单、易用的通用嵌入式软件架构,其结合具体的项目应用,整合uC/OS-I I,面向对象编程,是一款具有实时性要求、多任务的前后台系统。msOS的特点是统一了编程风格,把C语言写成简单、优雅的C#语言的样子,利用结构体把软件架构分为应用层(App)和系统层(System),独立编程,应用层和系统层都只能对设备操作,不能访问底层,实现芯片级移植,便于多人协同开发系统层。
本文研究的软件架构底层的CMSIS、STM32 HAL Driver和FreeRTOS模块都可以方便地使用ST公司的工具软件STM32CubeMX来配置生成,方便在STM32不同芯片之间进行移植。上层的System和App层是按照msOS的框架和风格来实现的。App层是直接面向应用的,不涉及底层硬件和驱动。主要包含业务逻辑(Logic.c)和菜单界面(Menu.c),用于业务逻辑控制和串口屏界面显示。System层细分为GUI库、MOTOR(电机)库、Switch Mat r ix(切换矩阵)库等中间件和Device 子层,可以将它看作是C#里的System命名空间,将通用监控板底层的硬件资源及相关驱动全部封装起来,供App层调用。GUI库为菜单界面解析包,用于面向对象的页面解析。MOTOR库为电机控制包,用于封装控制步进电机和直流电机的子函数。Switch Matrix库为切换矩阵控制包,用于封装控制切换矩阵的子函数。Device为App层和System层提供所需要外围软硬件设备的驱动程序,内部包含各种设备,如LCD、按键、串口、电机等。
本文的软件架构借鉴了msOS的思想,共分为4 个任务,它们的名字和优先级如图3所示。任务1的功能是进行1ms一次的轮询,处理最紧急的周期性查询事物如电机控制等,为最高的任务优先级;任务2的功能是进行10ms一次的轮询,处理较紧急的周期性查询事物如按键扫描等,为第二高的任务优先级;任务3的功能是采用消息驱动型方式处理业务逻辑,为第三高的任务优先级;任务4的功能是进行菜单界面解析处理,为最低的任务优先级,100ms刷新一次即可。另外,如果需要进行微秒级的轮询,直接使用MCU的定时器,在定时器中断程序里进行轮询,缓存从外设获取的数据,并发送消息给任务3,在任务3中进行业务逻辑处理。
任务1、任务2和中断程序将从外设获取的数据缓存到MCU内存中,并发送消息给任务3;任务3在收到任务1、任务2和中断程序发送过来的消息后,对缓存下来的数据进行协议解析、转换计算等处理,并更新全局数据库App.Data和App.Menu;任务4根据全局数据库App.Data和App.Menu的最新数据,每隔100ms刷新一次界面显示。
图3 任务分配框图
本文的菜单界面是基于msOS的菜单界面设计思想,根据通用监控板菜单界面的具体需求改造而来。它完全基于面向对象的思路来进行设计,把界面抽象成若干个页面,而每个页面又由背景文字(BackText)、标签(Label)和文本(TextBox)等控件组成。背景文字用于显示固定的文字说明,比如频点、温度等,这些文字在当前页面下是一直不会变化的。标签控件是用来显示变量的,可以是字符串,也可以是数字。文本控件除了具有标签控件的特点外,还可以通过按键等来修改变量值。标签控件使用单向链表来进行组织和遍历,文本控件使用双向链表来进行组织和遍历。在面向对象语言C#中,控件是类(class)来封装的,控件的特性对应类的属性,控件的操作函数对应类的方法。在C语言中没有类,只能将控件的特性封装到结构体(struct)里面。菜单界面中页面的组织结构如图4所示。
图4 菜单界面中页面结构框图
在页面的初始化函数中将每个控件初始化,然后在任务4中每隔100ms就解析执行一次菜单界面。只有当菜单界面有数据更新时,才去更新液晶屏显示,这样可以减少MCU与液晶屏之间的数据通信开销,有利于提高菜单界面显示的可靠性。
本文针对卫星通信设备通用监控板的监控软件实际需求,基于开源的FreeRTOS和msOS嵌入式操作系统,设计了一套监控软件架构。本文的监控软件架构具有良好的可读性、稳定性和可移植性,使得应用软件工程师不需要关心底层的硬件和驱动,只需要关注自己需要的监控界面和业务逻辑,大大减少了重复性工作,监控软件开发的时间成本和沟通成本减少,新员工接手监控软件的难度也将大大降低,预期的效益非常明显。
[1] 王绍伟,郑德智,吴玉勇.嵌入式微系统[M].北京:机械工业出版社,2016.
[2] 李泽平.嵌入式微系统msOS的设计与应用[D].江西科技师范大学,2015.
[3] 李志明,檀永,徐石明.STM32嵌入式系统开发实战指南[M].北京:机械工业出版社,2013.
[4] 左中凯,刘军,张洋.FreeRTOS源码详解与应用开发[M].北京:北京航空航天大学出版社,2017.