嵌入式 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 正常工作。

posted @ 2022-09-22 13:29  KevinAshton  阅读(302)  评论(0编辑  收藏  举报