单片机有锁存为啥子还需要while循环

简单的说就是:为了保证程序的可靠性,或者叫健壮性;

如果我输出了零,那么就一直是零,但是为了保证程序的可靠性,或者叫健壮性,应该重复输出0,使用while循环就是为了保证万无一失;

单片机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)循环,程序全部执行后,跳转至程序起始处重新执行。

单片机有锁存为啥子还需要while循环相关推荐

  1. 汽车座椅位置自动调节中高灵敏度数字式锁存

    随着汽车工业的发展及其电子化程度的不断提高,汽车逐步走向自动化和智能化,以便为驾驶者提供更好的乘用体验.其中对驾驶者来说,座椅的舒适性是影响用车体验的一个非常直观因素,座椅位置的调节能为驾驶者提供舒适 ...

  2. 国产汽车级双极锁存霍尔传感器CHA44X介绍

    CHA44X是一系列符合AEC-Q100 汽车认证的数字双极锁存霍尔传感器产品,其主要性能及特点如下: • AEC-Q100汽车认证 • 数字双极锁存霍尔传感器 • 多种灵敏度选项(BOP / BRP ...

  3. 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...

  4. 译文 :如果我们心存偏见,还能做好数据分析吗

    如果我们心存偏见,还能做好数据分析吗? 原文: If prejudice lurks among us,can our analytics do any better? 来源:https://www. ...

  5. 元宵佳节,程序员小明被女友罚写一万遍“我爱你”,还不准用循环和递归?!

    元宵佳节,风流倜傥的程序员小明终于东窗事发,被他那聪明漂亮.温柔大方的女朋友小芳发现了他的风流往事,被罚写一万遍"我爱你",还不准用循环和递归!请看机智的小明如何从容应对

  6. 51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真

    51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真 说明:为什么采用4位的数码管,因为Proteus里面没有3位的数码管器件可选,也可以采用2+1,或者1+1+1, ...

  7. 如此通俗的分布式锁讲解,如果还搞不定那就...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 贾俊江 来源 | http://tinyurl ...

  8. Redisson:这么强大的实现分布式锁框架,你还没有?

    摘要:Redisson框架十分强大,基于Redisson框架可以实现几乎你能想到的所有类型的分布式锁. 本文分享自华为云社区<[高并发]你知道吗?大家都在使用Redisson实现分布式锁了!!& ...

  9. 单片机c语言存数据,单片机中C语言的数据存储与程序编写

    一.五大内存分区 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区. ...

最新文章

  1. Ajax.net实现loading登陆的效果
  2. Lock同步锁--线程同步
  3. spark中saveAsTextFile如何最终生成一个文件
  4. 4.5.1 条件语句
  5. 调试比较大小的 才=c语言,计算机等级二级C语言考试练习题(六)
  6. 【kafka】scalac compiled against an incompatible version of joptsimple
  7. Dell台式机重装win 10系统之后开机报错
  8. Windows8 RP版亲手体验全过程
  9. 微信 iOS 收款到帐语音提醒开发总结
  10. Wireshark抓取VLAN包
  11. 2020 用html jQuery实现广告轮播图自动切换 滚动页面 鼠标悬浮下标且左右切换图片
  12. win7如何设置wifi热点_mac如何共享网络?mac怎么建立wifi热点?
  13. 3 树莓派使用网线连接路由器获取网络
  14. 高等数学(总结9-多重积分)
  15. 【Android 教程系列第 27 篇】如何使用 Keytool 工具生成 keystore 签名文件
  16. kill -15 与kill -9的区别
  17. 【转帖】Moodle平台的5个新玩法
  18. 熊掌号PHP,百度熊掌号广受站长关注,phpcm网站程序的熊掌号页面改造插件
  19. 从搜狗网站爬取微信公众号文章
  20. Xftp的安装与使用

热门文章

  1. MTC荣膺“2020年度SAP Business One大中华区新零售行业伙伴”
  2. (二十四)优秀员工 - 5
  3. PCB电路板上各种标志的含义
  4. 集合篇8:笔试编程原题
  5. 手把手教你绩效管理体系-OKR
  6. 中国的SEO优化大神都有哪些人呢?【SEO优化大神】
  7. java运行机制及运行过程
  8. ffmpeg-日志输出av_log()
  9. layui使用富文本已经使用第三方插件Kz.layedit来优化layui的富文本
  10. 树莓派装linux教程,树莓派安装系统教程