瑞芯微与微软开展合作,加速物联网部署进程
1.引言
如何阅读代码还要单独写一篇文章?难道不是随便用一个IDE就可以了吗?回到上一篇文章里介绍的那个问题,需要修改uboot里board_mmc_. @ ( Y D ; ; $ ^inim R $ ] s M V m nt函数里的writel(0x66666666,REG_MFP_GPD_L) ,对于初学者如何在uboot代码里找到这句话呢?当时问我这个问题的网友就有这个困惑。
因为Uboot和Kernel里有非常多数量的文件,另外为了支持多种芯片,在整个目录里存在大量的同名文件、同名函数。I J L A G #所以如果用一r ` I ; o ^般的IDE把整个工程目录加载进去,然后阅读代码,会= ` 4相当的N ) j C 2 } )不方便,你很难理清楚各个函数之间的调用关系。我曾经尝试过在Windows下用SourceInsight去看内核源码,实在看不下去,而且由于文件太多经常卡住。在网上也看到有人通o / + 4 z s过一些脚本去精简文件数量再配合So# = L rurceInsight的,我也尝试过,感觉也不是很好用。见到过几个高手是直接通过VIM阅读,效率很高,我经过几天的摸索,稍微入x P ( E p了一点门,在这里给初学者做个分享,希望对大家有所帮助。
2.工具安装与使用
因为我一开始学的单片机,用Keil软件比较多,咱们就在Ubuntu里 #ending on the language, functions, variables, class members, macros and so on may be indexed. These tags allow definitions to be quickly and easily located by a text editor, a code search en| A L 7 Pgine, or other utility.安装方式如下:sudo ap 6 h v e ^ Y 7pt-get install ctags验证是否安装成功的方式可以输入ctags --version
使用ctags --list-languages可以查看cD 2 z O X a E J ~tags支持的编程语言
使用1 T 6 Qctags --list-maps可以查看ctags支持的编程语言对应的文件扩展名
使用ctags --list-kinds可以查看ctags识别的语法元素,使用ct& ! Mags --list-kinds=c可单查看C语言识别的语法元素
安装完成之后,想要使用ctags,必须在你想要查看的代码目录中有tags文件。2.1.2 ctags使用m # w 9 2 a a在执行下述操作前,已经在Ubuntu里w i D ! , ; g %~/mcuproject目录下放了一个MCU的工程。第1步: ctags -R *生成tags文件。
第2步:j o O q d S需要找到main函数定义在哪里,先输入vim打开vim窗口,然后在vim命令行窗口输入ts mai$ r mn它的作用是b B 4 - Q K:Search for a particular tag
再根据提示输入$ + C ` [ 1 回车就跳转到main函数所在6 Y S = F | %的位置了,s h %
有一点需要大家注意的是:一定要在tags所在的目录打开vim,输入ts才能搜到你要找到的tag,在其它目录是不行的,比如我进入到上一级目录,就会提示如下信息了。
对比下Windows里Keil环境下,我L 4 n o p通常用如下方式去查找:
搜索结果如下:
看到这里B w * m 8 R V W H你是不= K b e , u是有个疑问,为s 8 q ?什么Ubuntu下搜索main只有一个地方,但是在Keil下搜索F d = # a出来了6处。原因是使用ctags搜索的结果是main的定义,而Keil里是只要main这个字符串出现的地方都会被搜索出来。除了刚才使用的ts命令,还有其他相关命令:
:ts or :tselect List all of the definitions of the last tag
:tn or :tnext Go to the nm Jump to the tag underneath the curso6 * E o ;r
Ctrl-t Jump backx j v k 2 C ? w up in the tagI = T 5 3 X + stack
通过ctrl+] ,取出当前光标下的word作为tag的名字并进行跳转。你需要查看main函数里的BOARD_I8 ] mnitPins()函数定义,直接在vim里,将光标k q j 1 A W c z B移动到那里,然后ctrl+]就跳转过去了
实现的效果和Keil里点击Go to Definition 效果一致
看完了这L ( m & n C A个函数,想回到原来的地方怎么办呢,ctrl+t即可,对应Keil中] E x P 2 C ; N 6下方红框向左的箭头功能。
但是只有ctagu b h l ss还不{ ` v L行,因为还有下面3个阅读代码过程中的问题没有解决1)没有类似Keil中下方的工程文件列表,不方便随意选中某个# Y h W l k文件浏览
2)没有类似Keil中下方的function功能,方便快速找到一个文件中的函数定义
3)如果浏览到下面这个文件的BOARD_InitP) R 4 d u T 0ins函数,我想搜索K 7 W 4 9 p s j e谁调用它的,就没招了M : w。
上述第一个问题,我们通过2.2节的Nerdtree工具实现,第二个问题通过2.3节的Taglist工具实现,第三个问题通过2U w `.4节的csg s P + 3cope工具实现。
2.2安装配置Nerdtree
2.2.1 Nerdtree安装
The NERD tree : A tree explorer plO n A 3 S L Fugin for navigating the filesystem
The NERD tree allowm i qs yo, O :u to explore your filesystem and to open files and directories. It presents the filesystem to you in the form of a tree which you
manipulate with the keyboard and/or mous+ E } F R le. It also allows you to perform
simple filesystem operations.
安装方式是先在https://www.vim.org/scripts/scriptl . u L c L 2左侧的窗口,怎么切换到右侧窗口浏览代i % P U z k码呢?通过Ctrl+w+w在两个窗口切换,我们先切换到右边的窗口,然后进入到CLOCK_EnableClocG b Tk定义的文件里(还记得上一节的Ctrl-]快捷键吧),进入后显示如下
这时按一下F3快捷键,注意左侧窗口的变化,自动就定位到该函数所在的文件了,可以很清晰的看到所在文件的目录结构。这就是上面添加的第二句话的作用。
另, D 外如果工程里文件很多,你想通过搜索快速找到某个文件,可以使用vim自带的find命令也能完成所需功能。find 会从 path 中搜索文件1 9 H 8 。所以在使用find之前一定要配置一下path变量(不是PATH环境变量)具体方法是:在右侧窗口中,进入命令行窗口:set path=./**然后
find gpio_led_output.c或
find g
即可搜索文件
2.3 安装配置Taglist
2.3.1 Tagliu 5 d 4 xst安装
Taglist也是vim的一个插件,能将当前vi: a E Hm打开的文件中函数名、变量名等在一个窗口中列出来,并支持( J c b `通过列出的函数名实U + f | . Bindow = 1
其中第1句话u t Z _ x 2 K Z是建了一个F4的快捷键,用来方便打开Y P b和和关闭该插件第2句话是将该插件窗口放到最后侧。另外根据需要你还可以选择是否添加以下特性:
let Tlist_* D & C mShow_One_File = 1 \"不同时显示多( & = / u个文件的tag,只显示当前文件的
let Tlist_Ex/ Q ^ E Git_U Z + 2 + ! 2OnlyWindow = 1 \"如果taglist窗口是最后一个窗口x G 4 ~ i % n x d,则退出vim
按下F4打开Taglis后,整体窗口显示# C E j n k r =如下:
三部分窗口比例不是很和谐,中间代码窗口太窄,怎么调整窗口大小/ = G @ 9 H z呢?在~/.vimrc中添加以下两句话:
map <F6> :vertical resize +1<CR>
map <F5>B B / ` ! V 1 :vertical resize -1<CR>
:vertical resize 是用来调整当前窗口宽度的。
我们: X w u ; l 3在最左侧窗口中先按F5几次,减小当前窗口宽度,
然后到最右侧窗口中也按F5几次,减小当前窗口宽度,
就变成这样了` Z S 6 h ( R , $:
另外你也可以在中间窗口通过Ctrl + - 减小字体来显示的更多内容
Ctrl + + 为增大字体
2.4 cscope
2.4.1 cscope安装N V / % B配置
先看下ctags和cscope的区别:ctags can be used to take you to the defin` Y r u d { Y H eition of a variable (R l , 7e.g., a func3 [ - 2 Ction, variable, or macro). cscope can be used to tak. 9 + | ) 2 3 `e you to the call site ofA j } macro useV D e 6 Z y t . Hs).简而言之,它是 c. f htags 的加强版,ctags 只能让我们跳转到某个 tag 的定义T M ~ 5 ~ z l a q之处,但是无法让我们知道这个 tag 还在哪里出现过,或者被哪个函数调用过,这时候就需要 cscope 来完成该功能了。安装方式如下:sudo apt-get install cscope验证` | _ r Y } b {是否安装成功的方式可以输入cscope --version
表示安装成功
2.4.2 cscope使用
第1步:使6 i # l t i ! l |用 cscope 生成数据库文件
cscope -Rbkq
其中参数的含义:
-R 递归,对子目录也建立数据库
-o H T p R A ! &b 只生成数据库p j u 5 A 0 m . n,不进入 scope 界面
-k 生成数据库时,不搜索 /usr/include 目录
-q 生成 cscope.in.out 和 cscope.po.out 文件,加快查找速度
第2步:在C ` ( Ivim命令行窗口输入:cs add ./cscope3 ! 0.out第3步:通用格式为 :7 C c f ] 6 L ycs find -option labeloption 可以有很多种模式,在 Vim 中使用 :help cscope-find 来查看 option:
0 or s: Find this C symbol
1 or g: Find_ B 6 u 3 V this definition
2 or d: Find functR d 0 O _ions called by this function
3 or c: Find functions calling this function
4 or t: Find this text string
6 or e: Find this egrep pattern
7 or f: Find this file
8 or i: Find files #including this file
比如:
cs find g BOARD_InitPJ 2 w {ins 会直接跳转到这个函数的定义处
cs find c BOARD_InitPins 会直接跳转到调用这个函数的地方
cs find t BOARD_InitPinsM Z _ ) 会列出以下5个出现该函数的地方
通过选择不同的数字,可以查看具体不同出现的位置。: g O N E这个搜索结果和Keil里搜索的结果一样:
但是这样使用有一个问题:就是4 ` ! J ! B I我查看一个结果后,如果我还想继续查看其它的结果,还得重新搜索再选择一次。该问题的解决方法是:用cscopequickfix,在.vimrc中添加:set cscopeq) n + Cuickfix=c-,d-,e-,= X s 2g-,i-,s-,t-
在命令行copen打开quickfix窗口,用cclose关闭,cprev、cny K Cext移动再次cs find t BOARD_InitPi@ 1 D W c _ns 就会再右下角的窗口里显示,这样查看完) $ s e O O一个文件后如果继续查看另外的文件,就可以通过最O ( ) 5 , k A % X右下角的窗口切换选择。
这种方式打开的窗口是在右下角,看着不是很舒服,怎么弄成Keil那样放到最下方呢,在中间命令行窗口处输入以下内容,就可以在下N N方显示了:botright copen
3.Uboot实战应用
先回到我们之前遇到的那1 P 1 7 d个问题,我是如何在Uboot工程里找到需要修改的那个代码地方的,我们先把上一章改动后的0x0666666改回原来的0x6666666f p A k ^ b c6。第1步:进入到Uboot所在目录m& 0 5 1 .ake cscope
第2步:make ctags
注意上面两步骤没用第二章介绍的方法生成tags和cscope.out文件,原因是因为如果那样操作的话,就把uboot整N 4 T j个文件夹里的所有文件都加进去了,而使用make的方 u } 2 . e B式只生成了实际用到的。第3步:vim:cs add ./cscope.out第4步:F2 、F4 把Ner5 2 H udtree和Taglist窗口打开,通过F5减小下两侧窗口宽度,Ctrl+-缩小字体:botright copen 打开quickfix窗口第5步::cs find t 0x66666666我们找到16处,通过简单分析就可以定位到第一个结果就是我们需G 6 5 . g H [ X ~要的。
你如果是在整个目录去查询,就远远不止这16处了。通过最右侧的Taglist窗口可以看到它是在board_mmc_inr $ 4 S 7 v = Eit这个函数调用的。紧接着我们看下是谁调用的这个$ D + $ U k F .函数board_mmc_init::cs find c board_mmc_init
我们把光标移动到board_mmc_init 处 Ctrl-t 一下,你会发现进入到不是刚才那个函数定义的$ w i m v g地方了,变成了下面这里,w v d这Z 2 U是咋回事??
我们再输入:ts board_mmc_init 查看下该函数的定义,发现竟然有三处
不过前两个是weak弱定义,所以直接Ctrl-t 跳转的就是上述的第一个结果输入:tny s _ Z B W | m 就会跳转到下一个定义,直到找到正确的定义
另外输入ts 就可以看到最R [ / # L T后一次tag结果。
使用上面的方法就可以一步步的继续% t M分析Ubo% , 3 S + # -ot代码,这里不是本篇的重点,不详细介绍了。
4.结束语
本篇为大家介绍了Linux下使用vim配合4个插件实现Linux代码的高效阅读,因为我也是刚学习,所? S g + 7以肯定有很多更好的使用方法还没有掌握,欢迎大家多交流,共同进步,_ } f X W网页下方留言讨论
想要获取本文pdf版本的,请私信留言。