单片机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)循环,程序全部执行后,跳转至程序起始处重新执行。
次元光电推出首款可实现三种光色的COB光源
w5500原理图_w5500电路图
撇开华为, 魅蓝X和MX6如何选择?
三安光电子公司 “阔气”出手,发力集成电路领域
解析智能驾驶关键技术:LPDDR5
单片机C语言的主程序,通常要用一个while(1)语句来让程序进入一个无限循环,目的是为了让程序一直保持在我
英特尔下一代处理器细节参数曝光
数字货币交易平台Paxful与线上娱乐平台Bspin正式达成了合作关系
面部识别是什么_面部识别的应用
导航定位芯片厂商华大北斗发布了新一代北斗三号导航定位芯片
滤波电容容值与所滤噪声频率的关系
Fitbit为何打赢AppleWatch? 功能合理 性价比高
场效应管厂商:山东科达半导体有限公司简介
在Linux系统使用iptables实现外网访问内网
瞬态抑制二极管TVS的选择
华为P10最新消息:华为P10闪存门风波未平,华为P10“wifi硬件门”风波又起,网友还会买账吗?
SIM卡座的基本知识你了解多少
STC15系列单片机与迪文DGUS屏应用(五):模拟调试
固态电池原理_固态电池使用的材料
交流充电桩可提供安全稳定、友好便捷的充电服务