当前位置: 首页 > news >正文

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

        前言:本系列教程旨在如何将自己的代码写的整洁,同时也希望小伙伴们懂如何把代码写脏,以备不时之需,同时本系列参考 正点原子 , C++代码整洁之道,编写可读的代码艺术。

#好的代码的特点

          好的代码应该都有着几条特性,可读性高(根据函数命名就知道这个函数是干啥的),简单(没有复杂的变量英文名,大量调用库中封装函数)。

        方便维护(别人在你的代码上加功能好加,好上手),好移植(头文件大量书写宏定义  移植只需要改宏定义引脚即可),函数功能单一精简(函数定义几百行,参数很多,永远 没有 十几行函数代码的好理解)。

        调用函数库统一,(没有二次封装函数,没有带位操作跟库函数混着用),没有带位操作,(程序中统一调用库函数)带位操作确实快,现对于库函数,但是不好上手,没有重新编写函数(如果放着现有的库函数不用,重新赋值寄存器,写新函数,还没有根据功能命名)

        上述的这些都是,好的代码的特点,接下来将从,每个类型的变量书写规范开始讲解。

#函数的命名

        函数的命名,应该把信息或者注释装进命名里面,同时每个单词使用下划线  "_" 进行连接,,让在读函数命名的同时,就知道你这个函数是什么作用,什么功能,大致看一下函数体,就行了。

void SPI_GPIO_Init(void);

        这个函数名,即使不看函数体,也知道这个函数用来将  SPI通信用到的GPIO 初始化,那么如何将代码命名进行规范化。

        翻译命名:将这个函数的功能,翻译成英文在命名里面加入英文的缩写,去表示。

        外设命名:如果用到对应的外设,可以在命名中加入所用到的外设。

        寄存器命名:这个函数里面用到了什么寄存器,什么参数也能写到函数名里面。

 #代码注释写给别人看也写给自己看

        代码注释不仅仅可以,用来解释这一行代码什么意思做了什么,最重要的是让读你代码的人知道你的写码思想,你此时在关联什么,你在想什么,你要用这些代码去干什么,完成什么,

        当自己编写代码的时候,肯定知道自己写这些代码是为了完成什么功能,去怎么应用在需求上,别人读代码,只有眼前每行代码的作用,注释在这个时候,可以是思维,可以是目的。可以是关联应用

#什么不需要注释

        注释在程序中,并不是越多越好的,大量的注释无关紧要的地方,会造成浪费时间,去阅读这些注释,占用屏幕空间,这些注释相对来说是没有价值的。

void Usart_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStructure;//声明结构体变量	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//开启时钟	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//开启复用功能GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin           = GPIO_Pin_9;//TX引脚GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_AF;//IO口用作串口引脚要配置复用模式GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;//选择速度GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin           = GPIO_Pin_10;//RX引脚GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_AF;//IO口用作串口引脚要配置复用模式GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;//选择速度GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_UP;//推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);
}

        上述这些注释是没有价值的,为什么,因为没有提供额外的信息,这些作用能从函数里面读出来,就可以不用去加,写这么多注释是会影响效率的。

                                   总结:不要为代码本身能读出来的信息写注释

        同时不要为了写注释,而去注释,总有小伙伴认为,一定要写注释,为了写注释去写注释,从而忽略了写注释本身的作用,写注释是为了更好的理解工程,而不是写没有意义的注释,浪费读你注释的人的时间。

#什么需要注释

        注释本身就是一种信息,这种信息不是关于函数功能的信息,这些信息可以加入见解,可以使各种有关经验之谈,可以是别人不知道代码的瑕疵,缺陷,也可以是站在读你代码的人角度写注释,或者解释为什么选择A方案,而不是B方案。

#ifndef  _pid_h_
#define  _pid_h_
#include <stdio.h>
#include "board.h"
//编写PID应在云台中调用
#define Kp  5.0
#define Ki  5.0
#define Kd  5.0
//这里参数设定有问题,云台抖动
typedef struct 
{float Velcity_Kp;float Velcity_Ki;float Velcity_Kd;float Error;float Last_Error;float integral;float derivate;int Control_Velocity;
}PID;
void PID_Init(PID*pid, float Velcity_Kp ,float Velcity_Ki,float Velcity_Kd);
float PID_Calculate (PID*pid,float Current_Velocity ,float TargetVelocity);
#endif

        上述这些出函数本身带来的信息,是值得去注释的,这些是对于读你代码的人是有用的,是有价值的信息

