一、BSP概述与开发环境搭建
1.1 什么是BSP
BSP,全称 Board Support Package,板级支持包。说白了,它就是连接硬件和操作系统的桥梁。
我经常跟团队里的新人说:你把BSP想象成一个翻译官。硬件说「寄存器地址0x1C000000,写0x55AA」,操作系统说「我要点亮LED」。BSP就在中间,把操作系统的指令翻译成硬件能懂的动作。
一个完整的BSP通常包含这几部分:
- Bootloader:引导加载程序,负责初始化硬件、加载内核
- 设备驱动:串口、网卡、I2C、SPI等外设驱动
- 硬件抽象层:屏蔽硬件差异,向上提供统一接口
- 配置文件:设备树、内核配置、分区表等
核心观点:BSP不是操作系统的一部分,它是为特定板卡定制的软件层。换一块板子,BSP就得重写或大幅修改。
1.2 BSP在嵌入式系统中的角色
嵌入式系统分三层:硬件、BSP、应用软件。BSP卡在中间,承上启下。
我做过一个项目,硬件团队换了Flash芯片,应用层代码一行没动,BSP里改了三处——分区表、驱动配置、启动参数。你看,这就是BSP的价值:隔离变化。
BSP的具体职责:
- 硬件初始化:CPU、内存、时钟、外设上电后的第一件事
- 操作系统适配:让Linux内核能在你的板子上跑起来
- 资源管理:中断分配、内存映射、DMA通道
- 调试接口:串口打印、JTAG、网口调试
我的经验:BSP写得好的团队,应用开发基本不用关心硬件细节。BSP写得烂,应用工程师天天来找你问「为什么我的线程跑不起来?」——嗯,这种锅我背过。
1.3 主流芯片架构简介
嵌入式世界里,架构选择决定了你的BSP怎么写。目前主流的有这几家:
| 架构 | 代表厂商 | 典型应用 | BSP特点 |
|---|---|---|---|
| ARM Cortex-A | NXP i.MX、TI AM335x | 工控、网关、HMI | 生态成熟,资料多,BSP相对好做 |
| ARM Cortex-M | STM32、GD32 | 物联网、传感器、电机控制 | 裸机或RTOS,BSP轻量 |
| x86 | Intel Atom、AMD | 边缘计算、工业PC | BIOS/UEFI,BSP更像驱动包 |
| RISC-V | 赛昉、平头哥 | AIoT、开源硬件 | 新兴架构,BSP还在完善中 |
| MIPS | 龙芯、Ingenic | 网络设备、打印机 | 老牌架构,BSP稳定但生态萎缩 |
我个人最常用的是ARM Cortex-A系列。为什么?因为资料全、社区活跃、踩过的坑网上基本都能找到答案。RISC-V我最近也在跟进,但说实话,BSP这块还不够成熟,遇到问题得自己啃手册。
避坑提醒:选架构不能只看性能,要看BSP生态。我曾经在一个项目里选了冷门架构,结果一个网卡驱动调了两周——因为没人做过。从那以后,我选型必先问一句:「BSP谁做?做过没有?」
1.4 Linux开发环境搭建
环境搭建是BSP开发的第一步,也是最容易出问题的一步。我见过太多人卡在环境上,一天过去了,代码一行没写。
1.4.1 交叉编译工具链
交叉编译,就是在PC上编译出能在ARM板子上运行的程序。为什么不能直接在板子上编译?你想想看,板子那点CPU和内存,编译一个内核得等到猴年马月。
安装步骤:
- 下载工具链:推荐Linaro或芯片厂商提供的版本
- 解压到指定目录,比如
/opt/toolchains/ - 配置环境变量
# 以ARM Cortex-A7为例,使用gcc-arm-9.2-2019.12
export PATH=/opt/toolchains/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-none-linux-gnueabihf-
export ARCH=arm
验证是否安装成功:
arm-none-linux-gnueabihf-gcc --version
# 输出类似:arm-none-linux-gnueabihf-gcc (GCC) 9.2.1 20191025
我的习惯:我会在 ~/.bashrc 里写一个函数,每次切换项目时一键设置环境。比如 setenv_imx6ul()、setenv_stm32mp1()。省得每次敲一堆export。
1.4.2 TFTP服务
TFTP,简单文件传输协议。开发阶段用来把内核、设备树从PC传到板子上。为什么不用U盘?因为板子可能没有USB口,或者你懒得来回插拔。
安装配置:
# Ubuntu上安装TFTP服务
sudo apt-get install tftpd-hpa
# 配置文件 /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp" # 文件存放目录
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
重启服务:
sudo systemctl restart tftpd-hpa
板子上怎么用?U-Boot里直接敲:
# 在U-Boot命令行
tftp 0x80800000 zImage
tftp 0x83000000 imx6ul-14x14-evk.dtb
注意:TFTP没有认证和加密,只适合开发环境。我曾经见过有人把TFTP暴露在公网上,结果被塞了一堆垃圾文件。记住,TFTP只在局域网调试用,别开防火墙端口。
1.4.3 NFS服务
NFS,网络文件系统。比TFTP更强大——板子可以直接挂载PC上的目录,像操作本地文件一样。开发阶段,我把根文件系统放在PC上,板子通过网络挂载,改完代码立刻生效,不用反复烧写。
安装配置:
# 安装NFS服务
sudo apt-get install nfs-kernel-server
# 编辑 /etc/exports,添加共享目录
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
# 重启服务
sudo systemctl restart nfs-kernel-server
板子上挂载:
# 在U-Boot设置内核启动参数
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs ip=192.168.1.10'
# 或者进入Linux后手动挂载
mount -t nfs -o nolock 192.168.1.100:/srv/nfs/rootfs /mnt
效率提升:NFS + TFTP组合是我最常用的开发模式。TFTP传内核和设备树,NFS挂载根文件系统。改驱动 -> 编译 -> 重启板子 -> 验证,整个流程不到30秒。
1.5 本章知识体系
下面这张图,把本章的核心内容串起来了。我建议你保存下来,后面每学一章都回头看看,知识体系会越来越清晰。
1.6 本章小结
这一章我们聊了BSP是什么、它在系统里干什么、主流芯片架构有哪些,以及怎么搭开发环境。看起来内容不少,但说白了就三件事:
- 理解BSP:它是硬件和OS之间的桥梁,换板子就得改它
- 认识架构:ARM、x86、RISC-V,选型时BSP生态比性能更重要
- 搭好环境:交叉编译链、TFTP、NFS,这三样配好了,后面开发事半功倍
环境搭建这块,我建议你亲手做一遍。别光看,动手敲命令。我第一次配NFS时,exports文件写错了格式,挂载一直报错,折腾了半小时才发现少了个星号。嗯,这种坑踩过一次就记住了。