技术文档

单片机 文件系统 51单片机程序执行流程详细分析

小编 2024-10-10 技术文档 23 0

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丨接地‧‧‧‧‧‧

长按二维码识别关注

阅读原文可一键关注+历史信息

比特智能申请单片机运行文件的制备方法专利,实现质量稳定可靠

金融界2024年2月10日消息,据国家知识产权局公告,山东比特智能科技股份有限公司申请一项名为“单片机运行文件的制备方法、系统、装置和存储介质“,公开号CN117539558A,申请日期为2024年1月。

专利摘要显示,本发明公开了一种单片机运行文件的制备方法、系统、装置和存储介质,涉及单片机技术领域。单片机运行文件的制备方法,包括以下步骤:设定第一存储区域、第二存储区域;获取第二目标文件并存储至第二存储区域;预存储第一目标文件至第一存储区域,或者待获取第二目标文件后将第一目标文件存储至第一存储区域;合并第一存储区域、第二存储区域中的数据为运行文件。本发明实现产品只需开发人员进行一道工序即可完成两个程序的功能,缩短流程,节约时间,实现质量稳定可靠。

本文源自金融界

相关问答

单片机 文件 都哪些,是不同 单片机 对应不同的头 文件 ?有没有什么对应表格之类的东西?

没有类似的表格,但是都可以看到这些头文件,你用相应的单片机编程的时候,一般程序的开头都需要包含头文件的语句,在这些语句上点击右键就可以打开头文件,可以...

51 单片机 文件 的含义?

1.是为了方便程序员在编写代码时调用相关的函数和定义。2.这些头文件包含了51单片机的各种功能和特性的定义和声明,例如IO口控制、定时器控制、中断控制等等...

单片机 程序有哪几部分组成?头 文件 的作用是什么?

头文件,变量声明,函数声明,子函数,主函数这几部分组成,头文件其实就是一种声明,将单片机中的一些常用的符号变量进行定义声明,对一些特殊功能寄存器进行声...

单片机 怎么创建 文件 ?

单片机并没有操作文件的功能,因为它通常没有文件系统可以管理文件。所谓的“创建文件”,实际上是在单片机使用的开发环境中进行的。一般情况下,可以通过以下步...

单片机 项目的目录结构,多个.c 文件 是干什么用的?

这是写程序的常采用的做法,叫模块法。因为,一个项目,程序是很复杂的,有很多的接口电路和外部设备,每一个设备都要写一个驱动程序,各个接口电路也要有相应...

multisim怎么使用51 单片机 的头 文件 ?

1.利用multisim建立一个Design,放置一个51单片机,根据向导建立一个51单片机的源代码工程,并选择生成一个main.c文件。2.在生成的main.c中有一个main函数,输...1....

单片机 代码中lib是什么 文件 ?

在单片机代码中,lib通常是指库文件(Library),它是一个包含可重用函数和变量的文件。这些函数和变量可以在程序中被调用和使用,从而简化了开发过程并提高了代码...

51 单片机 和52 单片机 文件 区别?

51单片机和52单片机都是基于Intel的8051微控制器核,但它们有一些不同的特性和功能。这些差异也反映在它们的头文件上,这些头文件包含了用于编程单片机的库和宏...

单片机 怎么建立工程 文件 ?

单片机建立工程文件的步骤如下:首先选择合适的开发工具,如Keil、IAR等,创建新项目,选择单片机型号和工程目录,然后添加需要的源文件和头文件,设置编译选项...

51 单片机 的头 文件 究竟该如何写?

单片机的头文件应该包含了该单片机的所有功能模块的声明和定义,包括IO口的定义、中断向量表、外设寄存器的地址定义等。同时,头文件应该提供了一系列的宏定义...

猜你喜欢