0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51单片机程序深入编写裸机代码有助于了解硬件的特性

m3eY_edn_china 来源:未知 作者:李倩 2018-03-19 08:36 次阅读

单片机是没有上操作系统的东西,在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程序管理。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43970

    浏览量

    620767
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128398

原文标题:51单片机程序执行流程详细分析

文章出处:【微信号:edn-china,微信公众号:EDN电子技术设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机深入了解

    项目名称:单片机深入了解!项目是否开源:否申请开发板数量:1 块申请人团队介绍:我们团队由五个人组成,我们打算开始着手单片机程序改编,设计一些比较特殊新颖的东西!希望给以支持!
    发表于 10-12 20:00

    如何学习嵌入式系统(硬件篇),含51单片机学习资料

    头脑。 6、ARM9/ARM11裸机学习裸机程序编写,即不带操作系统的程序编写,其作用和上面43
    发表于 12-01 17:35

    单片机程序代码烧写方法

    单片机加密是为了防止被解密,做加密那就得对解密手段有所了解,这样能更有助于增加我们所采用的加密措施的解密难度。
    发表于 07-19 09:33

    探探51单片机的执行流程

    单片机是没有上操作系统的东西,在keil中编写代码都是裸机代码深入编写
    发表于 11-18 07:29

    单相的基本知识及第一个C51程序

    虽说用C语言编程不必对单片机硬件结构有详细的掌握,但是了解一些单片机内部硬件的基本结构,有助于
    发表于 07-15 14:23 17次下载

    基于51单片机的IIC 程序代码

    基于51单片机的,IIC 程序,源代码
    发表于 11-16 19:04 62次下载

    51单片机程序执行流程是怎么样的

    单片机是没有上操作系统的东西,在keil中编写代码都是裸机代码深入编写
    发表于 08-19 17:31 2次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>程序</b>执行流程是怎么样的

    51单片机程序执行流程详细资料说明

    单片机是没有上操作系统的东西,在keil中编写代码都是裸机代码深入编写
    发表于 06-24 17:43 1次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>程序</b>执行流程详细资料说明

    单片机程序如何编写

    设计编写单片机程序是一个渐进的过程不可一蹴而就,毕竟单片机程序是与硬件有密切关系的,我们一般称为
    的头像 发表于 02-12 14:38 3.7w次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>程序</b>如何<b class='flag-5'>编写</b>

    51单片机程序执行流程详细分析

    单片机是没有上操作系统的东西,在keil中编写代码都是裸机代码深入编写
    发表于 11-11 20:21 9次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>程序</b>执行流程详细分析

    关于在keil 5中编写51单片机程序

    关于在keil 5中编写51单片机程序
    发表于 11-23 16:20 2次下载
    关于在keil 5中<b class='flag-5'>编写</b><b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>程序</b>

    基于51单片机的呼吸灯程序编写

    利用51单片机编写的呼吸灯小程序,实验程序内容截图分享~
    发表于 11-23 16:36 33次下载
    基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的呼吸灯<b class='flag-5'>程序</b><b class='flag-5'>编写</b>

    单片机裸机环境下编写AT指令程序

    单片机裸机环境下编写AT指令程序的一种方式。2.程序设计 首先串口底层的收发程序不在这里详细
    发表于 01-18 10:43 6次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>裸机</b>环境下<b class='flag-5'>编写</b>AT指令<b class='flag-5'>程序</b>

    孔环是什么?深入了解孔环有助于实现PCB设计

    本文将探讨孔环,因为更深入了解孔环有助于确保成功地实现PCB设计。
    的头像 发表于 07-19 10:21 2704次阅读
    孔环是什么?<b class='flag-5'>深入了解</b>孔环<b class='flag-5'>有助于</b>实现PCB设计

    单片机(裸机)程序一般怎么写?

    裸机(单片机)程序主要是相对于基于操作系统的程序开发而言,就是没有操作系统的基础上开发具有特定功能的代码
    发表于 09-05 16:48 624次阅读
    <b class='flag-5'>单片机</b>(<b class='flag-5'>裸机</b>)<b class='flag-5'>程序</b>一般怎么写?