第42讲:嵌入式四段式万能Spec模板——适配所有驱动/任务/协议

CSDN专栏:

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

第42讲:嵌入式四段式万能Spec模板——适配所有驱动/任务/协议

一、四段式Spec模板概述

四段式Spec模板是嵌入式开发的万能模板,适用于所有场景:驱动开发、任务设计、协议实现。

1.1 四段式结构

第一层:需求层
Requirement

第二层:设计层
Design

第三层:编码层
Coding

第四层:测试层
Test

第一层:需求层(Requirement)

  • 功能需求
  • 性能需求
  • 安全需求

第二层:设计层(Design)

  • 硬件层设计
  • 数据层设计
  • 函数契约设计
  • 容错边界设计

第三层:编码层(Coding)

  • 编码规范
  • 命名规范
  • 注释规范

第四层:测试层(Test)

  • 单元测试
  • 集成测试
  • 覆盖率要求

1.2 模板特点

特点一:通用性

适用于:

  • GPIO驱动
  • UART驱动
  • SPI驱动
  • I2C驱动
  • ADC驱动
  • PWM驱动
  • RTOS任务
  • 通信协议

特点二:完整性

覆盖:

  • 所有功能需求
  • 所有接口定义
  • 所有异常处理
  • 所有性能要求

特点三:可追溯性

每个Spec条款有唯一ID:

  • REQ-001:需求ID
  • DES-001:设计ID
  • COD-001:编码ID
  • TEST-001:测试ID

二、万能Spec模板

2.1 完整模板

## Spec:[模块名称] ### 1. 需求层(Requirement) #### 1.1 功能需求 - REQ-001:[功能需求1] - REQ-002:[功能需求2] - REQ-003:[功能需求3] #### 1.2 性能需求 - REQ-010:[性能需求1] - REQ-011:[性能需求2] #### 1.3 安全需求 - REQ-020:[安全需求1] - REQ-021:[安全需求2] ### 2. 设计层(Design) #### 2.1 硬件层约束 - DES-001:[硬件约束1] - 约束类型:[时序/电气/环境] - 约束值:[具体数值] - 验证方法:[验证方法] - DES-002:[硬件约束2] #### 2.2 数据层约束 - DES-010:[数据结构定义] - 类型:[数据类型] - 范围:[最小值, 最大值] - 默认值:[默认值] - 校验方法:[校验方法] - DES-011:[数据格式定义] #### 2.3 函数契约 - DES-020:[函数名] - 签名:[函数签名] - 入参约束:[参数约束] - 出参约束:[输出约束] - 返回值约束:[返回值约束] - 副作用:[副作用描述] - 执行时间上限:[时间上限] - DES-021:[函数名2] #### 2.4 容错边界 - DES-030:[异常类型1] - 检测方法:[检测方法] - 响应措施:[响应措施] - 恢复策略:[恢复策略] - 记录要求:[记录要求] - DES-031:[异常类型2] ### 3. 编码层(Coding) #### 3.1 编码规范 - COD-001:遵循MISRA C:2012规范 - COD-002:禁止动态内存分配 - COD-003:禁止指针运算 - COD-004:所有变量必须初始化 - COD-005:所有函数必须有单一出口 #### 3.2 命名规范 - COD-010:函数命名:模块名_功能名(如:UART_Init) - COD-011:变量命名:类型前缀_模块_名称(如:u8_UART_TxBuffer) - COD-012:宏定义:全大写(如:UART_BUFFER_SIZE) #### 3.3 注释规范 - COD-020:使用Doxygen格式注释 - COD-021:每个函数必须有注释块 - COD-022:注释必须标注对应Spec ID ### 4. 测试层(Test) #### 4.1 单元测试 - TEST-001:[测试用例1] - 测试目标:[目标Spec ID] - 测试输入:[输入数据] - 期望输出:[期望结果] - 前置条件:[前置条件] - TEST-002:[测试用例2] #### 4.2 集成测试 - TEST-010:[集成测试场景1] - TEST-011:[集成测试场景2] #### 4.3 覆盖率要求 - TEST-020:语句覆盖率:≥80% - TEST-021:分支覆盖率:≥80% ### 5. 追溯层(Traceability) #### 5.1 需求追溯矩阵 | 需求ID | 设计ID | 代码文件 | 函数名 | 测试ID | |-------|--------|---------|--------|--------| | REQ-001 | DES-020 | uart.c | UART_Init | TEST-001 | | REQ-002 | DES-021 | uart.c | UART_Send | TEST-002 | ### 6. AI生成指令 根据以上Spec生成代码,要求: 1. 严格遵守所有Spec约束 2. 每个函数注释标注对应Spec ID 3. 包含所有Spec要求的功能 4. 包含所有Spec要求的容错处理 5. 符合编码规范

