第10讲:嵌入式AI开发人机分工——人定硬件逻辑,AI做代码实现

CSDN专栏:

  • 嵌入式程序开发实战
  • 嵌入式双范式AI编程
  • 嵌入式开发必掌握
  • 嵌入式求职面试技术资料

第10讲:嵌入式AI开发人机分工——人定硬件逻辑,AI做代码实现

一、为什么需要明确人机分工

嵌入式AI开发中,最危险的误区是"完全交给AI"。明确人机分工,是确保AI辅助正确、代码质量可控的前提。

1.1 完全交给AI的后果

后果一:硬件逻辑错误
AI生成的代码:

  • 不理解硬件特性(时序、电气特性)
  • 不理解硬件约束(资源限制、环境条件)
  • 不理解硬件风险(干扰、失效模式)

示例

  • AI生成的I2C代码没有考虑总线恢复时间
  • AI生成的中断代码没有考虑中断嵌套
  • AI生成的电源代码没有考虑上电顺序

后果二:架构混乱
AI生成的代码:

  • 没有整体架构设计
  • 各模块耦合混乱
  • 代码风格不一致
  • 难以维护和扩展

示例

  • AI生成的多个驱动相互依赖
  • AI生成的代码命名混乱
  • AI生成的代码注释缺失

后果三:安全隐患
AI生成的代码:

  • 没有容错处理
  • 没有异常处理
  • 没有安全检查

示例

  • AI生成的电机控制代码没有过流保护
  • AI生成的通信代码没有超时处理
  • AI生成的传感器代码没有断线检测

1.2 正确的人机关系

人是主导
人负责:

  • 硬件逻辑设计(时序、电气、环境)
  • 架构设计(模块划分、接口定义)
  • 安全设计(容错、异常、保护)
  • 质量把控(审查、测试、验证)

AI是辅助
AI负责:

  • 代码实现(根据人的设计)
  • 代码生成(重复性工作)
  • 代码优化(性能优化)
  • 文档生成(辅助文档)

核心原则

  • 人定方向,AI做执行
  • 人定约束,AI做实现
  • 人定质量,AI做效率

二、人负责的核心工作

2.1 硬件逻辑设计

硬件逻辑包括

时序逻辑
人需要确定:

  • I2C时序:Start建立时间、Stop建立时间、数据保持时间
  • SPI时序:时钟极性、时钟相位、片选建立/保持时间
  • UART时序:波特率、数据位、停止位、校验位
  • ADC时序:采样时间、转换时间
  • PWM时序:周期、占空比、死区时间

示例

  • 人确定:I2C速率100kHz,Start建立时间≥4.7us
  • AI实现:根据人的约束生成I2C初始化代码

电气逻辑
人需要确定:

  • 电压范围:工作电压、容差范围
  • 电流限制:最大电流、过流保护阈值
  • 功耗要求:工作功耗、休眠功耗
  • 驱动能力:引脚驱动能力、负载匹配

示例

  • 人确定:GPIO输出电流最大8mA,负载需要10mA,需要增加驱动电路
  • AI实现:根据人的约束生成GPIO配置代码

环境逻辑
人需要确定:

  • 温度范围:工作温度、存储温度
  • 湿度范围:工作湿度、防护等级
  • 振动要求:振动频率、振动幅度
  • EMC要求:抗干扰等级、辐射限制

示例

  • 人确定:设备工作温度-40°C ~ +85°C,需要工业级芯片
  • AI实现:根据人的约束选择合适的芯片型号

2.2 架构设计

架构设计包括

模块划分
人需要确定:

  • 功能模块:传感器模块、通信模块、控制模块、显示模块
  • 驱动模块:GPIO驱动、UART驱动、SPI驱动、I2C驱动
  • 中间层:协议层、应用层、接口层

示例

  • 人确定:系统分为传感器采集、数据处理、通信发送三个模块
  • AI实现:根据人的架构生成各模块代码框架

接口定义
人需要确定:

  • 模块间接口:函数接口、数据接口、事件接口
  • 驱动接口:初始化接口、操作接口、状态接口
  • 硬件接口:引脚定义、信号定义、时序定义

示例

  • 人确定:传感器模块接口:Init()、Read()、Process()
  • AI实现:根据人的接口定义生成函数框架

