前言

在嵌入式开发中,开发环境的搭建是入门的关键第一步,本文以 FS4412 开发板为例,详细拆解
(1)交叉开发工具链安装
(2)TFTP 文件传输服务配置
(3)NFS 文件共享服务搭建
(4)网络参数设置
(5)开发板网络启动



一、交叉开发工具链

1.工具链文件准备与解压

交叉开发工具链是实现 “在 PC 端编译、开发板端运行” 的核心工具,本文以
gcc-4.6.4.tar.xz为例,先明确不同压缩格式的解压指令差异,再完成工具链解压:

  • 通用解压“格式”:
tar -xvf xxx.tar.*//(需根据压缩格式补充参数)
  • 不同格式对应指令:
    (1)tar.gz格式:tar -zxvf xxx.tar.gz​
    (2)tar.bz2格式:tar -jxvf xxx.tar.bz2​
    (3).tar.xz格式(本文使用):tar -Jxvf gcc-4.6.4.tar.xz

2.PATH 环境变量配置:让系统 “找到” 工具链

(PATH 环境变量的核心作用:记录 Shell 执行命令时的搜索路径,添加工具链路径后,无需输入完整路径即可调用编译指令)
解压完成后,需配置 PATH 环境变量,确保 Shell 能搜索到工具链的可执行文件,
配置方式分 “当前用户生效” 和 “所有用户生效” 两种:

(1)当前用户生效:(修改~/.bashrc)

  • 打开配置文件~/.bashrc:
sudo gedit ~/.bashrc
  • 在配置文件中的末尾添加一下任意一种方式的代码:

方式A:先定义变量,用于后续使用(当然具体的路径需要替换为自己的路径)

TOOL_CHAIN=/home/linux/fs4412/toolchain/gcc-4.6.4/bin ​
export PATH=$PATH:$TOOL_CHAIN

方式B:直接添加路径(当然具体的路径需要替换为自己的路径)

export PATH=$PATH:/home/linux/fs4412/toolchain/gcc-4.6.4/bin
  • 生效配置的命令:
source ~/.bashrc

(2)所有用户生效:(修改/etc/bash.bashrc)

  • 打开配置文件(需管理员权限)
sudo vim /etc/bash.bashrc
  • 添加与方案 1 相同的路径配置代码
  • 生效配置:
source /etc/bash.bashrc

3. 64 位 Ubuntu 的特殊依赖:安装 32 位运行库

若使用 64 位 Ubuntu 系统,需额外安装 32 位运行库,否则工具链可能无法运行:

sudo apt install lib32ncurses5 ​
sudo apt install lib32z1

二、TFTP 服务:

TFTP(简单文件传输协议,开发板与 PC 的 “文件传输桥梁”)适用于嵌入式开发中 “小文件快速传输”(如内核镜像、设备树),需在 Ubuntu 端搭建服务端与客户端,步骤如下:

1.安装 TFTP 相关软件包

(1)先更新软件源,再安装服务端与客户端程序:

# 更新软件源
sudo apt update
# 安装TFTP服务端
sudo apt install tftpd-hpa
# 安装TFTP客户端
sudo apt install tftp-hpa

(2)安装完成后,可通过以下指令验证服务是否存在:

ps -ef | grep tftp

2.配置 TFTP 服务器路径

TFTP 服务需指定一个 “文件传输目录”,所有待传输文件需放在该目录下,配置步骤:
(1)打开 TFTP 配置文件:sudo vim /etc/default/tftpd-hpa
(2)修改TFTP_DIRECTORY字段(替换为自己的目录,建议放在开发板工作目录下):

TFTP_DIRECTORY="/home/linux/fs4412/tftpboot"

3.重启 TFTP 服务

配置完成后,需重启服务使设置生效,两种重启方式任选:

# 方式1
sudo /etc/init.d/tftpd-hpa restart  
# 方式2
sudo service tftpd-hpa restart

4.测试TFTP是否配置成功