#代码缩进问题

        使用TAB进行缩进的时候,这个键的值可能是4位或者是8位,有的小伙伴上面缩进4跟下面8个,随便缩进,反正不会报错,看着确实难受,如果使用文本方式打开,驱动文件,可以发现是跟在KEIL5中阅读的缩进大小是不一样的。

        如果代码被不同的编译器打开,缩进效果,也是不一样的,但是如果使用 空格键 代替缩进在大多数编译平台看到的区别都是不大的。

        这里在KEIL5中是4位缩进,下面使用VSCODE打开相同的源文件

        可以看到这里就变成了8位缩进,只是因为使用的编译器不同,导致效果就不一样了,同时附带着汉字乱码(改编码格式)。

        总结:如果代码经常移植,建议缩进使用空格代替。

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

相关文章:

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

前言&#xff1a;本系列教程旨在如何将自己的代码写的整洁&#xff0c;同时也希望小伙伴们懂如何把代码写脏&#xff0c;以备不时之需&#xff0c;同时本系列参考 正点原子 &#xff0c; C代码整洁之道&#xff0c;编写可读的代码艺术。 #好的代码的特点 好的代码应该都有着几…...

iwconfig iwpriv学习之路

iwconfig和iwpriv是两个常用的wifi调试工具&#xff0c;最近需要使用这两个工具完成某款wifi芯片的定频测试&#xff0c;俗话说好记性不如烂笔头&#xff0c;于是再此记录下iwconfig和iwpriv的使用方式。 -----再牛逼的梦想&#xff0c;也抵不住傻逼般的坚持&#xff01; ----2…...

【Docker-compose】搭建php 环境

文章目录 Docker-compose容器编排1. 是什么2. 能干嘛3. 去哪下4. Compose 核心概念5. 实战 &#xff1a;linux 配置dns 服务器&#xff0c;搭建lemp环境&#xff08;Nginx MySQL (MariaDB) PHP &#xff09;要求6. 配置dns解析配置 lemp Docker-compose容器编排 1. 是什么 …...

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…...

《框架封装 · Redis 事件监听》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

小白学webgl合集-Three.js加载器

