主机:Win11 家庭版

Linux:Ubuntu 22.04 WSL

开发板:100ask-MP157-PRO

任务

一、 NFS搭建

选做:编写脚本

Windows

开发板

二、 以SSH连接开发板

三、 内核源码查看


一、 NFS搭建

工欲善其事,必先利其器。一个方便快捷的开发环境才能更加方便的进行开发与学习。

在学习中,主机上的Linux环境选用WSL,其原因是启动快捷,并且功能比较齐全。而主机与开发板之间使用如SecureCRT之类的终端仿真工具进行设置。

对于WSL搭建NFS本身就是一件不容易的事情,WSL的网络设置很复杂,WSL 2与Windows是不同网段的,并且对于Windows家庭版是少了很多开发插件的,比如Hyper-v虚拟机的网络管理等;WSL 1与主机为相同ip,但在开发板挂载的时候很难找到共享的位置。但利用WSL 1的根目录在Windows系统中以目录的形式存放,并非像WSL 2将系统使用虚拟驱动封装,则可以退而求其次在Windows中搭建NFS。haneWIN NFS虽然不错,是收费软件。在此,发现了这篇文章中在Windows搭建NFS的工具——WinNFSd。

Windows10 WSL2搭建支持nfs的hi3518开发环境icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/349253238?utm_id=0

在文章中使用WSL 2,WSL会在/mnt/中挂载Windows中的硬盘,而作者将NFS搭建在/mnt/挂载的Windows硬盘中其本质也是在Windows中搭建的NFS。而WSL 1的根目录在WIndows文件系统中,则环境与作者所做的相似。WinNFSd下载地址。

Releases · winnfsd/winnfsd · GitHubContribute to winnfsd/winnfsd development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/winnfsd/winnfsd/releases/

下载WinNFSd.exe文件即可运行。

常用的使用方式:

WinNFSd.exe [-log off] <export path> [alias path]

 在Linux中挂载:

mount -t nfs -o nolock,vers=3 <ip>:<export/alias path> <mount path>
选做:编写脚本
Windows

WinNFSd设置了环境变量以方便后续操作。

根据WinNFSd命令用例,编写脚本代码:

@echo off
WinNFSd -log off d:\<WSL path>\home\<user>\project /project

 -log off 即关闭日志输出

这里对Linux内的目录进行搭建,并且因为目录名称过长,挂载的时候会很不方便,因此起了别名(/project)。

开发板

编写Shell脚本:

#!/bin/bash
mount -t nfs -o nolock,vers=3 <ip>:/project /mnt/nfs/

二、 以SSH连接开发板

NFS是通过网络传输的,而仿真终端是通过串口传输的,这时候想要使用开发板就需要连接串口线和网线两条线,非常非常不方便,要是能连接能够更加方便就好了。

因此使用SSH连接开发板,SSH依靠网络传输,即同时也能兼并NFS的挂载。因此静态设置主机和开发板网线端口的ip达到方便连接的效果。

对于Windows,对选中网络进行属性配置或网络适配器设置即可。

网络属性配置

网络适配器设置

对于该开发板,根据开发手册,需要到/etc/systemd/network下创建50-static.network文件进行配置:

[Match]
  Name=eth0

[Network]
  Address=10.1.1.3/24
  Gateway=10.1.1.1

然后重启开发板即可。

相互ping通即可,即Linux/Windows与开发板互ping,因为WSL 1与主机公用ip。

然后使用SSH连接:

SSH连接

三、 内核源码查看

WSL需要安装的基础软件:网络工具net-tools,C语言库gcc,编译工具make,交叉编译gcc-arm-linux-gnueabihf等等。

至于ide,使用了VSCode,在主机上安装了VSCode,WSL也可以使用。

VSCode安装CLang支持浏览以及编写C语言程序。(目测微软官方的C/C++插件也可以)

整个流程:首先安装CLang,如何编译内核,编译内核的同时生成compile_commands.json给CLang索引。

