在开始学习嵌入式系统或者单片机系统的时候,大多数人的学习方法都是自己找视频教程或书本自己学,有的人也许会掏钱报个培训班什么的跟着老师学。

  当自己慢慢的可以独立写代码的时候,就会觉得已经学会了。特别是自己能独立完成一些简单的项目之后感觉自己可以出师了。慢慢的随着各种项目的锻炼,写代码的能力也会慢慢提高。写到最后就会发现,其实好多项目都是不同的代码重新组合,一个功能写好之后,在每个项目中都可以用。比如写好了一个串口功能之后,那个项目用到了串口,直接将以前写好的代码拷贝过去就完了,最后开发项目就变成了一个拼积木的过程。

  这时候基本写代码好像就失去了最开始学习的激情,写代码就变成了一个体力活了,基本也不用动脑了,都是复制粘贴了。写代码的能力好像也很难在突破了,感觉到了瓶颈。这时候就很难找到视频或者书籍或者老师教自己如何突破这个瓶颈。此时如果想要自己的代码水平更进一步,要怎么做呢,下面我就将自己的经验分享一下。

  在自己写完一个功能之后,如果想知道自己写的怎么样,最好的办法就是找一个别人写的同样功能的代码去比较。看看自己写的和别人写的有什么区别。找代码的时候,不能网上随便找一个,因为你不知道你找到的代码是初学者写的还是高手写的。容易被误导,这时就要找大家比较认可的,代码风格比较好的去比较。我一般找到都是某原子和某火的代码。下面就通过一个简单的LED代码来分析比较一下。

  首先看某原子的代码

  这是 led.h 的代码


  这是 led.c 的代码


  led.h里面用到的位操作是在sys.h头文件中定义了。


  这个初始化代码看起来非常简洁,首先使能用到的IO口时钟,然后初始化相应的IO口。在初始化函数中一眼就能看出两个LED分别是PA2和PD8口。代码理解起来非常容易。

  接下来看某火的代码
   头文件 bsp_led.h

   C文件 bsp_led.c

  首先从文件名字就能发现区别,上面的是led.h,下面的是bsp_led.h。前面加了一个bsp,这个bsp是什么意思呢?BSP即Board Support Package,板级支持包。也就是这个文件是和当前硬件系统有关的。然后在看头文件中的内容,发现在头文件中,把LED用到的IO口和具体引脚重新定义了一个名字。然后在C文件中初始化LED口的时候,用的都是新的名字。初始化的流程也是先使能用到的IO口的时钟,在初始化用到的相关IO口。但是从初始化代码中很难看出,当前使用的LED口是哪个端口。代码看起来感觉就比较费劲。

  为什么一个简单的LED功能,风格却相差这么大呢?这两种风格你自己的代码更接近于哪一种呢?从我自身来说,刚开始的时候比较喜欢上面的那种风格,简单明了,代码写起来很容易。但是随着写代码的时间增加,逐渐开始喜欢下面的这种风格。代码也由上面的风格逐渐转换为下面这种风格了,下面就分别讨论一下这两种风格的差异。

  刚开始写代码的时候,第一种风格比较适合,写起来比较简单,容易理解,代码出现问题时查找起来也更加方便快速。但是随着项目的增加和需求的各种变化,就会发现,第一种代码修改起来比较麻烦,比如LED口发生了变化,那么头文件和和初始化函数都需要修改,变动一次要修改好几个地方,修改的时候容易漏掉有些地方,导致调试起来各种问题不断,增加了调试的难度。这时就想,能不能值修改一个地方,就能把LED口用到的地方都修改过来。此时就需要用到第二种代码的方式了。在头文件中将LED用到的端口和时钟都抽象出来,重新定义一个名字。在初始化代码的时候,初始化的只是是LED口,至于这个LED具体对应到哪个口,直接在头文件中定义就行。这时候初始化代码就不需要修改了。

  简单的理解就是,第一种方法写起来简单,针对的是具体的IO口,但是一旦项目发生了改动,修改和移植起来比较麻烦。第二种方法写起来复杂,但是是一个抽象的方法,它的初始化函数和具体的IO口没有关系。当项目发生变动或者移植起来更方便。

  这两种方法各有优缺点,可以根据自己的实际情况选择不同的方法,也可以将这两种方法结合起来。比如我感觉第一种方法的位带操作比较简单,将所有的位操作统一定义在一个文件中,使用起来比较方便。第二种方法的位带操作都卸载头文件中,写起来比较麻烦,也比较复杂。但是第二种方法把LED口使用的IO口和引脚抽象出来比较好。那么就可以将第一种的位带操作和第二种的端口抽象同时用在自己的项目上。

  这样通过对别人代码的分析,然后结合自己的代码,对比不同代码的优缺点,然后再修改自己的代码。不断的模仿别人优秀的地方,自己的代码也就写的越来越好了。如果感觉自己的技术比较好了,那么就可以去看库函数的源码,或者操作系统的源码,看看官方的源码是如何将不同类型不同型号的单片机抽象为统一的函数。如果哪天你看到别人的代码之后,一眼就能看出代码的优缺点时,那么就说明你的水平已经很高了,已经突破了自己的瓶颈了。

