查看原文
其他

【系列】嵌入式编程"进阶有道”--C语言篇(1)

bug菌 最后一个bug 2021-01-31

1、日常聊一聊(听说文章与音乐更配)

    文章开头为大家选了一首《桥边姑娘》,为什么选择这首歌?给你个眼神慢慢体会。好了,上期为大家带来了一篇《Jlink调试器的那些事》,很多小伙伴在微信中给我说文章前面有点难懂,因为我们大部分小伙伴都不会去研究一个调试器,这篇文章的目的主要是让大家简单了解一下,如果想要深入研究大家可以找一下调试器制作的相关资料进行阅读,那样应该能找到相应的答案。

    好了,今天为大家开辟一个全新的连载系列《嵌入式编程进阶有道》,该系列文章既然是进阶那么肯定就不会讲太多基础知识,现在市面上介绍基础知识的书籍也特别多了,大家随便随便挑来一本看看即可。该系列文章不仅仅只包括C语言,后续还会开拓数据结构编程算法等知识来帮助大家提升。对于目前的C语言提升篇主要是把脉C语言和其中一些难懂的知识,并且还会介绍一些优秀代码或者是实际开发中的C语言独特用法。下面开始进入今天的主题:

2、嵌入式与C语言

     作为该系列的第一篇文章我需要为C语言在嵌入式行业拉拉票,C语言可谓是目前信息类专业必上的一门编程语言课,为什么选择C语言?我个人觉得是因为C语言是比较古老的,并且语法上非常精炼的,比如相比C++语言。可以说你只需要了解如何定义变量、并且学会了三大程序结构:顺序结构、分支结构、重复结构(再简单一点就是程序的顺序执行,if语句,for语句)就可以开始程序设计了,所以如果是初学者一定不要对其有畏惧感。

1)编程与数学 

    信息类相关的基本都是理工类,那么一直以来必备的知识便是数学了,那么我们的编程与数学便是密不可分的,但是我们再深入想一想,数学其实更多的是人类思维的一种简化和总结,比如说著名的高斯求和定律,早期没有这个规律基本上大家都是一个一个数相加,后面总结了规律就很方便我们的计算,这就是数学,那么我们如果用C语言实现这个功能,直接编写这个定律就可以了(具体关系见下图),

    那么还在读书的正在为数学抓狂的小伙伴一定要好好的学习下,我们经常听到程序员和码农两个名词,个人觉得他们的区别就在码农是为了编程而编程,而程序员是通过理论数学计算分析而编程。

2)C程序到机器码 

    我们都知道可编程芯片执行的都是二进制的机器码,然而这些机器码一定是有一定规则的,其对应着芯片的指令集,在早期使用汇编进行程序设计就是需要对应的对应芯片的指令集,不过由于汇编语言与芯片的依赖性较强不便于程序的可移植性、维护性和可读性,这样可以说C语言就是为了解决汇编语言这些缺点而更贴近底层的一种相对高效的语言。我在这里把从C程序到机器码大致流程了总结一下:C程序-->预编译-->编译-->汇编-->链接-->目标文件(可以转化成bin,hex文件等)【如下图所示】;玩单片机的小伙伴可能大部分在类似于KEIL、IAR等IDE中都是一键生成烧录文件,而且大部分处理过程中的配置都是通过IDE中可视化的对话框进行配置,如果到了linux平台使用gcc编译器可能就需要了解这整个实现的过程并使用相关命令行来编写makefile等完成这个自动化过程。

3)C语言与底层 

    能够产生烧录文件还不够,C语言还需要具备一些有利于进行底层开发的特点才行。C语言具有丰富的位运算符,我们在进行底层操作的时候大部分都是读写或者修改寄存器等中的某一个位,同时位域的存让开发人员能够更好的理解底层。

    同时对于初学者比较头疼的指针,它更是C语言受底层驱动开发欢迎的原因,指针简单一点的说的话就是记录着一块内存的地址,这块内存的大小类型等等都由指针类型决定着,你可以认为这块内存是一个byte,也可以认为是一块数组,还可以认为这块记录着一个函数,指针的灵活度非常高,所以说指针是C语言的精髓。

    结构体类型为C语言创造新的数据类型,struct简单一点就是把我们的基本类型进行组合从而形成一种新的数据类型,一旦和指针进行结合使用,便又增加了C指针的灵活度,比如说索引一块结构体类型的的数据块等。

    这样由于我们C语言对硬件的访问虽然没有汇编那样直接,不过C语言的对底层操作功能上一点都不输汇编语言,可能很多小伙伴有会想?既然这样汇编就没啥用了,其实汇编的最大优势就是效率会要比C高,因为汇编的指令集基本上与实际运行的机器码是一一对应的关系,而我们C语言一条语句可能需要转化为多条汇编语句来进行处理,不过随着我们编译工具的日益智能化,在效率上的差异正在日益减少,除非在一些特殊的场合如果代码执行的效率能够为系统带来较大的收益,比如说RTOS中的任务调度这块一般都会使用汇编来进行编写,不过这部分汇编代码比较简短而且也比较容易理解,而且大多数都是嵌入到C语言中对汇编进行调用,所以作者建议大家对于汇编有一个简单的学习过程即可,不需要花太多的精力去深究,而且简单的汇编基本上大家学过微机原理等等课程也都看得懂。(PS:如果是复杂的汇编程序如果让我们去编写估计也不一定能够写出高效率的汇编程序来吧。哈哈)


3、总结

     今天这里主要是为大家讲解了一下从我的个人角度对C语言的一些把脉,同时里面对一些C语言一些简单的思考,也让大家对后面的嵌入式的学习更加有动力,后续该系列文章我会陆陆续续为大家带来C语言中我们值得get到的编程技巧和进阶知识点,一方面提升大家的编程能力,另一方面也能够让大家顺畅的阅读一些开源作品,同时也推荐大家阅读C语言中的"四大名著"--《C专家》、《C指针》、《C pro》、《C缺陷》,如有什么疑问也欢迎大家加作者微信进行交流。

    好了,这里是公众号"最后一个bug",我们下期精彩再见!

推荐好文  点击蓝色字体即可跳转

一文教你定位单片机"死机"(实用调试技巧)

嵌入式编程之"重构"代码(C语言版本) 

单片机常用程序框架之分时轮询(详注代码) 

【连载】通过"库文件"学单片机驱动编程(5)-完结篇

goto关键字你不知道的"那些事"(C语言提升)

手把手教你写Modbus-RTU协议(理论篇)

单片机开发之节省内存大法(C语言版本)

嵌入式编程之动态接口技术(经验干货)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存