单片机是没有上操作系统的东西,在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中的以下代码方位:
持续点击单步调试直到进入一个循环中: