撸代码时,有哪些习惯一定要坚持?

我从2011年开始做单片机开发,一直保持以下撸代码的习惯。

1.做好代码版本管理

有些人,喜欢一个程序干到底,直到实现全部的产品功能,我以前做51单片机的项目就是这样。

如果功能比较多的产品,我不建议这样做,迟早有一天,有一个项目,会让你崩溃的,特别是还不具备模块化编程能力的时候

之前我就踩过几次这种坑,一个程序版本实现了很多个功能,后面新增功能的时候,突然发现了一个BUG,怎么都调不出来。

这时候,如果有上一个版本,可以用上一个版本的代码,一点点代码复制过去看看,到底是哪个代码造成的。

从那次以后,我就养成了做代码版本管理的习惯,比如V1.0,V1.1,V1.2.....

然后每个程序版本里面,我都会写一个文档,描述下历史版本实现的功能记录,以防后面忘了。

2.多学习优秀的代码和思维

刚工作那会,主要用STC的51单片机做项目,主要维护之前工程师遗留的代码,升级产品功能为主,基本是一堆屎山代码,实现功能就行了。

不会考虑怎么把代码写得更好,主要是自己当时也没那能力,项目又急,能改出来应付工作就不错了,有时项目急,我逻辑又理不清,甚至用了goto语句走了捷径,可能很多人都没见过。

工作了几年,一直是维持在这种水平,没有提升,因为接触不到更复杂的项目,接触不到好的编程思维和代码。

后面跳槽到一家公司,接收了一个网关项目,需要自己从0到1,完成整个项目的代码。

这个项目难度,已经超过了我的知识范围,主要有两个问题:

第一,很多功能没做过,不知道啥原理

第二,功能太多了,不知道怎么很好地把它们整合协调起来。

我是怎么解决这两个问题的呢?

第一个问题,最快的方式就是问同部门的研发同事。

不过不要指望别人会手把手教你,哪怕领导发话,别人也没这义务。

最关键的,不是指望让领导去给他下发命令,就能让他带你,而是看自己懂不懂得做人的。

举个例子:有些老铁来找我领单片机入门到高级的教程+工具包,我都是无套路直接发链接。

为什么要在我的朋友圈才发?

因为我是卖课佬,我觉得我们的项目课确实能帮到一些人,成就一些人,万一哪天你需要,我们又正好专业,各取所需共赢,我觉得没毛病。

但,我也深知,要让别人认可你,那就先贡献价值出来,所以我就不断输出自己经验和送粉丝教程+工具包了。

我感觉人和人之间,挺有意思,也差别挺大。

有些人很懂得感恩,还会给我发个小惊喜,收不收看我有没有给到他对应的价值了。

有些人,趾高气昂,理所当然,像我欠了他的一样。

我就想,怎么会有这种傻杯,然后拉黑了。

扯远了。

回到找同事帮忙的问题,也是同理,你得付出相应的价值,得请吃饭、得请喝奶茶、帮的忙多了得送礼....这不是潜规则,是对别人起码的尊重。

不能因为领导发话了,叫他去带你,你就能像个伸手党一样,一直索取他的价值,不信?你试试多问几个问题以后,看他鸟不鸟你。

第二个问题,功能太多了,不知道怎么很好地把它们整合协调起来。

这个其实最难,因为涉及到程序架构的问题,不是某个功能点,更多的是经验积累到一定程度后,再学习别人优秀的程序架构,突然开悟了。

我是参考别人工程师写的代码,一点点积累起来的,然后根据时间片轮询原理,设计了一个程序架构,我在2019年也录过这个程序架构的教程。

老规矩,有礼貌的粉丝,可以找我安排。

编程思维、高阶代码技巧、程序架构这些,如果能冲我们无际单片机项目特训营,系统把我们几个项目做完,那直接就是走捷径了,都是我们踩坑10年以上总结出来的精华。

3.重视模块化

我第一次重视程序模块化,项目代码量编译完大概70kb+。

什么是模块化?

举个例子,以下两段代码,分别是非模块化写法和模块化写法:

非模块化写法:

C
#include <reg51.h> // 假设是51单片机

void main() {
    //
硬件初始化
    P1 = 0xFF; // 设置P1口为输入
    IT0 = 1;    // 设置外部中断0为下降沿触发
    EX0 = 1;    // 使能外部中断0
    EA = 1;     // 开启全局中断

    // 主循环
    while(1) {
        //
功能实现
        if(P1_0 == 0) {
            P1 = ~P1; //
如果P1.0被按下,翻转P1口的状态
        }
    }
}

