使用IDE(vs code)进行嵌入式linux驱动开发

原文链接:https://blog.csdn.net/y24283648/article/details/107981315

背景

早期的ubuntu版本上没有好的可用的IDE,那个时候嵌入式linux驱动开发人员多使用vim进行编码;而对于没有图像界面的linux服务器,开发人员更是只能选择vim这一编辑工具。但是,接触过IDE的人会感觉到vim的不方便:需要记一些指令,而且没有代码自动补全,没有代码提示,没有括号自动补全,没有回车后自动缩进等等。

后来ubuntu上有了gedit这个好了许多的编辑工具,使开发人员有了在windows上编辑文本文档的感觉,但它仍然缺乏IDE拥有的代码自动补全等功能。

虽然真正的linux开发大神们都是号称使用vim或者gedit加上插件(如代码自动补全插件,关键词高亮插件,括号自动补全插件)的方式来编程的,但在选择更为丰富的现在,选择一款界面漂亮、支持各种友好操作(如代码自动补全)的IDE也是一个不错的选择,它能大大提升嵌入式linux驱动人员的编码体验。而对于没有图像界面的linux服务器,我们也可以选择先在本地用IDE交叉编译好了,然后再上传到服务器上。

本文主要介绍visual studio code(vs code)这款IDE在嵌入式linux驱动开发中的使用。其他可能也能用于嵌入式linux驱动开发的IDE,还有eclipse。

本文所有操作是建立在你的开发环境已经搭建好了的前提下的。如果你的开发环境没有搭建好,可以参考我另一篇博客《ubuntu20.04.1 64位搭建嵌入式linux开发环境》。

下面总结下VS CODE能帮我们做什么:

  1. 提供函数名的自动补全以及参数的提示
  2. 提供已存在变量名的自动补全
  3. 换行自动对齐
  4. 输入左括号时自动补齐右括号
  5. 可以用于阅读linux源码,因为他有很方便的查找功能:菜单栏中Edit->Find以及Edit->Find in Files;Ctrl+左键也可以尝试查找函数和变量定义的位置(列出来很多地方让你自己看,准确率挺高)。
  6. 可以自定义快捷键,比如我不想用键盘上的上下左右来进行光标移动,可以将他们用更方便的快捷键替代(如Alt+w,a,s,d)。

目前发现的VS CODE不能做的事情:

暂时没有,我需要的功能他都有提供。

原本以为VS CODE无法自动补全结构体名和结构体变量名,也无法自动补全结构体的成员名。后来发现是没有正确设置"compilerPath"导致的。见“设置vs code工程的头文件查找路径及编译器路径”一节中最后部分。

另外IDE本身也有点问题:当定义一个结构体变量时,输入struct xxx aaa; 时,结构体名xxx不会自动补全;但是当你不输入struct,而是直接输入xxx时又会自动补全。

我猜测这是IDE认为你输入struct后可能会定义一个结构体,此时确实是不需要代码补全的。代码补全只有在定义结构体变量的时候才需要。不过我们也不用担心,我们可以通过按键Ctrl+Space强制弹出代码提示。在一些自动补全突然不好使的情况下,这种强制的方法挺好用的。

系统版本

我是通过在win10系统上安装vmware workstation pro 15,然后在上面安装ubuntu20.04.1 64位虚拟机来建立开发环境的。

之所以选择20.04.1这么高的版本,是因为我平时还会做opencv的开发,较高版本的opencv需要较高版本的ubuntu来支持,否则会有各种麻烦的问题。选择这种高版本的ubuntu的话,我就不用建立各种版本的虚拟机,只需要一个虚拟机就能搞定所有开发。arm linux开发板厂商的提供给我们的开发环境总是低版本的vmware加低版本的ubuntu(虽然也是64位),高版本的开发环境的搭建需要我们自己去探索。我的这番尝试也证实了高版本的ubuntu也是能胜任开发环境的。

vs code的安装和使用

1.安装

Visual Studio Code是微软开发的一款可以用于Linux平台的免费IDE。我们可以在vs code的官网上下载,也可以在ubuntu software软件中心下载。我是从后者下载的。安装完之后,点击ubuntu界面的左上角的activity,在搜索框中输入visual studio code,打开vs code并将其添加到favorite中,方便以后使用。

