在c语言在哪里编写编写过程中,出现如下图所示之问题,是由什么情况导致,本人还没入门,请回答那种菜鸟能看懂的,

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

发布了2 篇原创文章 · 获赞 18 · 访问量 2万+

}

我要回帖

更多关于 c语言在哪里编写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信