51单片机程序执行流程(STARTUP.A51) [李园7舍_404]

keil 版本:uVision 4

 

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

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

 

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

#include <reg52.h>


void delay_ms( int ms );

int main()
{
	
	P1	= ~P1;
	delay_ms( 500 ); 
	
	while(1);
	return 0;			
}


//-----------------------
//约延迟ms毫秒
//-----------------------
void delay_ms( int ms )
{
	int i, j;
	for( i = ms; i > 0; i-- ){
		for( j = 110; j > 0; j-- ){
			;
		}
	}
}


 

执行以上程序,由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程序管理

 

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

 

此次笔记记录完毕。

 

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 首先,A51是一种基于8051微控制器的汇编语言。在8051微控制器上编写程序时,可以使用汇编语言编写程序,并将其编译为二进制机器代码,然后将其烧录到芯片中。 startup.a51文件是8051微控制器启动代码的源文件,用于在8051芯片上运行汇编程序时初始化系统设置和设置寄存器。这个文件通常由芯片制造商提供,并包含一些系统级别的功能,例如初始化存储器、设置时钟频率和配置中断向量等。 startup.a51文件通常会在整个程序开发过程中保持不变,因为它是8051芯片的系统级别代码。因此,程序员可以专注于编写应用程序代码,而不必关心芯片启动和系统初始化的细节。 在编写8051微控制器程序时,程序员可以将startup.a51文件包含在他们的项目中,并且将其链接到他们的代码中,以确保系统初始化代码能够在8051芯片上正确运行。 ### 回答2: 51单片机启动文件startup.a51是一种汇编语言文件,用于初始化并启动51单片机。它包含了51单片机的启动代码,负责进行硬件初始化和设置。 首先,startup.a51文件会设置栈指针,即初始化堆栈。堆栈用来保存程序运行时的临时变量和函数调用的返回地址。 接下来,启动文件会初始化外部存储器(如RAM和ROM)的地址和数据线,并将它们连接到相应的片内内存和外设。 然后,启动文件会对中断进行设置和初始化。它会定义中断向量表,即将中断向量的地址和中断服务程序的入口地址联系起来。这样,在发生中断时,单片机就可以根据中断向量表找到和执行对应的中断服务程序。 此外,启动文件还会对时钟和定时器进行初始化。它会设置定时器的初始值和工作模式,使得单片机能够按照指定的时间间隔产生定时中断。 最后,启动文件会执行主程序的入口函数。主程序是由开发者编写的应用程序代码,它包含了处理输入输出、逻辑运算、控制流程等功能。 总之,startup.a51文件是51单片机启动时必要的代码文件。它通过执行初始化步骤,为单片机的正常工作做好准备,并将控制权交给应用程序。 ### 回答3: startup.a5151单片机启动文件,它起着非常重要的作用。在单片机上电时会首先执行这个文件中的代码。下面我来详细解释它的功能和作用。 首先,startup.a51文件包含了一些必要的初始化代码,用于设置单片机的基本工作环境。它会设置机器模式、堆栈指针、内存空间等。这些设置对于单片机正常工作是必不可少的。 其次,startup.a51文件还包含了中断向量表的定义。中断向量表是用来保存中断地址的一个表格。当中断事件发生时,单片机会自动跳转到对应中断向量的处理程序去执行。startup.a51文件会为每个中断向量分配一个处理程序的地址。 此外,startup.a51文件中还包含了一些初始化数据和变量的定义。在程序运行之前,这些数据和变量会被存储在相应的内存地址中。这些数据和变量的定义可以在程序中使用,提供了方便的操作。 最后,startup.a51文件还会跳转到主程序的入口点,将控制权交给主程序。主程序是用户自己编写的,是实际执行功能的核心代码。 总之,startup.a5151单片机启动文件,负责进行一系列的初始化设置和准备工作。它定义了中断向量表、初始化数据和变量,并将控制权交给主程序。没有这个文件,单片机将无法正常启动和运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值