[研电赛技术支持] GD32实战1__编程规范

[复制链接]
1060|10
 楼主| 原来是wjc 发表于 2021-11-30 12:21 | 显示全部楼层 |阅读模式
目的
​ 规范是经验的积累,需要慢慢用心去体会。

规范
1. 原则
简洁明了,提高代码可读性,读的是代码而不是注释,注释永远都是辅助的。
零告警,严谨的语法才能保障代码表达和编译器理解的是一至的。
2. 排版
缩进4空格,杜绝tab键
程序块之间、变量声明之间,用空行分隔
突出语法关键字
一行不要太长,换行增加可读性
3. 注释
注释的目的是阐明意图目的,而不是翻译某行代码的动作
注释的原则是尽量代码自注释,代码越清晰,可读性越高
统一格式 /* 注释内容 */, *号与注释内容之间有一个空格

 楼主| 原来是wjc 发表于 2021-11-30 12:21 | 显示全部楼层
4. 定义
命名风格

模块名+文件名+功能描述,之间采用短下划线分隔
功能描述部分,采用驼峰风格
例如,
  1. VOID OS_TASK_TaskDelay(IN U16 ms);
 楼主| 原来是wjc 发表于 2021-11-30 12:22 | 显示全部楼层
宏定义

define 必须大写
typedef 可以小写
例如,

  1. #define OS_TASK_SWITCH_INTERVAL 10 /* 单位ms */
  2. typedef U32 StackSize_t;  /* 仅用于堆栈 */
 楼主| 原来是wjc 发表于 2021-11-30 12:22 | 显示全部楼层
类型定义

统一使用下面的,编程最关心符号位和位宽

  1. #define U8  unsigned char
  2. #define S8  char
  3. #define U16 unsigned short
  4. #define S16 short
  5. #define U32 unsigned int
  6. #define S32 int
  7. #define U64 unsigned long long
  8. #define S64 long long
  9. #define VOID void
  10. #define BOOL unsigned char

  11. #define TRUE 1
  12. #define FALSE 0
  13. #define NULL 0
 楼主| 原来是wjc 发表于 2021-11-30 12:23 | 显示全部楼层
5. 变量
局部变量
在函数开始是全部定义,不允许在函数中间定义
命名必须能传达该变量使用的意图
必须初始化
全局变量
在C文件中,函数之前统一定义
命名必须能传达该变量的使用意图,且以g开头
本地全局变量必须用static关键字
开发给外部使用的全局变量,必须在头文件中声明,且使用extern关键字
必须初始化
 楼主| 原来是wjc 发表于 2021-11-30 12:24 | 显示全部楼层
6. 函数
函数名必须能够自注释,必要是需要增加注释写明意图
参数必须使用IN、OUT、INOUT指明出入参类型
内部函数必须使用static定义,命名可以不加模块名
外部函数
必须在头文件中声明,
必须使用extern关键字,
命名时必须带模块名,
必须给出带注释,并写明函数意图,参数说明,返回值
 楼主| 原来是wjc 发表于 2021-11-30 12:25 | 显示全部楼层
7. 文件
头文件

命名规则模块名+功能,小写,例如os_task.h

格式如下
#ifndef __OS_TASK_H__
#define __OS_TASK_H__

..../* 开放的宏定义 */
..../* 开放的全局变量声明 */
..../* 开放的函数声明 */

#endif
 楼主| 原来是wjc 发表于 2021-11-30 12:26 | 显示全部楼层
源文件

命名规则模块名+功能,小写,例如os_task.c

格式如下,举例只为说明源文件中,各元素的顺序
 楼主| 原来是wjc 发表于 2021-11-30 12:26 | 显示全部楼层
  1. <- 1 - 引用头文件 ->
  2. #include "os_task.h"

  3. <- 2 - 定义本文件用到的宏 ->
  4. #define OS_TASK_SWITCH_INTERVAL 10 /* 单位ms */
  5. typedef U32 StackSize_t ;  /* 仅用于堆栈 */
  6. typedef enum{};
  7. typedef struct{};

  8. <- 3 - 静态全局变量 ->
  9. static StackSize_t *gTopStack = NULL;

  10. <- 4 - 本模块开放的全局变量 ->
  11. U32 gOsTaskEventBitMap = 0;

  12. <- 5 - 本地函数,仅在本文件使用 ->
  13. static VOID TASK_TaskSwitch(VOID)
  14. {
  15.     return;
  16. }

  17. <- 6 - 本模块开放的函数 ->
  18. VOID OS_TASK_TaskDelay(IN U16 ms)
  19. {
  20.         return;   
  21. }
 楼主| 原来是wjc 发表于 2021-11-30 12:27 | 显示全部楼层
8. 模块
模块必须具有封装性,且对外提供尽量少的必要接口,接口必须提供详细的注释描述

模块的组织形式可以是文件夹形式,也可以是文件形式

例如:
 楼主| 原来是wjc 发表于 2021-11-30 12:27 | 显示全部楼层
  1. .
  2. ├── app /* 应用层代码 */
  3. │   ├── app.h
  4. │   ├── main.c /* 应用入口 */
  5. │   ├── test.c
  6. │   └── test.h
  7. ├── driver /* 设备驱动代码 */
  8. │   ├── drv_led.c
  9. │   ├── drv_led.h
  10. │   ├── drv_uart.c
  11. │   └── drv_uart.h
  12. ├── os  /* 操作系统代码 */
  13. │   ├── os_task.c
  14. │   ├── os_task.h
  15. │   └── os_type.h
  16. ├── sdk /* 芯片厂家提供的库代码 */
  17. │   ├── CMSIS
  18. │   └── Peripherals
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部