通过本地连接测试服务是否正常,确保后续开发板能正常传输文件:
(1)进入 TFTP 客户端交互模式:tftp 127.0.0.1(127.0.0.1 为本地回环地址)
(2)传输测试:在TFTP_DIRECTORY目录下放一个测试文件(如test.txt),执行get test.txt,若能成功下载则服务正常
(3)退出客户端:quit

三、NFS 服务:

NFS(网络文件系统,开发板与 PC 的 “文件共享仓库”)可实现 “开发板挂载 PC 端目录”,适用于文件系统共享(如开发板直接使用 PC 端的根文件系统),避免频繁传输大文件,配置步骤如下:
(1)安装 NFS 服务端软件:
NFS 依赖nfs-kernel-server包,安装指令:

# 更新软件源(若之前已更新可跳过)
sudo apt update 
# 安装NFS服务端
sudo apt install nfs-kernel-server

(2)配置 NFS 共享目录:

  • 打开 NFS 配置文件:sudo gedit /etc/exports
  • 末尾添加共享规则(需要替换为自己的路径)
/home/linux/fs4412/rootfs *(rw,sync,no_root_squash)

注释:规则说明:

·  /home/linux/fs4412/rootfs:待共享的 PC 端目录(需替换为实际路径)​
·  *:允许所有 IP 访问(开发环境中简化配置,生产环境需指定 IP 段)​
·  rw:读写权限​
·  sync:同步写入(确保数据实时同步)​
·  no_root_squash:开发板 root 用户访问时保留 root 权限(避免权限问题)

(3)重启NFS服务

# 方式1
sudo /etc/init.d/nfs-kernel-server restart
# 方式2
sudo service nfs-kernel-server restart

四、网络设置

嵌入式开发中,PC(虚拟机)与开发板需在同一局域网,才能实现 TFTP 传输、NFS 挂载及调试,需分别配置虚拟机和开发板的网络参数。

1.虚拟机网络配置(Ubuntu系统)
(1)设置网络设配器为桥接模式
打开 VMware(或其他虚拟机软件),选中目标虚拟机,点击 “编辑虚拟机设置”,在 “硬件” 选项卡中,选择 “网络适配器”,勾选 “桥接模式”(取消 “NAT 模式” 和 “仅主机模式”)。

(2)配置桥接网卡
进入虚拟机的 “虚拟网络编辑器”,选择 “桥接模式”,在 “已桥接至” 下拉框中,选择 PC 当前使用的网卡(如有线网卡 “Realtek PCIe GbE Family Controller”,避免选择无线网卡,无线可能导致不稳定)

(3)设置虚拟机静态IP
为避免 IP 动态变化影响通信,建议给虚拟机配置静态 IP(需与后续开发板 IP 在同一网段,如192.168.1.x):

# 以网卡ens33为例(可通过ifconfig查看实际网卡名)
sudo ifconfig ens33 192.168.1.100

2.开发板网络配置(U-boot模式下)
开发板需在 U-Boot 模式下配置 IP 参数,U-Boot 是嵌入式系统的引导程序,可通过串口工具(如 SecureCRT、Putty)连接开发板并操作。
(1) 进入 U-Boot 交互模式

  • 连接开发板电源与串口线,通过串口工具打开对应的串口(波特率通常为 115200)
  • 重启开发板,在串口打印信息中按任意键(如空格、回车),进入 U-Boot 交互模式

(2)配置开发板IP参数

  • 查看当前环境变量(确认已有参数):print
  • 设置开发板 IP(ipaddr):setenv ipaddr 192.168.1.200(如192.168.1.200,与虚拟机192.168.1.100同一网段)
  • 设置 TFTP/NFS 服务端 IP(即虚拟机 IP,serverip):setenv serverip 192.168.1.100
  • 保存参数(避免重启后丢失):save
  • 测试网络连通性:ping 192.168.1.100(ping 虚拟机 IP),若显示 “alive” 则网络正常

五、通过网络的方式启动开发板

配置好工具链、TFTP/NFS服务,及网络之后,即可通过网络启动开发板,实现内核,设备树,及文件系统的加载。网络启动开发板分为两种方式:

