第19讲:增量迭代——只改驱动片段,不破坏原有工程框架
CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第19讲增量迭代——只改驱动片段不破坏原有工程框架一、增量迭代的重要性在嵌入式开发中经常需要在现有工程基础上修改或添加驱动。如果修改不当可能破坏已有功能导致工程崩溃。增量迭代的核心是只改需要改的部分不影响其他部分。1.1 传统修改方式的问题问题一牵一发动全身场景修改UART波特率错误做法修改UART初始化函数影响了其他使用UART的模块导致通信协议错误需要修改多个模块原因模块耦合度高修改影响范围大难以控制影响范围问题二破坏已有功能场景添加新驱动错误做法添加新驱动代码修改了全局配置影响了已有驱动已有功能失效原因配置冲突资源冲突时序冲突问题三难以回退场景修改失败需要回退问题修改了多个文件不记得修改了哪些无法完整回退只能重新开始1.2 增量迭代的原则原则一最小修改原则只修改必要的部分只修改目标驱动不修改其他驱动不修改全局配置不修改接口定义原则二隔离修改原则修改部分要隔离使用条件编译隔离使用独立文件隔离使用独立函数隔离原则三可回退原则修改要可回退保留原始代码记录修改内容使用版本控制二、增量迭代的方法2.1 方法一条件编译隔离适用场景临时修改、测试修改方法// 原始代码voidUART_Init(void){// 原始配置huart1.Init.BaudRate9600;}// 增量修改条件编译voidUART_Init(void){#ifdefNEW_BAUDRATE// 新配置huart1.Init.BaudRate115200;#else// 原始配置huart1.Init.BaudRate9600;#endif}优点容易切换保留原始代码容易回退缺点代码冗余不适合大改动2.2 方法二独立文件隔离适用场景新驱动添加、驱动替换方法原始工程 ├── drivers/ │ ├── uart.c │ ├── spi.c │ └── i2c.c 增量添加 ├── drivers/ │ ├── uart.c │ ├── spi.c │ ├── i2c.c │ └── adc.c // 新增驱动独立文件优点不影响已有文件容易管理容易删除缺点需要修改工程配置2.3 方法三独立函数隔离适用场景功能扩展、功能修改方法// 原始函数voidUART_Send(uint8_t*data,uint16_tlen){HAL_UART_Transmit(huart1,data,len,100);}// 增量添加新函数不修改原函数voidUART_Send_DMA(uint8_t*data,uint16_tlen){HAL_UART_Transmit_DMA(huart1,data,len);}优点不修改原函数不影响已有调用容易管理缺点函数数量增加2.4 方法四配置参数化适用场景参数修改、配置修改方法// 原始代码硬编码voidUART_Init(void){huart1.Init.BaudRate9600;// 硬编码}// 增量修改参数化#defineUART_BAUDRATE115200// 配置参数voidUART_Init(void){huart1.Init.BaudRateUART_BAUDRATE;// 使用配置参数}优点只修改配置不修改逻辑容易管理缺点需要重构原始代码三、Vibe模式增量迭代3.1 Vibe增量迭代的Prompt技巧技巧一明确修改范围Prompt 在现有工程基础上只修改UART驱动 - 不修改其他驱动 - 不修改全局配置 - 不修改接口定义 现有代码 [粘贴现有UART代码] 修改需求 [具体修改需求] 技巧二提供完整上下文Prompt 现有工程结构 ├── drivers/ │ ├── uart.c // 需要修改 │ ├── spi.c // 不修改 │ └── i2c.c // 不修改 现有UART代码 [粘贴代码] 修改需求 [需求] 请生成修改后的uart.c不要修改其他文件 技巧三要求增量代码Prompt 请生成增量修改代码 - 只生成需要修改的函数 - 标注修改部分 - 不要生成完整文件 原始函数 [原始函数] 修改需求 [需求] 3.2 典型案例修改UART波特率场景将UART波特率从9600改为115200错误做法直接修改UART_Init函数可能影响其他模块正确做法Vibe增量迭代第一步提供上下文Prompt 现有工程 - UART驱动uart.c - 协议层protocol.c使用UART - 应用层app.c使用协议 现有UART初始化 c void UART_Init(void) { huart1.Init.BaudRate 9600; // ... 其他配置 }修改需求将波特率改为115200不影响协议层和应用层不修改其他配置请生成增量修改代码**第二步AI生成增量代码** c // AI生成的增量修改 // 方法1修改配置参数推荐 // 在uart.h中修改配置宏 #define UART_BAUDRATE 115200 // 原为9600 // 方法2修改初始化函数 // 在uart.c中修改 void UART_Init(void) { huart1.Init.BaudRate 115200; // 修改此处 // ... 其他配置保持不变 }第三步验证修改验证 1. UART通信正常 2. 协议层正常工作 3. 应用层正常工作 4. 无其他影响3.3 典型案例添加新驱动场景在现有工程基础上添加ADC驱动正确做法Vibe增量迭代第一步提供上下文Prompt 现有工程 ├── drivers/ │ ├── uart.c │ ├── spi.c │ └── i2c.c ├── main.c 需要添加 - ADC驱动adc.c 要求 - 不修改已有驱动 - 不修改main.c暂时 - 生成独立的adc.c和adc.h ADC需求 - 使用ADC1通道0PA0 - 采样周期1ms - 使用DMA传输 第二步AI生成新驱动// adc.h#ifndef__ADC_H#define__ADC_H#includestm32f1xx_hal.hvoidADC_Init(void);uint16_tADC_Read(void);#endif// adc.c#includeadc.hADC_HandleTypeDef hadc1;uint16_tadc_value;voidADC_Init(void){hadc1.InstanceADC1;hadc1.Init.ScanConvModeADC_SCAN_DISABLE;hadc1.Init.ContinuousConvModeENABLE;hadc1.Init.ExternalTrigConvADC_SOFTWARE_START;hadc1.Init.DataAlignADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion1;HAL_ADC_Init(hadc1);// 配置通道ADC_ChannelConfTypeDef sConfig{0};sConfig.ChannelADC_CHANNEL_0;sConfig.RankADC_REGULAR_RANK_1;sConfig.SamplingTimeADC_SAMPLETIME_55CYCLES_5;HAL_ADC_ConfigChannel(hadc1,sConfig);// 启动ADCHAL_ADC_Start(hadc1);}uint16_tADC_Read(void){returnHAL_ADC_GetValue(hadc1);}第三步集成到工程手动操作 1. 将adc.c和adc.h添加到工程 2. 在main.c中调用ADC_Init() 3. 编译测试3.4 典型案例修复驱动Bug场景I2C驱动连续读取失败正确做法Vibe增量迭代第一步提供上下文Prompt 现有I2C驱动 c void I2C_Read(uint8_t addr, uint8_t *data, uint16_t len) { HAL_I2C_Master_Receive(hi2c, addr, data, len, 100); }问题连续读取失败第一次正常后续错误分析可能是总线恢复时间不足修复需求添加总线恢复延时不修改其他函数不修改接口请生成修复后的函数**第二步AI生成修复代码** c // 修复后的函数 void I2C_Read(uint8_t addr, uint8_t *data, uint16_t len) { HAL_I2C_Master_Receive(hi2c, addr, data, len, 100); HAL_Delay(5); // 添加总线恢复延时 }第三步验证修复验证 1. 连续读取正常 2. 不影响其他I2C操作 3. 不影响其他驱动四、增量迭代的注意事项4.1 避免全局修改错误做法// 修改全局配置voidSystemClock_Config(void){// 修改系统时钟影响所有外设}正确做法// 只修改相关外设配置voidUART_Init(void){// 只修改UART配置不影响其他外设}4.2 保持接口兼容错误做法// 修改接口定义int8_tUART_Send(uint8_t*data,uint16_tlen,uint32_ttimeout);// 新增参数// 所有调用都需要修改正确做法// 保持接口不变int8_tUART_Send(uint8_t*data,uint16_tlen);// 接口不变// 内部实现修改int8_tUART_Send(uint8_t*data,uint16_tlen){returnHAL_UART_Transmit(huart1,data,len,100);// 内部修改}4.3 记录修改内容方法一注释记录voidI2C_Read(uint8_taddr,uint8_t*data,uint16_tlen){HAL_I2C_Master_Receive(hi2c,addr,data,len,100);HAL_Delay(5);// [2024-01-15] 添加总线恢复延时修复连续读取失败问题}方法二版本控制使用Git记录修改 git commit -m 修复I2C连续读取失败添加总线恢复延时方法三修改日志修改日志 - 2024-01-15修复I2C连续读取失败 - 文件i2c.c - 函数I2C_Read - 修改添加HAL_Delay(5) - 原因总线恢复时间不足五、增量迭代的工具支持5.1 版本控制工具Git工作流1. 创建分支git checkout -b feature/uart-modify 2. 修改代码 3. 提交修改git commit -m 修改UART波特率 4. 测试验证 5. 合并分支git merge feature/uart-modify优点完整记录修改容易回退支持分支开发5.2 代码对比工具Beyond Compare / WinMerge对比修改前后的代码 - 高亮显示差异 - 容易发现意外修改 - 确认修改范围5.3 静态分析工具PC-lint / Cppcheck检查修改后的代码 - 是否引入新问题 - 是否影响其他模块 - 是否符合规范六、本讲核心要点6.1 记住这三句话增量迭代原则最小修改、隔离修改、可回退增量迭代方法条件编译、独立文件、独立函数、配置参数化Vibe增量迭代明确修改范围、提供完整上下文、要求增量代码6.2 实践建议对于新手学习增量迭代方法使用版本控制工具记录修改内容对于有经验工程师建立增量迭代工作流使用分支开发代码审查确认修改范围6.3 下讲预告第20讲将深入讲解报错驱动修复用串口日志、硬件报错引导AI排错当驱动出现问题时如何用日志和报错信息引导AI快速定位和修复问题下一讲将详细讲解。

