嵌入式应用开发之代码整洁之道二

       前言:本系列教程旨在如何将自己的代码写的整洁,同时本系列参考 正点原子 , C++代码整洁之道,编写可读的代码艺术。

#函数的应用规范

#函数作用的功能

        函数功能:函数应该只做一件事,做好这件事,只做这一件事,一个函数不应该被应用于多个功能,如果满足前者,这个函数就应该,被二次拆分,出更细致的功能,去简化这个函数,直到划分为每个功能单一的函数

函数的第一规则是要短小,第二条规则是还要更短小,函数就该小。—————Clean Code

       函数封装:将重复调用的代码封装为功能单一的函数,进行调用,重复的代码,重复写不封装,浪费代码行,浪费阅读时间,封装之后,一行代码,能解决的事情,不用写那么多行,还能提升自己效率,封装函数在主程序循环中调用和没有进行封装调用,循环执行时间不一样的,前者是比后者快的相对来讲。

       函数嵌套:封装函数中,不要进行大量的循环判断嵌套,当在函数体中进行(if  for  while  switch)应用这些语句的大量嵌套,那么别人读懂这个函数,就要思考很多函数对应的情况,如果没有理解这个函数,进行调用,就会出现问题,最后要进行排查,嵌套最好不要超过4层向上。

        函数参数:自己定义地多参数函数,别人在调用的时候,可能需要 Ctrl+F仔细看每个参数的取值,是什么,函数的参数越少,在调用的时候,就越傻瓜式,就越省事,当然前提是,减少参数并不会影响功能。

最理想的参数数量是零,其次是单参数函数,在此是双参数函数——————Clean Code

#代码行的应用以及规范

        代码长度:每行代码的长度应该限制在 80列,如果超过这个数,这句代码,后半句建议写到下一行 ,如果非要写很长,用很长的变量名,这样可读性会很差,同时在一些编辑器 IDE 里面是由行宽限制的。

perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );    ————————正点原子

        函数间隔:调用不同的库函数之间,每个函数之间建议使用回车进行分隔,方便阅读。

