2. 开发环境搭建:交叉编译工具链安装、OpenCV for Embedded配置、CMake工程管理、板卡连接与文件传输

好,咱们正式开始动手了。这一章要解决一个核心问题:怎么让PC上写的代码,能在嵌入式板卡上跑起来?

说白了,嵌入式开发就是「交叉编译」——在PC上编译,在板子上运行。我刚开始接触这个时,总觉得很别扭,明明在PC上能直接编译运行,干嘛要绕一圈?后来被现实教育了:板子上的ARM芯片跑不动IDE,更跑不动VS。嗯,这就是现实。

2.1 交叉编译工具链安装

交叉编译工具链,就是一套能在PC上生成ARM机器码的工具。我个人习惯用Linaro提供的GCC工具链,稳定且社区活跃。

核心思路:PC(x86)上编译 → 生成ARM可执行文件 → 传到板子上运行。

2.1.1 下载与解压

我建议直接去Linaro官网下载预编译好的工具链。以ARM Cortex-A7为例,我常用的是gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf

# 下载
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 解压到 /opt 目录
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

小技巧:解压后建议重命名一下目录,比如改成/opt/gcc-arm,方便后续配置。我每次装新环境都会这么干,省得路径太长记不住。

2.1.2 配置环境变量

这一步很关键。你想想看,如果不配环境变量,每次编译都要敲一长串路径,多累啊。

# 编辑 ~/.bashrc
export PATH=$PATH:/opt/gcc-arm/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

# 使配置生效
source ~/.bashrc

验证是否安装成功:

arm-linux-gnueabihf-gcc --version

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

注意:我曾经遇到过一个问题——明明配了环境变量,但新开的终端还是找不到命令。后来发现是忘了把export写到~/.bashrc里,只写在了当前终端。嗯,这种低级错误,犯过一次就不会再犯了。

2.2 OpenCV for Embedded配置

OpenCV在嵌入式板子上编译,说实话,挺折磨人的。我第一次编译OpenCV 3.4.1,在树莓派上跑了整整6个小时。后来学乖了,改用交叉编译。

2.2.1 下载OpenCV源码

git clone https://github.com/opencv/opencv.git -b 3.4.1
git clone https://github.com/opencv/opencv_contrib.git -b 3.4.1

2.2.2 编写交叉编译工具链文件

我个人习惯创建一个toolchain.cmake文件,把交叉编译参数写进去。这样每次CMake时直接引用,省心。

# toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER /opt/gcc-arm/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /opt/gcc-arm/bin/arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH /opt/gcc-arm/arm-linux-gnueabihf)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

2.2.3 配置与编译

mkdir build && cd build

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
      -DCMAKE_INSTALL_PREFIX=/opt/opencv-arm \
      -DWITH_GTK=OFF \
      -DWITH_V4L=ON \
      -DWITH_FFMPEG=OFF \
      -DWITH_TBB=ON \
      -DWITH_OPENMP=ON \
      -DCMAKE_BUILD_TYPE=Release \
      ..

make -j4
make install

避坑指南:我曾经在配置时忘了关WITH_GTK,结果编译到一半报错,说找不到GTK的依赖库。嵌入式板子上一般没有桌面环境,所以GTK、Qt这些图形库统统关掉。V4L(Video for Linux)一定要开,因为摄像头驱动全靠它。

2.3 CMake工程管理

CMake是嵌入式C++项目的标配。我见过有人用Makefile手写,说实话,项目一复杂就乱成一团。CMake的模块化管理,真香。

2.3.1 编写CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MicroscopeEnhance)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置交叉编译工具链
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

# 指定OpenCV路径
set(OpenCV_DIR /opt/opencv-arm/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(microscope_enhance main.cpp)

target_link_libraries(microscope_enhance ${OpenCV_LIBS})

2.3.2 编译与测试

mkdir build && cd build
cmake ..
make

如果一切顺利,你会得到一个ARM架构的可执行文件。用file命令确认一下:

file microscope_enhance
# 输出:ELF 32-bit LSB executable, ARM, version 1 (SYSV)

关键点:看到「ARM」字样,说明交叉编译成功了。如果显示的是「x86-64」,那说明你还在用PC的GCC编译,赶紧检查CMakeLists.txt里的编译器路径。

2.4 板卡连接与文件传输

代码编译好了,怎么传到板子上?我常用的方式有两种:SSH + SCP,或者NFS挂载。

2.4.1 网络连接配置

我建议用静态IP,省得每次重启都要查地址。板卡和PC连同一个路由器,或者直接用网线直连。

板卡端(以Linux系统为例):

# 配置静态IP
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
route add default gw 192.168.1.1

PC端:

ifconfig eth0 192.168.1.101 netmask 255.255.255.0

2.4.2 使用SCP传输文件

SCP最简单,一行命令搞定:

scp microscope_enhance root@192.168.1.100:/home/root/

传完之后,SSH登录板子,运行程序:

ssh root@192.168.1.100
chmod +x microscope_enhance
./microscope_enhance

小技巧:我习惯写一个deploy.sh脚本,把编译、传输、运行三步合在一起。每次改完代码,一键部署,省时省力。

#!/bin/bash
# deploy.sh
scp microscope_enhance root@192.168.1.100:/home/root/
ssh root@192.168.1.100 "./microscope_enhance"

2.4.3 使用NFS挂载(推荐)

如果频繁修改代码,SCP就有点慢了。我更喜欢用NFS,直接把PC上的目录挂载到板子上,改完代码直接运行,不用来回传文件。

PC端(NFS服务器):

# 安装NFS服务器
sudo apt-get install nfs-kernel-server

# 编辑 /etc/exports
/home/user/project 192.168.1.100(rw,sync,no_subtree_check)

# 重启服务
sudo service nfs-kernel-server restart

板卡端(NFS客户端):

mount -t nfs 192.168.1.101:/home/user/project /mnt
cd /mnt
./microscope_enhance

注意:NFS挂载时,板卡和PC必须在同一网段。我曾经因为IP不在一个段,折腾了半天才发现是网络配置的问题。嗯,这种低级错误,说出来都是泪。

2.5 本章小结

这一章的内容,说白了就是三板斧:

  • 交叉编译工具链:让PC生成ARM代码
  • OpenCV交叉编译:把OpenCV库也编译成ARM版本
  • CMake工程管理:规范项目结构,避免手写Makefile的混乱
  • 板卡连接与文件传输:SCP或NFS,把编译好的程序送到板子上

环境搭好了,下一章咱们就开始写真正的图像增强算法了。到时候你会发现,前面这些准备工作,都是值得的。