数据流设计
人需要确定:

  • 数据流向:传感器 → 处理 → 通信 → 显示
  • 数据格式:原始数据、处理数据、协议数据
  • 数据存储:RAM、Flash、外部存储

示例

  • 人确定:传感器数据经过滤波、校准后发送
  • AI实现:根据人的数据流生成处理代码

2.3 安全设计

安全设计包括

容错设计
人需要确定:

  • 通信容错:超时重传、CRC校验、帧序号
  • 传感器容错:断线检测、量程检查、滤波去抖
  • 执行器容错:过流保护、过热保护、堵转检测
  • 系统容错:看门狗、异常复位、状态恢复

示例

  • 人确定:I2C通信失败重试3次,仍失败则报告故障
  • AI实现:根据人的容错设计生成重试代码

异常处理
人需要确定:

  • 硬件异常:断线、短路、过流、过热
  • 通信异常:超时、错误、丢失
  • 数据异常:越界、错误、丢失
  • 系统异常:死锁、溢出、崩溃

示例

  • 人确定:传感器断线时输出安全值,记录故障日志
  • AI实现:根据人的异常处理生成故障处理代码

保护措施
人需要确定:

  • 硬件保护:过流保护、过压保护、过热保护
  • 软件保护:看门狗、堆栈检测、内存保护
  • 数据保护:备份、校验、加密
  • 系统保护:安全状态、故障导向安全

示例

  • 人确定:电机过流时立即停止,进入安全状态
  • AI实现:根据人的保护措施生成保护代码

2.4 质量把控

质量把控包括

代码审查
人需要审查:

  • 逻辑正确性:代码是否实现设计意图
  • 规范符合性:代码是否符合编码规范
  • 安全正确性:容错、异常、保护是否完整
  • 性能合理性:时序、资源、功耗是否满足

示例

  • 人审查:AI生成的I2C代码是否有总线恢复时间
  • AI无法替代:人的审查判断

测试验证
人需要验证:

  • 功能测试:功能是否正确实现
  • 边界测试:边界条件是否处理
  • 异常测试:异常情况是否处理
  • 性能测试:性能指标是否满足

示例

  • 人验证:I2C通信在快速连续读取时是否正常
  • AI无法替代:人的测试判断

问题修复
人需要分析:

  • 问题定位:问题发生在哪里
  • 问题原因:问题为什么发生
  • 修复方案:如何修复问题
  • 验证修复:修复是否有效

示例

  • 人分析:I2C通信失败是因为时序违规,修复方案是增加延时
  • AI实现:根据人的修复方案修改代码

三、AI负责的核心工作

3.1 代码实现

AI擅长的代码实现

驱动代码生成
人提供:

  • 硬件参数(引脚、时钟、时序)
  • 功能需求(初始化、读写、配置)

AI生成:

  • 寄存器配置代码
  • 初始化函数
  • 操作函数

示例

  • 人:PA9/PA10配置为USART1,波特率115200
  • AI:生成USART1初始化代码

协议代码生成
人提供:

  • 协议格式(帧结构、字段定义)
  • 处理逻辑(解析、打包、校验)

AI生成:

  • 协议解析代码
  • 协议打包代码
  • 校验计算代码

示例

  • 人:Modbus RTU帧格式,CRC-16校验
  • AI:生成Modbus帧解析和打包代码

算法代码生成
人提供:

  • 算法原理(公式、逻辑)
  • 实现要求(精度、性能)

AI生成:

  • 算法实现代码
  • 优化代码

示例

  • 人:PID控制算法,Kp=1.0, Ki=0.1, Kd=0.01
  • AI:生成PID控制代码

3.2 代码生成

AI擅长的代码生成

配置代码生成
人提供:

  • 配置参数(时钟、GPIO、外设)

AI生成:

  • 配置结构体
  • 配置函数

示例

  • 人:系统时钟72MHz,HSE 8MHz
  • AI:生成时钟配置代码

模板代码生成
人提供:

  • 模板结构(函数框架、注释格式)

AI生成:

  • 完整函数代码
  • 注释文档

示例

  • 人:函数模板:函数名、参数、返回值、功能描述
  • AI:生成完整函数代码和注释

