news 2026/3/27 11:28:32

PetaLinux内核定制全流程:新手入门必看图文教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PetaLinux内核定制全流程:新手入门必看图文教程

从零开始玩转PetaLinux:一次完整的内核定制实战之旅

你有没有遇到过这样的场景?
手头一块Zynq开发板,Vivado工程已经跑通了AXI GPIO和ADC IP,但Linux系统就是“看不见”这些外设;或者内核启动卡在串口输出一半,日志戛然而止;又或者想让一个采集程序随系统自动运行,却不知道该把可执行文件放哪儿……

别急——这些问题的根源,往往都出在系统级配置环节。而解决它们的核心钥匙,就是掌握PetaLinux 的全栈定制能力

本文不讲空泛理论,也不堆砌命令手册。我们将以一位嵌入式工程师的真实工作流为线索,带你亲手完成一次从创建工程到部署镜像的完整闭环。重点聚焦“内核怎么改、设备树怎么写、应用怎么塞进去”这三个最常卡人的关键点,用你能听懂的“人话”,还原每一个操作背后的逻辑与坑点。


第一步:先搭个架子——PetaLinux工程是怎么来的?

所有故事的起点,都是这行命令:

source /opt/petalinux/2023.1/settings.sh petalinux-create -t project --name my_zynq_project --template zynq

看起来很简单对吧?但背后其实藏着不少门道。

为什么一定要 source settings.sh?

你可以把它理解成“激活开发环境许可证”。PetaLinux 是闭源工具链,它依赖一些私有库和脚本路径。settings.sh的作用就是把你当前终端“注入”正确的环境变量(比如PATHPETALINUX_SDK_DIR等),否则后续所有petalinux-*命令都会报错找不到。

✅ 小技巧:建议把这个 source 命令写进.bashrc或单独做个 alias,避免每次新开终端都要手动加载。

工程模板选哪个?zynq 还是 zynqmp?

  • --template zynq:适用于 Zynq-7000 系列(如 ZedBoard、MicroZed),双核 Cortex-A9 架构;
  • --template zynqmp:用于 Zynq UltraScale+ MPSoC(如 ZCU106),四核 A53 + 双核 R5;
  • --template versal:面向 Versal ACAP 平台。

选错模板会导致默认设备树、电源管理策略、驱动集都不匹配,轻则功能异常,重则根本启动不了。

创建完之后,项目长什么样?

执行完命令后,你会看到一个标准目录结构:

my_zynq_project/ ├── components/ # 子系统源码区 │ └── libs/ # 第三方库支持 ├── project-spec/ # 所有配置集中地! │ ├── config/ # 全局配置 │ ├── meta-user/ # 用户自定义层(应用、补丁) │ └── dts/ # 设备树文件存放处 ├── build/ # 构建中间产物 └── images/ # 最终生成的镜像输出目录

其中project-spec/是你未来90%时间会打交道的地方,务必记住它的存在。


第二步:动内核——裁剪不是删代码,而是做减法的艺术

当你输入:

cd my_zynq_project petalinux-config -c kernel

屏幕上弹出的那个黑白界面,其实是 Linux 内核自带的menuconfig配置工具。它不像图形操作系统那样点点鼠标就行,但它足够强大且精准。

到底哪些可以关?哪些必须留?

很多新手一上来就想“瘦身”,把 USB、Bluetooth、Wi-Fi 全都[ ]掉。这没错,但在裁剪之前,请先确认三件事:

  1. 你现在能通过串口登录吗?
    - 检查路径:Device Drivers → Serial drivers → <*> 8250/16550 and compatible serial support
    - 如果这里被禁用了,哪怕你的硬件 UART 正常,Linux 也打不出任何 log!

  2. 根文件系统怎么加载?
    - 默认通常是 SD 卡或 QSPI 启动。
    - 要确保:

    • MMC/SD/SDIO support开启
    • EXT4 filesystem support编译进内核(不要模块化)
  3. 是否需要动态加载驱动调试?
    - 如果你还在开发阶段,强烈建议开启:
    text [*] Enable loadable module support
    - 否则所有驱动必须静态编译进内核,修改一次就得重新烧录整个 image.ub,效率极低。

实战案例:我想用 SPI 接个温湿度传感器

假设你要用/dev/spidev1.0访问一个外挂的 SPI 设备,那至少要打开以下几项:

Device Drivers ---> <*> SPI support ---> <*> Xilinx SPI controller <*> User mode SPI device driver support

保存退出后,PetaLinux 会在project-spec/configs/下生成或更新kernel_config文件,并在下次构建时自动应用。

⚠️ 血泪教训:如果误删了amba总线或Clock Driver相关选项,可能导致内核 hang 在 early boot 阶段,连串口都没输出。遇到这种情况,最快恢复方式是删除project-spec/configs/kernel_config,再重新运行petalinux-config -c kernel加载默认配置。


第三步:写设备树——让内核“看见”你的PL外设

这是最容易出问题的一环。很多人以为 Vivado 导出hdf就万事大吉,殊不知设备树才是连接软硬件的最后一公里

它到底干了啥?

简单说:设备树告诉内核,“某个地址上有个什么东西,该怎么访问”

比如你在 PL 里加了个 AXI GPIO,地址分配是0x41200000,中断连到了 GIC 的 SPI ID 29(对应 CPU IRQ 61)。如果不写设备树节点,Linux 根本不知道这个寄存器块的存在。

正确姿势:编辑 system-top.dts

文件路径:project-spec/dts/system-top.dts

在这个文件末尾追加:

&amba { axi_gpio_0: gpio@41200000 { compatible = "xlnx,xps-gpio-1.00.a"; reg = <0x41200000 0x10000>; interrupt-parent = <&intc>; interrupts = <0 29 4>; xlnx,all-inputs = <0>; xlnx,all-outputs = <1>; xlnx,tri-default = <0xffffffff>; }; };

我们逐行拆解:

解释
&amba表示挂载在 AMBA 总线上(Zynq PS 的主总线)
gpio@41200000节点命名规范:设备类型@基地址
compatible驱动匹配字段!必须和内核中of_match_table一致
reg地址空间描述:起始地址 + 大小(单位字节)
interrupt-parent指定中断控制器,这里是 Zynq 的 intc(GIC)
interrupts<type line trigger>,其中0=SPI中断,29=GIC中的SPI编号,4=上升沿触发

🔍 如何查中断号?
在 Vivado Address Editor 中查看 AXI Interrupt Controller 输出的irq连接到 Processing System 的哪一个IRQ_F2P[x],然后根据 UG585 手册第6章换算成 GIC SPI ID。

验证方法:运行时检查

烧录新镜像后,在板子上执行:

ls /proc/device-tree/amba/gpio@41200000/

如果有这个目录,说明设备树已生效。接着可以用devmem测试读写:

# 设置方向为输出(写 control register) devmem 0x41200008 32 0x00000000 # 输出高电平 devmem 0x41200004 32 0xFFFFFFFF

如果对应的 LED 亮了,恭喜你,打通任督二脉!


第四步:塞应用——让程序开机自启其实很简单

你想写的采集程序、通信服务、AI推理脚本……最终都要变成系统的一部分。PetaLinux 提供了两种主流方式:

  • 传统方式:编译好扔进 rootfs;
  • 现代方式:注册为 systemd 服务(推荐)。

下面我们一步步来。

1. 创建应用模板

petalinux-create -t apps --name hello_app --template c

这会生成:

project-spec/meta-user/recipes-apps/hello_app/ ├── hello_app.bb # BitBake 配方文件 └── files/ └── hello_app.c # 示例代码

2. 改配方文件,让它开机启动

编辑hello_app.bb,加入 systemd 支持:

SUMMARY = "My first auto-run app" LICENSE = "MIT" SRC_URI = "file://hello_app.c" S = "${WORKDIR}" do_compile() { ${CC} ${CFLAGS} ${LDFLAGS} hello_app.c -o hello_app } do_install() { install -d ${D}${bindir} install -m 0755 hello_app ${D}${bindir}/ } # 关键在这里 ↓ SYSTEMD_PACKAGES = "${PN}" SYSTEMD_SERVICE_${PN} = "hello_app.service"

然后创建files/hello_app.service

[Unit] Description=Hello World Service After=network.target [Service] Type=simple ExecStart=/usr/bin/hello_app Restart=on-failure [Install] WantedBy=multi-user.target

3. 构建并验证

petalinux-build

构建完成后,进入images/linux/目录,你会看到image.ubrootfs.cpio.gz。烧录到板子上,启动后执行:

systemctl status hello_app

如果显示active (running),说明成功了!

💡 提示:如果你的应用依赖 Python 或 OpenCV,记得在petalinux-config -c rootfs中启用相应包组。


调试那些年我们踩过的坑

❌ 串口没输出?

