历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2020年02月01日 | 51单片机程序深入编写裸机代码有助于了解硬件的特性

2020-02-01 来源:elecfans

单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。


若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么?


写一个很简单的程序试一下。

执行以上程序,由P1端口控制的流水灯闪了一下。程序最终进入while(1);里纠缠去了,这个到好解释。


现将while(1);语句屏蔽掉。我还以为程序不能被正确执行了呢,因为退出了main主函数,就像Render需要循环来实现一样(尽管刚刚闪灯的程序不在循环之内,但我还是不由产生了这一错觉)。程序执行的结果是:流水灯不停的闪烁!


看到这个现象后的猜想及动作^-^:

(1) 这块板坏了吧!(在带操作系统如linux字符界面下运行一个不带死循环的C语言文件完毕后就会返回到linux shell程序中)。赶紧换个板再测试一下,显然还是一样的结果。

(2) 单片机中将一直执行main函数中的最后一个(些)语句?(基于带OS平台下运行标准C语言文件的经验,可从来没有想过是main函数被多次调用或多次进入)

(3) 单片机内将C语言指令取出来加载到单片机内,单片机内自动生成一个主程序循环执行C语言中main函数的内容?(虽然很荒唐,还是想了)

(4) 赶快谷歌百度一下单片机的执行流程(虽然在谷歌百度时以“51单片机程序执行流程”搜索,没有搜到相关内容)。换朴实的搜索词:“51单片机 main”。然后就出现跟我一样带有疑问的问题:为什么main函数中不加while(1);语句之后程序会反复执行呢?回答的关键词包括“程序跑飞、看门狗、复位”。

(5) 趁上嵌入式的机会将“51单片机程序执行流程”搬出来并向老师讲述了我所写程序的得到的现象,包括我怎么验证呀等等。


老师的回答:Keil C51程序自动加载了一个名为”STARTUP.A51”的文件,在这个文件里面进行了一系列的初始化操作后进入用户编写的C语言程序入口main函数中,main函数执行完毕后,STARTUP.A51文件后有一句跳转到程序入口main函数的语句,所以会再次进入C语言主程序main函数中执行相关内容。


然后我用keil软件模拟了运行一下以上那一段代码:

程序开始运行就在程序入口main函数的第一条语句之处,Disassembly窗口是c语言代码与汇编代码相对应的窗口,前面是地址,后面的是C语言对应的汇编语句。下面的窗口是相应文件的运行代码的位置,由黄色箭头指向当前正要执行的代码。然后点击单步运行工具条,指导跳出main函数为止,程序跳转到STARTUP.A51中的以下代码位置:

继续点击单步调试直到进入一个循环中:

这里是一个循环,根据DJNZ指令的功能:每执行一次DJNZ RO, IDATALOOP就将R0的值减1,若R0的值不为0则就跳到IDATALOOP地址去。很显然这是一个循环,那么RO的值是多少呢,在以下窗口显示:

可见r0的初值为0x7f,这里将要循环0x7f(128)次,具体在这里r0值的含义可查看一下子的。那么在这个循环之后程序又将去哪里呢?跳过这个循环后程序运行的地方如下:

再单步运行一次:

根据Disassembly的内容,此条语句执行了就又要回到main函数中去了,执行一下试试:

是的!

所以,在51单片机中,程序的执行流程就是会不断( 以r0的值作为延迟条件, 具体含义可继续探索 )的进入main函数中执行main函数中的代码。


为什么我们在linux等上面运行不带死循环的C语言代码后程序就会自行终止呢?这是不同的操作流程:

(1) C51单片机不带OS(操作系统),代码的执行形势在此看来就由STARTUP.A51来安排了,没有一个更大的程序来管理怎么调用main函数。

(2) 像Linux这类的平台是带了OS的,运行一个C语言程序对linux来说就是一个任务,除了运行C语言程序这个任务外还有其它的任务。当运行一个C语言程序完毕时,此次的任务也算是完成了。如在linux shell界面运行一个文件名为“hello.c”功能为输出“hello world!”的C语言程序,过程如下:

编译:gcc hello.c –o hello

运行:./hello

在运行hello可执行文件时,可以当做是shell调用了hello这个可执行程序。在hello运行完毕后,将返回值等返回给shell界面。整个C语言文件的生死全有linux shell程序管理。

归其原因,还是代码规定的机制不一样吧。

推荐阅读

史海拾趣

Custom Connector Corporation公司的发展小趣事

随着全球化趋势的加剧,CCC意识到必须拓展国际市场才能保持竞争力。因此,公司制定了全球化战略,积极开拓海外市场。通过与国外代理商合作、参加国际展会等方式,CCC的产品逐渐打入国际市场并获得了良好的口碑。如今,CCC的产品已经出口到欧洲、亚洲等多个国家和地区。

ARCOL公司的发展小趣事

品质是ARCOL公司的核心竞争力。公司始终坚持以质量为核心,建立了严格的质量管理体系。从原材料的采购到产品的出厂,每一个环节都经过严格把关,确保产品的质量和性能达到最高标准。同时,ARCOL还注重品牌建设,通过不断提升产品质量和服务水平,树立了良好的企业形象和口碑。

Bias Power公司的发展小趣事