int main(void)
{board_init();uart1_init(115200U);printf("start\r\n");PCA9685_Init(60,0);	//PCA9685--16路舵机初始化  频率60Hz -- 0度delay_ms(1000);PID  servo;//声明PID 结构体 变量PID_Init(&servo,Kp,Ki,Kd);//这几个宏定义在PID.h文件里面。while(1) {}}

        声明变量按行写:一行声明多个变量,跟每行声明一个变量,可能有的小伙伴觉得前者比较省事情,但是这样写,不利于他人阅读。

int a = b =0;//不利于观看int a = 0;//推荐写法
int b = 0;

        判断语句书写:if  while for do case switch default  这些语句单独占一行,后面执行语句,不论有多少条,统一加  {}  ,进行表示,判断语句单独占一行

不规范的写法: 
if (p_gpiox->IDR & pinx) return 1; /* pinx 的状态为 1 */
else return 0; /* pinx 的状态为 0 */
应改为:
if (p_gpiox->IDR & pinx)
{
return 1; /* pinx 的状态为 1 */
}
else
{return 0; /* pinx 的状态为 0 */
}

#变量的声明与使用

        变量的用途:在声明变量的时候,应该不用或者少用,全局变量,或者使用static声明全局变量,作为文件的私有变量,全部变量应该是模块化的私有数据,不能作用为对外的接口,使用static定义全局变量可以防止,外部文件对定义文件的变量非正常访问。同时一个变量应该只用作一个用途。

一个变量只能有一个特定功能,不能把一个变量作为多用途使用,——————正点原子
int time;
time = 200; /* 表示时间 */
time = getvalue(); /* 用作返回值 */
//应改为下面的
int time,ret;
time = 200;
ret = getvalue();

#宏定义的使用

               宏定义作用:大量使用宏定义,方便移植程序,提升程序运行速度,如果使用宏定义写的程序,移植的时候,一般只需要改头文件里面的宏定义就能,进行正常运行工作,同样一段程序,不写宏定义,那么可能每个参数都要从头改到尾,会造成时间上的浪费。

#ifndef _BSP_PCA9685_H_
#define _BSP_PCA9685_H_#include "stm32f4xx.h"//端口移植
#define RCC_PCA9685_GPIO  	RCC_AHB1Periph_GPIOA
#define PORT_PCA9685 		GPIOA#define GPIO_SDA 			GPIO_Pin_5
#define GPIO_SCL 			GPIO_Pin_6//设置SDA输出模式
#define SDA_OUT()   {        \GPIO_InitTypeDef  GPIO_InitStructure; \GPIO_InitStructure.GPIO_Pin = GPIO_SDA; \GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; \GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; \GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; \GPIO_Init(GPIOA, &GPIO_InitStructure); \}
//设置SDA输入模式
#define SDA_IN()    {        \GPIO_InitTypeDef  GPIO_InitStructure; \GPIO_InitStructure.GPIO_Pin = GPIO_SDA; \GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; \GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; \GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; \GPIO_Init(GPIOA, &GPIO_InitStructure); \}
//获取SDA引脚的电平变化
#define SDA_GET()       GPIO_ReadInputDataBit(GPIOA, GPIO_SDA)
//SDA与SCL输出
#define SDA(x)          GPIO_WriteBit(GPIOA, GPIO_SDA, (x?Bit_SET:Bit_RESET) )
#define SCL(x)          GPIO_WriteBit(GPIOA, GPIO_SCL, (x?Bit_SET:Bit_RESET) )#define PCA_Addr              0x80        //IIC地址
#define PCA_Model             0x00        
#define LED0_ON_L             0x06
#define LED0_ON_H             0x07
#define LED0_OFF_L            0x08
#define LED0_OFF_H            0x09
#define PCA_Pre               0xFE        //配置频率地址void PCA9685_Init(float hz,uint8_t angle);
void setAngle(uint8_t num,uint8_t angle);
void PCA9685_setFreq(float freq);
void PCA9685_setPWM(uint8_t num,uint32_t on,uint32_t off);#endif

        除此之外,宏定义是预处理指令,这种指令的执行,实在程序执行之前,在程序编译之前,大量使用这种指令,会提升程序运行速度,这种指令在程序执行前就已经执行过了,能提升程序整体运行速度。

        初次之外,二次封装库中的函数,完全可以用宏定义函数来代替,不用在程序中进行封装,宏定义一行就能搞定的事情,模块文件中,封装在声明,没必要写那么多行。

//错误写法,写了之后还要声明函数。
void SDA(x)
{
GPIO_WriteBit(GPIOA, GPIO_SDA, (x?Bit_SET:Bit_RESET) );
}void SCL(x)
{
GPIO_WriteBit(GPIOA, GPIO_SDA, (x?Bit_SET:Bit_RESET) );
}
//正确写法宏定义声明函数
//这种写发程序执行速度比较块
#define SDA(x)          GPIO_WriteBit(GPIOA, GPIO_SDA, (x?Bit_SET:Bit_RESET) )
#define SCL(x)          GPIO_WriteBit(GPIOA, GPIO_SCL, (x?Bit_SET:Bit_RESET) )

                                欢迎指正,希望对你,有所帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony--文本组件Text属性详解

金樽清酒斗十千,玉盘珍羞直万钱。 停杯投箸不能食,拔剑四顾心茫然。 欲渡黄河冰塞川,将登太行雪满山。 闲来垂钓碧溪上,忽复乘舟梦日边。 行路难,行路难,多歧路,今安在? 长风破浪会有…

2024最新国际版抖音TikTok安装教程,免root免拔卡安卓+iOS,附全套安装工具!

我是阿星,今天给大家带来是2024年最新TikTok国际版抖音的下载和安装教程,而且还是免root免拔卡的那种,安卓和iOS都能用哦!由于某些原因,国内用户并不能使用TikTok。今天阿星就教一下大家怎么安装TikTok。 TikTok在全球…

张爱华:身残志坚谱写人间大爱 推己及人彰显巾帼风采

张爱华,女,1963年2月出生,响水县聚贤养老协会会长、响水县小尖镇爱华老年公寓院长。张爱华因患小儿麻痹症导致下肢重度残疾,但她身残志坚,通过创办服装厂慢慢走上致富之路。2011年,她先后筹资、贷款600多万…

vue 项目代码架构

Vue项目的代码架构通常遵循一定的组织结构和约定,以提高项目的可维护性、可扩展性和可读性。以下是对Vue项目代码架构的详细解析: 一、项目目录结构 Vue项目的目录结构通常包括以下几个关键部分: 根目录: package.json&#x…

Linux下解压.tar.gz文件

.tar.gz 是一种常用的压缩包格式,尤其在Unix、Linux以及macOS系统中非常普遍。这个格式结合了两种不同的功能: Tar (.tar): “Tar” 是“Tape Archive”的缩写,最初是为了将数据备份到磁带上而设计的。Tar命令可以将多个文件和目录打包成一个…

UART串口通信实验

一.通信种类 1.1按照数据通信方式 1.1.1串行通信 优点:占用的引脚少,成本低 缺点:传输速度慢 适用场合:长距离、低速率的通信场合 1.1.2并行通信 优点:传输速率快 缺点:占用引脚多,成本…

Java学习笔记整理: 关于设计模式:模板方法模式 2024/7/10;

模板方法模式 自理解:通过指定流程创建模板类并写入指定方法和抽象方法要求子类重写,然后创建类继承该模板类进行统一操作; 优点 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。 缺点 每一个不同的…

【开源项目的机遇与挑战】探索、贡献与应对

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 目录 引言 一:开源项目的发展趋势 🍃开源项目的蓬勃发展现状 🍃开…

VSCode 远程反复输入密码不能链接问题解决

通过 vscode 远程连接服务器时出现了连接不上,而且一直要循环输入密码的问题,可能是因为上次异常退出导致。 主要解决思路是删除当前 vscode 远端服务后,重新建立连接。 解决方法一 在 vscode 端接口删除 vscode 服务。 View->Commond…

“超级攻略:如何快速排查和优化慢SQL,提升系统速度!“

慢查询指的是数据库中执行时间超过指定阈值的 SQL 语句。不同业务场景下,这个阈值通常各不相同。在我们公司内部,这个阈值被设定为 1 秒钟。也就是说,任何执行时间超过 1 秒的 SQL 语句都会被视为慢查询。 对慢查询进行问题排查通常分为以下…

vue 使用腾讯地图 标点 自定义瓦片 折线配置

vue 使用腾讯地图 标点 自定义瓦片 折线配置 申请腾讯地图秘钥 key 腾讯地图开发者 https://lbs.qq.com/dev/console/application/mine 腾讯地图开发文档 https://lbs.qq.com/webApi/javascriptGL/glGuide/glOverview 添加 key 代码中引入 // 入口文件 index.html // 填…

【通信原理】其实QPSK就是一种特殊的QAM,即4-QAM

文章目录 幅度调制和相位调制QPSK(Quadrature Phase Shift Keying)QAM(Quadrature Amplitude Modulation)QPSK作为4-QAMQPSK(Quadrature Phase Shift Keying)和QAM(Quadrature Amplitude Modulation)都是数字调制技术,用于在无线信号中传输数据。要理解“QPSK其实就是…

新旧电脑数据转移方法

随着科技的发展和电脑性能的不断提升,许多用户在工作和生活中都需要更换新电脑。当我们购买了一台新电脑后,如何将旧电脑中的数据转移到新电脑上成许多用户关注的问题。本文将详细介绍几种有效的电脑数据转移方法,帮助大家顺利完成数据迁移。…

国产麒麟、uos在线编辑word文件并控制编辑区域(局部编辑)

windows系统也适用,该插件可同时支持windows和国产系统 在实际项目开发中,以下场景可能会用到Word局部编辑功能: 合同审批公文流转策划设计报告汇签单招投标(标书文件)其他,有模板且需要不同人员协作编辑…

06.TMS570LC43入门指南——中断操作

06.TMS570LC43入门指南——中断操作 文章目录 06.TMS570LC43入门指南——中断操作一、简介二、中断(VIM)介绍2.1 VIM架构2.2 CPU 中断处理2.3 VIM中断通道映射2.4 中断请求默认分配 三、项目实现3.1 硬件部分3.2 软件部分3.2.1 HALCoGen 配置3.2.2 CCS 配…

arm 版的 deb、rpm、AppImage 都有什么区别

qq arm 版的 deb、rpm 和 AppImage 格式之间存在几个关键区别。以下是对这些区别的详细解释: 包管理系统与兼容性: deb:是Debian及其衍生发行版(如Ubuntu)中使用的软件包格式。这些系统使用dpkg命令来管理deb包&#…

RK3588部署YOLOV8-seg的问题

在使用YOLOV8-seg训练出来的pt模型转为onnx的时候,利用以下仓库地址转。 git clone https://github.com/airockchip/ultralytics_yolov8.git 在修改ultralytics/cfg/default.yaml中的task,mode为model为自己需要的内容后, 执行以下语句 cd …

最新等保测评要求与企业应对策略

等保(等级保护)是中国网络安全的基本制度之一,旨在根据信息系统的安全级别,实施相应的保护措施。等保2.0在2019年底正式实施,它对信息系统进行了更细致的分类,并提出了更全面的安全要求。最新的等保测评要求…

vue3 学习笔记03 -- scss的使用

vue3 学习笔记03 – scss的使用 项目中结合 SCSS 可以很方便地管理样式 安装依赖 npm install -D sass sass-loader配置scss支持 export default defineConfig({plugins: [vue()],css: {preprocessorOptions: {//define global scss variablescss: {javascriptEnabled: true,…

在Linux上搭建服务器之综合实验(web,dns,防火墙,SELinux)

其实验简图如下: 解读: 本实验需要完成4部分内容,web服务器的搭建,主从dns服务器的搭建,防火墙的开启,以及SELinux设置为强制模式。 首先dns主服务器上配置web服务(其中我本机的IP为192.168.5.…