THREE.TextureLoader: 用途: 加载单个图像文件并将其作为纹理应用到材质上。示例: const loader new THREE.DataTextureLoader(); loader.load(path/to/data.bin, function (texture) {const material new THREE.MeshBasicMaterial({ map: texture });const geometry new TH…...

【算法】字符串的排列

难度&#xff1a;中等 给你两个字符串 s1 和 s2 &#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 换句话说&#xff0c;s1 的排列之一是 s2 的 子串 。 示例 1&#xff1a; 输入&#xff1a;…...

5-3.损失函数

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名–章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…...

SCSA第四天

ASPF FTP --- 文件传输协议 Tftp --- 简单文件传输协议 FTP协议相较于Tftp协议 ---- 1&#xff0c;需要进行认证 2&#xff0c;拥有一套完整的命令集 用户认证 防火墙管理员认证 ---- 校验登录者身份合法性 用户认证 --- 上网行为管理中的一环 上网用户认证 --- 三层认证…...

品牌策划必读:9本改变游戏规则的营销经典

作为深耕品牌十余年的策划人&#xff0c;这些年自学啃下的书不计其数。 这里特意挑选了几本知名度不高但是却非常有用的“遗珠”优质品牌策划书籍分享出来。 如果你是一位初步了解品牌的人&#xff0c;这些书籍既包含了品牌理论基础&#xff0c;也有实用的实践指导。 这些书…...

泛型

背景 优点 类型绝对安全避免强制类型转换 泛型类 定义 使用 举例 泛型类 // 泛型类 T就是类型参数 public class Generic<T>{// key这个成员变量的类型为T,T的类型由外部指定private T t;public void set(T t){this.t t;}public T get(){return t;} }使用 // 创建一个泛…...

react动态渲染列表与函数式组件

1.如何使用jsx语法动态渲染列表呢&#xff0c;下边我用一个例子来切实总结一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scal…...

小程序内容管理系统设计

设计一个小程序内容管理系统&#xff08;CMS&#xff09;时&#xff0c;需要考虑以下几个关键方面来确保其功能完善、用户友好且高效&#xff1a; 1. 需求分析 目标用户&#xff1a;明确你的目标用户群体&#xff0c;比如企业、媒体、个人博主等&#xff0c;这将决定系统的功…...

HDFS 块重构和RedundancyMonitor详解

文章目录 1. 前言2 故障块的重构(Reconstruct)2.1 故障块的状态定义和各个状态的统计信息2.2 故障文件块的查找收集2.5.2.1 misReplica的检测2.5.2.2 延迟队列(postponedMisreplicatedBlocks)的构造和实现postponedMisreplicatedBlocks中Block的添加postponedMisreplicatedBloc…...

Power BI DAX常用函数使用场景和代码示例

Power BI函数表达式对于没有接触过的朋友可能会有些迷茫&#xff0c;花一点时间了解一下原理在学习一些常用的DAX函数&#xff0c;就可以解决工作中绝大部分问题&#xff0c;函数使用都是共同的。 以下是一些最常用的DAX函数&#xff0c;如聚合&#xff0c;计数&#xff0c;日期…...

机器学习与深度学习:区别与联系(含工作站硬件推荐)

一、机器学习与深度学习区别 机器学习&#xff08;ML&#xff1a;Machine Learning&#xff09;与深度学习&#xff08;DL&#xff1a;Deep Learning&#xff09;是人工智能&#xff08;AI&#xff09;领域内两个重要但不同的技术。它们在定义、数据依赖性以及硬件依赖性等方面…...

大模型/NLP/算法面试题总结5——Transformer和Rnn的区别

Transformer 和 RNN&#xff08;循环神经网络&#xff09;是两种常见的深度学习模型&#xff0c;广泛用于自然语言处理&#xff08;NLP&#xff09;任务。 它们在结构、训练方式以及处理数据的能力等方面有显著的区别。以下是它们的主要区别&#xff1a; 架构 RNN&#xff0…...

【RHCE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通...

AI提示词:打造爆款标题生成器

打开GPT输入以下内容&#xff1a; # Role 爆款标题生成器## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 利用心理学和市场趋势&#xff0c;生成吸引眼球的自媒体文章标题。## Background 一个吸引人的标题是提升文章点击率和传播力…...

skywalking-1-服务端安装

skywalking很优秀。 安装服务端 skywalking的服务端主要是aop服务&#xff0c;为了方便查看使用还需要安装ui。另外采集的数据我们肯定要存起来&#xff0c;这个数据库就直接用官方的banyandb。也就是aop、ui、banyandb都使用官方包。 我们的目的是快速使用和体验&#xff0c…...

查看oracle ojdbc所支持的JDBC驱动版本

oracle jcbc驱动的下载地址参考&#xff1a;JDBC and UCP Downloads page 其实上文中对ojdbc所支持的JDBC驱动版本已经有说明了&#xff0c;不过&#xff0c;因为oracle的驱动包很多时间&#xff0c;都是在公司内部私服里上传维护的&#xff0c;上传的时候&#xff0c;可能又没…...

自媒体运营怎样引流客源?

不管是企业还是个人&#xff0c;越来越多都在做自媒体引流运营&#xff0c;那有什么引流客源的方式呢&#xff1f; 高质量内容&#xff1a;创作并分享有价值的内容&#xff0c;吸引目标受众&#xff0c;提升内容的分享和传播效果。 SEO优化&#xff1a;优化文章标题、关键词和…...

【算法】十进制转换为二进制

目的&#xff1a;将十进制转换为二进制 思路&#xff1a; 首先我们手算的情况是通过求余数算出进制数&#xff0c;同样代码也是通过做除法和求余数的方式&#xff0c;除法是得出下一次的被除数&#xff0c;而求余数是得到进制数 代码&#xff1a; #include<stdio.h>/…...

Postman中的API安全堡垒:全面安全性测试指南

&#x1f6e1;️ Postman中的API安全堡垒&#xff1a;全面安全性测试指南 在当今的数字化世界中&#xff0c;API安全性是保护数据和系统不可或缺的一环。Postman作为API开发和测试的领先工具&#xff0c;提供了多种功能来帮助开发者进行API安全性测试。本文将深入探讨如何在Po…...

学圣学最终的目的是:达到思无邪的状态( 纯粹、思想纯正、积极向上 )

学圣学最终的目的是&#xff1a;达到思无邪的状态&#xff08; 纯粹、思想纯正、积极向上 &#xff09; 中华民族&#xff0c;一直以来&#xff0c;教学都是以追随圣学为目标&#xff0c;所以中华文化也叫圣学文化&#xff0c;是最高深的上等学问&#xff1b; 圣人那颗心根本…...

JS进阶-构造函数

学习目标&#xff1a; 掌握构造函数 学习内容&#xff1a; 构造函数 构造函数&#xff1a; 封装是面向对象思想中比较重要的一部分&#xff0c;js面向对象可以通过构造函数实现的封装。 同样的将变量和函数组合到了一起并能通过this实现数据的共享&#xff0c;所不同的是借助…...

使用Spring Boot和Couchbase实现NoSQL数据库

使用Spring Boot和Couchbase实现NoSQL数据库 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 NoSQL数据库越来越受到开发者的欢迎&#xff0c;特别是…...

【数据库】Redis主从复制、哨兵模式、集群

目录 一、Redis的主从复制 1.1 主从复制的架构 1.2 主从复制的作用 1.3 注意事项 1.4 主从复制用到的命令 1.5 主从复制流程 1.6 主从复制实现 1.7 结束主从复制 1.8 主从复制优化配置 二、哨兵模式 2.1 哨兵模式原理 2.2 哨兵的三个定时任务 2.3 哨兵的结构 2.4 哨…...

C基础day8

一、思维导图 二、课后习题 #include<myhead.h> #define Max_Stu 100 //函数声明 //学生信息录入函数 void Enter_stu(int *Num_Stu,char Stu_name[][50],int Stu_score[]); //查看学生信息 void Print_stu(int Num_Stu,char Stu_name[][50],int Stu_score[]); //求出成绩…...

【Spring成神之路】老兄,来一杯Spring AOP源码吗?

文章目录 一、引言二、Spring AOP的使用三、Spring AOP的组件3.1 Pointcut源码3.2 Advice源码3.3 Advisor源码3.4 Aspect源码 四、Spring AOP源码刨析4.1 configureAutoProxyCreator源码解析4.2 parsePointcut源码解析4.3 parseAdvisor源码解析4.4 parseAspect源码解析4.5 小总…...

有做网站代理运营的吗/品牌咨询

我们的疑问是&#xff1a;iPad充电器可以给iPhone充电吗&#xff0c;iPad充电器不能为iPhone充电吗&#xff1f;使用iPad给iPhone充电的危害&#xff1f;用iPhone充电器会损害iPad吗&#xff1f;iPad充电器可以给iPhone快充吗&#xff1f;iPhone用iPad充电器是不是可以的呢&…...

南宁做网站开发的公司/哈尔滨优化网站方法

Dom是什么&#xff1f; 文档对象模型DOM&#xff08;Document Object Model&#xff09;定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和文本的树结构&#xff08;节点树&#xff09;。 将HTML解析成Dom节点图 上图Dom节点&#xff1a; 1. 元素节点&a…...

wordpress文章格式/百度搜索排名优化

慢慢将一些概念固化到基因内&#xff0c;才有可能和SPRING MVC&#xff0c;MEAN之类的好好作比较吧。 全都是基于1.8版本的教材&#xff0c;爽&#xff01;&#xff01;&#xff01;...

郯城做网站/资源网

★★★ 本文源自AlStudio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 真实场景篡改图像检测挑战赛 比赛链接传送门 PaddleSeg传送门 背景 目前各类社交平台中视频、图像、文本内容的截图内容恶意篡改的情况日益加剧&#xff0c;截屏图像的原始性和…...

vps做网站/网络营销的优势

绍过了SOAP&#xff0c;让我们关注Web Service中另外一个重要的组成WSDL。 WSDL的主要文档元素 WSDL文档可以分为两部分。顶部分由抽象定义组成&#xff0c;而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息&#xff0c;它们并不包含任何随机器或语言而…...

织梦做的网站打包在dw修改/2022最火营销方案

大小尾数 小尾数&#xff1a;低位字节存储在低内存位置或寄存器的低位地址&#xff0c;高位字节存储在高内存位置或寄存器的高位地址。 大尾数&#xff1a;和小尾数的存储顺序是相反的&#xff0c;低位字节存储在高位地址。 intel采用的是小尾数存储格式&#xff1a; 检测&…...