基于Linux命令行的嵌入式代码阅读及开发集成环境

发表时间:2021/3/26   来源:《电力设备》2020年第32期   作者:苏清波
[导读] 摘要:目前大部分嵌入式开发都是在远程的Linux服务器上完成,本文介绍一种基于Linux命令行,使用Vim、Global及Tmux等工具的嵌入式代码阅读及开发集成环境。
        (瑞晟微电子(苏州)有限公司  苏州  215000)
        摘要:目前大部分嵌入式开发都是在远程的Linux服务器上完成,本文介绍一种基于Linux命令行,使用Vim、Global及Tmux等工具的嵌入式代码阅读及开发集成环境。该系统充分利用了远程命令行访问服务器的优势。具有断线恢复、访问速度快、跳转方便、脱离鼠标纯命令行操作、集成编译与代码编写以及代码的版本操作等集于一体的优点。另外还有获取工具方便,免费等优点。极大地提高了嵌入式软件开发的效率,也留给了程序员自己个性化定制的空间,是一种展现程序员个人专业技术水平的系统。
        关键字:Linux,Vim, Global, Gtags, Tmux
        一、综述
        如何高效地阅读代码,是作为一名软件工程师的必备技能。目前市场上有很多收费或者免费的集成代码阅读环境。其中收费的莫过于著名的source insight,其能够很好地支持C/C++等语言,实现快速的语法跳转[1]。但source insight的价格却让很多人望而止步。为此微软也推出了一款开源免费的代码阅读软件Visual Studio Code(VSC)。VSC具有强大的语言支持能力,除了能够很好地支持C/C++以外,还支持Python、JavaScript、TypeScript、JSON、CSS和HTML等诸多语言。VSC还能够自动识别语言并且安装插件,这是比其他工具更具优势的地方[2]。VSC甚至可以支持比较冷门的Groovy,对编写Jenkins Pipeline的程序时候比较实用。除了VSC,其他还有一些开源的免费工具,比如Notepad++、eclipse等。但是这些工具操作都需要手动安装插件,不如VSC亲民。
        在日常的嵌入式开发工作中,需要一款能够很好地支持C语言的阅读软件,这一点source insight和VSC都可以完成。但是通常嵌入式开发环境并不是本地编译和阅读代码,而是将代码放在服务器上编译,编译成功以后,再复制到本地下载到目标板上,如图1所示。
 
                                                      图1通常的嵌入式开发环境
        因此,就需要解决代码在服务器上的矛盾。通常采用的一种方法是,将远程服务器上的目录挂在为本地的网盘,然后使用本地的软件如source insight或者VSC来阅读代码。这种方法的主要优点就是可以直接使用本地的工具。但是受制于网速,尤其是在代码量比较大的情况下,代码的同步时间也会加长,带来很差的阅读体验。
        如果在Linux命令行直接使用Vim,那么就可以直接在远程的Linux server下直接阅读代码。这样就不需要使用本地阅读工具。Vim是一款强大的Linux下的文本阅读工具,其可以支持很多插件,但是上手复杂,让很多初学者望洋兴叹。但是如果熟练掌握以后,就可以在代码的天空里翱翔而不迷失方向[3]。但是仅靠Vim,还足以显示出比source insight或者VSC更大的优势,还需要其他工具如Global[4]、Tmux[5]以及一些其他插件,构造一个为嵌入式Linux环境定制的代码阅读环境。本文将介绍一种基于Linux命令行,使用Vim、Global及Tmux等工具的嵌入式代码阅读及开发集成环境。
        二、系统构成
        该系统是以Tmux提供多窗口服务,再以Global的Gtags提供C语言的符号跳转,最后再以Vim来阅读代码的系统。一下分别介绍这三种工具以及在系统中的应用。
        (一)Tmux提供断线恢复和多窗口功能
        Tmux是一种Linux下的命令终端的多窗口软件。如果在Ubuntu系统之下,可以直接使用如下命令(1)安装[5]。
        sudo apt install tmux(1)
        如果不使用Tmux,直接使用Vim阅读代码,那么与服务器的连接断开以后,再次连接服务,我们就需要重新搭建之前的Vim工程,过去访问文件的缓存也全部失效,因此又需要花费时间去重新打开那些文件。但是使用Tmux的命令“Tmux -2”建立一个Tmux服务器之后。在Tmux的窗口里面的所有操作,都会保留下来。只要服务器不重启,那么这个Tmux服务就会一直存在。以后在连接服务器的时候,只需要使用“Tmux -2 a”将原来建立的服务再连接上即可。这里需要注意,第一次建立Tmux服务才会使用“Tmux -2”命令,以后再访问这个服务,使用“Tmux -2 a”即可。
        Tmux可以分成窗口和面板两种视图。面板是对窗口的划分,即在一个窗口里面,可以横竖划分出多个面板,然后使用“Ctrl+b”再按z命令对面板进行最大化或者还原。如图2所示,里面将窗口1分为3个面板,可以在这三个面板中进行独立的操作。因此可以解决使用ssh访问远程服务器时候的多窗口问题,并且记录还可以保存。在表1中列出了Tmux的常用命令。
 
        图2 Tmux面板介绍
                                                                             表1  Tmux常用命令
 
        (二)Global提供符号跳转功能
        Global是GNU[6]上面一款检索代码符号的工具,可以将其理解为cscope[7]和ctags[8]的集合体,并且兼容cscope和ctags的命令。由于cscope在2012年以后就再也没有更新,并且生成数据库时不会增量生成,每次更新数据库,都需要全部重新生成,对工程比较大的时候,每次生成数据库所需要花费大量时间。但是Global可以使用“global -u”命令来增量生成数据库,所以更新数据库所花费的时间特别短,因此在大工程的时候,更具优势。另外Global一直都在更新,最新一次更新是在2020年9月3日[9]。并且Global的gtags也可以替代ctags。因此在该系统中选择Global作为跳转代码的工具。表2展示了Global在Vim里面的跳转命令,基本与cscope一样,缺少cscope的d命令,目前Global还不支持,但是这个命令用到的概率很小,所以也算瑕不掩瑜。
                                                                                 表2  Global常用命令
 
        表2中的命令也可以通过Vim里面的映射命令,如命令(2)。可以将“cs find s”命令通过“ctrl-@ s”这样的组合键来取代,并且直接从光标处取词,完成跳转,而不需要输入复杂的命令。其他命令也可以通过类似的命令来映射。并且可以将其写到vimrc中,这样每次Vim启动即可映射这些命令。
        nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>(2)
        Global生成数据库一般在所需要阅读的工程的根目录下,输入“gtags”即可,这样可以在该目录下生成GPATH、GRTAGS和GTAGS三个库文件。在此目录下打开Vim以后,可以使用命令(3)将gtags的数据添加进Vim,这样就可以使用上面介绍的跳转命令。
        cs add GTAGS(3)
        同理可以将命令(3)添加到vimrc中,以实现打开Vim即添加数据库的作用。这里建议在生成数据库的目录打开Vim。因为在命令(3)中的GTAGS没有给出路径,就需要这样的约定。如果不是在同一个目录打开,就会找不到GTAGS。虽然可以在GTAGS前面加目录的方法来找到GTAGS,但是后面也会出现每次跳转时候的相对目录的麻烦,因此建议在GTAGS所在目录,即代码工程的跟目录打开Vim。
        之前使用的“gtags”,这个命令是递归寻找当前目录所有的子目录中C/C++以及其头文件,然后生成数据库。因为现在的代码工程中的所有文件并不是都要编译的,所以就会带来很多冗余和重复,在阅读代码时降低了效率。而可以使用另一条命令(4)。
        gtags -f gtags.files        (4)
        这里的gtags.files可以是任何名字,只要里面存放需要生成数据库的基于当前目录的文件列表即可。因为这个功能,就可以将实际开发工程编译需要的文件从Makefile中提取出来[10],然后将其路径转化为基于工程根目录的相对路径,存放在gtags.files。再使用命令(4),即可保证数据库中的文件,都是当前工程编译的文件。这个功能极大地提高了代码的阅读效率,也是比source insight和VSC更便捷的地方。
        (三)Vim的配置
        Vim可以直接在Linux命令行下操作,因此即使远程使用ssh访问也可以。就可以直接在远程的Linux服务器上看代码而不是挂载到本地用本地编辑器再看。Vim本身不具有代码跳转的功能,因此需要和global配合使用。Vim本身没有集成工程的功能,为了保留之前的打开文件,需要和Tmux配合使用。
        默认的Vim是没有任何配置的,需要修改在用户目录下的.vimrc文件来实现对Vim的初始化配置。表3列出了在Vim与Global关联起来的配置。
                                                                          表3  vimrc中的特别配置
 
        如果需要在Vim中需要加入文件目录树的列表,那么就要安装NERDTree插件。安装BufExplorer的插件,可以打开所有打开的文件,可以方便快速跳转到最近打开的文件。Vim也要有其他很多插件,在参考文献[3]中有详细介绍。
 
                                                                        图3 整体集成环境
        (四)集成环境介绍
        在前面三个工具的基础之上,图3展示来最终的集成开发环境。这里将一个Tmux窗口分为三个面板。
        上面的大面板用Vim打开需要阅读代码的工程,里面用Global的cs find c命令查找函数hif_update_ie_beacon被调用的地方,列出了在Linux内核中两处被调用的地方和一处声明的地方。左侧是列出的hif_tx.c文件里面所有的symbol,包含函数、变量及宏。右侧是整个Linux内核的目录,可以这里根据目录选择需要的文件。
        左下角的小Tmux面板,是编译区域,这里执行make或者make clean这些操作。
        右下角的小Tmux面板,是查找或者其他区域,对于一些不在C文件里面的搜索可能会用到Linux的grep或者find操作,就在这个区域完成。同时这个区域也可以进行一些svn或者git的操作。
        这个系统,可以完美地适合嵌入式开发的要求。由于操作和编译都是在服务器上,速度会远大于本地的操作。
        三、总结和展望
        该集成阅读嵌入式代码及开发环境,充分利用了远程命令行访问服务器的优势。具有断线恢复、访问速度快、跳转方便、自动检索编译代码、脱离鼠标纯命令行操作、集成编译与代码编写以及代码的版本操作等集于一体的优点。另外还有获取工具方便,免费等优点。极大地提高来嵌入式软件开发的效率,也留给了程序员自己个性化定制的空间,是一种展现程序员个人专业技术水平的系统。
        目前这个系统还需要改进的地方是,在Makefile中定义的宏不能直接与代码中的#ifdef等判断对应起来。这个方面笔者也查了很多资料,目前还没有得到有效地解决。希望以后能够解决这个问题,让这个系统更加完美。
        参考文献:
        [1]Wikipedia.Source Insight[DB/OL].https://en.wikipedia.org/wiki/Source_Insight.
        [2]Wikipedia.Visual Studio Code[DB/OL].https://en.wikipedia.org/wiki/Visual_Studio_Code.
        [3]岳顺.面向程序员的编辑器与vim定制化[J].电脑编程技巧与维护, 2016, (12): 5-10.
        [4]Gnu.GNU Global source code tagging system[DB/OL]. https://www.gnu.org/software/global/.
        [5]Linuxize.Get stated with Tmux[DB/OL]. https://linuxize.com/post/getting-started-with-tmux/.
        [6] Wikipedia. GNU[DB/OL]. https://en.wikipedia.org/wiki/GNU.
        [7]Cscope. cscope[DB/OL].http://cscope.sourceforge.net/.
        [8]Github. ctags[DB/OL]. https://github.com/universal-ctags/ctags.
        [9]Gnu.What’snew?[DB/OL]. https://www.gnu.org/software/global/whatsnew.html.
        [10]朱雪燕. Linux内核文件间依赖关系分析工具的研究与实现[D]. 北京:北京交通大学,2018.
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: