分享

社区专访|王君杰:软件包制作经验及使用体验分享

 魅影苍穹 2020-02-18

前言

在使用RT-Thread时,必不可少需要接触到RTT的软件包。什么是软件包,引用RTT软件包开发文档中的定义:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的软件组件形成一个个软件包,由软件包描述信息,软件包源代码或库文件组成。

丰富多样的软件包

简单来说,一个软件包就是基于RTT操作系统的,具有不同功能的软件组件,使用软件包的用户可以在env工具中选中所需的软件包,使用env命令下载并编译,该组件的文件就可以自动加入到用户的开发工程中来。

当然,仅仅是使用软件包是远远无法体会到玩转软件包的全部乐趣的,有幸受到RT-Thread团队的邀请,今天我就来分享一下如何制作一个软件包以及我做软件包的一些经验,也顺便带大家了解一下为什么利用软件包可以降低开发难度。

RT-Thread软件包结构

在制作软件包前,我们首先要来了解一下RT-Thread软件包的结构。


一个完整的软件包有以下两个重要组成部分:
1、软件包内容
2、软件包索引

其中,软件包内容指的是该软件包的主体,里面包括软件源代码、软件包说明文档、许可证以及用于scons编译的SConscript文件。

软件包索引主要是提供给env工具,将你的软件包信息加入到env的软件包目录中,使其能够自动下载你的软件包并且进行一些基本的配置。里面包含Kconfig文件以及packages.json文件。

软件包索引及软件包内容中的Sconscript文件在RT-Rhread官网的文档中心有详细的介绍,对其不熟悉的朋友可以点击下方链接进入查看:https://www./document/site/development-guide/package/package/ (请将以上链接复制至外部浏览器打开)

软件包设计步骤


了解了软件包的结构后,我们就可以来设计自己的软件包了。

首先,我们需要制作好一个能够实现某项具体的功能、与产品业务逻辑分离、具有通用性的软件源代码(在下文中,我会分享一些我设计软件包时的一些经验与想法),并且将不同的文件分类放入不同的文件夹中,我在设计中一般分为:example、inc、src、port、doc这五个文件夹,分别为使用案例、头文件、源文件、移植文件以及文档,其中移植文件和文档若没有则可以不需要。

在软件包根目录中还需加入软件包使用说明(一般命名为“readme.md”)、软件包开源许可证( 对于开源许可证不熟悉的朋友可以查阅相关资料,根据自己的实际情况选用合适的许可证)与Sconscript文件。Sconscript文件主要用于在使用scons编译工程时根据用户在menuconfig中选择的不同选项将对应的源文件编译到工程之中。Sconscript的编写可以参照RT-Thread官方的Scons构建工具说明文档:https://www./document/site/programming-manual/scons/scons/
制作好软件包主体之后,我们需要将软件包主体上传到代码仓库中如Github。上传完软件包主体后,我们使用env工具肯定是没办法看到我们刚刚上传的软件包的,因为我们还没有告诉它去哪里找我们的软件包。因此,接下来,我们需要制作软件包索引,使env工具能够找到并且下载我们的软件包。

软件包索引只需要两个文件Kconfig与package.json,前者包含了软件包的配置项,如软件包版本、功能选项等信息。也就是我们使用env工具能看到的软件包信息及配置。后者存放软件包的名称、简介、各个版本对应的下载链接等信息。相当于告诉env工具需要去哪里下载我们的软件包,对于有多个版本的软件包还可以给每个版本设置独立的下载地址。

这两个文件并不需要我们自己从头开始写,我们可以试用env工具的索引生成向导并根据向导提示一步一步生成我们的软件包索引。同样,RT-Thread官方对于如何生成索引文件有详细的介绍,大家可以点击下方链接,找到“创建软件包索引”一节查看:https://www./document/site/development-guide/package/package/

最后,我们需要将制作好的软件包索引通过PR流程推送到RT-Thread软件包索引仓库中:https://github.com/RT-Thread/packages。