//
外部中断0服务程序
void exint0() interrupt 0 {
    //
中断处理
    P1 = P1 << 1; // 每次中断,将P1口的值左移一位
}

在这个例子中,硬件初始化、主循环和中断服务程序都混合在同一个.c文件中,阅读和维护起来会困难很多,特别是后期随着代码越来越多。

模块化写法:

C
// hardware.h
#ifndef HARDWARE_H
#define HARDWARE_H

void init_hardware();

#endif

// hardware.c
#include "hardware.h"

void init_hardware() {
    P1 = 0xFF; //
设置P1口为输入
    IT0 = 1;    // 设置外部中断0为下降沿触发
    EX0 = 1;    // 使能外部中断0
    EA = 1;     // 开启全局中断
}

// main.c
#include "hardware.h"
#include <reg51.h>

void main() {
    init_hardware(); // 初始化硬件

    while(1) {
        // 主循环功能实现
        if(P1_0 == 0) {
            P1 = ~P1; // 如果P1.0被按下,翻转P1口的状态
        }
    }
}

// exint0.c
#include <reg51.h>

// 外部中断0服务程序
void exint0() interrupt 0 {
    // 中断处理
    P1 = P1 << 1; // 每次中断,将P1口的值左移一位
}

在这个模块化的例子中,我们将硬件初始化放到了hardware.c和hardware.h中,主循环放在main.c中,而中断服务程序放在exint0.c中。这样,每个文件都有一个明确的作用,代码的结构更加清晰,也更好阅读和维护。

稍微复杂点的单片机项目,需要处理很多硬件接口和复杂的时序逻辑,还有各种产品业务逻辑组合,所以模块化尤其重要。

上面只是举了两个入门级模块化写法,高阶的模块化,远不止这些,首先是程序文件架构的模块化,分硬件层、中间层、应用层。

怎么实现多层之间依赖最少,这样后期万一需要更换单片机,只需要修改硬件层驱动代码就好了。

然后是里面每个功能模块化,怎么写方便后期增减功能。

这些其实都是系统的学问,所到之处全是细节,我们无际单片机特训营,都是通过这些思维和编程方式做的,特别是项目3和6。

提升这块的能力,主动学习意识和机遇都很重要,有些工程师做了4,5年,如果公司一直做简单的项目,那也是提升不了的,需要自己通过业余的时间,不断看别人代码摸索。

4.有条件,换个好点的椅子

撸代码的,长时间对电脑,经常一坐就是几个小时,好点的椅子能缓解颈椎、腰椎的疲劳。如果能换个立式办公桌就更好了。

5.不要做一个看完不点赞的冷漠青年

不知不觉,又写了两个多小时,原创不易,发财小手点起来...


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

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

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

相关文章

【Linux】指令

1. 简单指令 whoami 显示当前登入账号名 ls /home 现在有的用户名 adduser 用户名 新加用户&#xff08;必须在root目录下&#xff09; passwd 用户名 给这个用户设置密码 userdel -r 用户名 删除这个用户 pwd 显示当前所处路径 stat 文件名 / 文件夹名 显示文件状…

鸿蒙HarmonyOS 与 Android 的NDK有什么不一样?

1. 序言 就像开发Android要用Android Studio一样&#xff0c;Android Studio&#xff08;简称AS&#xff09;其实是基于IDEAgradle插件android插件开发而来。 鸿蒙系统&#xff0c;你可以认为它和android有点像&#xff0c;但又是超越android的存在&#xff0c;除了手机&…

《C语言深度解剖》(2):详解C语言分支语句和循环

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

Java实现二叉树(上)

1.树型结构 1.1树型结构的概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 1.2树型结构的特点…

xshell7连接ubuntu18.04

&#x1f3a1;导航小助手&#x1f3a1; 1.查看ubuntu IP2.开启openssh-server3.静态IP设置4.Xshell连接 1.查看ubuntu IP 输入下面命令查看IP ifconfig -a可以看到网卡是ens33&#xff0c;IP为192.168.3.180。 2.开启openssh-server 1、执行下句&#xff0c;下载SSH服务 s…

openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint

文章目录 openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint257.1 功能描述257.2 语法格式257.3 示例 openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint 257.1 功能描…

