确定模块与类概念:
模块——有独立的输入依赖适配文件,方便移植。每个驱动就是一个模块,而且是有固定的输出接口是一个特殊的模块。
类——无独立的输入依赖适配文件。如user,sys。
为了更好的移植,适配,快速完成器件替换,组件替换。所有有代码都要归到相应的模块或者类里面。
一、驱动编写
驱动包含但不限于:外设芯片器件,RTC,打印,马达等。
flash为例:
flash_port_xxx.c//输入依赖,其中的函数以flash_port_开头。
flash_drv_aaa_xxx.c//驱动实现。aaa:器件名
flash_api_xxx.c//输出接口,其中的函数以flash_api_开头。
二、文件系统移植
fs_port_xxx.c//输入依赖
aaa_xxx_xxx.c//文件系统源码。aaa:文件系统标识缩写,如第三方维持原状
fs_api_xxx.c//输出接口
三、操作系统移植
os_port_xxx.c//输入依赖
aaa_xxx_xxx.c//操作系统源码。aaa:操作系统标识缩写,如第三方维持原状
os_api_xxx.c//输出接口
四、第三方组件移植
lvgl为例:
lv_port_xxx.c//输入依赖
lv_xxx_xxx.c//组件源码
五、功能模块代码编写
模仿第三方组件的风格,方便剥离移植。ble模块为例
ble_port_xxx.c
ble_xxx_xxx.c
ble_sql_xxx.c//模块中的数据库文件。多个模块使用的数据建立数据库文件放在关联最紧密的模块中。如配置信息,健康信息,天气信息,短信息,表盘信息等数据。
六、工程模块设计与命名
sys_xxx_xxx.c//系统类共用的基础代码。如内存管理,消息管理,MCU初始管理,MCU异常管理,宏配置管理
user_xxx_xxx.c//用户类代码。无明确模块的中间件。
task_xxx_xxx.c//任务类代码。任务,任务管理。
collect_xxx_xxx.c//采数模块代码。
fit_xxx_xxx.c//运动健康模块代码。fit_alg_,fit_health_,fit_data_等。
ble_xxx_xxx.c//蓝牙模块代码。ble_radio_,ble_server_等。
log_xxx_xx.c//日志模块代码。
ui_xxx_xxx.c//UI模块代码。
wf_xxx_xxx.c//表盘模块代码。
ate_xxx_xxx.c//测试模块代码。
七、打印管理
在每个要打印的源文件中加入如下代码,xxx为模块或类名。实现对单个文件的打印管理。
#define ENABLE_PRINT_INFO false
extern uint32_t xxx_print(char *pcFmt, ...);
#define xxx_print_remind(...) xxx_print(__VA_ARGS__)//重点信息打印一般常开
#if ENABLE_PRINT_INFO
#define xxx_print_info(...) xxx_print(__VA_ARGS__)//一般信息打印宏控制
#else
#define xxx_print_info(...)
#endif
八、编码约定
1、代码编辑器
1.1 统一使用 Source insight 进行代码编辑,源码文件统一使用UTF-8字符编码,tab键4个空格
设置要求:
1. Options -> Preference -> files -> Default encoding: 设置字符编码
2. Options -> File Type Options -> Tab width: 设置tab键空格数
3. View -> Visible Tabs and Spaces 打勾设置文件中可见空格
以上,才能保持大家的代码对齐是一致的。
1.2 Astyle 配置。
2、命名
2.1 整体使用下划线命名法。sdk,os等第三方库维持原状。
2.2 模块名、类名尽量简短并符合习惯。
2.3 模块、类中的文件、函数命名以模块名或类名开头。
2.4 全局变量统一加前缀 g_。
2.5 宏定义和 enum 类型全大写。拒绝使用魔鬼数字。
2.6 回调函数名有 _callback 标志,回调注册函数名有 _register 标志。
3、编码风格:
3.1 头文件里面尽量少包含头文件。尽量在源文件中去包含其它文件的头文件。
3.2 头文件编写加入#ifndef UI_XXXX_H 判断避免重复定义报错。
3.3 文件内的全局变量加作用域限制符 static。
3.4 除需对外提供的接口函数外,文件内的其他函数均需加限制符 static,且不在相关头文件声明。
3.5 函数中局部变量过大建议使用动态分配方式。
3.6 防御式编程。入参判断、非空判断、申明变量赋初值、赋值类型匹配等。
3.7 对外的函数接口传参尽量不引入结构体等自定义数据结构。
3.8 结构体注意4字节对齐。
4、注释
4.1 文件开头加信息注释如
/*----------------------------------------------------------------------------
* Copyright (c) xxx xxx Technologies Co., Ltd. 2021. All rights reserved.
*
* Description: ui_xxx.c
*
* Author: xxx
*
* Create: 2021-08-08
*--------------------------------------------------------------------------*/
4.2 函数关键位置需加注释,解释操作过程或实现原理。
4.3 对外提供的接口需加注释,有如 “异步或同步”,“大内存申请”,“大局部变量定义”,“文件操作”等,需要在接口注释中说明,特殊接口需在注释中说明使用条件。