STM32 编码规范与 SVN 版本控制
命名规则
1、自定义数据类型名
/* 前缀必须是模块名称的大写,后缀是 TypeDef */
typedef struct
{
uint8_t speed; //结构体内部变量元素名全部小写,尽量使用缩写,不用下划线
uint8_t status;
} MOTOR_TypeDef;
2、函数名
/* 前缀必须是模块名称的大写 MODOLENAME_ */
void MOTOR_Init(void);
/* 前缀后面是函数的功能,驼峰规则命名首字母大写 */
void MOTOR_Brack(void);
/* 驼峰规则中不使用下划线 */
void MOTOR_ChangeSpeed(uint8_t MOTOR_Speed);
3、全局变量
/* 前缀必须是模块名称的大写,后面的单词以下划线分割并且只有首字母大写 */
static MOTOR_TypeDef MOTOR_Run_Time_Status = {0};
4、局部变量
/* 全小写,可以用下划线分割 */
uint16_t iic_ccr;
uint32_t iic_trise;
5、函数参数
/* 前缀必须是模块名称的大写,后面是驼峰规则命名首字母大写 */
uint32_t TIM_GetPWMDuty(TIM_TypeDef *TIM_Cur, uint8_t TIM_Channel);
6、宏定义
/* 前缀必须是模块名称的大写,后面的单词以下划线分割全部大写*/
#define MOTOR_DUTY_SPEED0 0
#define MOTOR_DUTY_SPEED1 (TIMER_PWM_DUTY_MAX * 30 / 100)
#define MOTOR_DUTY_SPEED2 (TIMER_PWM_DUTY_MAX * 50 / 100)
#define MOTOR_DUTY_SPEED3 (TIMER_PWM_DUTY_MAX * 70 / 100)
#define MOTOR_DUTY_SPEED4 TIMER_PWM_DUTY_MAX
7、数字
/* 十六进制x小写、数字中的字母大写,二进制 b 小写 */
a = 0xFABC123;
b = 0b101110;
书写规范
1、缩进:
a)使用空格代替缩进符进行对齐
2、空格:
/* if/while/for 后面使用空格,运算符两边用空格,常量的计算不用空格 */
if (a > 1*2+3)
{
b = ~(0xFF)
}
3、括号:
a)大括号必须另起一行,单独占一行
4、每行最大长度:
/* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
80 个 ASCII 字符,超长了要换行,换行注意内容对齐
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */
健壮性规范
1、使用assert 断言,assert 像是一种"契约式编程",其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个 if 语句,assert处理的是致命错误,如果发生,则需要立刻停止程序运行,以避免连锁反应产生更大的错误,使用 assert_param(),校验函数参数的合法性。
#ifdef DEBUG
/*******************************************************************************
* Macro Name : assert_param
* Description : The assert_param macro is used for function's parameters check.
* It is used only if the library is compiled in DEBUG mode.
* Input : - expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* Return : None
*******************************************************************************/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(u8* file, u32 line);
#else
#define assert_param(expr) ((void)0)
#endif /* DEBUG */
2、死循环超时机制,while(exp) 的使用必须有超时机制,避免 exp 一直成立产生死循环
3、debug 日志打印,可以控制打印的级别
a. 调试级别1,打印函数名,和函数内所有执行路径的变量值
b. 调试级别2,打印函数调用信息和返回值
c. 日志级别,只打印运行状态相关的信息
d. 沉默运行,不打印任何信息
版本控制
桌面版 svn 之 TortoiseSVN 的单机开发快速开始指南:
- TortoiseSVN 是对 svn 的桌面版本的封装。为一个项目创建一个版本库(可以是线上的也可以是本地的)之后,把项目文件添加到版本库,然后就可以对项目进行版本控制,再也不用因为手残误修改导致bug而拼命用Ctrl+z回溯原始代码:
a. 工作空间:从版本库下载(CheckOut)到本地的项目文件,程序员日常开发过程中,操作的都是工作空间内的内容,提交之前对版本库无影响。
b. 提交:把工作空间中修改的内容上传到版本库
c. 分支:可以从主干 COPY 出来若干个分支用于测试而不影响主干的代码,测试成功后把测试好的代码合并到主干;协作开发时分支也可以用于不同模块独立开发,最终多个模块的分支合并到一起成为完整的主干。
d. 合并:把两个分支合并(Merge)到一起,如果两个分支修改了同一个文件则需要处理冲突。 - TortoiseSVN 官网下载程序和语言包并安装
- 安装后所有操作都在鼠标右键
a. 找一个妥善的文件夹,创建一个本地版本库,右键->Create repository here
b. 设计好版本库内的目录结构,右键->repo browser,找到刚创建的版本库,右键-> Create folder
i.
ii. branches 用于存放众多分支
iii. Tags 用于存放文档
iv. Trunk 用于存放废弃的历史分支或文档
v. branches/MAIN 主干分支
c. 向版本库下的主干分支添加项目的初始文件,右键->Add file/folder
d. CHECKOUT 一个工作空间,找到开发用的工程目录,右键->CheckOut,选择主干分支
TortoiseSVN 集成到 Keil5 的 SVCS
- 找到配置文件 C:\Keil_v5\UV4\TortoiseSVN.SVCS
- Keil5 ->SVCS 指定配置文件为 TortoiseSVN.SVCS
- Database 配置为 repo browser 中的版本库对应的分支路径
SVN 常用命令:
- checkout 下载指定分支到本地,形成一个工作空间
- commit 提交修改到版本库
- update 把本地文件更新为版本库的新版本
- diff 对比本地文件和版本库中某个版本文件的差异
TortoiseSVN 回溯旧版本
- 右键->Repo-brower