重复代码生成
人提供:

  • 重复模式(相似功能的代码模式)

AI生成:

  • 批量生成相似代码

示例

  • 人:8路ADC采集,每路配置相同
  • AI:生成8路ADC采集代码

3.3 代码优化

AI擅长的代码优化

性能优化
人提供:

  • 性能瓶颈(耗时函数、频繁调用)

AI优化:

  • 算法优化
  • 代码重构

示例

  • 人:滤波函数耗时过长
  • AI:优化滤波算法,使用查表法

资源优化
人提供:

  • 资源限制(RAM、Flash、堆栈)

AI优化:

  • 内存优化
  • 代码压缩

示例

  • 人:RAM不足,需要优化内存使用
  • AI:使用静态数组替代动态分配,减少局部变量

代码简化
人提供:

  • 冗余代码(重复逻辑、冗余判断)

AI简化:

  • 代码合并
  • 逻辑简化

示例

  • 人:多处重复的错误处理代码
  • AI:提取公共函数,简化代码

3.4 文档生成

AI擅长的文档生成

代码注释生成
人提供:

  • 代码功能描述

AI生成:

  • 函数注释块
  • 参数说明
  • 返回值说明

示例

  • 人:函数功能是读取传感器数据
  • AI:生成完整的函数注释

设计文档生成
人提供:

  • 设计思路、架构描述

AI生成:

  • 设计文档
  • 架构图描述

示例

  • 人:系统分为三个模块,数据流向是…
  • AI:生成设计文档

测试文档生成
人提供:

  • 测试用例、测试结果

AI生成:

  • 测试报告
  • 测试文档

示例

  • 人:测试用例和结果
  • AI:生成测试报告

四、人机协作工作流

4.1 标准工作流

步骤一:人进行需求分析
人:

  • 分析功能需求
  • 分析性能需求
  • 分析安全需求
  • 分析约束条件

输出:需求文档(自然语言)

步骤二:人进行设计
人:

  • 设计硬件逻辑(时序、电气、环境)
  • 设计系统架构(模块、接口、数据流)
  • 设计安全机制(容错、异常、保护)

输出:设计文档(Spec)

步骤三:AI生成代码
AI:

  • 根据人的设计生成代码框架
  • 根据人的约束生成驱动代码
  • 根据人的接口生成函数代码

输入:人的设计文档(Spec)
输出:代码框架、驱动代码、函数代码

步骤四:人审查代码
人:

  • 审查逻辑正确性
  • 审查规范符合性
  • 审查安全正确性
  • 修改不符合要求的代码

输入:AI生成的代码
输出:审查通过的代码

步骤五:人测试验证
人:

  • 执行功能测试
  • 执行边界测试
  • 执行异常测试
  • 执行性能测试

输入:审查通过的代码
输出:测试报告

步骤六:人修复问题
人:

  • 分析问题原因
  • 制定修复方案

AI:

  • 根据人的方案修改代码

输入:测试报告
输出:修复后的代码

步骤七:迭代直到通过
重复步骤四-六,直到所有测试通过

4.2 典型案例:温度控制系统

步骤一:人进行需求分析
人分析:

功能需求

  • 读取温度传感器(PT100)
  • 根据温度控制加热器
  • 显示当前温度和设定温度
  • 通过串口上报温度数据

性能需求

  • 温度采集周期:1秒
  • 控制响应时间:<100ms
  • 显示刷新周期:500ms

安全需求

  • 温度超限报警(>100°C)
  • 加热器过流保护
  • 传感器断线检测

约束条件

  • MCU:STM32F103
  • 温度范围:-50°C ~ +150°C
  • 加热器功率:500W

步骤二:人进行设计
人设计:

硬件逻辑

  • PT100使用SPI接口,采样周期1秒
  • 加热器使用PWM控制,频率1kHz
  • 显示使用I2C接口,刷新周期500ms
  • 串口波特率115200

系统架构

  • 传感器模块:PT100_Init()、PT100_Read()
  • 控制模块:Control_Init()、Control_Process()
  • 显示模块:Display_Init()、Display_Update()
  • 通信模块:Comm_Init()、Comm_Send()

安全机制

  • 温度超限:停止加热,报警
  • 过流保护:检测电流,超限停止
  • 断线检测:检测PT100连接状态