相关新闻

国产越冬甘蓝种业逆袭:从技术突破到产业化应用

国产越冬甘蓝种业逆袭:从技术突破到产业化应用

1. 国产越冬甘蓝的产业突围之路记得2015年冬天第一次在山东寿光蔬菜基地见到越冬甘蓝试验田时,那些被冻得发紫的菜苗让我这个从业二十年的老农技员都捏了把汗。谁能想到,短短八年时间,国产越冬甘蓝品种的市场占有率就从不足30%跃升到现在的68…

2026/10/13 4:08:33 阅读更多 →
南极科考技术突破:冰下微生物与臭氧层修复新发现

南极科考技术突破:冰下微生物与臭氧层修复新发现

1. 南极科考新突破:冰盖下发现未知微生物群落我国第39次南极科学考察队近日在东南极冰盖下约800米深处,首次发现并成功分离培养出一组全新的微生物群落。这项发现由昆仑站深冰芯钻探团队完成,通过改进的低温无菌采样技术,在零下55…

2026/9/28 5:33:00 阅读更多 →
终极AMD Ryzen硬件调试指南:解锁处理器深层性能的免费开源工具

终极AMD Ryzen硬件调试指南:解锁处理器深层性能的免费开源工具

终极AMD Ryzen硬件调试指南:解锁处理器深层性能的免费开源工具 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…

