在Windows使用VSCode搭建嵌入式Linux开发环境

news2024/12/22 2:12:22

在Windows使用VSCode搭建嵌入式Linux开发环境

百问网已经制作好了完备的Ubuntu镜像,可以从这里下载:

链接:https://pan.baidu.com/s/1vw4VUV_Mvt0HXz8IC66ACg 
提取码:iftb 

我们也正在(2022.10.17开始)使用纯粹的Ubuntu环境开始教驱动入门,免费的,感兴趣者也加上面的群。

1. Ubunt上的操作

1.1 安装基本开发工具

git clone https://e.coding.net/weidongshan/DevelopmentEnvConf.git
cd DevelopmentEnvConf
sudo ./Configuring_ubuntu.sh

1.2 安装bear

sudo apt install bear

1.3 下载和编译内核

1.3.1 下载内核

执行如下命令:

$ git clone https://e.coding.net/codebug8/repo.git
$ mkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk
$ ../repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask_imx6ull_linux4.9.88_release.xml --no-repo-verify
$ ../repo/repo sync -j4

1.3.2 配置工具链

执行如下命令:

gedit  ~/.bashrc

在最后加入如下内容:

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

重新关闭、打开终端。

1.3.3 编译内核

vscode的clangd插件使用compile_commands.json文件来生成索引文件,这样当我们点击某个函数时可以飞快跳转到它定义的地方。

compile_commands.json文件中记录的是每个文件的编译选项,样式如下:

        "arguments": [
            "arm-buildroot-linux-gnueabihf-gcc",
            "-c",
            "-Wp,-MD,init/.main.o.d",
            "-nostdinc",
            "-isystem",
            "/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include",
            "-I./arch/arm/include",
            "-I./arch/arm/include/generated/uapi",
            "-I./arch/arm/include/generated",
            "-I./include",
            "-I./arch/arm/include/uapi",
            "-I./include/uapi",
            "-I./include/generated/uapi",
            "-include",
            "./include/linux/kconfig.h",
            "-D__KERNEL__",
            "-mlittle-endian",
            "-Wall",
            "-fno-dwarf2-cfi-asm",
            "-fno-omit-frame-pointer",
            "-o",
            "init/.tmp_main.o",
            "init/main.c"
        ],
        "directory": "/home/book/100ask_imx6ull-sdk/Linux-4.9.88",
        "file": "init/main.c"
    },

我们使用bear命令来生成compile_commands.json,它的用法如下:

bear make [其他make本身的参数]

它会记录make过程编译文件时用到的命令。

所以我们编译内核的目的是生成compile_commands.json,执行如下命令:

$ cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
$ make 100ask_imx6ull_defconfig
$ bear make zImage -j4

如果你之前曾经编译过内核但是没有在前面使用bear命令,那么需要重新编译:

$ make  clean
$ bear make zImage -j4

编译成功后就会在当前目录下得到文件compile_commands.json,需要如下修改:

在这里插入图片描述

在gedit中使用快捷键"Ctrl+H"即可如下操作:

在这里插入图片描述

2. Windows上的操作

2.1 安装vscode

2.1.1 从官网下载安装

使用浏览器从从https://code.visualstudio.com/下载vscode安装包,双击安装。

2.1.2 在本地安装插件

我们的目的是在Windows上运行vscode,使用vscode阅读Linux服务器上的内核源码。

这需要安装很多插件,这些插件是安装在windows上还是Linux服务器上?

vscode的插件有两种类型:

  • 全局插件:只需要安装在Windows上,打开远程服务器的代码后也可以使用这些插件
  • 远程插件:即使在Windows上使用vscode,这类插件也必须安装在远程服务器上

但是我们并不知道插件属于全局插件还是远程插件,怎么办呢?

  • 先在Windows安装所需的全部插件
  • 以后打开远程服务器文件夹时,再查看已经安装的插件,它会有相应的提示。

打开vscode后,点击左侧图标:

在这里插入图片描述

依次输入下列插件名字,安装:

  • C/C++
  • C/C++ Extension Pack
  • C/C++ Snippets
  • Clangd
  • Remote SSH
  • Code Runner
  • Code Spell Checker
  • vscode-icons
  • compareit
  • DeviceTree
  • Tabnine AI Autocomplete
  • Bracket Pair Colorization Toggler
  • Rainbow Highlighter
    • 高亮文字:shift + alt + z
    • 取消高亮:shift + alt + a
  • Arm Assembly
  • Chinese
  • Hex Editor
  • One Dark Pro
  • Markdown All in One
  • Markdown Preview Enhanced

我们已经安装的插件有这些:

在这里插入图片描述

2.2 设置SSH

