第一章:开发环境搭建

做嵌入式Linux开发,第一步就是把“家伙事儿”备齐。我见过不少新手,上来就啃代码,结果编译报错半天找不到原因——最后发现是环境没配好。这章咱们就把虚拟机、交叉编译链、TFTP/NFS这些基础环境一一搞定。

1.1 安装Ubuntu虚拟机

为什么非得用虚拟机?说白了,嵌入式开发离不开Linux环境。你想想看,Windows下虽然也能折腾,但交叉编译、驱动调试这些活儿,还是原生Linux最顺手。

我个人习惯用VMware Workstation,当然VirtualBox也行。这里我建议用Ubuntu 20.04 LTS,稳定,社区活跃,遇到问题好搜解决方案。

安装要点:

  • 内存至少分配4GB,我一般给8GB
  • 硬盘建议80GB以上,别省这点空间
  • 网络选NAT模式,省心

嗯,这里要注意:安装时选“中文简体”没问题,但后面编译时如果遇到乱码,记得把终端编码改成UTF-8。我在项目中遇到过一位同事,折腾了一下午,结果就是编码问题。

1.2 配置交叉编译工具链

交叉编译,说白了就是在PC上编译出能在ARM板子上跑的程序。你PC是x86架构,板子是ARM架构,编译器得“跨”过去。

我常用的工具链是gcc-arm-none-eabi或者arm-linux-gnueabihf。怎么选?看你的目标芯片。比如STM32MP1系列,用arm-linux-gnueabihf就对了。

# 下载工具链
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/gcc-arm-10.3-2021.07-x86_64-arm-linux-gnueabihf.tar.xz

# 解压到指定目录
tar -xvf gcc-arm-10.3-2021.07-x86_64-arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量
export PATH=$PATH:/opt/gcc-arm-10.3-2021.07-x86_64-arm-linux-gnueabihf/bin

避坑指南:我曾经把工具链直接解压在/home下,结果权限问题搞了一上午。建议统一放到/opt目录,然后给普通用户加执行权限。

验证是否安装成功,跑一下这个命令:

arm-linux-gnueabihf-gcc --version

如果看到版本号,恭喜你,第一步走通了。

1.3 搭建TFTP/NFS服务

这两个服务是调试阶段的“生命线”。TFTP用来快速下载内核和设备树,NFS用来挂载根文件系统。你想想看,每次改个驱动都要重新烧写整个系统,那得多崩溃?

1.3.1 安装TFTP服务

sudo apt-get install tftpd-hpa tftp-hpa

配置文件在/etc/default/tftpd-hpa,我一般改成这样:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"

记得创建/tftpboot目录,并给权限:

sudo mkdir /tftpboot
sudo chmod 777 /tftpboot

注意:防火墙要放行UDP 69端口。我在项目中遇到过,TFTP服务明明启动了,板子就是连不上,最后发现是防火墙在捣鬼。

1.3.2 安装NFS服务

sudo apt-get install nfs-kernel-server

编辑/etc/exports文件,添加共享目录:

/nfsroot *(rw,sync,no_root_squash,no_subtree_check)

然后重启服务:

sudo mkdir /nfsroot
sudo chmod 777 /nfsroot
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

为什么用no_root_squash?因为开发阶段需要root权限操作文件系统,省得权限报错。但生产环境千万别这么干,安全第一。

1.4 熟悉基本Linux命令

这部分我快速过一下,因为大部分读者应该都有基础。但有几个命令,做嵌入式开发时几乎天天用:

命令 用途 我的经验
lsmod 查看已加载的驱动模块 调试驱动时第一个命令
insmod/rmmod 加载/卸载驱动模块 配合dmesg看日志
dmesg 查看内核日志 驱动出问题先看它
ifconfig 配置网络接口 板子连不上网?先查它
mount 挂载文件系统 NFS调试必备

举个例子,调试一个LED驱动时,我通常会这样操作:

# 在板子上
insmod led_driver.ko
lsmod | grep led
dmesg | tail -20

# 如果报错,先卸载
rmmod led_driver.ko
dmesg -c  # 清空日志,方便下次查看

小技巧:把常用的命令写成脚本,比如我有个debug.sh,一键加载驱动、挂载NFS、启动应用。省得每次敲一堆命令。

好了,环境搭建这部分就这些。说实话,配环境是最枯燥的,但也是最关键的。我见过太多人卡在这一步,后面学得再好也白搭。下一章咱们开始写第一个驱动——LED驱动,到时候这些环境就派上用场了。

记住:环境配好了,后面就是水到渠成的事。