2026/10/12 21:12:51 阅读更多 →

最新新闻

.NET中JSON Patch实战:从RFC 6902到REST API部分更新

.NET中JSON Patch实战:从RFC 6902到REST API部分更新

上周做系统重构时,一个同组的同事突然问我:"改一个字段,客户端为什么要传一整个对象?"这个问题我太熟悉了。在用 .NET 写 Web API 的几年里,几乎每次做资源更新接口,都要面对"改一个状态值&…

2026/10/13 4:09:01 阅读更多 →
基于Zipline的A股回测框架改造:从交易日历到撮合规则

基于Zipline的A股回测框架改造:从交易日历到撮合规则

简介:面向A股量化策略开发者的ZipLine本地化Python框架,重点解决原版仅适配美股、无法应对T1交易规则、A股交易时段以及A/H差异等问题。内含完整回测与数据导入能力,用户可用pandas处理历史行情、计算因子,再通过matplotlib生成收…

2026/10/13 4:09:01 阅读更多 →
美赛O奖论文的建模思维黑匣子:从PDF到可执行知识图谱

美赛O奖论文的建模思维黑匣子:从PDF到可执行知识图谱

简介:本资源汇集2004—2020年美国大学生数学建模竞赛(MCM/ICM)全部Outstanding Winner(O奖)获奖论文,面向数学建模初学者、竞赛备赛学生及指导教师,提供权威、完整的高分方案范本与解题逻辑参考…

2026/10/13 4:09:01 阅读更多 →
FANUC FOCAS2以太网通信实战:从寄存器读取到Web实时HMI

FANUC FOCAS2以太网通信实战:从寄存器读取到Web实时HMI

简介:本资源是面向工业自动化工程师、数控系统集成人员及智能制造领域开发者的FANUC CNC屏幕显示功能实战资料包,聚焦FOCAS2以太网通信协议下的远程监控与界面交互实现。资源完整覆盖CNC状态实时采集、NC程序远程上传、报警信息解析、加工数据可视化等核…

2026/10/13 4:09:01 阅读更多 →
9个实用降AI率工具全解析:原理、搭配与完整实操流程

9个实用降AI率工具全解析:原理、搭配与完整实操流程

期末周的凌晨两点,A同学把AI生成的文献综述发给导师之前,顺手上传到某个检测平台,看到整页飘红的“AI疑似率82%”,整个人直接清醒。这几年本科生几乎人手一个AI写作助手,但交作业前最怕看到的就是那一串数字。“降AI率…

2026/10/13 4:09:01 阅读更多 →
鸿蒙环境下React Native列表开发实践:组件封装、性能优化与跨端适配

鸿蒙环境下React Native列表开发实践:组件封装、性能优化与跨端适配

各位做跨端开发的朋友,今天想聊聊我在鸿蒙生态下用 React Native 做列表类页面的一次完整实践。先说结论:在鸿蒙设备上跑 RN 已经不再是"能不能跑"的问题,而是"怎么跑得稳、跑得像原生"的问题。这篇内容会从组件封装、Pr…

2026/10/13 4:08:01 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →