1608 字
8 分钟
Linux嵌入式环境配置
2025-01-25
无标签

开发板 Ping 不通虚拟机和主机#

开发板Ping不通虚拟机和主机

Ubuntu Linux 内核降级或升级到指定版本,更新引导#

Ubuntu Linux内核降级或升级到指定版本,更新引导 - 云吱 - 博客园

NFS下载文件报错#

Ubuntu 22.04版本无法挂载NFS V2的解决方法-OpenEdv-开源电子网

u-boot NFS下载文件报错:Loading: *** ERROR: File lookup fail解决方法-CSDN博客

vscode免密连接ubuntu虚拟机#

vscode免密连接ubuntu虚拟机 - 一望天涯 - 博客园

ubuntu 图形界面配置 Clash#

Linux Clash 最速安装使用 - 知乎

ubuntu 安装特定版本 gcc#

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81-164-169_page-0001.jpg

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81-164-169_page-0002.jpg

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81-164-169_page-0003.jpg

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81-164-169_page-0004.jpg

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81-164-169_page-0005.jpg

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81-164-169_page-0006.jpg

正点原子 Linux 内核编译错误#

IMX6:内核编译报错/bin/sh: 1: lzop: not found-CSDN博客

vscode 远程连接虚拟机可双向 ping 通却无法写入指定的管道#

参考 【linux】VSCode连接VMware Linux 过程试图写入的管道不存在_linux_松鼠不吃桂鱼-华为开发者空间

  • 原因 :known_hosts 文件内容没有更新

如果 ssh 重新生成密钥后,之前 known_hosts 文件内容没有更新,又不会自动覆盖,需要把该文件内容清空。

  • 解决

C:\Users\gdfangxy. ssh(主机内 SSH 的地址,每个人不同)内的 known_hosts 文件,清除文件内的所有内容,再重新连接。

vscode 远程连接基于clangd实现内核/外部代码跳转#

参考实现#

在Windows使用VSCode搭建嵌入式Linux开发环境_windows怎么编译linux驱动-CSDN博客

vscode 中 clangd 忽略 gcc 参数爆错#

交叉编译环境配置.jpeg

在建立阅读外部代码的环境时 ?为什么需要把内核目录保存为工作区之后,再把外部代码添加到工作区呢?#

1. 内核与驱动的依赖关系#

  • 驱动程序依赖内核源码:驱动程序需要引用内核的头文件(如 linux/module.hlinux/fs.h 等)和内核符号(如函数、结构体、宏定义等)。

  • 直接打开驱动目录的问题:如果仅单独打开驱动目录,VSCode 的代码分析工具(如 Clangd)会因为找不到内核头文件而无法正确解析代码,导致代码跳转、悬停提示等功能失效。


2. 工作区的作用#

通过将内核目录保存为工作区,可以实现以下关键功能:

(1) 全局代码索引#

  • Clangd 的索引范围:VSCode 的 Clangd 插件会基于工作区内的所有文件建立全局索引。

  • 内核源码的覆盖:将内核目录加入工作区后,Clangd 会索引整个内核源码,包括头文件、函数定义、符号表等,使得驱动代码可以正确跳转到内核源码中的定义。

(2) 统一的编译配置#

  • compile_commands. json:该文件记录了每个源文件的编译参数(如头文件路径、宏定义等)。
  • 内核的编译配置:内核目录的 compile_commands.json 包含了内核编译时的完整配置(如架构 ARCH=arm、交叉编译器路径等)。
  • 驱动的编译配置:驱动目录的 compile_commands.json 需要与内核的编译配置保持一致(例如使用相同的交叉编译器 arm-buildroot-linux-gnueabihf-gcc)。

(3) 跨目录依赖解析#

  • 头文件路径解析:驱动代码中可能包含如下头文件引用:

    #include <linux/module.h> // 内核头文件

    如果内核目录不在工作区中,Clangd 将无法找到这些头文件的实际路径。

(4) 避免路径冲突#

  • 相对路径与绝对路径:内核和驱动可能分布在不同的目录中(例如内核在 /home/book/linux-kernel,驱动在 /home/book/drivers)。

  • 工作区统一管理:通过工作区将两者绑定,Clangd 可以自动处理跨目录的路径关系,无需手动配置头文件路径。


3. 操作步骤的意义#

根据文章中的步骤,具体逻辑如下:

4.1 创建内核工作区#

  • 目的:将内核源码目录作为工作区的根目录,确保 Clangd 能索引整个内核源码。
  • 操作:在 VSCode 中打开内核目录,保存为 .code-workspace 文件。

4.2 将驱动目录加入工作区#

  1. 编译驱动生成 compile_commands.json

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

    bear make # 生成 compile_commands. json

    • bear 会记录 make 编译时的命令,生成驱动代码的编译配置。
  2. 修改 compile_commands.json

    • 将文件中的编译器 "cc" 替换为交叉编译器 "arm-buildroot-linux-gnueabihf-gcc"

    • 原因:驱动代码需要针对 ARM 架构交叉编译,确保 Clangd 使用正确的编译器解析代码。

  3. 将驱动目录加入工作区

    • 在 VSCode 中通过 File > Add Folder to Workspace 添加驱动目录。

    • 效果:工作区现在包含内核和驱动两个目录,Clangd 会同时索引两者的代码。

4.3 验证#

  • 代码跳转:在驱动代码中按住 Ctrl 点击内核头文件(如 #include <linux/module.h>),应能跳转到内核源码中的定义。

  • 悬停提示:将鼠标悬停在函数或变量上,显示其定义和注释。


4. 不保存工作区的后果#

如果直接打开驱动目录而不包含内核目录,会出现以下问题:

  1. 头文件找不到:Clangd 无法解析 #include <linux/...> 的头文件路径,导致代码飘红(报错)。

  2. 符号无法跳转:无法跳转到内核中的函数或结构体定义。

  3. 编译配置冲突:驱动的 compile_commands.json 可能使用默认的本地编译器(如 gcc),而非交叉编译器,导致代码语义分析错误。


5. 总结#

  • 保存内核目录为工作区:是为了让代码分析工具(如 Clangd)能够访问内核源码,建立全局索引。

  • 添加驱动目录到工作区:确保驱动代码能正确引用内核头文件,并使用交叉编译器的配置。

  • 修改 compile_commands.json:解决架构和编译器不一致的问题,保证代码分析的准确性。

通过这种方式,VSCode 可以像本地开发环境一样高效地处理嵌入式内核和驱动的开发!