嵌入式软件设计与模块化编程通用规范

确定模块与类概念:

模块——有独立的输入依赖适配文件,方便移植。每个驱动就是一个模块,而且是有固定的输出接口是一个特殊的模块。
类——无独立的输入依赖适配文件。如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 对外提供的接口需加注释,有如 “异步或同步”,“大内存申请”,“大局部变量定义”,“文件操作”等,需要在接口注释中说明,特殊接口需在注释中说明使用条件。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值