当前位置:首页>Linux>嵌入式 Linux 开发会被 AI 取代吗?BSP 工程师和应用开发者的真实处境

嵌入式 Linux 开发会被 AI 取代吗?BSP 工程师和应用开发者的真实处境

  • 2026-10-11 08:04:08
嵌入式 Linux 开发会被 AI 取代吗?BSP 工程师和应用开发者的真实处境

嵌入式 Linux 开发会被 AI 取代吗?

BSP 工程师和应用开发者的真实处境

一个朋友最近在面试,面试官直接问他:"你觉得你自己三年后还有没有被雇佣的价值?"

这问题听着像刁难,但我觉得这是 2026 年每一个嵌入式 Linux 工程师都应该认真想一遍的问题。

AI 写代码这件事已经不是新鲜事了——GitHub Copilot 全球超过 2000 万用户,41% 的代码由 AI 参与生成。但嵌入式 Linux 这个圈子有它独特的复杂性:你不只是在写代码,你是在让 Linux 跑在一块可能从没见过 Linux 的板子上。

这里面的水,比你想的深。

先把"嵌入式 Linux 开发"拆开来看

很多人说"嵌入式 Linux 开发",其实在说两件差别很大的事:

嵌入式 Linux 开发├── BSP 层(Board Support Package)│   ├── Bootloader 移植(U-Boot)│   ├── 内核配置与裁剪(Kconfig、DTS)│   ├── 设备驱动开发(字符设备、平台驱动、子系统驱动)│   └── 根文件系统构建(Yocto / Buildroot)│└── 应用层(Application)    ├── 系统级应用(守护进程、systemd 服务)    ├── 驱动用户态接口(ioctl、sysfs、netlink)    ├── 网络与通信(socket、MQTT、OTA 升级)    └── 业务逻辑开发

这两层被 AI 影响的方式截然不同。搞清楚这个,才能判断自己的饭碗有多稳。

BSP 层:AI 进来之后,踩了多少坑

先说 AI 在 BSP 层干了什么

Linux 内核社区其实已经在用 AI 了,而且用得很务实。

AUTOSEL 是 NVIDIA 工程师 Sasha Levin 写的工具,用多个 LLM 联合投票,每天自动筛选哪些 upstream 补丁值得 backport 到 stable/LTS 内核树。以前维护者每天要人工看 100 个补丁,只有 5~10 个值得 backport——这种重复劳动 AI 干得比人好,速度也快。

Btrfs 的作者、Meta 工程师 Chris Mason 也在搞 AI 辅助的 patch code review,把大段 diff 拆成小块,逐块让 LLM 审查,再汇总报告。

这些都是真实落地的 AI 应用,不是 PPT。

但是——

坑一:AI 不认识你的板子

BSP 最硬核的挑战在于,你的目标平台可能是全球独一份的。

假设你在给一块基于 RK3568 的定制工业板做 BSP,板子上挂了一颗你们硬件团队自研的 FPGA,通过 SPI 连接,中断走的 GPIO 扩展器。

你让 AI 写这个驱动,它会给你一段"看起来很完整"的 spi_driver 代码:

staticintmy_fpga_probe (struct spi_device *spi){    struct my_fpga_dev *dev;    int ret;    dev = devm_kzalloc(&spi->dev, sizeof (*dev), GFP_KERNEL);if (!dev)        return -ENOMEM;/* AI 生成的代码在这里会自信地填上 SPI 参数 */    spi->max_speed_hz = 10000000;  /* 10MHz,AI 猜的,没有根据 */    spi->mode = SPI_MODE_0;        /* MODE_0,也是猜的 */    ret = spi_setup(spi); if (ret < 0)        return ret;/* 中断处理?AI 根本不知道你的 GPIO 扩展器型号 */    dev->irq = spi->irq;  /* spi->irq 在你这块板子上是 0,永远触发不了 */return0;}

这段代码能编译,甚至能 insmod 不报错——但它不工作。spi->irq 是 0,因为 AI 不知道你的中断实际上经过了 GPIO 扩展器(比如 PCA9555),DTS 里需要专门声明 interrupt-parent 和 interrupts。

AI 不读你的原理图,不知道你的硬件拓扑。 这个问题无解,除非你告诉它。

坑二:Device Tree 的坑深不见底

DTS 是 BSP 工程师的日常,也是 AI 最容易翻车的地方。

我测试过让 AI 写一个 I2C 温度传感器(LM75A)的 DTS 节点,以及对应的 Linux 驱动绑定。AI 给的结果:

/* AI 生成 */&i2c1{   lm75@48{       compatible="national,lm75a";        reg=<0x48>;        /* AI 忘了加这个,但你的板子需要 */        /* vs-supply = <&reg_3v3>; */    };};

漏了电源域声明,在有电源管理的系统上,传感器在 suspend/resume 之后挂掉,i2c_transfer 返回 -EIO,你要花几个小时才能定位到这里。

