资料介绍
单片机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这样,在程序员编译程序可能出现漏洞的地方给与防护,避免程序跑飞程序员无法查找程序问题。
深有体会。刚学单片机不久,参考别人的程序写了LCD驱动,在买来的实验板上运行时,显示正常。在自己用面包板上搭建的系统运行时,只能显示几秒钟,之后一片空白,当时怀疑面包板供电不稳定,或者信号线干扰,折腾几小时后,在程序末尾加一句“while(1);”,显示完全正常。
不加不稳定,有时候会在main()里面循环,有时候会乱码。
这里的while(1)并不是防止程序“跑飞”的,而是防止main()返回。
① 在嵌入式中main是不能返回的。不同的C语言实现的单片机初始化代码会有不同的表现,有的是在call _main后jmp,而有的是jmp 0,等等这些会导致不可预料的结果。
② 在我们写的C语言后转换成汇编,再观察单片机的代码区,你会发现没有写程序的部分例如全1或者全0区域,程序运行到这里,就会有可能造成意料不到的结果。若无while(1)循环,程序全部执行后,跳转至程序起始处重新执行。
- RAM在单片机里有什么样的作用?
- 《PIC单片机C语言》pdf 0次下载
- 单片机C语言程序与数据存储
- C语言和单片机C语言为什么会有差异?虽不同但理同!
- [ 爱找茬 ]都是C语言,单片机C语言和普通的C语言究竟有什么差异呢?
- 1.单片机和C语言的关系(5)
- 单片机C语言和汇编语言混合编程实例详解 224次下载
- PIC单片机的C语言编程电子版下载 0次下载
- 单片机上拉电阻有什么样的作用好使用原则详细说明
- 单片机C语言中如何使用nop函数进行短延时的效果资料和程序说明 10次下载
- C51单片机C语言与标准C语言有什么区别? 134次下载
- 单片机C语言code与data的作用 1次下载
- 8051单片机C语言软件设计8051单片机C语言软件设计 92次下载
- 单片机C语言中常用到的关键字及数据类型 13次下载
- AVR单片机C语言总纲
- 什么是C语言?单片机有什么特点?为什么要用C语言编程? 1264次阅读
- C语言怎么跳出while函数 3.5w次阅读
- 单片机液晶汉字显示的C语言程序 4885次阅读
- 单片机为什么需要晶振?晶振在单片机中有什么样的作用 2.1w次阅读
- 新手教程:单片机的学习实践步骤 3819次阅读
- C语言中#和##符号有什么样的作用 4.5w次阅读
- 学习单片机一定要先学好C语言再去学单片机吗 1.3w次阅读
- 单片机C语言有哪些优越性?如何建立一个Keil C51项目 1.2w次阅读
- 单片机C语言的求平方根怎么实现 3462次阅读
- RAM在单片机里有什么样的作用 6262次阅读
- 单片机C语言之串口通信协议 4773次阅读
- 单片机仿真器有什么用?单片机仿真器作用介绍 1.7w次阅读
- pic单片机io口控制教程之c语言编程实现 1.1w次阅读
- 单片机编程之汇编语言基础-常用指令和程序模式 1.5w次阅读
- 单片机C语言知识点全攻略(一) 5w次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 651单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 751单片机大棚环境控制器仿真程序
- 1.10 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多