https://code.visualstudio.com/

2.新建工程

vs code是基于文件夹进行工程管理的。

如果你只需要用到一个文件夹,那么直接在你的目录中(比如Home)创建一个新文件夹,然后点击vs code菜单栏的File->Open Folder,打开你刚刚新建的文件夹就完成了工程的建立,接下来你就可以往里面添加文件了:如下图,点击左侧工程栏,新建的文件夹(我这里是HELLODRIVER)的右侧的红圈部分。这里我添加了helloWorld.c文件和Makefile文件,用于编写之后的驱动程序。注意第一次使用vs code时,此时它会要求你安装C/C++ for Visual Studio Code。
在这里插入图片描述

如果你需要同时管理多个文件夹,vs code的workspace机制会帮助到你。此时,除了要新建一个文件夹外,还需要点击菜单栏File->Add Folder to Workspace添加你要管理的第二个文件夹到你的workspace中。接着保存你的workspace并为其命名:File->Save Workspace As。这样,你就得到如下图所示的界面(我的workspace名为HELLODRIVER,下面有两个文件夹:helloDriver和iTop4412_Kernel_3.0)。
以后使用的时候,你就只需要打开这个工作空间了。

在这里插入图片描述

3.设置vs code工程的头文件查找路径及编译器路径

我们使用vs code,是希望能使用“代码自动补全”这一功能。要想实现这一点,IDE自然要知道包含那些函数、变量声明的头文件所在的路径。

vs code的每一个工程都需要我们自己设置头文件的查找路径,我们也可以保存一份配置文件,新建工程时把它复制过来再改改。

vs code配置头文件查找路径以及宏定义的文件叫做c_cpp_properties.json,打开它的方法如下:在菜单栏View->Command Palette,然后在出现的搜索框中输入“edit”,注意搜索框中本身有一个“>”,这样搜索框里的内容就是“>edit”,之后在搜索提示列表中选择 c/c++:Edit Configurations(JSON),这样就打开了c_cpp_properties.json这个配置文件。

在这里插入图片描述
c_cpp_properties.json文件内容如下:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/home/liyu/iTop4412_Kernel_3.0/include",
                "/home/liyu/iTop4412_Kernel_3.0/arch/arm/include",
                "/home/liyu/iTop4412_Kernel_3.0/arch/arm/mach-exynos/include"                
            ],
            "defines": [],
            "compilerPath": "/usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

如上面代码块所示,我们需要在“includePath”中填写需要包含的头文件路径,用于让IDE知道如何补全代码。"${workspaceFolder}/**“这一条是默认就有的。我们还需要添加linux源码的通用头文件包含路径:”/home/liyu/iTop4412_Kernel_3.0/include"以及具体平台的头文件包含路径:"/home/liyu/iTop4412_Kernel_3.0/arch/arm/include"和 “/home/liyu/iTop4412_Kernel_3.0/arch/arm/mach-exynos/include” 。

除此之外,我们还需要在 “compilerPath"中填写我们使用的交叉编译工具中的具体编译器的路径,如"compilerPath”: “/usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc”。把鼠标放在 "compilerPath"上,会提示:Full path of the compiler being used, e.g. /usr/bin/gcc, to enable more accurate IntelliSense. 可见虽然我们直接用他进行编译工作,但是他直接影响到我们的代码补全(IntelliSense),实测具体表现为:结构体名不会自动补全,成员名也不会自动补全。另外,如果不设置正确的编译器路径,当需要使用一些标准库时,如stdlib.h,IDE定位到的标准库就不是你的交叉编译工具中的标准库,而是你的PC上自带的标准库了,这会带来一些错误。

至于宏定义“defines”,我目前还没用到,以后可能会用到。

4.Intelli Sense Engine Fallback设置为ENABLE

有时候IDE的自动补全功能会失效(包括函数名和变量名等),我猜测这种情况会在找不到头文件时出现。

为了解决这个问题,选择菜单栏File->Preferences->Settings,在弹出的窗口中选择User->Extensions->C/C++,然后再上方的搜索栏中输入“Intelli Sense Engine Fallback”,将其设置为ENABLE即可。