首先建立工作区,将Linux内核和驱动程序文件包含在工作区内,进行编译。

————————————————————更新————————————————————

2024年5月12日

灰字部分是原稿,目前关于环境变量的问题所在以及解决办法已经整理出来了,完成配置后下面的 ARCH 以及 CROSS_COMPILE 不需再要设置。

Linux环境变量随谈-CSDN博客文章浏览阅读108次。将环境变量写入 /etc/bash.bashrc(全局) 或者 ~/.bashrc(指定用户) 中保证环境变量被加载生效。https://blog.csdn.net/2301_78517819/article/details/138745815

 ——————————————————————————————————————————

出现 "Kernel configuration is invalid." 的错误,是因为该内核文件未指定具体的系统设置。因开发板为100ask-STM32MP157,则找到 内核文件中./arch/arm/configs/100ask_stm32mp157_pro_defconfig 进行设置。

sudo make ARCH=arm 100ask_stm32mp157_pro_defconfig

题外话:怎么知道是这个路径的?因为没有指定ARCH参数时会指向x86,后面的配置基本就错了,然后报错在./arch/x86/configs/中找不到配置文件……

在期间可能会报错 "flex: not found.","bison: not found." 这据说是一些解释器,安装一下。

sudo apt install flex bison

根据手册,下一步开始编译内核。

sudo make ARCH=arm CROSS_COMPILE=/opt/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf- uImage LOADADDR=0xC2000040

在编译内核的同时要生成compile_commands.json,这里使用 bear 生成。高版本 bear 需要在指令前加入 "--"。

sudo apt install bear
sudo bear -- make ARCH=arm CROSS_COMPILE=/opt/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf- uImage LOADADDR=0xC2000040

可能有人问:为什么要加ARCH定环境?为什么CROSS_COMPILE要写这么长一串?

第一个问题,Makefile当中说明了,若在交叉编译的情况下需要指定ARCH否则会像上面一样检测为x86(即当前系统)。

第二个问题,在几次编译当中,都出现先了 "compiler 'arm-buildroot-linux-gnueabihf-gcc' not found" 或者是 "unrecognized argument in option ‘-mabi=aapcs-linux’."  的错误。前者是因为找不到指令,需要像上述语言完全的路径;后者是编译器使用了非交叉编译的编译器,需要加入CROSS_COMPILE进行指定。倒也不是因为没有设置环境变量的问题,CROSS_COMPILE以及PATH都设置了,用交叉编译工具还是可以正常运行的,但就是这里的make总是会出错,也是没有办法的办法吧,给有需要的人一个方案,当然也欢迎指正,后续如果排查出问题所在我会及时修改。

查看 compile_commands.json ,把下方 "gcc" 全部 更改为交叉编译工具,不然构建了索引也用不了(有时候生成的就是交叉编译,有时候是gcc,一旦后面文件引用不上就先看这里的问题)

cat compile_commands.json
//下方为在vi中修改指令
:%s/\/[path & gcc compiler]/\/[path & cross compiler]

 

————————————————————更新————————————————————

2024年5月12日

完成环境变量的设置后指令应为:

su
make 100ask_stm32mp157_pro_defconfig
make uImage LOADADDR=0xC2000040
bear -- make uImage LOADADDR=0xC2000040

 同时,compile_commands.json 中的gcc替换为工具链的交叉编译 arm-buildroot-linux-gnueabihf-gcc 即可。

 ——————————————————————————————————————————

最后打开工作区,可以看到左下角正在建立索引。

当进行驱动项目开发时,在工作区中加入文件,并且 "bear -- make" 生成 compile_commands.json 即可。

参考文章​​​​​​​

Windows10 WSL2搭建支持nfs的hi3518开发环境

make menuconfig错误: /bin/sh: 1: flex: not found 和 /bin/sh: 1: bison: not found-CSDN博客

 编译Android源码和Linux内核源码时候遇到的一些错误

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