嵌入式软件开发有没有捷径

news2024/11/13 9:13:51

嵌入式软件开发有没有什么捷径?不定期会收到类似的问题,我只想说:嵌入式软件开发没有捷径

说实话,有这种想法的人,我其实想劝你放弃。对于绝大多数普通人,一步一个脚印就是捷径。

当然,这个问题可以换个方式问,比如:如何才能提升自己编程水平?或者:如何提升自己技能?

对于大部分人,特别是初学者,我觉得应该从两个方面提升自己技能:

1.多参考、多阅读优秀的开源代码;

2.多实践,动手敲代码;

为啥要参考别人的代码?

你要相信,这个世界上大部分人都是普通人,你的写代码的很多想法别人都已经想过,而且实践验证过。

最终能保留下来的,而且运用在优秀开源项目中的代码,这种代码就具有参考价值。

肯定有人会反驳,认为**代码很La圾,自己写的代码肯定比**代码要好。有这种想法的人,往往自己很菜,却非要认为自己很牛逼。

当然,不排除有那种确实很牛逼的人,但这种人又有多少呢,反正我自认为我是一个普通人,我要向优秀的人学习的地方还有很多。

何为优秀的代码?

何为优秀的代码?可能每个人的定义不同,每个人的侧重点也不同。

易读易懂、结构清晰、逻辑清晰、方便移植......等等包含了所有优点的代码,就是优秀的代码?我觉得不是!

人无完人,代码也肯定多少都存在“瑕疵”,或者说多少存在有你认为不满意的地方。

我认为优秀的代码,首先,它能被许多人使用,并运用在许多成功的项目中。比如:一套控制算法代码,能成功应用在机械臂、机器人、无人机等项目中,它就是优秀的代码。

其次,它具有优秀代码的一些基本特性,比如上面说的易读易懂、代码清晰、方便移植等。

这种对于学习者不排斥的代码也算得上优秀的代码,比如:一个模块的驱动程序、一套串口通信协议。

再次,就是代码更多细节,比如:代码排版格式、注释、命名等。

哪里有优秀的代码?

我觉得程序员不应该问这样的问题。我反过来问你吧,你看大家一般把代码开源在什么地方?

当然是代码托管的网站啊,GitHub是目前世界上最大的代码托管平台:

https://github.com/

当然,除了GitHub之外,还有国内的Gitee代码托管平台:

https://gitee.com/

这俩代码托管平台众多大公司都在上面贡献了优秀的代码,微软、谷歌、腾讯、阿里这些公司都有代码库。

同时,你会发现平时我们使用的一些开源代码,在GitHub平台上都有。比如:RTOS内核及组件、MCU厂家驱动代码、通信协议等源代码。

多动手写代码

实践是检验真理的唯一标准,这句话相信大家都听说过。

如果只看书不动手敲代码就能掌握程序开发,你觉得这个程序员能写出好的代码吗?很多人基础理论很不错,但实践操作起来各种问题、各种不懂。

比如下面这样写:

