1. 从零开始:全志A33平台开发环境搭建的挑战与选择
如果你正在或即将接触全志A33这颗经典的入门级ARM Cortex-A7芯片,无论是为了学习嵌入式Linux,还是为了复活一个老旧的多媒体设备(比如一些早期的平板电脑、广告机、工控屏),搭建一套完整的编译和烧录环境都是绕不开的第一步。这个过程,对于习惯了在Windows下点点鼠标就完成开发的工程师来说,可能会是一个不小的挑战。它不像在IDE里按一下“Build”那么简单,更像是在搭建一个精密的手工作坊——你需要准备合适的工具、原料,并遵循一套特定的工艺流程。
网络上关于“编译”、“烧录”的热词层出不穷,从windows中编译ffmpeg到ubuntu22.04编译autoware,从stlinkv2烧录stm32到jflash怎么烧录程序,这恰恰说明了底层开发中这两个核心环节的普遍性和多样性。全志A33的流程,融合了这两类问题的特点:它需要在Linux环境下进行庞大的系统编译,又涉及到通过特定工具将镜像写入NAND或SD卡。很多人卡在第一步,看着满屏的命令行错误无从下手;或者好不容易编译成功,却因为烧录姿势不对,让开发板变成了“砖头”。
这篇内容,就是基于我个人多次搭建全志A33开发环境的实战经验,为你梳理出一条清晰的路径。我会假设你是一个有一定Linux基础,但对嵌入式平台编译体系还不甚熟悉的开发者,目标是带你走通从纯净的Ubuntu系统到最终将自制的系统镜像成功运行在A33板卡上的全过程。我们会避开那些官方文档语焉不详的坑,聚焦于真正影响成功率的细节。你会发现,只要工具链选对、步骤清晰、耐心足够,让A33跑起来自己编译的系统,并没有想象中那么难。
2. 基石:Linux编译宿主机的准备与工具链部署
全志A33的官方SDK以及主流的开源构建系统(如Buildroot),其编译生态都深度依赖于Linux环境。在Windows下通过WSL或虚拟机操作是可行的,但我强烈建议使用一台物理机安装Ubuntu,这能避免大量因文件系统、权限、路径带来的诡异问题。虚拟机方案在编译大型系统时,性能损耗和磁盘I/O可能会让你等得怀疑人生。
2.1 操作系统与基础软件包安装
我推荐使用Ubuntu 18.04 LTS或Ubuntu 20.04 LTS。这两个版本在软件包新旧程度和稳定性上取得了很好的平衡,对全志老版本SDK的兼容性最好。更老的版本可能缺少新工具,而像Ubuntu 22.04这样的新版,其自带的软件包(如python3的默认版本、make版本)有时会与SDK中古老的脚本发生冲突,导致需要额外的适配工作,徒增复杂度。
系统安装完成后,第一件事就是更新软件源并安装一系列必需的开发工具。这些工具是编译工作的“螺丝刀和扳手”。
sudo apt-get update sudo apt-get upgrade -y # 安装编译所需的核心工具 sudo apt-get install -y build-essential git-core gitk git-gui subversion sudo apt-get install -y libc6:i386 libstdc++6:i386 lib32z1 lib32ncurses5-dev sudo apt-get install -y u-boot-tools device-tree-compiler mtools sudo apt-get install -y python python2.7 python-dev python-pip sudo apt-get install -y bc lzop zip unzip dosfstools # 对于图形化配置界面(如Buildroot的menuconfig),需要ncurses库 sudo apt-get install -y libncurses5-dev这里有几个关键点需要解释:
build-essential: 包含了gcc,g++,make等最基础的编译工具链。没有它,什么都编不了。libc6:i386等i386库: 全志官方提供的交叉编译工具链(尤其是较老的版本)很多是32位的,在64位的Ubuntu系统上运行,必须安装这些32位兼容库。这是新手最容易忽略的一步,错误提示通常是“找不到文件”或“无法执行二进制文件”,其根源就在这里。u-boot-tools和device-tree-compiler: 前者用于处理U-Boot引导程序相关的镜像(如mkimage命令),后者用于编译设备树源文件(.dts)为二进制文件(.dtb)。设备树是现代Linux内核描述硬件资源的核心机制,A33平台必须用到。python2.7: 尽管Python 2已停止维护,但很多老旧的构建脚本(包括全志的一些工具)仍然强依赖Python 2。同时安装python(系统默认可能是Python 3)和python2.7,并通过update-alternatives或直接在脚本头指定#!/usr/bin/python2.7来确保兼容性。
2.2 获取交叉编译工具链
工具链是编译工作的“翻译官”,它运行在你的x86电脑上,但生成的是ARM架构的机器码。全志A33是ARM Cortex-A7核心,属于armv7架构。你有两个主要选择:
- 使用SDK自带工具链:如果你使用的是全志官方的Tina SDK(这是为Allwinner平台定制的构建系统),它通常会自带一个预编译好的工具链,路径类似
lichee/out/...或prebuilt/...。这种方式最省心,SDK环境脚本(如source build/envsetup.sh)会自动设置好路径。 - 使用Linaro或ARM官方工具链:如果你使用更通用的构建系统如Buildroot或Yocto,或者想自己从零编译U-Boot和Kernel,推荐使用Linaro GCC。例如,针对
arm-linux-gnueabihf(带硬件浮点单元)的版本。
这里以手动安装Linaro GCC为例,展示如何部署一个独立的工具链:
# 创建一个专门的目录存放工具链 mkdir -p ~/toolchains cd ~/toolchains # 下载 Linaro GCC 7.5.0 (一个比较稳定且兼容性好的版本,适用于A7) 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 # 解压 tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz # 将工具链路径加入系统环境变量,方便调用 echo 'export PATH=$PATH:~/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc source ~/.bashrc # 验证安装 arm-linux-gnueabihf-gcc --version如果看到输出GCC的版本信息,说明工具链安装成功。后续在编译时,通常需要通过CROSS_COMPILE环境变量来指定前缀,例如make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-。
注意:工具链的版本并非越新越好。内核、U-Boot和根文件系统对GCC版本都有一定的要求。如果遇到奇怪的编译错误,比如“internal compiler error”,可以尝试更换一个稍旧或稍新的工具链版本。对于全志A33,GCC 4.x到7.x的版本都是常见的选择范围。
3. 源码获取与构建系统解析:Tina SDK vs Buildroot
有了环境,接下来就需要“图纸”和“原材料”——也就是系统源码。对于全志A33,主流有两种构建方式:使用全志官方的Tina SDK,或者使用开源的Buildroot。两者各有优劣,选择哪一种取决于你的目标和精力。
3.1 全志Tina SDK:原厂一站式方案
Tina是全志为其芯片定制的嵌入式Linux开发平台,它整合了U-Boot、Linux Kernel、驱动、中间件和构建系统。对于A33这种老芯片,你可能需要寻找历史版本的Tina SDK(例如Tina2.0/3.0)。获取方式通常来自原厂或开发板供应商。
Tina SDK的典型目录结构如下:
tina-sdk/ ├── build/ # 构建系统核心脚本 ├── config/ # 板级配置 ├── kernel/ # Linux内核源码 (可能是链接) ├── boot/ # U-Boot源码 ├── target/ # 目标板配置、根文件系统生成规则 ├── package/ # 软件包定义(应用、库) ├── prebuilt/ # 预编译的工具链、内核等 ├── out/ # 编译输出目录 └── scripts/ # 工具脚本使用Tina SDK编译的基本流程:
# 1. 进入SDK根目录,设置环境 source build/envsetup.sh # 2. 选择目标板配置,例如 `lunch` 命令后选择对应A33的选项,或者直接 make menuconfig # 进入图形化配置界面进行内核、驱动、软件包的选择 # 3. 开始编译(-jN参数指定并行编译线程数,加快速度) make -j8 # 4. 编译完成后,镜像文件通常在 out/xxx/ 目录下Tina SDK的优缺点:
- 优点:驱动支持最全,与硬件匹配度最高,特别是显示、视频解码等多媒体功能。构建流程封装好,命令简单。
- 缺点:系统相对封闭,定制化需要深入理解其目录结构和打包规则。源码获取可能受限,且版本管理可能比较混乱。
3.2 Buildroot:高度灵活的开源方案
Buildroot是一个通过交叉编译生成完整嵌入式Linux系统的框架。它通过Kconfig(和Linux内核一样的配置系统)让你可以极其精细地控制要编译进系统的每一个组件,从工具链、内核、到根文件系统里的每一个软件包。
使用Buildroot为A33构建系统的流程:
- 获取Buildroot:从官网下载稳定版本,如
buildroot-2022.02.tar.gz。 - 配置:
在配置界面中,你需要关键设置:tar -xf buildroot-2022.02.tar.gz cd buildroot-2022.02 make menuconfig- Target Architecture->
ARM (little endian) - Target Architecture Variant->
cortex-A7 - Toolchain-> 选择使用外部自定义工具链(External toolchain),并指向你之前安装的Linaro GCC路径。
- Kernel-> 选择使用自定义内核(Custom kernel),并指定你准备好的Linux内核源码目录(需要事先下载好A33适配的内核,例如从全志的GitHub仓库)。
- Target packages-> 在这里选择你需要的应用软件,如BusyBox、Dropbear(SSH)、Qt5等。
- Target Architecture->
- 编译:
make -j8。Buildroot会自动下载选中的软件包源码、应用补丁、配置、编译并打包成根文件系统。
Buildroot的优缺点:
- 优点:极度灵活和透明,你可以完全掌控从工具链到应用的每一个环节。版本清晰,社区活跃,易于定制和复现。
- 缺点:需要自行适配内核和引导程序(U-Boot),对硬件驱动的支持需要自己整合或打补丁,入门门槛稍高。
个人经验选择:如果你是初学者,或者项目要求快速利用A33的多媒体功能,建议从Tina SDK入手,先跑通整个流程。如果你希望深入学习嵌入式Linux构建体系,或者需要高度定制的精简系统,Buildroot是更好的选择。我个人的许多A33项目后期都转向了Buildroot,因为它带来的可控性优势在长期维护中非常明显。
4. 核心组件编译详解:U-Boot、Kernel与根文件系统
无论选择Tina还是Buildroot,其内部都在处理三个核心组件的编译:引导程序(U-Boot)、Linux内核(Kernel)和根文件系统(Rootfs)。理解它们各自的编译过程和产出,对后续的烧录和排错至关重要。
4.1 U-Boot的编译与配置
U-Boot是系统上电后运行的第一段裸机程序,负责初始化最基础的硬件(如DRAM、时钟)、加载设备树、并从存储设备(SD卡、NAND)中加载Linux内核镜像到内存,最后跳转到内核执行。
独立编译U-Boot(以使用Linaro工具链为例):
# 1. 获取U-Boot源码(建议使用全志适配的分支) git clone https://github.com/allwinner-zh/u-boot.git -b sunxi-v2018.01 cd u-boot # 2. 配置为A33平台,具体配置名需查阅板级支持。常见的有 `orangepi_pc_plus_defconfig`(对于某些A33板) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_pc_plus_defconfig # 3. 如果需要微调配置,如串口、启动参数 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # 4. 编译 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8编译成功后,会生成几个关键文件:
u-boot-sunxi-with-spl.bin:这是最重要的文件。它结合了SPL(Secondary Program Loader,用于初始化DRAM等)和主U-Boot,是直接烧录到存储设备启动区域(如SD卡前8KB或NAND特定偏移)的镜像。u-boot.bin: 纯主U-Boot镜像。u-boot.img: 带有U-Boot头部信息的镜像。
踩坑点:全志A33的U-Boot通常需要SPL。务必使用
u-boot-sunxi-with-spl.bin进行烧录,而不是u-boot.bin。烧录错误的文件会导致板子毫无反应。
4.2 Linux内核的编译与设备树
内核是系统的核心,管理硬件资源、进程调度和文件系统。A33的内核版本可能是3.x或4.x,需要包含全志的特定驱动(称为“sunxi”系列驱动)。
独立编译Linux内核:
# 1. 获取内核源码(例如全志维护的linux-4.9.y分支) git clone https://github.com/allwinner-zh/linux.git -b sunxi-4.9.y cd linux # 2. 导入默认配置 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sunxi_defconfig # 3. 进行详细配置(驱动、文件系统支持等) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # 4. 编译内核镜像和设备树 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs -j8 # 5. 编译内核模块 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j8 # 6. 安装模块到指定目录(后续打包进根文件系统) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/path/to/your/rootfs modules_install关键产出文件:
arch/arm/boot/zImage: 压缩的内核镜像文件。arch/arm/boot/dts/sun8i-a33-xxx.dtb: 设备树二进制文件。这是另一个关键点。A33的设备树文件可能是sun8i-a33-sinlinx-sina33.dtb或sun8i-a33-xxx.dtb,具体名称取决于你的具体板型。你需要确认你的开发板对应哪个.dts文件,并编译出正确的.dtb。U-Boot在启动时会根据板子信息加载对应的.dtb文件,告诉内核硬件是如何连接的。
4.3 根文件系统的构建与打包
根文件系统包含了系统运行所需的所有目录结构、配置文件、系统工具(如ls,cp)和用户应用程序。Tina SDK和Buildroot最终都会生成一个根文件系统镜像。
常见的根文件系统格式有:
ext4格式镜像:可以直接写入到SD卡或eMMC的某个分区,作为可读写的根文件系统。squashfs只读镜像 +overlay:在Tina SDK中常见。squashfs是高度压缩的只读文件系统,节省空间;overlay(通常用ubifs或ext4)用于存储运行时的改动。这种组合在需要恢复出厂设置或防止系统文件被篡改的场景下很有用。initramfs(cpio归档):一个被链接到内核中的小型临时根文件系统,常用于系统初始化早期或恢复模式。
在Tina SDK中,执行make后,最终的固件包(如tina_a33_xxx.img)通常已经包含了U-Boot、内核和根文件系统。而在Buildroot中,output/images/目录下会分别生成zImage、sun8i-a33-xxx.dtb和rootfs.ext4等文件,需要你手动组合烧录。
5. 烧录实战:多种方式将系统写入A33设备
编译产出最终要落地到硬件上。全志A33芯片通常支持从SD卡和SPI NAND Flash启动。烧录方式也据此分为SD卡烧录和直接烧录到NAND。
5.1 SD卡烧录:最安全便捷的开发方式
对于开发阶段,强烈推荐使用SD卡启动。这相当于把SD卡变成你的“硬盘”,刷写和更换系统极其方便,完全不用担心把板载存储刷坏(变砖)。
步骤:
- 准备SD卡:使用读卡器将一张SD卡(建议8GB或以上,Class10速度)插入电脑。
- 识别设备:在Linux下,使用
lsblk或sudo fdisk -l命令查看SD卡对应的设备节点,通常是/dev/sdX(如/dev/sdb)。请务必确认无误,否则可能格式化你的电脑硬盘! - 使用专用工具烧录:
- 对于Tina SDK生成的
.img文件:可以使用Linux的dd命令,但更推荐使用全志的phoenixcard工具(有Windows和Linux版本)。phoenixcard不仅能写入数据,还会在卡上创建特定的引导信息,这对于全志芯片的SD卡启动是必须的。
# 假设固件是 tina_a33_v1.0.img, SD卡是 /dev/sdb # 使用dd命令(有一定风险,需确保of参数绝对正确) sudo dd if=tina_a33_v1.0.img of=/dev/sdb bs=1M status=progress sync # 确保数据完全写入- 对于Buildroot产出的分散文件:你需要手动对SD卡进行分区。通常分为两个区:
- 第一个分区(FAT32格式,约16-64MB):存放内核镜像(
zImage)、设备树(.dtb)、可能的启动脚本(boot.scr)。 - 第二个分区(ext4格式,占用剩余空间):存放根文件系统(
rootfs.ext4)。 然后分别将文件复制进去:
- 第一个分区(FAT32格式,约16-64MB):存放内核镜像(
# 假设SD卡分区后,第一分区挂载在 /media/user/BOOT,第二分区挂载在 /media/user/ROOTFS cp zImage sun8i-a33-xxx.dtb /media/user/BOOT/ sudo tar -xf rootfs.tar -C /media/user/ROOTFS/ # 如果是tar包 # 或者直接写入ext4镜像到第二分区 sudo dd if=rootfs.ext4 of=/dev/sdb2 bs=1M status=progress sync - 对于Tina SDK生成的
- 设置启动模式:将A33开发板的启动跳线帽设置为从SD卡启动(具体方式查阅板子手册),插入SD卡,上电。
5.2 NAND Flash烧录:量产与最终部署
当系统调试稳定后,需要烧录到板载的SPI NAND Flash中。这需要使用全志的官方烧录工具PhoenixSuit(Windows)或LiveSuit(Linux)。烧录过程通常需要让芯片进入FEL模式。
FEL模式进入方法:A33芯片有一个特殊的引脚(通常标为FEL或UBOOT)。在板子断电状态下,用跳线帽短接该引脚到地(GND),或者按住板载的FEL按钮不放,然后给板子上电,此时芯片会进入USB烧录模式。在电脑的设备管理器中会识别到一个“USB FEL”或“Allwinner”设备。
使用PhoenixSuit烧录:
- 在Windows电脑上安装PhoenixSuit驱动和软件。
- 让A33板子进入FEL模式,并通过USB线连接电脑。
- 打开PhoenixSuit,选择“固件”->“映像文件”,加载你编译好的
.img文件(Tina SDK产出)。 - 点击“升级”或“立即烧录”,软件会擦除NAND并写入新系统。
- 烧录完成后,断开USB,拔掉FEL跳线,正常上电启动。
烧录失败排查:
- 驱动问题:确保FEL模式驱动安装正确。在Linux下可能需要手动加载
sunxi-fel工具。- 镜像格式:确保烧录的是包含完整分区表的
.img文件,而不是单独的zImage或rootfs。- 存储类型:确认你的
.img文件是针对SPI NAND编译的,而不是针对SD卡。两者的分区表和引导参数可能不同。- 供电不足:烧录时确保板子供电稳定,尤其是通过USB供电时,最好使用外部电源。
6. 上电调试与串口信息捕获
系统烧录完成后,第一次上电是关键时刻。最可靠的调试手段就是串口控制台。全志A33的UART0(通常是板子上标有RX/TX/GND的三针接口)在U-Boot和内核启动初期就会输出大量信息。
你需要准备一个USB转TTL串口模块(如CH340、CP2102等):
- 将模块的
GND、TX、RX分别连接到板子的GND、RX、TX。注意:TX接RX,RX接TX,交叉连接。 - 在电脑上使用串口终端软件,如
minicom(Linux)、PuTTY或MobaXterm(Windows)。 - 设置正确的串口端口(如
COM3或/dev/ttyUSB0)、波特率(全志平台通常是115200)、数据位8、停止位1、无校验位、无流控。 - 给板子上电,观察终端输出。
正常的启动日志会依次显示:
- U-Boot SPL:初始化DRAM的简短信息。
- 主U-Boot:版本信息、驱动初始化、尝试从哪个设备启动、加载设备树和内核。
- Linux内核:内核解压、初始化CPU、内存、设备树、加载驱动、挂载根文件系统。
- 用户空间:执行
init进程(通常是/sbin/init),启动系统服务,最后出现登录提示符(如root@sun8i:~#)。
常见启动失败问题:
- 无任何输出:检查串口连接、波特率、电源。确认U-Boot镜像是否正确烧录。
- U-Boot启动后卡住:检查
bootcmd环境变量是否正确设置了启动设备(mmc或nand)和加载地址。检查内核镜像(zImage)和设备树(.dtb)文件是否存在、是否损坏。 - 内核panic,无法挂载根文件系统:这是最常见的问题。内核日志会提示类似“VFS: Unable to mount root fs”。原因包括:
- 根文件系统路径不对:检查U-Boot的
bootargs环境变量中的root=参数,例如root=/dev/mmcblk0p2(SD卡第二分区)或root=/dev/nandb(NAND第二个分区)。 - 根文件系统格式不对:
rootfstype=参数是否指定正确(如ext4,squashfs)。 - 根文件系统内容损坏:重新制作或烧录根文件系统镜像。
- 缺少对应的驱动:例如内核没有启用
EXT4文件系统支持,或者没有对应的NAND驱动。
- 根文件系统路径不对:检查U-Boot的
通过串口,你不仅可以查看日志,还可以在U-Boot阶段打断启动(通常在倒计时时按任意键),进入U-Boot命令行,手动执行printenv查看环境变量、fatload/nand read测试加载文件、用bootm或bootz命令手动启动内核,这对于调试是无可替代的。
7. 进阶:系统定制与常见问题排查
当基础系统跑通后,你可能会需要定制功能,比如增加Wi-Fi驱动、调整屏幕分辨率、移植某个特定的应用程序。这个过程会伴随各种编译和运行时的挑战。
7.1 内核驱动的添加与配置
假设你需要为A33板载的AP6212 Wi-Fi模块添加驱动。
- 确定驱动类型:AP6212是博通的SDIO接口Wi-Fi芯片,内核中可能有
brcmfmac驱动支持。 - 内核配置:在内核源码目录执行
make menuconfig。- 定位到
Device Drivers -> Network device support -> Wireless LAN。 - 选中
Broadcom devices和Broadcom FullMAC wireless cards (brcmfmac) support。 - 同时确保依赖项被选中,如
CFG80211(无线配置API)、MAC80211(软件MAC层)、MMC/SDIO支持。
- 定位到
- 设备树配置:驱动需要知道硬件连接信息。编辑你的板级设备树文件(如
sun8i-a33-xxx.dts),在sdio节点下添加或确认Wi-Fi模块的描述:
这里的&mmc1 { // SDIO控制器 pinctrl-names = "default"; pinctrl-0 = <&mmc1_pins_a>; vmmc-supply = <®_vcc3v3>; bus-width = <4>; non-removable; status = "okay"; brcmf: wifi@1 { reg = <1>; compatible = "brcm,bcm4329-fmac"; interrupt-parent = <&pio>; interrupts = <6 10 IRQ_TYPE_LEVEL_LOW>; /* PG10 */ interrupt-names = "host-wake"; }; };interrupts引脚定义需要根据你的实际板子原理图来修改。 - 重新编译内核和设备树:
make zImage dtbs。 - 提供固件:博通芯片需要额外的固件文件(
.bin或.txt)。你需要将对应的固件文件(如brcmfmac4329-sdio.bin)放入根文件系统的/lib/firmware/brcm/目录下。 - 测试:烧录新内核和设备树,启动后使用
ifconfig -a查看是否出现wlan0接口,并用iwconfig等工具进行配置。
7.2 构建失败与依赖问题解决
编译过程中,尤其是Buildroot或Tina SDK在下载、编译第三方软件包时,很容易因网络或依赖问题失败。
- 下载失败:构建系统会尝试从上游服务器下载软件包源码。国内网络环境可能导致连接超时。解决方法:
- 使用代理(需自行配置)。
- 更有效的方法:手动下载缺失的源码包。构建系统通常会在
dl/目录下寻找缓存。你可以根据编译错误提示的URL,用浏览器或wget手动下载对应的tar.gz或git仓库,放到dl/目录下,然后重新编译。
- 编译错误:例如提示“
error: unknown type name ‘xxx’”或“function declared implicitly”。这通常是头文件路径问题或依赖库缺失。- 检查该软件包的编译配置(
.mk文件或Config.in),看是否正确地指定了依赖的其他库。 - 在Buildroot的
make menuconfig中,确保依赖库已经被选中编译。例如,一个软件依赖libcurl,那么libcurl必须被选入Target packages。 - 有时需要手动为软件包打补丁来适配特定的工具链或内核版本。补丁文件通常放在软件包目录的
patches/子目录下。
- 检查该软件包的编译配置(
7.3 根文件系统空间优化
嵌入式设备存储空间有限,需要对根文件系统进行“瘦身”。
- 使用Buildroot的尺寸分析:
make graph-size可以生成一个饼图,直观显示各个软件包占用的空间,帮你决定裁剪哪个。 - 裁剪BusyBox:BusyBox是嵌入式系统的瑞士军刀,它集成了上百个常用命令。通过
make busybox-menuconfig可以精细地禁用你不需要的命令,能节省不少空间。 - 移除调试符号和文档:在Buildroot配置中,开启
Strip target binaries和Remove documentation and development files选项。 - 选择更小的C库:用
uclibc-ng或musl替代默认的glibc,可以显著减少库文件大小,但需要注意软件兼容性。 - 使用squashfs:如前所述,将系统核心部分做成只读的
squashfs,能获得极高的压缩率。
整个全志A33的系统搭建、编译和烧录,是一个典型的嵌入式Linux开发流程的缩影。从工具链准备到构建系统选择,从核心组件编译到镜像烧录调试,每一步都充满了细节和“坑”。我的经验是,保持耐心,善用串口日志,理解每一步命令背后的意图,遇到问题先搜索错误关键词(结合“全志A33”、“sunxi”等),大部分难题都能在社区或开源项目中找到线索。当你第一次看到自己编译的系统在小小的A33板子上成功启动,并运行起自己编写的程序时,那种成就感会让人觉得所有的折腾都是值得的。这个平台作为学习入门和进行中小型嵌入式产品开发,依然具有很高的性价比和实用性。