嵌入式项目骨架
新项目启动时 clone 即用的目录模板,编码了从需求到量产的全流程。
🔴目录结构
project/
├── 00_Project_Management/ # 项目管理(流程、质量、合规)
│ ├── 00_需求导入_QFD/ # QFD:客户声音 → 工程指标
│ ├── 01_需求约束_Pugh/ # Pugh矩阵:多方案对比选型
│ ├── 02_需求转化_Basic_Statics/ # 需求 → 可量化技术参数
│ ├── 03_功能图谱_Function_Map/ # 流程节点 → 跳转到 01_Function_Map
│ ├── 04_功能风险管控_DFMEA/ # 设计失效模式与影响分析
│ ├── 04_法规认证_国内_国外/ # CCC/FCC/CE 等认证
│ ├── 04_知识产权_国内国外/ # 专利/软著
│ ├── 05_敏捷开发_Scrum/ # Sprint 迭代
│ ├── 06_持续集成与测试_DevOps/ # CI/CD、自动化测试
│ ├── 07_产品生产管理_Six_Sigma/ # 量产质量管理
│ └── 08_缺陷管理追踪_Jira/ # 缺陷追踪
├── 00_Reference/ # 参考资料(手册、标准、竞品)
├── 01_Function_Map/ # 功能列表——先定"做什么",再分发
├── 02_Hardware/ # 硬件(原理图、PCB、BOM)
├── 03_Firmware/ # 固件(直接跟硬件打交道的底层代码)
├── 04_Software/ # 上位机 / 算法 / 工具软件
├── 05_Mechanical/ # 机械结构
├── 06_FCT/ # 产线自检工具链
├── 07_Tools/ # 项目辅助脚本
└── readme.md # 工作流箭头链(路线图,不是简介)
🔴敏捷开发和瀑布开发的区别是什么?各自的优势?
| 维度 | 敏捷 | 瀑布 |
|---|---|---|
| 交付节奏 | 短周期迭代(1-4 周一个 sprint) | 一次性最终交付 |
| 需求变更 | 拥抱变化,随时调整优先级 | 冻结需求,变更走 CR 流程成本高 |
| 文档 | 够用就好,重可工作软件 | 完备文档驱动,每个阶段有交付件 |
| 客户参与 | 持续参与,每个迭代给反馈 | 主要在需求阶段和验收阶段出现 |
| 测试介入 | 贯穿始终(TDD、持续集成) | 开发完成后才进入测试阶段 |
| 团队结构 | 自组织、跨职能小团队 | 角色分明,按阶段交接 |
敏捷适合:
- 需求不确定、市场变化快的产品(互联网、SaaS)
- 需要快速验证假设的创业场景
- 团队与客户能紧密协作
瀑布适合:
- 需求固定、合规要求高的项目(航天、医疗设备、政府招标)
- 硬件耦合紧密、中途改动代价极大的系统
- 团队分散、客户无法持续参与
两者的本质取舍:敏捷用流程灵活性换适应性,瀑布用前期规划换可预测性。
🔴02_需求转化
在需求转化为功能时,首先需要明确需求的关键细节,然后逐步将其分解为具体的功能模块和实现方式。以”我的产品需要保存一周的运行数据”为例,转化的过程可以按照以下步骤进行:
1.需求分析
需求明确:产品需要保存一周的运行数据。 关键问题:数据量:每秒/分钟/小时产生多少数据? 数据保存频率:是实时保存还是定时采样? 存储介质:是使用外部存储(如SD卡、EEPROM、Flash)还是内部存储(如微控制器的RAM/Flash)? 保存格式:数据的存储格式是什么(如CSV、二进制、JSON等)? 数据读取:数据是只写入,还是需要定期读取、备份?
功能分解
根据以上需求,可以将其分解为以下功能: 数据采集功能: 定义哪些数据需要被保存(例如传感器数据、设备状态、运行日志等)。 确定数据采集的频率,例如每秒钟采集一次温度数据。 存储管理功能: 数据的存储介质和方法选择:决定将数据存储在外部Flash、EEPROM,或者用环形缓存管理。 实现数据的读写接口:实现对存储设备的读取、写入操作,考虑断电后的数据保护。 确保存储空间足够保存一周的数据。如果内存空间不足,可以采用覆盖式存储(即环形缓冲区)来管理数据。 数据压缩与优化: 如果数据量大,可能需要考虑对数据进行压缩以节省存储空间。 数据回放与导出功能: 为了确保数据能够在需要时被读取或导出,可能需要提供一个接口,通过USB、蓝牙等方式将数据导出到其他设备进行分析。 数据清理功能: 每周或当存储达到一定阈值时清除过期数据,保持最新的一周数据。
技术实现
在需求转化为功能后,还需要考虑具体的技术实现细节和路径: 选择合适的存储方案: 使用外部Flash存储器,如W25Q系列,或者内部Flash(如果设备支持)。 定时写入操作:每小时或每分钟写入一次,避免频繁写操作导致存储器寿命缩短。 数据结构设计: 设计一个合理的结构来存储数据,例如使用时间戳和数据值的键值对来存储。 异常处理和数据保护: 考虑到断电或意外关机的情况,确保数据不会丢失,使用文件系统(如FatFS)或者简单的日志记录机制来保护数据。
最终:
如果你需要保存温度数据,你的需求转化为具体功能的过程可能是: 每秒读取一次温度传感器数据,记录到内部缓存; 每秒读取一次温度传感器数据,记录到内部缓存; 每小时将缓存中的数据打包并写入外部Flash存储器; 使用时间戳来标记每一条数据; 设置一个环形缓存,确保当一周的数据达到存储上限时,覆盖最旧的数据。
这样,通过对需求的逐层分解和分析,便能够将”保存一周的运行数据”转化为可以执行的具体功能,然后有了具体功能,再去思考具体的实现路径和技术方案。
🔴03_firmware
与software和hardware相区分,固件(Firmware)就是写入EROM或EPROM(可编程只读存储器)中的程序,通俗的理解就是”固化的软件”。
比如我们编写的mcu代码,它就是通过烧录器固化在集成电路内部的程序代码,负责控制和协调集成电路的功能。所以可以理解为我们编写的,直接跟硬件打交道的底层代码,都是固件
而software一般用来存放上位机程序,算法之类