他的英文描述我不是太懂,感觉意思是当包含头文件出现错误时,IDE仍能正常智能解析和提示(自动补全)。

编辑驱动文件和Makefile
“新建工程”一节中提到的helloWorld.c和Makefile内容如下:

//helloWorld.c
#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("DUAL BSD/GPL");
MODULE_AUTHOR("LIYU");

static int hello_init(void)
{
    printk(KERN_EMERG "hello world enter!");
    return 0;
}

static int hello_exit(void)
{
    printk(KERN_EMERG "hello world exit!");
    return 0;
}

module_init(hello_init);
module_exit(hello_exit);
//Makefile
obj-m += helloWorld.o
KDIR := /home/liyu/iTop4412_Kernel_3.0
PWD ?= $(shell pwd)
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	rm -rf *.o
	rm -rf *.ko
	rm -rf *.mod.c
	rm -rf *.symvers
	rm -rf *.order

在敲上述代码的时候,头文件名是自动补全的,MODULE_LICENSE这些也是可以自动补全的,还能看到函数允许填写的参数;括号自动补全、回车自动缩进也都是有的,可谓友好极了。这里就不解释代码了,毕竟我们的重心不在这里,只要证明可行就行了。

需要注意的是,helloWorld.c文件里会有报错,比如包含头文件时,说找不到一些头文件里面包含的头文件:cannot open source file “asm/rwsem.h” (dependency of “linux/module.h”)C/C++(1696)。这是正常的,并且不影响我们使用Makefile构建驱动模块。因为我们仅仅使用IDE进行编辑工作,并不用它来进行编译。

最后,我们点击vs code下方的terminal或者菜单栏Terminal->New Terminal来使用内置的终端,在里面输入make,出现下面的结果表示编译成功。此时你的目录下也会多出来很多文件,当然也包含你的.ko文件。

在这里插入图片描述
将该.ko文件拷贝到开发板,运行insmod helloWorld.ko,系统打印出hello world enter!,证明驱动模块编译成功。

vscode搭建linux内核开发环境

https://blog.csdn.net/eydwyz/article/details/113888824?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-9.pc_relevant_paycolumn_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-9.pc_relevant_paycolumn_v2&utm_relevant_index=14

经过搜索和自己亲身实践,最后发现vscode+global插件,可以实现和source insight相媲美的体验。

1. 安装global软件包和vscode global插件

sudo apt install global

2. 在vscode的插件商店里搜索安装global插件

生成global数据库
在vscode下Ctrl+Shift+P进入命令行模式,输入gl,选择Global: Rebuild Gtags Database执行

过几分钟生成完毕,就会在linux源码目录下生成GTAGS、GRTAGS、GPATH三个tag数据库文件

接着,就可以用F12愉快的跳转定义啦,输入代码的时候也会有给力的代码提示

备注:global的版本要注意

又备注:目前在使用过程中,有自定义的结构体成员比如u32这种类型的无法识别无法提示的问题,不知大家有无方法解决。

正点原子 I.MX6U ALPHA/Mini 开发板教程

我们有时候也需要在 Ubuntu 下阅读代码,所以还需要在 Ubuntu 下安装 VSCode。Linux 下的 VSCode 安装包我们也放到了开发板光盘中, 将开发板光盘中的.deb 软件包拷贝到 Ubuntu系统中,然后使用如下命令安装:

sudo dpkg -i code_1.35.3-1552606978_amd64.deb

每次打开 VSCode 都要搜索,太麻烦了,我们可以将图标添加到 Ubuntu 桌面上,安装的所
有软件图标都在目录/usr/share/applications 中,如图所示
在这里插入图片描述
在图中找到 Visual Studio Code 的图标,然后点击鼠标右键,选择复制到->桌面,如图所示:

按照图所示方法将 VSCode 图标复制到桌面,以后直接双击图标即可打开 VSC,Ubuntu 下的 VSCode 打开以后如图所示。

Visual Studio Code 插件的安装

VSCode 支持多种语言,比如 C/C++、Python、C#等等,本教程我们主要用来编写 C/C++程
序的,所以需要安装 C/C++的扩展包,扩展包安装很简单。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值