2.2.1 安装Git

vscode自带的ssh程序有Bug,我们需要替换ssh。

可以使用GIT工具自带的ssh,所以先安装Git:

  • 下载:https://gitforwindows.org/
  • 安装:双击即可

2.2.2 替换ssh

修改环境变量,替换Path中ssh的路径即可。

先打开"编辑系统环境变量":

在这里插入图片描述

然后替换ssh,确保GIT工具的路径下有ssh.exe后,如下替换:

在这里插入图片描述

2.3 远程登录服务器

2.3.1 连接Ubuntu

安装好插件后,即可远程登录服务器,如下操作:

  • 先增加Host
  • 再连接Host

在这里插入图片描述

2.3.2 免密登录

这不是必须的,后续使用vscode访问远程服务器时,你可以一直使用密码登录。

如果想免密登录的话,需要生成ssh秘钥。

先在windows的命令行执行:

ssh-keygen

在这里插入图片描述

然后再修改vscode配置:

在这里插入图片描述

最后把前面生成的id_rsa.pub复制到Ubuntu目录/home/book:

mkdir /home/book/.ssh
cat /home/book/id_rsa.pub >> /home/book/.ssh/authorized_keys
chmod 700 /home/book/.ssh
chmod 600 /home/book/.ssh/authorized_keys
sudo /usr/sbin/sshd restart

2.4 在服务器上安装插件

vscode连接上服务器后,查看本地插件,发现有如下字样的插件就点击"Install in SSH":

在这里插入图片描述

安装完后,可以如下图查看,确保远程服务器上已经有了clangd插件:

在这里插入图片描述

2.5 配置clangd

2.5.1 下载clangd

前面只是安装clangd插件,它的使用还需要一个运行在Linux服务器上的clangd程序。

我们以后使用vscode打开C文件时,会提示你安装clangd程序,它会安装最新版本(版本15),但是这个版本有一些Bug,所以我们手工安装版本13。

在Ubuntu中使用浏览器打开https://github.com/clangd/clangd/releases/tag/13.0.0,下载Linux安装包:

在这里插入图片描述

把下载到的clangd-linux-13.0.0.zip放到/home/book目录下,执行解压命令:

cd /home/book
unzip clangd-linux-13.0.0.zip

2.5.2 配置clangd

在Windows的vscode界面按下图步骤打开setting.json文件:

在这里插入图片描述

在setting.json中写入如下内容(我们第1次打开源码目录后,这个文件可能被自动修改,你需要再次修改它):

{
    "C_Cpp.default.intelliSenseMode": "linux-gcc-arm",
    "C_Cpp.intelliSenseEngine": "Disabled",
    "clangd.path": "/home/book/clangd_13.0.0/bin/clangd",
    "clangd.arguments": [
        "--log=verbose",
    ],
}

C/C++插件里的intellisense和clangd是冲突的,如果我们没有手工设置setting.json,当使用vscode打开C文件时也会提示禁止intellisense,点击鼠标即可禁止。它的本质也是修改setting.json,它会写入如下文字:

"C_Cpp.intelliSenseEngine": "disabled",

上面代码有Bug,其中的"disabled"应该改为"Disabled"。

2.6 常用快捷键

打开C文件后,在文件里点击右键就可以看到大部分快捷键。

