GD32 ARM单片机开发规范检查清单 GD32嵌入式C代码检查清单

GD32 ARM单片机开发规范检查清单

以下检查清单基于您的编程规范制定,可用于代码审查和自检过程。通过逐项检查,确保代码符合项目规范要求。

代码审查流程
基础规范检查
功能实现检查
性能与安全检查
文档与注释检查
命名规范
格式规范
结构规范
功能完整性
API设计
错误处理
资源使用
安全措施
性能优化
代码注释
文档完整性

一、基础规范检查

1.1 文件组织

  • 每个C源文件(.c)是否有对应的头文件(.h)
  • 文件名是否使用小写字母并用下划线分隔
  • 文件名是否清晰表达文件功能
  • 头文件是否只包含接口声明(避免实现代码)
  • 头文件是否使用防重复包含宏定义 (#ifndef/#define/#endif)
  • 是否按照功能相关性组织文件内容

1.2 命名规范

  • 全局变量是否添加_g后缀
  • 静态局部变量是否添加_s后缀
  • 指针变量是否使用xxxPtr命名
  • 变量名是否使用驼峰形式(如pinNumber)
  • 函数名是否使用下划线形式并以动词开头(如read_gpio_pin)
  • 宏定义是否全部大写并使用下划线分隔
  • 枚举类型是否使用_enumType_t后缀
  • 结构体是否按规范定义(typedef struct xxx_struct xxx_t)
  • 常用词是否使用规定的缩写(如buffer缩写为buff)
  • 是否避免单字节变量命名(除循环变量i、j、k外)

1.3 格式规范

  • 缩进是否统一为4个空格
  • 相对独立的程序块之间是否加空行
  • 操作符前后是否加空格(紧密关联的除外)
  • 过长语句是否适当换行,并在低优先级操作符处划分
  • 换行时操作符是否放在新行首
  • 代码行长度是否合理(不超过80-120字符)

二、代码结构检查

2.1 函数设计

  • 函数是否遵循单一职责原则
  • 函数长度是否合理(非空非注释行不超过50行)
  • 代码块嵌套深度是否不超过4层
  • 内部函数是否使用static声明
  • 外部接口函数是否有完整参数和返回值说明
  • 参数顺序是否遵循输入在前输出在后的原则
  • 参数较多时(>3个)是否考虑封装为结构体传递
  • 函数是否有统一的错误返回机制(4000系列错误码)

2.2 模块化设计

  • 代码是否按功能进行模块化组织
  • 模块接口是否清晰明确
  • 全局变量是否仅由一个模块负责修改
  • 是否通过API函数访问模块内部数据(而非直接访问)
  • 模块间依赖关系是否清晰合理

2.3 中断处理(补充项)

  • 中断函数命名是否符合规范(模块名_IRQHandler)
  • 中断服务程序是否尽可能短小(执行时间<10μs)
  • 是否避免在中断中执行耗时操作(使用标志位模式)
  • 中断中使用的共享变量是否添加volatile限定符
  • 是否正确处理中断优先级设置
  • 是否正确清除中断标志位

三、语法使用检查

3.1 数据类型使用

  • 是否避免隐式类型转换
  • 需要转换时是否使用显式转换并确保正确性
  • 是否使用const定义常量(优先于宏定义)
  • 对于指针参数,是否正确使用const限定符
  • 结构体成员是否按照大小顺序排列(减少内存对齐填充)

3.2 语言特性使用

  • 是否避免C语言危险函数(strcpy、gets等)
  • 是否使用更安全的替代函数(strncpy、fgets等)
  • switch-case语句是否有default分支
  • 枚举类型switch是否处理所有可能值
  • 是否避免使用goto语句(特殊情况除外)
  • 是否合理使用内联函数(频繁调用的短小函数)

四、错误处理与验证检查

4.1 参数验证

  • 函数入口处是否对输入参数进行有效性验证
  • 对于指针参数,是否检查NULL
  • 对于数值参数,是否检查范围有效性
  • 对于枚举参数,是否检查是否为有效枚举值

4.2 错误处理

  • 是否统一使用错误码机制
  • 错误码是否按模块分类(如4000-4099系统级错误)
  • 函数返回错误时,是否提供足够的错误信息
  • 调用函数时,是否检查返回的错误码
  • 是否有适当的错误日志记录机制

4.3 边界条件处理

  • 是否考虑并处理边界条件(如0、最大值、溢出等)
  • 数组操作是否检查索引越界
  • 除法操作是否检查除数为零
  • 内存操作是否检查分配失败情况

五、资源管理检查

5.1 内存管理

  • 动态分配的内存是否配对释放(避免内存泄漏)
  • 是否检查malloc等分配函数的返回值
  • 堆内存使用是否合理(考虑嵌入式环境限制)
  • 栈空间使用是否合理(避免栈溢出)
  • 大数组是否定义为静态或全局变量(避免栈溢出)

5.2 外设资源管理

  • 外设初始化和配置是否集中管理
  • 共享资源是否有互斥访问机制
  • 使用完毕的外设是否及时关闭或休眠(省电)
  • 是否通过标准库函数而非直接访问寄存器操作外设
  • DMA等高级功能是否正确配置和管理

5.3 低功耗管理(补充项)

  • 是否关闭非必要外设时钟以节省功耗
  • 是否合理配置和使用低功耗模式
  • 是否正确配置唤醒源
  • 是否在进入低功耗前保存必要状态
  • 是否在唤醒后正确恢复系统状态

六、性能优化检查

6.1 算法优化

  • 是否选择了合适的算法(考虑时间和空间复杂度)
  • 循环中是否避免重复计算不变量
  • 是否减少不必要的函数调用(特别是在关键路径)
  • 是否使用查表法代替复杂计算(适用情况下)
  • 是否合理使用位操作优化算法

6.2 硬件特性利用

  • 是否利用了硬件加速功能(如硬件乘法器)
  • 是否使用DMA减轻CPU负担
  • 是否合理配置Cache(如有)
  • 是否利用GD32特有的硬件特性优化性能
  • 关键计算是否考虑使用汇编优化

七、文档与注释检查

7.1 代码注释

  • 文件头部是否有详细注释(包括功能、作者、日期等)
  • 函数声明处是否有详细注释(参数、返回值、功能)
  • 复杂算法是否有详细解释
  • 重要变量是否有说明注释
  • 注释是否放在代码上方相邻位置或右方(不放在下方)
  • 对于可能为0的运算结果是否添加// maybe 0注释

7.2 版本管理

  • 代码修改是否有修改记录(日期、作者、内容)
  • 是否记录了版本号和对应功能
  • 移除或注释代码是否说明原因

八、硬件抽象层检查(补充项)

8.1 HAL设计

  • 是否实现了硬件抽象层接口
  • 硬件依赖代码是否集中在特定文件中
  • 是否使用函数指针结构体方式实现硬件抽象
  • 应用代码是否通过抽象接口而非直接访问硬件
  • 不同硬件平台切换是否仅需修改底层实现

九、编译器与工具链检查

9.1 编译器特性使用

  • 是否避免使用非标准扩展(除非必要)
  • 是否正确使用预处理指令(#if/#ifdef等)
  • 是否使用pragma指令控制特定编译行为(必要时)
  • 是否使用__attribute__等ARM特有特性优化代码

9.2 编译警告处理

  • 代码是否能以高警告级别编译通过(-Wall -Werror)
  • 是否修正了所有隐式声明警告
  • 是否处理了所有未使用变量警告
  • 是否处理了所有可能的类型转换警告
  • 是否处理了结构体填充警告

使用说明

  1. 在每次代码审查或提交前使用此清单检查代码
  2. 对于每个检查项,标记为"是"表示符合规范,"否"表示需要修改
  3. 对于"否"项,记录需要修改的内容和位置
  4. 持续更新此清单以适应项目需求变化
  5. 建议将此清单集成到CI/CD流程中,自动化部分检查项

优先级分类

  • 必须项:影响代码正确性和安全性的项目(如错误处理、资源管理)
  • 重要项:影响代码可维护性和效率的项目(如命名规范、注释)
  • 建议项:有助于提高代码质量但不影响功能的项目(如某些优化)

根据项目阶段和资源情况,可以选择优先关注必须项和重要项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…

《Oracle DBA入门实战:十大高频问题详解与避坑指南》

Oracle DBA 入门作业十问十答 本文为 Oracle DBA 入门作业整理&#xff0c;涵盖工具使用、配置管理及权限控制等核心知识点&#xff0c;适合新手快速上手。 如有疑问或补充&#xff0c;欢迎评论区交流&#xff01; 1. DBA 常用工具有哪些&#xff1f; Oracle Universal Instal…

解决用户同时登录轮询获取用户信息错乱,使用WebSocket和Server-Sent Events (SSE)

为什么更推荐WebSocket Server-Sent Events (SSE) 是一种服务器向客户端推送数据的单向通信协议&#xff0c;适合某些场景&#xff0c;在解决用户同时登录和实时获取用户信息的问题上&#xff0c;WebSocket 是更好的选择。 1. SSE 的局限性 单向通信 SSE 是单向的&#xff0…

发票查验/发票验真如何用Java实现接口调用

一、什么是发票查验&#xff1f;发票验真接口&#xff1f; 输入发票基本信息发票代码、发票号码、开票日期、校验码后6位、不含税金额、含税金额&#xff0c;核验发票真伪。 该接口也适用于机动车、二手车销售发票、航空运输电子客票、铁路电子客票等。 二、如何用Java实现接口…

html5-qrcode前端打开摄像头扫描二维码功能

实现的效果如图所示&#xff0c;全屏打开并且扫描到二维码后弹窗提醒&#xff0c;主要就是使用html5-qrcode这个依赖库&#xff0c;html5-qrcode开源地址&#xff1a;GitHub - mebjas/html5-qrcode: A cross platform HTML5 QR code reader. See end to end implementation at:…

cpp-友元

理解 C 中的友元&#xff08;Friend&#xff09; 在 C 语言中&#xff0c;封装&#xff08;Encapsulation&#xff09; 是面向对象编程的重要特性之一。它允许类将数据隐藏在私有&#xff08;private&#xff09;或受保护&#xff08;protected&#xff09;成员中&#xff0c;…

JavaWeb基础-HTTP协议、请求协议、响应协议

一. HTTP协议 1. HTTP协议&#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 2. HTTP协议特点&#xff1a; ① 基于TCP协议&#xff1a;面向链接&#xff0c;安全 ② 基于请求-响应模型的&#xff1a;一…

search_fields与filterset_fields的使用

在Django中&#xff0c;search_fields 和 filterset_fields 可以在视图类中使用&#xff0c;尤其是在 Django REST Framework (DRF) 中。它们分别用于实现搜索和过滤功能。以下是它们在视图类中的具体使用方法。 1. search_fields 在视图类中的使用 search_fields 是 DRF 中 S…

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型&#xff0c;用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求&#xff0c;而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识&#xff0c;确保对业务需…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker&#xff1a;在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

Java随机生成n位验证码

Java学习笔记 今天写一个随机生成n位的验证码&#xff0c;包含字母大小写和数字&#xff0c;直接见代码。 package com.itheima.hello;// 生成一个随机位数的验证码 public class ScannerDemo1 {public static void main(String[] args){System.out.println(getCode(4));Syst…

go复习目录

全部都是博主的学习笔记&#xff0c;放着链接用的&#xff0c;自己收藏&#xff0c;包含基础内容、go三方包、vue、数据结构、web框架、设计模式、docker、go连接kafka、redis、grpc、中间件 文章目录 基础内容go三方包vue数据结构web框架设计模式dockergo连接kafkaredisgrpc中…

23种设计模式-创建型模式-抽象工厂

文章目录 简介场景问题1. 风格一致性失控2. 对象创建硬编码3. 产品族管理失效 解决总结 简介 抽象工厂是一种创建型设计模式&#xff0c;可以生成相关对象系列&#xff0c;而无需指定它们的具体类。 场景 假设你正在写一个家具店模拟器。 你的代码这些类组成&#xff1a; 相…

案例:网络命名空间模拟隔离主机场景

场景描述 假设我们需要在同一台物理机上模拟两台独立的主机&#xff08;Host A 和 Host B&#xff09;&#xff0c;它们分别位于不同的网络命名空间中&#xff0c;并通过虚拟以太网对&#xff08;veth pair&#xff09;进行通信。目标是展示网络命名空间的隔离性和跨命名空间的…

新闻发布时间抽取(二)

1. 再论抽取方法 在前一期实验中&#xff0c;对gne组件进行分析和完善&#xff0c;对三种时间抽取的方法进行了实验对比。 在对抽取结果进行个例分析的过程中&#xff0c;我发现此前实验存在几个问题&#xff1a; 抽取的1000篇新闻存在一定的重复&#xff0c;经过ID去重大约减…

算法基础——栈

一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶&#xff0c;另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素&#xff0c;出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…

Android11至15系统定制篇

Android 11至15系统定制核心要点解析 一、Android 11关键定制特性 ‌分区存储强制化‌ 公共目录&#xff08;如Downloads、Pictures&#xff09;与应用专属目录分离&#xff0c;应用更新后无法通过requestLegacyExternalStorage绕过限制‌1。需申请MANAGE_EXTERNAL_STORAGE权限…

macOS 使用 enca 识别 文件编码类型(比 file 命令准确)

文章目录 macOS 上安装 enca基本使用起因 - iconv关于 enca安装 Encaenca & enconv 其它用法 macOS 上安装 enca brew install enca基本使用 enca filepath.txt示例 $ enca 动态规划算法.txt [0] Simplified Chinese National Standard; GB2312CRLF line terminat…

线段树与扫描线 —— 详解算法思想及其C++实现

目录 一、线段树&#xff08;Segment Tree&#xff09; 基本概念 结构 操作 示例代码 二、扫描线&#xff08;Sweep Line&#xff09; 基本概念 应用场景 示例代码&#xff08;矩形面积并集&#xff09; 三、总结 一、线段树&#xff08;Segment Tree&#xff09; 基本…

汇编代码中嵌入回调函数的优化说明

一、概述 在 PowerPC 的汇编代码中&#xff0c;我们需要实现调用 C 函数&#xff08;例如回调函数&#xff09;&#xff0c;并传递参数。本文将详细介绍如何通过一系列步骤完成这一目标&#xff0c;包括代码示例和详细的注释。 二、调用 C 函数的基本步骤及代码 1. 保存工作寄…