优先排查顺序:

  1. 设备树中chosen节点是否指定了正确 stdout-path?
    dts chosen { bootargs = "console=ttyPS0,115200 earlyprintk"; stdout-path = "serial0:115200"; };
  2. 内核是否禁用了 UART 驱动?
  3. 实际硬件接的是ttyPS0还是ttyPS1?别搞混了。

❌ 网络不通?

常见原因:

  • PHY 地址不对(设备树中phy-handle指向错误节点);
  • RMII/MII 模式未配置;
  • 复位引脚延迟不够(需添加phy-reset-duration属性)。

❌ 应用启动失败?

查看日志最有效:

journalctl -u hello_app.service

可能原因包括:

  • 动态库缺失(交叉编译时没链接好);
  • 权限不足(脚本没加可执行位);
  • 路径错误(/usr/binvs/bin)。

写在最后:真正的嵌入式开发,是从这里开始的

看到这里,你应该已经完成了:

✅ 创建 PetaLinux 工程
✅ 修改内核配置启用所需驱动
✅ 添加 PL 外设设备树节点
✅ 编写用户程序并实现开机自启
✅ 构建完整镜像并部署验证

但这还只是起点。

当你掌握了这套流程,就可以进一步挑战更复杂的任务:

  • 把 ROS2 打包进根文件系统,做机器人控制器;
  • 集成 AI 推理引擎(如 TensorFlow Lite),实现边缘智能;
  • 使用 Yocto 图层机制管理多个项目共用组件;
  • 配置安全启动与加密固件更新……

更重要的是,你会建立起一种全栈视角:不再把 FPGA 和 Linux 当作两个割裂的世界,而是真正理解“软硬协同”的含义。

所以,别再只停留在“Vivado 能跑就行”的阶段了。动手改一次内核、写一段设备树、让自己的程序随着系统一起醒来——这才是嵌入式开发的魅力所在。

如果你在实践中遇到了其他难题,欢迎留言交流。我们一起把这条路走得更远。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 12:50:38

新手必看:信号发生器在基础通信实验中的使用技巧

新手避坑指南&#xff1a;信号发生器在通信实验中的真实用法 你有没有遇到过这种情况&#xff1f; 接好线、设好参数&#xff0c;按下“运行”——结果示波器上波形不对劲&#xff1a;幅度翻倍、边沿振铃、调制没反应……最后折腾半天才发现&#xff0c;问题不在电路板&#x…

作者头像 李华
网站建设 2026/3/23 20:24:36

GPU集群上的并行计算:AI项目应用详解

GPU集群上的并行计算&#xff1a;从零构建AI大模型训练系统你有没有遇到过这样的场景&#xff1f;一个深度学习项目&#xff0c;模型刚跑起来&#xff0c;显存就爆了&#xff1b;好不容易调小了batch size&#xff0c;训练一轮要十几个小时&#xff1b;等到想上更大模型时&…

作者头像 李华
网站建设 2026/3/20 22:25:16

零基础理解UDS 27服务在诊断系统中的作用

深入浅出&#xff1a;UDS 27服务如何为汽车诊断系统“上锁”你有没有想过&#xff0c;为什么4S店的专用诊断仪可以刷新发动机程序、读取防盗信息&#xff0c;而市面上几十块钱的OBD工具却只能看看故障码&#xff1f;这背后的关键&#xff0c;并不是硬件多先进&#xff0c;而是—…

作者头像 李华
网站建设 2026/3/25 0:51:55

饮食饮水代谢检测系统 呼吸能量饮食饮水代谢检测系统 大鼠代谢系统 小鼠代谢系统

动物代谢监测系统具有多通量、实时统计、自动化、高准确性等优点&#xff0c;极大地提高了药物研发和基础生命科学研究的效率&#xff0c;并从根本上减少手工操作带来数据偏差及误差。在动物无拘束状态下&#xff0c;进行多通道测量,记录软件能实时统计大小鼠的饮食量、饮水量、…

作者头像 李华
网站建设 2026/3/20 9:06:24

智能论文改写工具推荐,8款AI平台助你轻松完成写作

目前市面上有多款AI论文辅助工具&#xff0c;通过对8个主流平台的综合评测发现&#xff0c;这些工具在论文降重、降低AI生成内容检测率以及辅助写作等方面各具特色&#xff0c;根据实际测试结果和用户评价显示&#xff0c;其性能表现主要取决于处理效率、内容准确度及操作便捷性…

作者头像 李华