51单片机程序执行流程详细分析
单片机是没有上操作系统的东西,在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程序管理。
归其原因,还是代码规定的机制不一样吧。
本文转载自网络,如涉版权请联系我们删除
看完本文有收获?请分享给更多人
回复关键词有干货: 电路设计丨电容丨三极管丨PCB丨接地‧‧‧‧‧‧
长按二维码识别关注
阅读原文可一键关注+历史信息
宇凡微详解:51单片机程序执行流程
今天宇凡微为大家分享的内容是51单片机程序执行流程 ,在我们的学习过程中总是会遇到一些难题,我们宇凡微将为大家整理更多的知识点,供大家学习参考。
51单片机程序执行流程
单片机是没有上操作系统的东西,在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程序管理。
以上就是深圳宇凡微为大家介绍关于51单片机程序执行流程 的全部内容。宇凡微提供的方案技术能够走在市场前沿,是因为有过硬的研发技术,为各大电子产品生产商打造属于自己的品牌产品,提升市场竞争力!
原文:宇凡微详解:51单片机程序执行流程
相关问答
51单片机程序 ?你这不是都已经把程序写出来了吗?!平铺直叙就是最好的程序。你的要求写成计算机认识的语句就是程序。假定p1口的0--7对应你说的D1__D8,电平高点亮。#inclu...
51单片机 的 程序 地址范围是?MCS51单片机的最大程序空间是64k,也就是从0000开始,一直到FFFF,也就是0到65535。51单片机根据型号不同,内部分配的程序空间也不一样,比方说,程序空间是32k...
用c++怎么编写 51单片机程序 ,可以这么样编写吗?可以的。在51单片机的嵌入式C语言中,指针同样是被支持的。所以在单片机上一样可以使用指针操作,具体使用方法,与标准C语言并没有不同。不过需要注意的是,使用...
51单片机 编程有什么用?51单片机作为学习单片机的过程中必须要经过的一个过程来讲是非常重要的,原因在于51单片机从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象...
用keil编写 51单片机程序 步骤?编写51单片机程序步骤一般包括以下几个步骤:1.确定程序的需求和功能,对程序进行整体设计。2.编写程序代码,采用C语言或汇编语言进行编程。3.使用keil集...
ad里边怎么找 单片机 ?在AD软件中找单片机,可以通过以下步骤实现:1.打开AD软件,点击菜单栏中的“库管理器”按钮。2.在库管理器中,选择“添加库”按钮,然后选择单片机厂商提供...
51单片机 ,按键控制流水灯 程序 ,懂的进!八个LED灯与单片机P1口...[最佳回答]假如,你的程序在执行key_scan();是触发了两次中断导致num>20,你的显示函数将永远被跳过,你应该写成if(num>20)��{���num=0;���display();�.....
51单片机 秒表 程序[回答]这个程序写的太乱了执行的顺序是先定义秒等一些寄存器,然后清零,并定义定时初值,开显示。再打开定时器中断,定时到,中断秒寄存器加1,加到10时清...
单片机 填空求助1.MCS- 51 系列单片机为()位单片机.2.8051单片...[最佳回答]1.MCS-51系列单片机为(8)位单片机.2.8051单片机有两种复位方式,既上电复位和手动复位.复位后SP=(07H),PC=(0000H),PSW=(00H),P0=(F...
51单片机 怎么将编译好的 程序 录入?将编译好的程序录入51单片机可以通过多种方式实现。一种常用的方法是使用专门的单片机编程器,将编译好的程序通过编程器连接到单片机的编程接口上,然后通过编...