您的位置 首页 芯闻

单片机C语言中while(1)的问题

单片机C语言的主程序,通常要用一个while(1)语句来让程序进入一个无限循环,目的是为了让程序一直保持在我们需要运行的情况下。虽

  单片机C言语的主程序,一般要用一个while(1)句子来让程序进入一个无限循环,意图是为了让程序一向保持在咱们需求运转的状况下。
  尽管这种做法毋庸置疑,在网上仍是有不少朋友有疑问,假如程序不加while(1)会呈现什么状况,关于这种好学精力,仍是值得赞扬的,做学问就需求有追根问底的精力。
  首要,咱们要了解一件工作,咱们编写的C言语程序,终究下载到单片机傍边去,在咱们单片机的程序存储空间FLASH傍边存储的全部是2进制数字代码。比方0x00,0x01,一向到0xff。而咱们编写的C代码,依托的是编译软件,比方keil软件,首要将C言语编译成为汇编言语,终究汇编言语变成2进制代码,也便是咱们的HEX文件傍边的数据,下载到单片机傍边去。
  因而,查找这个问题,首要从源头来找,首要是C言语,然后,咱们再看一下软件给咱们编译的汇编言语是什么姿态。用KEIL软件编写一个程序,然后simulator的方法进行仿真,进入仿真环境后,在View窗口下有个Disassembly window,翻开,里面就会呈现方才咱们的C言语所对应的汇编言语了(KEIL软件会主动将C编译成汇编),找到里面的主函数,找到你终究一行的程序所对应的汇编,找到后,会发现在终究一行程序完毕后,KEIL这个软件还会主动给参加几行汇编代码,这几行代码便是(1)MOV R0, #0x7F;(2)CLR A; (3)MOV @R0, A; (4) DJNZ R0, (3); (5)MOV SP, #0x0C;(6) LJMP main;这几条句子,前4条,是将咱们单片机的内存的前128个地址清零,第5条,是界说仓库,第6条,是将程序从头跳转到main函数的首行进行履行。
  从这儿咱们能够看出,终究下载到单片机运转的程序包括两部分,一部分是咱们编写的程序代码,别的一部分是编译器主动生成的代码,因而,用KEIL软件编写的程序在没有while(1)的状况下运转到终究一行,会主动跳转到main函数榜首行运转。
  本着谨慎的情绪,笔者又查找PIC单片机的编译开发环境MAPLAB IDE,找到其间的汇编程序,在Disassembly window汇编程序中没有发现跳转到主函数的句子或者是复位句子。笔者不甘心,所以持续查找,翻开了Promgram Memory,这也是终究下载到单片机傍边的程序,经过细心检查笔者在其后边,发现了在main函数的终究,有一条“reset”句子,这是一条PIC单片机的复位句子,也便是说PIC单片机在进行程序编译的过程中,假如没有while(1)句子,终究则会直接履行复位,这MAPLAB躲藏的可够深的。
  我在论坛上看到一个发帖者提出他下载进AVR单片机的没有while(1)的程序,可是单片机却没有复位,这点我没有再去验证,由于咱们的程序一般都是要加while(1)这个循环,因而呢,问题到了这儿,单片机程序没有while(1)会呈现什么状况,这一点现已不重要了。可是有一点现已能够确认了,一部分单片机在没有while(1)的状况下,运转到终究一行呈现的状况遭到编译开发环境的影响。
  当然了,一个谨慎的开发环境,就应该像KEIL和MAPLAB这样,在程序员编译程序或许呈现缝隙的当地给与防护,防止程序跑飞程序员无法查找程序问题。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/318040.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部