至此,我们的软件包制作流程就正式结束了,我们只需等待RT-Thread团队将我们的索引合并,即可使用env工具来配置及使用我们的软件包啦!

软件包设计思想


在整个软件包的制作过程中,最重要的部分就是软件包主体的设计。设计出一个真正受欢迎的软件包是非常不容易的,软件包的设计是一条长远的路,我自己也刚踏上这条路。不敢说有什么非常深刻的见解,但确实有一些小小的经验可以与大家分享。


软件包的实质是将能够实现某一种具体功能的代码与工程逻辑剥离开来,封装代码内核,去掉一些针对于某个项目的特定操作,保留通用功能,并且抽象出API接口,供软件包使用者使用。通俗来讲,以按键软件包为例,我需要去掉按下按键后做什么,长按按键后做什么这些与我具体项目相关的代码,将如何检测按键按下、如何检测按键长按、按键消抖这些涉及到按键内核操作的代码整合在一起,并且对外提供按键的初始化、按键功能的开启关闭、按键事件的设置等等通用的API接口。

下面我们来说一说软件包制作过程中的一些注意事项:
1、接口易懂:软件包是供大家使用的,而使用者又是通过软件包提供的API与软件包接触,因此,软件包的API一定要简洁易懂,命名风格要统一,尽量使用有意义的英文名词,参数尽量少。并且在软件包说明文档中,也一定要加入详细的API使用介绍。

2、内核屏蔽:一个好的软件包的内核应该是对用户不可见的,也就是说软件包的使用者不应该去直接对软件包的内核进行操作。在设计软件包时要时刻注意避免出现一些对外暴露的内核变量、参数以及函数等,必要时刻要加上static关键字对内核属性进行保护。

3、操作简单:软件包的出现是为了简化开发者的开发周期与难度,因此,软件包本身应该要具备使用步骤清晰,操作简单的特性。所有复杂的操作流程都应该在软件包的内部实现,否则这个软件包就失去了自身的意义。

4、易于移植:一个软件包需要运行于多种硬件平台和开发环境,而一份代码在不借助其他手段的情况下必然是无法在各种平台与环境下运行的。因此,移植性也是在软件包的设计过程中需要着重考虑的部分。一般我都会将软件包的内核分为无需依赖外部环境的核心层与需要依赖外部环境(如硬件接口)的移植层。其中核心层无需修改,而移植层则需要使用者依据自己的环境进行修改与适配。值得欣慰的是,RT-Thread已经统一了绝大部分的硬件操作,使大部分软件包的开发都无需太关注移植层的设置,很多软件包甚至都不需要移植即可在RT-Thread所支持的所有BSP上运行!
 

软件包使用体验


刚开始使用RT-Thread时还没有软件包的概念,很多应用都需要自己从底层一步步调用系统的接口实现。做一个按键,需要自己检测GPIO输入状态,需要自己进行按键消抖,做一个流水灯,需要加上一个又一个的延时,一条又一条的开启和关闭。而这些仅仅只是最简单的应用,复杂的应用如文件系统、网页服务器、MQTT等等若要自己从头实现,其难度可想而知。

自从使用了软件包,很多原本需要花几个星期甚至几个月的工作量现在只需花一分钟选中、下载、编译就可以直接使用,甚至自己无需了解内部的实现原理。大幅缩短了项目的开发周期,而一些知名的软件包还具备很高的稳定性,避免了自己在项目开发过程中会遇到的很多坑。而对于软件包开发者来说,自己的软件包能够被别人使用也是对自己能力的一种认可,最重要的是原来需要独自维护的程序现在将由广大的开发者群体一起维护,从软件包使用者反馈的建议以及其他开发者的PR中,我们能够更快认识到软件包内隐藏的问题或者设计的不足,并且加以修正,大大降低了项目出现莫名其妙错误的几率。

最后,希望能有越来越多的开发者加入到RT-Thread软件包的生态建设中来,一起维护,开发,创造一个更大,更完备的软件包社区!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多