更糟的是,有时 AI 会编造根本不存在的 compatible 字符串。比如 "myvendor,custom-sensor" 这种,写进 DTS 能过编译,内核启动时找不到匹配驱动,设备静默地不工作,没有任何报错。这比崩溃还难定位。

坑三:内核 API 一直在变,AI 的训练数据跟不上

Linux 内核没有稳定的驱动接口——这是官方立场,不是抱怨。

内核从 v5.10 到 v6.10,API 变化量巨大。AI 训练数据有截止日期,它给你写的 request_irq 参数列表可能对应的是旧内核,你用的是新内核,编译直接报错还算好的,运行时行为异常更麻烦。

有研究团队(DRIVEBENCH / AUTODRIVER)专门研究了这个问题:让 LLM 自动迁移跨内核版本的 out-of-tree 驱动,成功率在 74% 左右——这已经是优化过的结果了。换句话说,1/4 的驱动迁移还是要人来收尾。

/* Linux 5.x 写法 */ret = request_irq(irq, handler, IRQF_SHARED, "mydev", dev);/* Linux 6.x 某些场景推荐用 devm 版本 */ret = devm_request_irq(&pdev->dev, irq, handler,                        IRQF_SHARED, "mydev", dev);/* AI 可能给你混用,也可能给你一个已废弃的接口 */
坑四:Yocto 配方(Recipe)是 AI 的重灾区

Buildroot 还好,Makefile + kconfig,AI 尚能应付。

Yocto 就是另一回事了。

一个 Yocto recipe 的 .bb 文件涉及

  • • BitBake 的 DSL 语法;
  • • RDEPENDS/DEPENDS 的区别;
  • • do_install 函数;
  • • FILES:${PN} 的 split packaging;
  • • BBCLASSEXTEND 的用法……

我让 AI 写过一个给 RK3568 平台集成 Qt6 的 Yocto recipe,结果:

  • • DEPENDS 写成了 RDEPENDS,导致编译期找不到 Qt6 头文件
  • • do_install 里的安装路径用了 ${prefix} 但没有 inherit autotools,变量未定义
  • • SRC_URI 的 branch= 和 rev= 同时写了,BitBake 版本不同行为不一样

这些 bug 在 Yocto 的构建日志里会给你看几百行错误,要一条一条定位。

AI 对 Yocto 的理解停留在"能写出语法正确的 .bb 文件",距离"能在真实项目里跑通"还差很远。

应用层:AI 的能力上限在哪里

相比 BSP,嵌入式 Linux 应用层和通用 Linux 应用开发更接近,AI 的帮助力度也更大。

AI 真的能干好的事

守护进程框架

让 AI 生成一个基于 epoll 的事件驱动守护进程框架,非常稳:

// AI 生成的 epoll 骨架,质量相当不错int epfd = epoll_create1(EPOLL_CLOEXEC);if (epfd == -1) {    perror("epoll_create1");return-1;}struct epoll_event ev = {    .events = EPOLLIN | EPOLLET,  /* 边沿触发,减少唤醒次数 */    .data.fd = sockfd,};epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);/* 主循环 */while (running) {    int nfds = epoll_wait(epfd, events, MAX_EVENTS, -1);    for (int i = 0; i < nfds; i++) {        handle_event(&events[i]);    }}

这种代码 AI 写得比很多初级工程师好,注释也到位。

协议解析

Modbus RTU/TCP、MQTT、自定义串口帧格式——这些有明确规范的协议解析,AI 给出的代码准确率相当高,结构也清晰。

systemd service 文件

# AI 生成,直接能用[Unit]Description=My Embedded ApplicationAfter=network.targetWants=network-online.target[Service]Type=notifyExecStart=/usr/bin/myapp --config /etc/myapp/config.jsonRestart=on-failureRestartSec=5sWatchdogSec=30sStandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.target

OTA 升级逻辑

基于 RAUC 或 SWUpdate 的 A/B 分区更新方案,AI 能给出相当靠谱的框架代码和配置思路。

应用层的 AI 死穴

坑一:ioctl 接口和驱动强耦合

你写用户态代码去操作一个自研驱动,需要知道内核驱动里具体的 ioctl 命令字定义。AI 不知道你驱动里 #define MY_IOCTL_SET_FREQ _IOW('M', 1, uint32_t) 是什么含义,它会给你写出一段"语法正确但命令字对不上"的代码——在运行时返回 ENOTTY 或者更诡异的行为。

坑二:多线程 + 信号处理的边界情况

/* 这段 AI 生成的代码有隐患,你能看出来吗? */staticvolatilesig_atomic_t g_running = 1;staticpthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;voidsigint_handler(int sig) {    pthread_mutex_lock(&g_mutex);   /* ← 信号处理函数里锁 mutex,这是 UB */    g_running = 0;    pthread_mutex_unlock(&g_mutex);}

在信号处理函数里调用非异步信号安全的函数(pthread_mutex_lock 不是),是未定义行为。AI 经常犯这个错误,表现为偶发的死锁,复现概率极低,排查极难。

坑三:实时性要求(PREEMPT_RT)

如果你的应用跑在打了 PREEMPT_RT 补丁的内核上,优先级继承、中断线程化、spinlock 变 sleeping lock——这些细节 AI 基本不懂。它给你的代码在普通内核上跑得好好的,换到 RT 内核上可能死锁。

AI 怎么用才不会踩坑:一套实战工作流

综合下来,AI 在嵌入式 Linux 开发里的定位应该是这样:

你的工作流──────────────────────────────────────────阶段 1:需求理解 + 架构设计  → 完全靠你,AI 不了解你的硬件约束阶段 2:样板代码生成  → AI 主导,你提供精确上下文  → 告诉 AI:目标内核版本、SoC 型号、具体外设型号阶段 3:代码 Review(关键!)  → 逐行对着数据手册和内核文档验证  → 重点检查:中断号、寄存器偏移、API 版本阶段 4:硬件验证  → 示波器、逻辑分析仪、串口日志  → AI 介入不了,物理世界是你的主场阶段 5:调试定位  → GDB + KGDB、ftrace、perf、dmesg  → AI 可以辅助分析 crash log,但诊断要靠你

给 AI 的 Prompt 质量,决定了生成代码的可用程度。

烂 Prompt:

"帮我写一个 Linux SPI 驱动"

好 Prompt:

"我在 Linux 6.1(PREEMPT_RT)上为 RK3568 写一个 SPI 字符设备驱动,外接的是 Microchip MCP3204 ADC,SPI0,片选 GPIO3_B5,中断无,只需要支持 read() 系统调用,每次读取 4 字节 ADC 值。请使用 devm 系列 API,参考 drivers/spi/ 目录下的驱动风格。"

后者 AI 给出的代码,可用率能从 30% 提升到 70%+。

行业现实:嵌入式 Linux 岗位在消失吗

完全相反。

看看 2025 年真实的市场需求:

方向
需求趋势
车载 Linux / AGL
🔥 暴增(L2+ 自动驾驶域控)
工业边缘计算
🔥 持续增长(OPC-UA、TSN)
AI 边缘推理(NPU 驱动)
🔥 新兴需求
传统裸机 MCU 移植 Linux
→ 平稳
纯应用层(无硬件经验)
↘ 被 AI 压缩

最大的变化是:新增了"嵌入式 Linux + AI 推理加速"这个交叉岗位。

RK3588 上的 NPU、高通 SA8255P 的 Hexagon DSP、地平线 J6 的 BPU——这些 AI 加速器都需要工程师写内核驱动、调用 runtime API、做内存对齐和 DMA 优化。这些工作 AI 干不了,市面上能干的人也不多,薪资水涨船高。

一次真实的踩坑经历

之前在做一个工业网关项目,基于 i.MX8M Mini,需要把一颗 RS-485 工业协议芯片通过 SPI 挂到 Linux 上。

我用 AI 生成了初版驱动,编译通过,insmod 成功,/dev/spi-485 节点也出现了。读写第一次能工作,但在高负载下偶发数据错误。

排查了两天,最后发现:AI 生成的代码在 SPI 传输完成后没有等待 CS(片选)释放的 tHold 时间就立刻发起下一帧传输,这个芯片的 datasheet 里写了需要至少 50ns 的 CS 高电平保持时间,AI 完全不知道。

/* AI 生成的代码(有问题) */spi_sync(spi, &msg);/* 直接返回,没有任何延迟 */return0;/* 正确做法 */spi_sync(spi, &msg);ndelay(50);  /* tHold:CS 释放后至少 50ns,来自 datasheet Table 3 */return0;

这个 bug 只在特定 SPI 速率和特定数据模式下出现,AI 永远发现不了——因为它没有读你的 datasheet,更没有用示波器量 CS 波形。

一句话总结

AI 能帮你写嵌入式 Linux 代码,但它不能帮你理解那块板子。

理解板子,是嵌入式 Linux 工程师不可替代的核心价值。

BSP 工程师的护城河是:原理图 + 数据手册 + 内核子系统的深度融合。应用层工程师的护城河是:硬件行为 + 系统资源 + 业务约束的全局理解。

学会用 AI 做你的苦力,而不是让 AI 替代你的判断——这才是 2026 年嵌入式 Linux 工程师应该有的姿势。

你用 AI 写嵌入式 Linux 代码踩过什么坑?DTS 写错了?Yocto recipe 编不过?评论区聊聊,没准能救下一个被坑的同行。

END

往期推荐
RECOMMEND
1
在边缘自动优化PID参数?PSO粒子群优化及其在嵌入式系统中的应用
2
跨平台移植modbus,从STM32到TMS320F28377D,kimi 2.6半小时搞定
3
MCU 的进化史
4
AI Box,“小龙虾”规模化上车的真正底座
5
STM32C5在MX2下的FREERTOS配置
戳“阅读原文”了解更多!

最新文章

随机文章