输入文件名打开文件: Ctrl + P
跳到某行: Ctrl + G + 行号
打开文件并跳到某行: Ctrl + p 文件名:行号
列出文件里的函数 : Ctrl + Shift + O,可以输入函数名跳转
函数/变量跳转: 按住Ctrl同时使用鼠标左键点击、F12
前进: Ctrl + Shift + -
后退: Ctrl + Alt + -
列出引用 : Shift + F12
查找所有引用 : Alt + Shift + F12
切换侧边栏展示/隐藏: Ctrl + B
打开命令菜单: Ctrl + Shift + P
手动触发建议: Ctrl + Space
手动触发参数提示: Ctrl + Shift + Space
打开/隐藏终端: Ctrl + `(Tab上方的那个键)
重命名符号: F2
当前配置调试: F5
上/下滚编辑器: Ctrl + ↑/↓
搜索/替换 : Ctrl + F/H
高亮文字:shift + alt + z
取消高亮:shift + alt + a

3. 使用vscode阅读内核源码

确保Ubuntu上Linux内核源码目录下已经有了文件compile_commands.json。

3.1 打开目录

vscode已经连接到Ubuntu后,如下操作:

在这里插入图片描述

3.2 触发clangd建立索引

在vscode里打开任意一个C文件,就会触发clangd建立索引:

在这里插入图片描述

如果在状态栏没有看到正在建立索引,可以如下处理:

  • 按照《2.5.2 配置clangd》重新编辑setting.json
  • 重新启动vscode、重新打开内核源码目录、重新打开C文件

在创建索引的过程中,可以使用如下命令查看.cache目录,它会不断变大(最终大小在60M左右):

在这里插入图片描述

3.3 验证

在这里插入图片描述

4. 使用vscode阅读内核外部的源码

比如我们编写了hello驱动程序,它用到内核里的头文件、函数,我们点击hello驱动里的函数时,想打开内核的文件。

需要创建一个workspace:

  • 里面含有内核目录、hello驱动源码目录
  • 内核目录下有compile_commands.json
  • hello驱动源码目录下有compile_commands.json

4.1 创建workspace

使用vscode打开内核目录,然后保存为WorkSpace,如下操作:

在这里插入图片描述

4.2 把驱动目录加入workspace

假设驱动程序位于这个目录:/home/book/nfs_rootfs/drivers_projects/01_hello_drv/

4.2.1 编译驱动

使用如下命令编译,它会生成compile_commands.json:

cd /home/book/nfs_rootfs/drivers_projects/01_hello_drv/
bear make

在这里插入图片描述

4.2.2 修改compile_commands.json

把里面的"cc"全部修改为"arm-buildroot-linux-gnueabihf-gcc"。

4.2.3 加入workspace

在这里插入图片描述

在这里插入图片描述

4.3 验证

在这里插入图片描述

5. 常见错误

5.1 无法跳转

第1步,确认已经关闭intellisense:

在Windows的vscode界面按下图步骤打开setting.json文件:

在这里插入图片描述

在配置文件中:

在这里插入图片描述

第2步,跟第1步一样打开配置文件后,确认Ubuntu中有clangd:

在这里插入图片描述

第3步,确认源码目录下有compile_commands.json,并且文件里面记录有验证用的C文件、“cc"被改成了"arm-buildroot-linux-gnueabihf-gcc”:

在这里插入图片描述

第4步,在vscode里打开C文件后,确认.cache目录生成了:

在这里插入图片描述

5.2 Ubuntu IP变化

Ubuntu中的网卡IP会发生变化,如果发现无法连接服务器后,需要确认IP是否发生了变化,然后按照《2.3.1 连接Ubuntu》重新连接。

如果想那么麻烦,可以设置vmware让NAT的固定下来,如下图操作:

在这里插入图片描述

在这里插入图片描述

第2步,跟第1步一样打开配置文件后,确认Ubuntu中有clangd:

在这里插入图片描述

第3步,确认源码目录下有compile_commands.json,并且文件里面记录有验证用的C文件、“cc"被改成了"arm-buildroot-linux-gnueabihf-gcc”:

在这里插入图片描述

第4步,在vscode里打开C文件后,确认.cache目录生成了:

在这里插入图片描述

5.2 Ubuntu IP变化

Ubuntu中的网卡IP会发生变化,如果发现无法连接服务器后,需要确认IP是否发生了变化,然后按照《2.3.1 连接Ubuntu》重新连接。

如果想那么麻烦,可以设置vmware让NAT的固定下来,如下图操作:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

孙宇晨2022釜山区块链周演讲:区块链是未来数字城市发展基石

据韩国媒体全球经济新闻10月27日报道,波场TRON创始人孙宇晨线上出席了2022 釜山区块链周(Blockchain Week in Busan 2022,以下简称BWB 2022),并发表《 The Cities of Tomorrow》主题演讲。孙宇晨表示,“区块…

生产环境数据库表迁移实践集锦

数据库表迁移是开发者必须要掌握的一种能力,对中高级开发者来说更是如此。工作中随着公司业务不断发展、系统架构的慢慢调整演化,迁移数据库表是不可避免的。由于数据是公司最最核心的资产,所以对生产环境数据库表的迁移并不是谁都可以去实施…

Web服务器、Ftp服务器、DNS服务器搭建【高级路由协议与实验04-2】

上一篇自学练习了如何搭建web服务器 文章目录网络设置1.修改配置文件2.改成桥接模式访问外网3.选择网卡4.重启网卡一、web服务器补充:步骤1.安装httpd软件包2.将httpd服务设为开始自启动,并启动该服务3.查看httpd服务是否启动4.在防火墙开放80端口并查看…

小白学习spring第一天

第二章:Spring 第1节:概述 1.1 介绍 heap stack Spring是一个分层的Java SE/EE full-stack(一站式)轻量级开源框架,以 IoC(Inverse Of Control:控制反转)和 AOP(Aspec…

力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

文章目录738. 单调递增的数字思路难点:遍历顺序难点:设置flag714. 买卖股票的最佳时机含手续费贪心思路难点968. 监控二叉树思路难点:如何隔两个节点放一个摄像头738. 单调递增的数字 力扣题目链接 当且仅当每个相邻位数上的数字 x 和 y 满…

常用算法———P I D控制算法(P I D三个参数的作用和两种P I D算法的代码实现)

如果有错误请及时指出,大家一起学习交流。 目录 一、PID的概述 二、PID三个参数的控制原理 1、P控制器 2、I控制器 3、D控制器 4、PID控制器 5、PID的数学公式 三、位置式PID和增量式PID的差别和代码实现 1、位置式PID和增量式PID的差别 2、位置式PID …

(附源码)计算机毕业设计SSM竞赛报名管理系统

(附源码)计算机毕业设计SSM竞赛报名管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

mindspore实现自定义CNN图像分类模型

一、数据集定义 使用mindspore.dataset中的ImageFolderDataset接口加载图像分类数据集,ImageFolderDataset接口传入数据集文件上层目录,每个子目录分别放入不同类别的图像。使用python定义一个create_dataset函数用于创建数据集,在函数中使用…

[C++基础]-初识模板

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、泛型编…

【正点原子STM32连载】第五十五章 T9拼音输入法实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id677017430560 3)全套实验源码手册视频下载地址:http://www.openedv.com/thread-336836-1-1.html 4&#xff…

deepwalknode2vec 代码实战

提示:笔记内容来自于B站up主同济子豪兄 文章目录1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入?2.2. deepwalk的步骤1、生成graph;2、利用random walk生成多个路径;3、训练表示向量的学习;4、为了解决分类个数过…

航拍遥感数据集

一、Roundabout Aerial Images for Vehicle Detection 本数据集是从无人机拍摄的西班牙环形交叉口航空图像数据集,使用PASCAL VOC XML文件进行注释,指出车辆在其中的位置。此外,还附带一个CSV文件,其中包含与捕获的环形交叉口的位…

深度学习 神经网络(2)前向传播

深度学习 神经网络(2)前向传播一、前言二、神经网络结构三、前向传播四、参考资料一、前言 前面介绍了《感知器》,类似于单个神经元细胞,现在我们用多个感知器组合成更加复杂的神经网络。本文介绍了多层神经网络通过前向传播方法…

超市营业额数据分析

文章目录1:查看单日交易额最小的3天的交易数据,并查看这3天是周几1.1:导入模块1.2:数据处理1.3:输出结果完整代码2:把所有员工的工号前面增加一位数字,增加的数字和原工号最后一位相同&#xff…

FBAR滤波器的工作原理及制备方法

近年来,随着无线通信技术朝着高频率和高速度方向迅猛发展,以及电子元器件朝着微型化和低功耗的方向发展,基于薄膜体声波谐振器(Film Bulk Acoustic Resonator,FBAR)的滤波器的研究与开发越来越受到人们的关…

酒楼拓客营销流程,酒楼宣传推广方案

随著网络时代的发展,许多行业受到了大大的冲击,其中也涵盖酒楼,在目前的情况下,对于酒楼来说,无论是互联网还是线下,引流都是最重要的。那么酒楼如何做好营销推广工作,从而提升业绩?…

乘风而起!企业级应用软件市场迅猛发展,有哪些机会可以把握?

数字化转型战略的深入,使我国企业级软件市场得到了迅速的发展,据统计,2021年我国企业级应用软件市场规模超过了600亿元,其中商业智能(BI)市场规模超过了50亿元。 得益于中国企业对于数据系统的本地化部署需…

Hadoop3 - MapReduce DB 操作

一、MapReduce DB 操作 对于本专栏的前面几篇文章的操作,基本都是读取本地或 HDFS 中的文件,如果有的数据是存在 DB 中的我们要怎么处理呢? Hadoop 为我们提供了 DBInputFormat 和 DBOutputFormat 两个类。顾名思义 DBInputFormat 负责从数…

MODBUS通信浮点数存储解析常用算法

MODBUS通信相关的基础知识,各种PLC通信程序的写法。可以参看专栏的其它文章这里不赘述。MODBUS通信时,数据帧都是以字节为单位发送和接收的,接收到的字节,如何存放和解析。就需要我们具备数据处理类的知识了,这里需要大家简单了解下有关数据结构的基础知识,这方面比较薄弱…

AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

文章目录前言一、树状数组1.1、树状数组知识点1.2、树状数组代码模板模板题:AcWing 1264. 动态求连续区间和例题例题1、AcWing 1265. 数星星【中等,信息学奥赛一本通】习题习题1:1215. 小朋友排队【中等,蓝桥杯】二、 线段树知识点…