在嵌入式开发中如何提高自己的代码水平相关推荐

  1. 嵌入式开发中数值常量如何转化为内存地址?

    作者 | 李肖遥       责编 | 欧阳姝黎 最近在使用 Nordic 的最新蓝牙芯片 nRF52832 开发过程中,因为做一些测试涉及到对内存地址的操作,有(*(volatile unsigne ...

  2. 理解嵌入式开发中的一些硬件相关的概念

    为什么80%的码农都做不了架构师?>>>    做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解.这样才能深入的研究下去.下面我们简单的介绍嵌入式开发 ...

  3. 浅析嵌入式开发中的RAM和ROM

    在嵌入式开发中常常会遇到RAM,ROM,flash,内存等等一些问题,先梳理一下备用. 1.ROM:只读存储器.优点:容量大,掉电不丢失:缺点:读取速度慢.事实上,"只读"定义不准 ...

  4. 嵌入式开发中DSP与FPGA的关系

    嵌入式开发中DSP与FPGA的关系 常所说的单片机侧重于控制,不支持信号处理,属于低端嵌入式处理器,arm可以看做是低端单片机升级版,支持操作系统管理,更多接口如网卡,处理能力更强;fpga是可编程逻 ...

  5. 嵌入式开发中常用的几种通信接口总结

    关注.星标公众号,直达精彩内容 在嵌入式系统中,板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线. 以下内容为常用板上通信接口:包括I2C.SPI.UART.1-Wire: I ...

  6. 嵌入式开发中C语言编程要点简述!

    在嵌入式Linux的C语言开发中,C语言的基本编程依然是最重要的内容.除此之外,与一般的C语言编程相比,嵌入式Linux的C语言编程有以下一些要点: 1.库函数与系统调用 在进行C语言编程的时候,使用 ...

  7. c语言改变cmd 字体大小_嵌入式开发中常见3个的C语言技巧

    原文:https://www.cnblogs.com/CrazyCatJack/p/6080266.html 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数 ...

  8. 状态机思路在嵌入式开发中的应用说明及注意事项(普罗米修斯中不少功能节点用了状态机的方法来写)

    我感觉普罗米修斯很多功能模块里面都用到了状态机的思路 比如圆环穿越的,比如最新的二维码降落的代码. 摘自:https://mp.weixin.qq.com/s/qRmBDH-VIHM26AaNFoD9 ...

  9. 嵌入式开发中,嵌入式硬件和软件有什么区别?

    嵌入式指的是把软件直接烧录在硬件里,而不是安装在外部存储介质上,就像赋予机器人灵魂,从而方便人类操控.在嵌入式开发中,分为嵌入式硬件和嵌入式软件,大多数人对嵌入式的硬件和软件之间的区别不是很了解,现在 ...

  10. python示波器 波形数据_Python在嵌入式开发中的应用——数据示波器

    Python在嵌入式开发中的应用 引言 在嵌入式开发中我们常常要进行数据分析.算法设计.原型验证.自动化测试.辅助工具设计,每个环节的工作效率对整体的开发都非常重要.选用一个好的辅助开发工具是非常必要 ...

最新文章

  1. 离线轻量级大数据平台Spark之MLib机器学习库TF-IDF实例
  2. BaseControl按钮合集
  3. Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志
  4. python celery异步_python项目_使用异步功能,celery
  5. 图像语义分割 -- UNET++
  6. 关于Scalability的一些思考与疑问
  7. VB的KeyAscii
  8. (转)python3之模块io使用流的核心工具
  9. 数据结构c语言版算法设计题,数据结构题集(C语言版)算法设计答案
  10. WMI遍历注册表(VBS编程)
  11. Pytorch基于深度学习模型Seq2Seq的聊天机器人构建与应用部署实战
  12. 故事会-设计模式-策略模式
  13. el-table-column 内容不自动换行
  14. 短视频搬运如何上热门?搬运视频哪个平台容易挣钱?
  15. win10计算机维护,手把手教您win10系统打开安全和维护功能的问题
  16. 教你修改电脑mac地址图解教程
  17. 新型冠状病毒之物资的分配
  18. VN.PY量化框架创始人教你做量化交易
  19. web前端开发技术实验与实践(第三版)储久良编著 项目12 设计简易网站导航
  20. java转换大小写快捷键_Java 大小写最快转换方式实例代码

热门文章

  1. 激励视频广告 Android,激励视频广告
  2. Linux虚拟机(Centos7)桥接模式静态ip配置/克隆后MAC地址配置、主机名修改
  3. hadoop-bigdata-v2.2 版本shell脚本一键部署 master、slaver1、slaver2三个节点源代码.
  4. js 基础词汇及方法整理
  5. 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
  6. 用ProcessOn制作流程图
  7. Pycharm中不显示latest version
  8. 动画:二叉树有几种存储方式?(上)
  9. python处理FITS 3:处理头文件和数据单元
  10. IT人论房价 (七) 城市置业乱谈