if(i = 1){  //...}

你可能认为是对的,编译也是对的,但实际这代码有bug。

编程是一个很注重实践的工作,因为现实中存在各种不确定的因素,比如:你写的函数,有可能因为传入的参数过大导致内存溢出。

代码写出来了还不算有本事,编译0警告0错误,并成功运行起来,你学的理论知识才发挥了作用。

编程习惯

这里说的多动手写代码,不只是为了写代码而写代码,写代码的同时,要培养良好的编程习惯。

如果养成了不良的编程习惯,后期改变可能很难。

比如函数、变量以“中文字母”方式命名:

int DianYa;int CaiJiDianYa(void);

还比如:不写注释、源代码不分类、命名混乱等。

很多人初学的时候可能都没有意识,想到什么就写什么,所有功能在main中就实现了。

这里就要回到上面的内容,多参考别人优秀的代码。当然,不同阶段参考的代码不同,初学者可以参考一些基础教程配套的代码,有工作经验的工程师应该多参看成功项目的源代码。

看看别人怎样命名、怎么写注释、怎么将代码分类等。

编程思维

做小项目时,可能几百行代码,一个main就搞定了,这时你可能觉得编程思维不重要好。

但项目做大了,你就会发现以小项目的编程方式不能完成了,这个时候就要考虑软件架构、结构化、模块化了。

对于初学者来说,一下就要掌握软件架构、模块化设计可能有点难,但是,可以慢慢培养自己的编程思维。

举一个简单的模块化的例子,你做一个小车,你把“运动部分”的代码归为一类(模块化),对应的文件命名可以为 bsp_motion, app_motion,函数命名为 Motion_xxx 等。

当然,还有很多地方,你可以都归类为 Motion,比如:

#define MOTION_PWM_TIMx              TIM9#define MOTION_PWM_TIM_CLK           RCC_APB2Periph_TIM9#define MOTION_PWM_TIM_GPIO_CLK      RCC_AHB1Periph_GPIOE#define MOTION_PWM_TIM_PIN           GPIO_Pin_5#define MOTION_PWM_TIM_GPIO_PORT     GPIOE#define MOTION_PWM_TIM_SOURCE        GPIO_PinSource5#define MOTION_PWM_TIM_AF            GPIO_AF_TIM9#define MOTION_PWM_TIM_OCxInit       TIM_OC1Init#define MOTION_PWM_TIM_SetComparex   TIM_SetCompare1#define MOTION_PWM_COUNTER_CLOCK     10000000

其实,说的再多,看的再多,不如自己行动起来敲代码,过程中你肯定会遇到各种各样的问题。

你用心解决这些问题的过程,就是你成长的过程。

最后,如何证明你编码水平提升了? 

答:回看自己以前代码,如果觉得烂,那就说明你提升了。

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

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

相关文章

若依(RuoYi)系统添加自定义的模块

RuoYi系统是干什么用的,这里不过多说明了,自己搜一下,其提供的功能己经基本满足了一些简单的系统应用,如果想进行二次开发的小伙伴,可能会想仅仅用Ruoyi的后台权限管理,但是业务功能想进行自定义,可以借鉴一下本文。我们用的是前后端分离版 一、前端的自定义模块 其实在…

Drools用户手册翻译——第四章 Drools规则引擎(九)Phreak算法

这个地方我是先了解了Rete算法,才来看得这一部分,结果发现好像没有什么用......完全不知道讲的什么,估计之后在用的时候慢慢会明白。 RETE算法笔记:http://t.csdn.cn/iNZ8V 甩锅声明:本人英语一般,翻译只…

二叉树的最近公共祖先,二叉搜索树的最近公共祖先(同一个思路)

题目链接   二叉树的最近公共祖先   给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。   百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可…

GD32F103输入捕获

GD32F103输入捕获程序,经过多次测试,终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮,第1次按下采集一个值保存到TIMER2_CountValue1中,第2次按下采集一个值保存到TIM…

如何使jwt生成的 token在用户登出之后失效?

问题1:如何使jwt生成的 token在用户登出之后失效? 由于jwt生成的token是无状态的,这体现在我们在每一次请求时 request都会新建一个session对象: 举个例子: @PostMapping(value = "/authentication/logout") public ResponseEntity<BaseResult> logOut(Htt…

第十次CCF计算机软件能力认证

第一题&#xff1a;分蛋糕 小明今天生日&#xff0c;他有 n 块蛋糕要分给朋友们吃&#xff0c;这 n 块蛋糕&#xff08;编号为 1 到 n&#xff09;的重量分别为 a1,a2,…,an。 小明想分给每个朋友至少重量为 k 的蛋糕。 小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋…

Spring之浅谈AOP技术

前言 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff09;&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构。 OOP&#xff08;Object Oriented Programming&#xff09;面向对象编程 AOP和OOP一样都是一种编程思想&#xff0c…

佑友防火墙后台命令执行漏洞

漏洞描述 佑友防火墙 后台维护工具存在命令执行&#xff0c;由于没有过滤危险字符&#xff0c;导致可以执行任意命令 漏洞复现 访问url 使用弱口令登录佑友防火墙后台 User: admin Pass: hicomadmin 点击系统管理 维护工具 Ping 输入可执行命令 127.0.0.1|cat /etc/passwd

【高级程序设计语言C++】AVL树

1. AVL树的概念2. AVL树的旋转2.1. 左单旋2.2 右单旋2.3 左右双旋2.4 右左双旋 1. AVL树的概念 AVL树是一种自平衡二叉搜索树&#xff0c;它在每次插入或删除节点时自动调整以保持树的平衡。AVL树的平衡是通过节点的高度差来衡量的&#xff0c;即左子树的高度和右子树的高度之…

Gartner:2022年全球IaaS公有云服务市场增长30%,首次突破1000亿美元

根据Gartner的统计结果&#xff0c;2022年全球基础设施即服务&#xff08;IaaS&#xff09;市场从2021年的928亿美元增长到1203亿美元&#xff0c;同比增长29.7%。亚马逊在2022年继续排在IaaS市场的第一名&#xff0c;其次是微软、阿里巴巴、谷歌和华为。 最新消息&#xff0c;…

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建 qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…

无涯教程-Lua - 文件I/O

I/O库用于在Lua中读取和处理文件。 Lua中有两种文件操作&#xff0c;即隐式(Implicit)和显式(Explicit)操作。 对于以下示例&#xff0c;无涯教程将使用例文件test.lua&#xff0c;如下所示。 -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用以下语句。…

计算机毕设 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

vscode 第一个文件夹在上一层文件夹同行,怎么处理

我的是这样的 打开终端特别麻烦 解决方法就是 打开vscode里边的首选项 进入设置 把Compact Folders下边对勾给勾掉

acwing 1064 小国王 线性状态压缩DP

输入 3 2输出 16&#x1f37a; AC code #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector>using namespace std;typedef long long ll; const int N 12; const int M 1 << 10, K 110;//…

Openlayers:DWS-DD坐标形式互相转换

参考google地图, 坐标分为DD和DMS两种形式。 在本示例中,DWS-DD做互相转换。Openlayers处理DD-》DMS很简单,逆向操作需要做反向推导,方法参考源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有…

Linux【网络基础】IP协议

文章目录 一、IP协议&#xff08;1&#xff09;IP地址协议概念和理解&#xff08;2&#xff09;IP地址协议格式&#xff08;3&#xff09;网络号和主机号&#xff08;4&#xff09;地址管理&#xff08;一&#xff09;分配IP地址方法&#xff08;二&#xff09;CIDR分配IP地址&…

基本频谱分析

基本频谱分析 傅里叶变换是用于对时域信号执行频率和功率谱分析的工具。 频谱分析数量 频谱分析研究非均匀采样的离散数据中包含的频谱。傅里叶变换是通过在频率空间表示基于时间或空间的信号来揭示该信号的频率分量的工具。下表列出了用于描述和解释信号属性的常用量。要了…

Axios GET 请求:从入门到实践

在进行网络请求时&#xff0c;axios 是一个非常常用的请求库。本文将介绍如何使用 axios 发起 GET 请求&#xff0c;并详细列出传参的几种写法。同时会提供一个实践案例&#xff0c;其中包含基本路由与请求处理的过程&#xff0c;并确保在 IDE 编辑器中可以顺利运行。 什么是 a…