三、模板应用示例

3.1 GPIO驱动Spec

## Spec:GPIO驱动 ### 1. 需求层 #### 1.1 功能需求 - REQ-001:配置GPIO引脚为输入/输出模式 - REQ-002:读取GPIO输入状态 - REQ-003:设置GPIO输出状态 - REQ-004:切换GPIO输出状态 #### 1.2 性能需求 - REQ-010:GPIO操作响应时间<1us #### 1.3 安全需求 - REQ-020:参数检查,防止非法引脚号 ### 2. 设计层 #### 2.1 硬件层约束 - DES-001:GPIO端口 - GPIOA:PA0-PA15 - GPIOB:PB0-PB15 - GPIOC:PC0-PC15 - DES-002:GPIO模式 - 输入模式:GPIO_MODE_INPUT - 输出模式:GPIO_MODE_OUTPUT_PP/GPIO_MODE_OUTPUT_OD - 复用模式:GPIO_MODE_AF_PP/GPIO_MODE_AF_OD - 模拟模式:GPIO_MODE_ANALOG #### 2.2 数据层约束 - DES-010:GPIO引脚号 - 类型:uint16_t - 范围:GPIO_PIN_0 ~ GPIO_PIN_15 - 默认值:无 - DES-011:GPIO状态 - 类型:uint8_t - 范围:0或1 - 默认值:无 #### 2.3 函数契约 - DES-020:GPIO_Init - 签名:int8_t GPIO_Init(uint32_t port, uint16_t pin, uint8_t mode) - 入参约束:port有效,pin有效,mode有效 - 返回值约束:0成功,-1失败 - 执行时间上限:<100us - DES-021:GPIO_Read - 签名:int8_t GPIO_Read(uint32_t port, uint16_t pin, uint8_t *state) - 入参约束:port有效,pin有效,state非空 - 出参约束:state为0或1 - 返回值约束:0成功,-1失败 - DES-022:GPIO_Write - 签名:int8_t GPIO_Write(uint32_t port, uint16_t pin, uint8_t state) - 入参约束:port有效,pin有效,state为0或1 - 返回值约束:0成功,-1失败 #### 2.4 容错边界 - DES-030:非法端口 - 检测方法:端口枚举检查 - 响应措施:返回-1 - DES-031:非法引脚 - 检测方法:引脚范围检查 - 响应措施:返回-1 ### 3. 编码层 - COD-001:遵循MISRA C:2012规范 - COD-010:函数命名:GPIO_功能名 - COD-020:使用Doxygen格式注释 ### 4. 测试层 - TEST-001:测试GPIO输出 - 测试目标:DES-022 - 测试输入:port=GPIOA, pin=GPIO_PIN_5, state=1 - 期望输出:PA5输出高电平 - TEST-002:测试GPIO输入 - 测试目标:DES-021 - 测试输入:port=GPIOC, pin=GPIO_PIN_13 - 期望输出:正确读取PC13状态 ### 5. AI生成指令 根据以上Spec生成GPIO驱动代码

3.2 UART驱动Spec

