人们在接触单片机时,首先急于了解的就是如何对单片机进行编程,很少有人关心单片机程序执行流程究竟是什么样子的。本文就将从单片机程序执行流程中的while(1);语句问题进行入手,来为大家梳理一个大致的流程分析。
细心的朋友在51单片机的代码中都能发现一个名为while(1);的语句。为何要加一句while死循环让程序停留在main函数中呢?将while(1);语句去掉有什么影响?
这里不妨写一个简单的程序来试验一下,如图1。
执行以上程序,由P1端口控制的流水灯闪一下。程序最终进入while(1);里循环。将while(1);语句屏蔽掉。是不是程序就不能被正确执行了呢,因为退出了main主函数,就像Render需要循环来实现一样。程序执行的结果是:流水灯不停的闪烁。
为什么会出现这种现象,不妨先来进行一下猜想,并准备一些解决方案。
1、板子损坏。但换个板再测试一下还是一样的结果。
2、单片机中将一直执行main函数中的最后一个语句吗?基于带OS平台下运行标准C语言文件的经验,可从来没有想过是main函数被多次调用或多次进入。
3、单片机内将C语言指令取出来加载到单片机内,单片机是不是就会在内自动生成一个主程序循环执行C语言中main函数的内容。
4、百度一下单片机的执行流程。出现了一样带有疑问的问题:为什么main函数中不加while(1);语句之后程序会反复执行呢?回答的关键词包括“程序跑飞、看门狗、复位”。
5、向前辈或老师进行请教,看看能否得到答案。
老师的回答: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函数中去,执行一下试试:
可以看到此条语句执行了后确实回到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程序管理。
说了这么多,相信有些朋友已经观察到了问题所在,那就是代码机制的不同造成了对语言处理能力的不同。循环的情况在linux当中就不会出现.while(1);语句的问题虽然看似普通,但经过分析之后竟然能产生如此大的篇幅,可见其中需要很多的单片机知识支撑,而在这一问题的解决中,大家就能从中收获很多额外的知识。
声明:本内容为作者独立观点,不代表电源网。本网站原创内容,如需转载,请注明出处;本网站转载的内容(文章、图片、视频)等资料版权归原作者所有。如我们采用了您不宜公开的文章或图片,未能及时和您确认,避免给双方造成不必要的经济损失,请电邮联系我们,以便迅速采取适当处理措施;欢迎投稿,邮箱∶editor@netbroad.com。
微信关注 | ||
技术专题 | 更多>> | |
2024慕尼黑上海电子展精彩回顾 |
2024.06技术专题 |