嵌入式编程规范与原则

编程规范

  • 1.文件名尽可能以模块名命名,统一小写(根据个人风格调整)。如led模块led.c、led.h,要多进行模块的抽象,比如说千万不要在Uart0.c文件里面写Uart1的任务业务代码,层次感会非常混乱
  • 2.函数名以文件名为前缀(前缀全部大写,如文件名过长可缩写),后面的名字采用驼峰命名法则,名字用下划线与前缀分隔,给外部文件使用的函数在最前面附加EX。如给外部文件使用的函数void EX_LED_Open(void),EX是export的缩写,LED是模块名前缀,内部函数就文件名前缀+名字如void LED_Close(void)
  • 3.枚举值以E为前缀,枚举名全部大写,单词与前缀之间以下划线分隔,如E_LED_BEEP,如果是全局枚举,最前面追加EX前缀,如EX_LED_BEEP;宏定义以DEF为前缀,枚举名全部大写,单词与前缀之间以下划线分隔,如DEF_LED_BEEP,如果是全局的枚举,最前面追加EX前缀EX_DEF_BEEP
  • 4.变量以作用域+类型为前缀(前缀全部小写),后面的名字采用驼峰命名法则,如果是指针则名字前追加小写的p前缀,如guc_Dir(g是作用域global的缩写,uc是类型unsigned char的缩写,Dir是名字);s_pLed(局部作用域缺省不写,s是类型struct的缩写,p代表是指针变量,Led是名字)
  • 5.供中断服务函数调用的函数以_IT_CallBack作为后缀,如void UART_Rev_IT_CallBack(void);普通的回调函数以Callback为后缀,如void UART_Rev_Callback
  • 6.有必要的话,每个文件都提供一个外部测试示例函数,如void LED_TestSample(void);
  • 7.操作系统生成的函数以X为前缀,前缀与名字之间用下划线分隔

编程原则

  • 1.函数跳转是要压栈出栈的,比直接读取标志要耗费资源,一个函数不要想着面面俱到,比如说LCD初始化就做初始化,不要把在屏上显示xx字符串的功能也做在上面
  • 2.低耦合,耦合就是依赖的意思,为什么要强调本文件使用的全局变量用static修饰呢,从设计思想上来说就是为了降低耦度,缩小作用域来避免其它文件和它有任何的关联。同理,编程的时候能避免全局变量就尽最大的可能避免,很重要的一点,全局变量风险太大了,所以使用请三思
  • 3.注释到位,不写无意义的注释,很多时候函数名也是变相的注释,所以请三思再取名,你可以问问自己,我这个函数实现了什么功能,如Uart1_Send_Byte,表示通过串口1发送一字节,千万别用这个名字实现串口接收的功能;理论上全局变量都要注释的,如果它不能自注释(就是一眼看出是用来干嘛的)
  • 4.可移植性、扩展性,这个十分重要,因为客户的需求是千变万化的,不要把程序写死了,多用宏定义和回调函数(__weak修饰的),例如将IO定义成宏,一旦硬件的引脚变化了,修改宏即可同步所有,关于回调函数,可能很多开发人员不知道,其实它的作用还是很灵活的,比如说你想写一个协议解释的函数__weak void parseProtocol(),你自己实现了协议,但是如果你代码给别人用的话,别人不想用你的协议,那么它可以按照你的规范编写一个void parseProtocol();函数就可以覆盖你原来的__weak void parseProtocol()函数,其它的不用需要改动,好比说你把人家的汽车的发动机给换了,车主没发现有什么东西损坏了,但是有的编译器不支持__weak ,那么可以使用回调函数,就是把函数地址给所调用的函数,什么时候调用你给的函数不用你管。
  • 5.数据和参数结构化,如果全局变量十分多,那么请对它进行归类,封装成结构体,如所有用于存储Led信息的全局变量封装成一个LED结构体,函数的形参不宜过多,如果真的需要很多的参数,请结构化形参
  • 6.细致化,首先一个文件的代码不应该过多,合理细化,操作系统的一个文件的代码虽然也很多,但是它的层次感还是非常强的,如果你做不到有很强的层次感,那么请细分你的功能或业务;封装的时候多想想还能不能细分,比如UartInfo结构体,你还可以细分为UartTxInfo发送的和UartRxInfo接收的
  • 7.总分总的结构,对功能有一个整体的架构,从总体架构中拆分出若干的模块,实现逻辑业务代码,先实现驱动层(一般是硬件初始化),再实现应用层(一般是应用业务功能),最后汇总所有的模块
  • 8.文件应该有空间层次感,统一在某个区域放变量,统一在某区域放枚举等等,为什么写模版,正是为了体现这点
  • 9.命名严格规范化,做到见名知义;模版化编程,使你的程序更加的通用,便于维护和修改