在竞争激烈的电子行业中,Bias Power公司始终坚持质量至上的原则。公司建立了严格的质量控制体系,从原材料采购到生产加工、产品测试等各个环节都进行严格把关。此外,公司还引入了先进的生产设备和技术,确保产品的稳定性和可靠性。

由于公司对产品质量的严格把控,Bias Power公司的产品在市场上享有很高的声誉。许多知名企业都选择与其合作,将其产品应用于关键领域和重要项目中。这种信赖和认可为Bias Power公司的发展提供了有力支持。

Helicomm公司的发展小趣事

随着全球化进程的加速,Bias Power公司积极寻求国际合作,以拓展更广阔的市场。公司与国际知名电子企业建立了战略合作关系,共同研发新产品,分享技术和市场资源。通过国际合作,Bias Power公司成功打入欧洲、亚洲等多个地区的市场,实现了业务的快速增长。

此外,Bias Power公司还积极参与国际展览和交流活动,展示其最新技术和产品,与全球同行进行深入交流。这些活动不仅提升了公司的知名度,还为公司的进一步发展奠定了坚实基础。

BOT公司的发展小趣事

广西来宾电厂是中国第一个国家正式批准的BOT试点项目。该项目由法国电力国际和通用电气阿尔斯通公司作为项目公司的主要股东,总投资为6.16亿美元。这个电厂的装机规模为72万千瓦,安装了两台36万千瓦的进口燃煤机组。在长达18年的特许经营期内,该项目为广西地区提供了稳定的电力供应,同时也为项目公司带来了可观的投资回报。随着时间的推移,该项目成为了BOT模式在中国成功应用的典范,为后来的类似项目提供了宝贵的经验。

Herrmann Kg公司的发展小趣事

Herrmann Kg自成立以来,始终致力于超声波焊接技术的创新。在1960年代初,由Walter Herrmann创立的这家公司,通过引入基于发电机原理的机器发生器,成功替代了当时不稳定的超声波管发生器,这一技术创新极大地提升了超声波焊接的稳定性和效率。随着技术的不断迭代,Herrmann Kg开发出了包括ULTRAPLAST、ULTRAPACK和ULTRABOND在内的多条产品线,这些产品不仅满足了市场对高效、可靠焊接技术的需求,还推动了超声波焊接技术在电子制造领域的广泛应用。

问答坊 | AI 解惑

发现论坛bug

在点击进入电路图后,最下面有不对齐的…

查看全部问答>

多个串口,超小巧机箱,晾晾我们公司定制的新电脑

公司昨天来了批超小机箱的电脑,让我这个没见过的孩子新鲜了一天,都知道商用台式电脑又笨又重的,没想到还有这么小机箱的,老板说大机箱没用,特意定制的超小机箱,静音效果很好,又不占地方,恩,果真不是一般的东西,拍几张图上来看看 商 ...…

查看全部问答>

MC33996的一个问题,高手进。。。

请问,用MC33996和S08单片机做开关量输出时,那个AND/OR到底是怎么用的?谁来解释下。。…

查看全部问答>

历届电子设计优秀作品

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 继续啊  …

查看全部问答>

各位前辈们 谁用过 sc32442这系列的芯片?很想知道这系列的不同型号有什么区别? 怎么命名的?

各位前辈们 你们谁用过 sc32442这系列的芯片?小弟要用这颗料做个手持设备 发现有很多型号 SC32442BL-33 SC32442B43-7080 SC32442B54 SC32442AL-43S SC32442AL-45 SC32442XL-31 SC32442X33-7080 SC32442X31-7080 SC32442AL-33 SC32442A45 ...…

查看全部问答>

版本移植问题请教大家???

     感谢helenhf的回复我上个问题,那个问题已经解决。是MPC8280的PCI内部空间和外部空间有一个转换关系,即outwindow地址,PCI设备的基地址应设置为0x50000000,此时 d 0x80000000 就可以看到PCI设备的寄存器了。   &nb ...…

查看全部问答>

哈工大西门子视频教程

哈工大西门子视频教程1-12集.rar   需要先下载一个叫优蛋的专用下载软件才行。资源没有问题,可以下载! http://u.115.com/file/f93dca657d …

查看全部问答>

DAC8532基于MSP430驱动紧急求助,各位大神帮帮忙

有调过DAC8532的大神没?紧急求助 我今天调了一天没有数据转换出来,感觉和TLV5818差不多,驱动程序这些没什么错啊  望各位大神帮我看看程序 谢谢 非常感谢了 /**************************************************** 引脚初始化定义 ...…

查看全部问答>

在电脑与BBB之间互传文件的方法

以下两种方法都是建立在ssh连接的基础上。 方法一,用scp [OPTIONS] file_source file_target命令。例如: 从电脑复制到BBB: scp /Users/mycomputer/full.tar.gz root@192.168.7.2:/home/root/BBB复制代码 然后会提示你输入另外那台192.168.7 ...…

查看全部问答>

知名教授大作免费下,三万大奖等你拿

本帖最后由 qwqwqw2088 于 2014-12-15 16:29 编辑 西安交大知名教授杨建国最新力作《你好,放大器》新鲜出炉,你下载了吗? 点击链接,免费下载哟西安交大知名教授杨建国最新力作——《你好,放大器》电子版免费下载ing 3万元活动地址在这 ...…

查看全部问答>