1.TFTP 加载所有文件(内核、设备树、文件系统)
通过 TFTP 将所有文件下载到开发板内存,再通过bootm指令启动系统,步骤:
(1)进入 U-Boot 模式,查看当前网络参数(确认ipaddr和serverip正确):print
(2)下载内核镜像到内存地址41000000:tftp 41000000 uImage
(3)下载设备树文件到内存地址42000000:tftp 42000000 exynos4412-fs4412.dtb
(4)下载 ramdisk 镜像到内存地址43000000:tftp 43000000 ramdisk.img
(5)执行启动指令:bootm 41000000 43000000 42000000(指令说明:bootm 内核地址 ramdisk地址 设备树地址)

2.TFTP 加载内核 + 设备树,NFS 挂载文件系统
若 ramdisk 文件较大或需实时修改文件系统,建议用 NFS 挂载 PC 端的根文件系统,步骤:
(1)配置 U-Boot 自动执行命令(bootcmd):

setenv bootcmd "tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000"

说明:bootm第二个参数用 “-” 代替,意为 “不使用 ramdisk,从其他方式加载文件系统”
(2)配置文件系统挂载参数(bootargs):

setenv bootargs "root=/dev/nfs nfsroot=192.168.1.100:/home/hqyj/qudong_study/rootfs,v3 rw console=ttySAC2,115200 ip=192.168.1.199"

参数说明:

·nfsroot=192.168.1.100:/home/linux/fs4412/rootfs,v3:NFS 服务端 IP(虚拟机)及共享目录,v3为 NFS 版本​
·root=/dev/nfs:指定根文件系统类型为 NFS​
·rw:文件系统读写权限​
·console=ttySAC2,115200:指定串口控制台(FS4412 通常为ttySAC2,波特率 115200)​
·ip=192.168.1.200:开发板 IP(与serverip同一网段)

(3)保存参数并启动:

# 保存参数
save
# 执行启动命令(或等待U-Boot倒计时自动执行)
run bootcmd

3.关键 U-Boot 指令说明
U-Boot指令

六、为什么要配置上述这几个环境

1.为什么要配置交叉工具链

(1)因为系统移植需要用到的所有文件都需要编译为ARM架构,我们使用的Linux环境时虚拟机下的,虚拟机自带工具链都不是ARM架构,而是X86机构。
(2)为什么交叉工具链需要配置环境变量?
通俗的说,是为了在使用命令时能够像在中断中使用ls,cd等命令,直接使用,不加路径。
(3)为什么环境变量的配置要写在.bashrc中?
因为 .bashrc 文件是一个全局配置文件,它能让环境变量长时间生效。

2.为什么要配置TFTP服务器

(1)因为系统移植流程中需要让板子从虚拟机获取对应的启动文件,这些文件比较大,如果用串口发送,速度较慢;而TFTP走的是网络传输,速度较快。
(2)我们通过TFTP传输的是内核和设备树,处于未封包状态,使用TFTP能够相对较为便利的修改这个文件。

3.为什么要配置nfs服务器

(1)因为板子要用到的文件系统,处于未封包状态,使用TFTP能相对较为便利的修改这个文件系统(即板子用到的rootfs会经常进行实时修改)。
(2)使用nfs去挂载文件系统,能够实现 类似于“虚拟机中Linux和windows共享文件”的那种效果。这样就可以通过修改 经过nfs挂载 的虚拟机中的文件夹,来间接修改开发板的文件系统。

4.为什么开发板上要配置bootargs参数

因为板子上的文件系统是走nfs挂载上去的。这个文件系统依赖于虚拟机的网络、nfs服务器、以虚拟机上用于共享的rootfs文件夹。

4.未什么开发板上要配置bootcmd参数

(1)因为板子的启动可以依赖该参数指定好的命令,不用一个一个的敲命令来获取对应的文件
(2)而且在开发板所有镜像文件制作完毕,成功封包后,需要让设备从emmc(类似于电脑的硬盘)中获取镜像文件进行启动。

Logo

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

更多推荐