## Spec:UART驱动 ### 1. 需求层 #### 1.1 功能需求 - REQ-001:初始化UART - REQ-002:发送数据 - REQ-003:接收数据 - REQ-004:配置波特率、数据位、停止位、校验位 #### 1.2 性能需求 - REQ-010:波特率误差<2% - REQ-011:发送超时100ms - REQ-012:接收超时100ms #### 1.3 安全需求 - REQ-020:参数检查,防止空指针 - REQ-021:超时处理,防止卡死 ### 2. 设计层 #### 2.1 硬件层约束 - DES-001:UART实例 - USART1:PA9(TX), PA10(RX) - USART2:PA2(TX), PA3(RX) - USART3:PB10(TX), PB11(RX) - DES-002:UART配置 - 波特率:9600/19200/38400/57600/115200 - 数据位:8位 - 停止位:1位 - 校验位:无 #### 2.2 数据层约束 - DES-010:发送缓冲区 - 类型:uint8_t[256] - 大小:256字节 - DES-011:接收缓冲区 - 类型:uint8_t[256] - 大小:256字节 #### 2.3 函数契约 - DES-020:UART_Init - 签名:int8_t UART_Init(uint8_t uartId, uint32_t baudrate) - 入参约束:uartId有效,baudrate有效 - 返回值约束:0成功,-1失败 - DES-021:UART_Send - 签名:int8_t UART_Send(uint8_t uartId, uint8_t *data, uint16_t len) - 入参约束:uartId有效,data非空,len>0 - 返回值约束:0成功,-1失败 - DES-022:UART_Receive - 签名:int8_t UART_Receive(uint8_t uartId, uint8_t *data, uint16_t len) - 入参约束:uartId有效,data非空,len>0 - 返回值约束:0成功,-1失败 #### 2.4 容错边界 - DES-030:发送超时 - 检测方法:超时计时器 - 响应措施:返回-1 - DES-031:接收超时 - 检测方法:超时计时器 - 响应措施:返回-1 - DES-032:空指针 - 检测方法:指针检查 - 响应措施:返回-1 ### 3. 编码层 - COD-001:遵循MISRA C:2012规范 - COD-010:函数命名:UART_功能名 - COD-020:使用Doxygen格式注释 ### 4. 测试层 - TEST-001:测试UART发送 - 测试目标:DES-021 - 测试输入:"Hello" - 期望输出:正确发送 - TEST-002:测试UART接收 - 测试目标:DES-022 - 测试输入:接收5字节 - 期望输出:正确接收 ### 5. AI生成指令 根据以上Spec生成UART驱动代码

四、模板使用方法

4.1 填写步骤

步骤一:填写需求层

步骤二:填写设计层

步骤三:填写编码层

步骤四:填写测试层

步骤一:填写需求层

  • 列出所有功能需求
  • 列出所有性能需求
  • 列出所有安全需求

步骤二:填写设计层

  • 定义硬件约束
  • 定义数据结构
  • 定义函数契约
  • 定义容错边界

步骤三:填写编码层

  • 定义编码规范
  • 定义命名规范
  • 定义注释规范

步骤四:填写测试层

  • 设计单元测试
  • 设计集成测试
  • 定义覆盖率要求

4.2 AI生成代码

Prompt

【Spec】 [粘贴完整Spec] 【指令】 请根据以上Spec生成代码

4.3 验证代码

验证清单

  • 功能完整性
  • 接口正确性
  • 容错完整性
  • 性能达标
  • 编码规范

五、本讲核心要点

5.1 记住这三句话

  1. 四段式Spec模板:需求层→设计层→编码层→测试层,适配所有场景

  2. 模板特点:通用性、完整性、可追溯性

  3. 使用方法:填写Spec→AI生成→验证代码

5.2 下讲预告

第43讲将详细讲解:硬件层Spec:引脚定义、时钟、电压、时序约束

如何编写硬件层Spec,定义硬件约束?下一讲将详细讲解。