步骤三:AI生成代码
Prompt

"根据以下设计生成代码: - STM32F103,使用HAL库 - PT100通过SPI1读取,采样周期1秒 - 加热器通过TIM3 PWM控制,频率1kHz - 显示通过I2C1,刷新周期500ms - 串口USART1,波特率115200 - 温度超限>100°C时停止加热并报警 - 检测PT100断线,断线时报告故障"

AI生成:

  • PT100驱动代码
  • PWM控制代码
  • 显示驱动代码
  • 串口通信代码
  • 主控制逻辑代码

步骤四:人审查代码
人审查:

  • PT100驱动:时序是否正确?断线检测是否实现?
  • PWM控制:频率是否正确?过流保护是否实现?
  • 显示驱动:I2C时序是否正确?
  • 串口通信:波特率是否正确?超时处理是否实现?
  • 主控制逻辑:温度超限处理是否正确?

发现问题:

  • PT100驱动缺少断线检测代码
  • PWM控制缺少过流保护代码

人修改:

  • 添加PT100断线检测代码
  • 添加PWM过流保护代码

步骤五:人测试验证
人测试:

  • 功能测试:温度读取、加热控制、显示、通信
  • 边界测试:温度-50°C、+150°C、超限100°C
  • 异常测试:PT100断线、加热器过流、串口断开
  • 性能测试:采集周期、控制响应、显示刷新

发现问题:

  • 温度采集周期不稳定(有时800ms,有时1200ms)

人分析:

  • 原因:主循环中多个任务串行执行,耗时不确定
  • 修复:使用定时器中断控制采集周期

步骤六:人修复问题
人制定修复方案:

  • 使用TIM2定时器中断,周期1秒
  • 中断中设置标志,主循环检测标志执行采集

Prompt
“修改代码,使用TIM2定时器中断控制温度采集周期,周期精确1秒”

AI修改:

  • 添加TIM2定时器配置
  • 修改主循环逻辑,使用中断标志

步骤七:迭代直到通过
重复审查、测试、修复,直到所有测试通过

五、人机分工边界清单

5.1 人必须做的

  • 需求分析(功能、性能、安全、约束)
  • 硬件逻辑设计(时序、电气、环境)
  • 系统架构设计(模块、接口、数据流)
  • 安全机制设计(容错、异常、保护)
  • 代码审查(逻辑、规范、安全)
  • 测试验证(功能、边界、异常、性能)
  • 问题分析(定位、原因、方案)
  • 质量把控(最终决策)

5.2 AI可以做的

  • 代码实现(根据人的设计)
  • 代码生成(驱动、协议、算法)
  • 代码优化(性能、资源、简化)
  • 文档生成(注释、设计文档、测试文档)
  • 代码修改(根据人的方案)

5.3 AI不能做的

  • 需求分析(不理解业务)
  • 硬件逻辑设计(不理解硬件)
  • 架构设计(没有全局观)
  • 安全设计(不理解风险)
  • 质量决策(不能承担责任)
  • 替代人的判断

六、本讲核心要点

6.1 记住这三句话

  1. 完全交给AI是危险的:AI不理解硬件、架构、安全,必须由人主导

  2. 人负责设计、审查、测试、决策;AI负责实现、生成、优化、辅助

  3. 人机协作的正确姿势:人定方向和约束,AI做执行和实现,人审查和验证

6.2 实践建议

对于新手

  • 学习硬件知识,理解时序、电气、环境
  • 学习架构设计,理解模块、接口、数据流
  • 学习安全设计,理解容错、异常、保护
  • 对AI生成的代码进行审查,不要盲目信任

对于有经验工程师

  • 建立人机协作工作流
  • 编写Spec约束AI生成
  • 严格审查AI生成的代码
  • 建立代码审查清单

对于团队负责人

  • 明确人机分工边界
  • 培训团队硬件知识和安全意识
  • 建立代码审查流程
  • 建立质量把控机制

6.3 下讲预告

第11讲将对比分析:嵌入式传统开发 VS AI双范式开发:效率与稳定性对比

传统开发和AI双范式开发有什么区别?效率如何?稳定性如何?下一讲将通过对比分析,展示AI双范式开发的优势和适用场景。