产品概述

单片机 编译 单片机常用的编程语言有哪些?怎样能快速提高编程水平?

小编 2024-10-06 产品概述 23 0

单片机常用的编程语言有哪些?怎样能快速提高编程水平?

在我们上学的时候,很多专业都有开设C语言这门课程,但是汇编语言我是没见过有这门课。C语言和汇编语言都可以作为单片机的编程语言,那么它们具体有什么不同呢?

汇编语言的主要优势是程序可以优化,程序由我们编程人员所掌控,程序的安全性和执行速度取决我们编程者的水平,能力强的又快又安全,能力差的估计别人也看不上;就执行速度来说比C语言要快;因为汇编语言的代码占程序存储器的容量比C语言要小。所以汇编程序经常在那些程序存储器和数据存储器较小的老式单片机。汇编程序是机器语言的汇编助记符,指令比较难记住和指令功能弱的缺点,学习起来会有一定的难度。

C语言的优势与缺点正好与汇编相反。C语言是一种高级语言,记忆指令方便,学习容易,而且编译时的优化由编译器管理,对于使用者的要求不是很高。机器优化的东西就会有局限性,C语言总的执行速度比汇编语言慢,代码占程序存储器的容量较汇编语言大。

我个人建议初学者先使用C语言,这样方便我们入门,入门后再根据需求来决定要不要学习研究汇编语言。

怎样快速地让自己的代码提升?

我就说说我代码提升的经历,每次想起来脸上都能感觉火辣辣的。也就是七八年前我刚毕业那会,出学校时的第一份工作给我的教训真的太深刻了,刚出学校时都有一定的锐气。

入职后的第一个工作就是维护老产品的代码,每天的工作就是看代码;看着代码然后就觉得有些地方可以改得更简单一些,然后开会的时候就把自己的想法说了出来,然后领导就问原来负责这个代码的老员工可以不可以,老员工说估计没问题,现在都是年轻人的天下,没有创新就没有未来。后来换上去以后,第二天产品就出现了问题,然后责任肯定是我的。后面在公司做了大半年基本上做的事情对于自己的成长没什么帮助。后来就辞职了。

有时候我常常在想如果当时我先把我的想法以低姿态跟那位老员工请教,说不定当时他会告诉我为什么要加上那些我认为多于的代码,后面肯定可以从他的身上学到非常多的知识,对于我代码水平的提升至少会快上两年。

要想代码提升我们可以通过学习别人的代码,通过代码去学习思维,多想一下别人为什么这么写,通过别人的代码提升自己的眼界,眼界不提高代码永远提升不了,每个行业都是人外有人天外的地方,保持一颗学习的心态才能获取更多的知识。

希望以上的知识能够给大家提供帮助,这期我们先分享到这里,觉得有用的可以给华维点个赞关注一下!

想要一起学习单片机的朋友,评论”我要入门“,有惊喜,加入我们,就可以与导师一对一互动,快速成长

单片机程序是如何执行的指令数据写哪了

单片机的运行需要执行程序,同时硬件也是必不可少的,二者缺一不可。大家都知道单片机的运行需要执行写好的程序,但是单片机的指令数据都被写在了哪里?在哪读取指令?

让我们从最开始的环节讲起。在单片机上电的瞬间,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows、Linux系统启动了。

如果将操作系统看作是在处理器上奔跑的一个大裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多,很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。这一点看,它们在流程上是很相似的。

如果是系统上的程序启动呢?它们是由系统来决定的。Linux上在shell下输入./p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设它是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然这里边还有内存映射,虚拟内存,连接与加载,等一些其他东西),准备执行。

由以上可知,单片机上的程序和平时在系统上运行的程序相比,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的)。因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。

由此,以前的一些疑惑也就解开了。为什么在单片机上的程序不怎么使用malloc,而PC上经常使用? 因为单片机上没有已经写好的内存管理算法代码,而在PC上操作系统里运行的程序,libc已经把这些都做了,只需要调用就可以了。如果在单片机上想用动态内存,也可以,但是这些代码要自己去实现,并定义一个相应的malloc,有时候一些公司会提供一些库函数可能会实现malloc,但是因为单片机上RAM内存十分有限,如果不知道它的运行方式,估计会很危险。同样,因为在PC的系统上运行的程序与逻机程序的不同,裸机程序不会有动态链接,有的只是静态链接。

关于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是单片机上只有几K的RAM,而flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗(这里指的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存)?

这不可能,因为课上老师只说内存,但是PC上内存一般就是DDR RAM,不会是硬盘,硬盘是保存数据的地方;由此类比时,容易把自己弄糊涂,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。

运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M或者几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以现在CPU工作频率最快是在2003左右。一个瓶颈出现了。为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。

所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段、bss段、堆栈段;ROM(EPROM、EEPROM、Flash等非易失性存储设备)存放代码,只读数据段。本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写。当然现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM,一个Flash低,更节省成本,对于生产商更划算。

对于单片机的程序执行时指令和数据的存放与读取,理解如下:

对单片机编程后,程序的代码段、data段、bss段、rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段、bss段、复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。

无论是单片机也好,PC也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。

相关问答

单片机 编程语言?

单片机编程用c语言开发,因为单片机需要非常底层开发语言,用c语言开发效率非常高,而且c语言可以非常灵活,对于控制硬件非常合适。c语言最大的好处是可以利用...

单片机 编程要用什么软件? 单片机 编程如何快速入门?

你好,我就是做单片机嵌入式软件开发的,对于第一个问题,单片机开发一般都是用C语言,单片机的开发平台即编译器通用的有keil、IAR、eclipse等,现在eclipse也支...

51 单片机 编程方法?

学习51单片机硬件和编程基础缺一不可。比如说基本电子元器件电阻电容、电感、三极管、按键开关、二极管等等。再比如说模拟电路、数字电路、ADLayou软件、C...

stm8 单片机 如何编程?

欢迎关注我的免费课程《零成本学习单片机开发》,希望能帮助热爱单片机学习的童鞋。目前还在使用stm8s系列单片机,不得不说stm8系列单片机是非常优秀的单片机,...

51 单片机 编程程序怎么编?

51单片机编程程序怎么编?♣这种技术性问题在今日头条上,几乎没有一个高手给你一个答复。因为学习51单片机编程程序是需要长篇大论,并且用电脑操作截图来说明...

单片机 编程一般用什么语言?

单片机编程用c语言开发,因为单片机需要非常底层开发语言,用c语言开发效率非常高,而且c语言可以非常灵活,对于控制硬件非常合适。c语言最大的好处是可以利用...

单片机 编程一般用的是什么语言?

单片机一般用C语言或者汇编语言来编写程序。建议先学C语言,汇编语言要算地址,汇编语言比较难,所以建议先学C语言。汇编语言要算地址,大多数情况下,单片机运行...

单片机 怎么定义i?

在单片机编程中,i通常用来表示循环计数器。循环是一种重要的程序结构,通常用于重复执行一段代码。循环计数器i用于跟踪循环的迭代次数,从而控制循环的执行次数...

c51 单片机 编程?

南邻更可念,布破冬未赎。白毛浮绿水,红掌拨清波。窗含西岭千秋雪,门泊东吴万里船。月下飞天镜,云生结海楼。月出惊山鸟,时鸣春涧中.千山鸟飞绝,万径人...

单片机 编程中FF是什么意思?

0X表示十六进制的意思;FF是表两位的十六进制的数;ff在单片机中默认为11111111,在单片机中表示,将八位都是高电平;0X表示十六进制的意思;FF是表两位的十六进制...

猜你喜欢