安装 Linux 主机
尽管 Windows 虚拟机也可以开发 Linux 然而,不推荐这种做法---效率不高,存储文件和联网都有一番周折。
准备 1 台 Linux 开发主机,确定 Linux 发行版本,这是搭建开发环境的第 1 步。
如下图所示,Linux 主机通过【串口】登录 Linux 目标板,通过【以太网】下载 kernel 和挂载 NFS 根文件系统。
小窍门1
推荐使用 Ubuntu 做开发,它比 CentOS 安装软件更方便(后者更适合当服务器)。
小窍门2
固定一个版本(如 Ubuntu 18.04)否则,软件会有兼容问题,这是自由软件的通病。
安装 Ubuntu 18.04
安装交叉工具链和配置环境变量
准备项目工作空间
为每一个项目建立独立的工作空间很重要,它可以提供一个“与 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 PATH=${PREFIX}/bin:${PATH}
小窍门:在任意路径下运行 arm-nuvoton-linux-uclibceabi-gcc -v
如果看到编译器版本,说明配置环境已经生效。
测试工具链
进入目录 cd $PRJROOT/tmp 建立文件 hello.c 它包含如下代码。
#include <stdio.h>
void main(void)
{
printf("hello world\n");
}
执行 arm-nuvoton-linux-uclibceabi-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
执行 arm-nuvoton-linux-uclibceabi-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)
执行 arm-nuvoton-linux-uclibceabi-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 正常工作。