嵌入式 Linux 开发 3:搭建开发环境
安装 Linux 主机
尽管 Windows 虚拟机也可以开发 Linux 然而,不推荐这种做法---效率不高,存储文件和联网都有一番周折。
准备 1 台 Linux 开发主机,确定 Linux 发行版本,这是搭建开发环境的第 1 步。
如下图所示,Linux 主机通过【串口】登录 Linux 目标板,通过【以太网】下载 kernel 和挂载 NFS 根文件系统。
小窍门1
推荐使用 Ubuntu 做开发,它比 CentOS 安装软件更方便(后者更适合当服务器)。
小窍门2
固定一个版本(如 Ubuntu 18.04)否则,软件会有兼容问题,这是自由软件的通病。
安装 Ubuntu 18.04 请链接:安装 CentOS Ubuntu
安装交叉工具链和配置环境变量
准备项目工作空间
为每一个项目建立独立的工作空间很重要,它可以提供一个“与 Linux 开发主机隔绝”受控制的开发环境。
下面的 Shell 语句会在当前用户 home 下建立一个项目空间。
PROJECT=~/nuc980_sx130x
for DIR in bootldr build-tools debug doc images kernel project rootfs sysapps tmp tools
do
mkdir -p $PROJECT/$DIR
done
其中各目录的定义如下
目录 | 内容 |
---|---|
bootldr | 引导加载程序 |
build-tools | 交叉工具链的软件包 |
debug | 调试工具 |
doc | 项目文件 |
images | bootloader, kernel 和 rootfs 镜像 |
kernel | Linux 内核源代码 |
project | 项目配置文件 |
rootfs | 根文件系统 |
sysapps | 系统应用程序 |
tmp | 实验或临时文件 |
tools | 开发工具链和 C 程序库 |
安装交叉工具链
用户友好的 CPU 厂商会提供交叉工具链,一般只需要将它解压在“合适”的目录下。
cd $PROJECT/build-tools # 进入 build-tools
cp -vf /mnt/arm_linux_4.8.tar.gz ./ # (挂载 U 盘到 mnt)复制交叉工具链
tar -zxvf ./arm_linux_4.8.tar.gz -C ../tools/ # 解压交叉工具链
小心坑:如果 CPU 厂商没有提供交叉工具链,这是一个危险的信号---项目开发时间难以掌控。
尽管有 crosstool 可以编译生成交叉工具链,然而,除了编译代价大,还会引入难以估量的工具依赖问题。
配置环境变量
建立文件 ~/nuc980_sx130x.env 它包含如下环境变量。登录 Linux 主机,执行 source ~/nuc980_sx130x.env
完成配置。
export PROJECT=nuc980_sx130x
export PRJROOT=~/${PROJECT}
export TARGET=arm-nuvoton-linux
export HOST=i686-cross-linux-gnu
export PREFIX=${PRJROOT}/tools/arm_linux_4.8
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=${PREFIX}/bin:${PATH}
export CROSS=arm-nuvoton-linux-uclibceabi
小窍门:在任意路径下运行 ${CROSS}-gcc -v
如果看到编译器版本,说明配置环境已经生效。
测试工具链
进入目录 cd $PRJROOT/tmp 建立文件 hello.c 它包含如下代码。
#include <stdio.h>
void main(void)
{
printf("hello world\n");
}
执行 ${CROSS}-gcc ./hello.c -o hello; file ./hello
编译并查看目标代码
./hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, not stripped
执行 ${CROSS}-ldd ./hello
查看链接库
checking sub-depends for 'not found'
libc.so.0 => not found (0x00000000)
/lib/ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x00000000)
执行 ${CROSS}-cpp -v /dev/null
查看交叉编译器的头文件路径
#include "..." search starts here:
#include <...> search starts here:
搭建 TFTP 下载 Linux 内核镜像
TFTP 是简单文件传输协议,因为开销很小它被用于 Linux 目标板从开发主机下载 Linux 内核镜像。
以下操作基于 Ubuntu 18.04 其他版本 Linux 系统会有差异
- 安装 TFTP 软件
sudo apt-get install -y tftpd-hpa tftp-hpa
- 配置 TFTP 服务器
sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
- 建立 TFTP 工作目录
sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot/
- 启动 TFTP 服务
sudo service tftpd-hpa start
- 测试 TFTP 服务器
date > /tftpboot/test_tftp
tftp 192.168.1.101
tftp> get test_tftp
tftp> q
如果当前目录有 test_tftp 文件且内容正确,说明 TFTP 正常工作。
搭建 NFS 挂载 Linux 根文件系统
NFS 是网络文件系统(Network File System),它常被用于目标板从开发主机挂载 Linux 根文件系统。
这可以很好地提高开发效率,在 Linux 开发主机上编译的程序,目标板能及时地通过 NFS 共享调试。
以下操作基于 Ubuntu 18.04 其他版本 Linux 系统会有差异
- 安装 NFS 软件
sudo apt-get install -y nfs-kernel-server
- 建立 NFS 工作目录
sudo mkdir /nfsroot
sudo chmod -R 777 /nfsroot
sudo chown -R nobody /nfsroot
- 共享 NFS 目录
sudo vi /etc/exports
在配置文件末尾添加下面一行
/nfsroot *(rw,sync,no_root_squash)
- 启动 NFS 服务
sudo /etc/init.d/nfs-kernel-server start
- 测试 NFS 服务器
sudo mount -t nfs 192.168.1.101:/nfsroot /mnt
执行上面的命令,如果在 /mnt 目录查看到 /nfsroot 内容,说明 NFS 正常工作。