SVM简介 详细推导 核函数 线性可分 非线性可分

注意&#xff1a;由于该文章由jupyter nbconvert导出&#xff0c;若单独执行代码可能出现变量找不到或者没有导入库的情况&#xff0c;正确的做法是将所有的代码片段按顺序放到一个.py文件里面或者按顺序放入一个.ipynb文件的多个代码块中。 SVM(Support Vector Machine) Vap…

2024年C语言最新经典面试题汇总(21-30)

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

Java——数据类型、运算符、逻辑控制、方法、数组

1.前置知识 Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论…

Spring Security——07,授权_从数据库查询权限信息

授权_从数据库查询权限信息 一、RBAC权限模型二、准备工作2.1 创建数据表2.2 准备表数据2.3 准备查询语句2.4 创建一个实体类Menu 三、代码实现3.1 创建一个MenuMapper3.2 创建对应的mapperXML文件3.3 配置mapperXML文件的位置3.4 UserDetailsServiceImpl查询权限信息 四、测试…

JAVA并发编程(一)

JAVA并发编程&#xff08;一&#xff09; 1.1JAVA线程API 1.1.1currentThread package com.lisus2000.thread;/** * 当前线程 * */ public class Test07 extends Thread {public Test07() {System.out.println("new Test07()......" Thread.currentThread().getNa…

深入浅出 -- 系统架构之微服务架构

1.1 微服务的架构特征&#xff1a; 单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责 自治&#xff1a;团队独立、技术独立、数据独立&#xff0c;独立部署和交付 面向服务&#xff1a;服务提供统一标准的接口&…

就业班 第二阶段(python) 2401--4.7 day3 python3 函数

八、文件操作 1、读取键盘输入 input 获取标准输入&#xff0c;数据类型统一为字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("请输入&#xff1a;") print&#xff08;"你输入的内容是: ", str&#xff09; 这会产生如下的对应着输入的…

网络安全培训完就业一般,为什么还有那么多人学?

无论如何&#xff0c;即使网上说找工作有多难&#xff0c;互联网行业的薪水普遍比传统行业高&#xff0c;这是毫无疑问的事实。 现在这种offer颗粒无收或者计科应届生出来薪资降低的这种情况都是跟前两年的情况对比来讲的&#xff0c;网络安全是个有前景的专业这个事实谁也不能…

xilinx 7系列fpga上电配置

一、前言 Xilinx FPGA通过加载比特流到内部存储单元来进行配置。 Xilinx FPGA存在两种数据配置路径&#xff0c;一种是满足最小引脚需求的串行路径&#xff0c;一种是可用8位、16位或32位来连接到行业的高性能通用接口&#xff0c;如处理器&#xff0c;8位或者16位并行的闪存…

[问题记录] oracle问题汇总记录

plsql问题 1、oracle-initialization error could not locate OCI.dll 下载plsql客户端后&#xff0c;登录显示如图所示的错误 解决方法&#xff0c;点击下方链接&#xff0c;下载64位客户端 Instant Client for Microsoft Windows (x64) 64-bit (oracle.com) 2、显示中文乱…

影院座位选择简易实现(uniapp)

界面展示 主要使用到uniap中的movable-area&#xff0c;和movable-view组件实现。 代码逻辑分析 1、使用movable-area和movea-view组件&#xff0c;用于座位展示 <div class"ui-seat__box"><movable-area class"ui-movableArea"><movab…

Android 11属性系统初始化流程

在init进程启动的第二阶段&#xff0c;调用PropertyInit 对属性系统进行初始化 int SecondStageMain(int argc, char** argv) {//省略PropertyInit();//省略 }PropertyInit函数在system\core\init\property_service.cpp 中实现 void PropertyInit() {//省略mkdir("/dev/…

【Layui】------ layui实现table表格拖拽行、列位置的示例代码

一、完整的示例代码&#xff1a;&#xff08;请使用layui v2.8.3的版本&#xff09;看懂就能用、不要照搬、照搬会出错误、拷贝重要代码改改符合你自己的需求。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

File,IO流,递归详解

File类 介绍 java.io.File类是Java语言提供了用来描述文件和目录(文件夹)的 构造 方法 注意&#xff1a; 构造方法中通常用的是第一个方法文件和目录可以通过File封装成对象File封装的对象仅仅是一个路径名&#xff0c;它是可以存在的&#xff0c;也可以不存在 绝对路径…