编程思想

架构思想

  • inc:所有头文件的集合,目的是只需要在编译器中添加一次头文件路径(把inc所在的根目录添加到编译器头
  • 文件路径即可),头文件如果过多,可以设下级目录来分类,如driver、application、resource
  • src:所有源文件集合,大体分类资源初始化层、应用层和驱动层三类,可设下级目录来分类,如driver、application、resource

IDA分层思想

  • i:即Initialize,资源初始化层;包括IO初始化,编写所有的IO硬件配置,方便统一管理;SysTick初始化;片内资源初始化,如定时器初始化、ADC初始化、NVIC初始化、RTC初始化等等
  • d:即Driver驱动层,可能需要依赖资源初始化层才能完成,仅仅是编写最基础的驱动API,不涉及任何业务,如电机就只提供开启、关闭、调速、转向控制API
  • a:即Application,需要依赖资源初始化层和驱动层才能完成,根据产品的要求实现具体的业务,如要实现电机开机回归0位,这个动作需要启动电机,同时检测光电开关,电机运动到光电开关位停止电机

函数编写原则

  • 1.规范命名,参考编程规范和原则
  • 2.最基本的也要注释函数完成的功能,传入参数、传出参数、返回值
  • 3.编写的内容和函数名呼应
  • 4.内容最好控制在一屏
  • 函数低耦合思想
  • 1.函数如果依赖外部参数或者其它的函数,尽最大可能通过参数传递改依赖,函数里面不要有全局变量,这样
  • 会使函数的独立性大大降低,迫不得已都不要在函数里面使用全局变量
  • 2.如果函数的参数过多,考虑结构化参数
  • 3.传递回调函数(就是传依赖其它函数的地址给当前函数)会使函数更加灵活,同时降低函数内部的耦合度

模板示例

/* 头文件描述信息 */
/**
  ******************************************************************************
  * 文件名          : .h
  * 作者			   : 凌宇
  *	日期			   : 2019-7-4 
  * 版本			   : V1.0
  * 描述		       : 
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 Lingyu.
  * All rights reserved.</center></h2>
  * 注释统一用多行注释
  ******************************************************************************
  */

/* 防止重复包含 ————————————————————————————————————————————————————————————————*/
#ifndef __DEMO_H
#define __DEMO_H

/* extern "C" 目的是为了让c++兼容c库文件,不致于出现连接错误的情况 ————————————————————*/
#ifdef __cplusplus
 extern "C" {       
#endif

/* 本头文件依赖的其它头文件 ———————————————————————————————————————————————————————*/

/* 需要对外的类型 ———————————————————————————————————————————————————————————————*/

/* 需要对外的宏定义 —————————————————————————————————————————————————————————————*/

/* 需要对外的常量 ———————————————————————————————————————————————————————————————*/

/* 需要对外的变量 ———————————————————————————————————————————————————————————————*/

/* 需要对外的函数声明 ————————————————————————————————————————————————————————————*/

#ifdef __cplusplus
}
#endif

#endif /* __DEMO_H */

/**
  * @}
  */

/************************ (C) COPYRIGHT Lingyu *****************END OF FILE****/

/* 源文件描述信息 */
/**
  ******************************************************************************
  * 文件名          : .c
  * 作者			   : 凌宇
  *	日期			   : 2019-7-20
  * 版本			   : V1.0
  * 描述		       : 
  ******************************************************************************
  * @attention
  * 注释请统一用多行注释,编程规范请参考编程规范.c
  ******************************************************************************
  */
/* 本文件的头文件 ——————————————————————————————————————————————————————————————*/
/* 仅放自己的头文件 */
#include "inc/general/demo.h"
/* 本文件依赖的头文件 ———————————————————————————————————————————————————————————*/

/* 本文件自定义类型 -————————————————————————————————————————————————————————————*/

/* 本文件依赖的宏定义 ———————————————————————————————————————————————————————————*/

/* 本文件使用的常量 -————————————————————————————————————————————————————————————*/

/* 本文件使用的变量 -————————————————————————————————————————————————————————————*/

/* 本文件使用的函数声明 ——————————————————————————————————————————————————————————*/

/* 所有的函数实现 ——-————————————————————————————————————————————————————————————*/

/**
  * @函数名			
  * @描述			  
  * @传入参数   无
  * @传出参数   无
  *	@返回值     无
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT Lingyu *****************END OF FILE****/      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值