这个while(1)循环并不能阻止程序的跑飞(应该用看门狗防止程序跑飞),不过这样写也是很正确的做法,就是让程序一直在运行着(原地循环),这里的while(1)并不是防止程序“跑飞”的,而是防止main()返回。
① 在嵌入式中main是不能返回的。不同的C语言实现的单片机初始化代码会有不同的表现,有的是在call _main后jmp,而有的是jmp 0,等等这些会导致不可预料的结果。
② 在我们写的C语言后转换成汇编,再观察单片机的代码区,你会发现没有写程序的部分例如全1或者全0区域,程序运行到这里,就会有可能造成意料不到的结果。若无while(1)循环,程序全部执行后,跳转至程序起始处重新执行。
我用keil将去掉while(1)的程序编译,编译后的汇编代码如下,注意C:0x0012行(RET后会从0开始运行)和C:0x001C行(运行结束后跳转至main)这个方式是keil编译器的跳转方法,其他的可能会不同:
C:0x0000 020013 LJMP C:0013
10: void main (void){
11: P1=0x00;
C:0x0003 E4 CLR A
C:0x0004 F590 MOV P1(0x90),A
12: P20=0;
C:0x0006 C2A0 CLR P20(0xA0.0)
13: P21=0;
C:0x0008 C2A1 CLR P21(0xA0.1)
14: CS88=0;
15:
C:0x000A C2A2 CLR CS88(0xA0.2)
16: P1 = 0xFF;
17:
18:
C:0x000C 7590FF MOV P1(0x90),#0xFF
19: P1 = 0xfe;
20:
21:
22: // while (1)
C:0x000F 7590FE MOV P1(0x90),#0xFE
23: {
C:0x0012 22 RET
C:0x0013 787F MOV R0,#0x7F
C:0x0015 E4 CLR A
C:0x0016 F6 MOV @R0,A
C:0x0017 D8FD DJNZ R0,C:0016
C:0x0019 758107 MOV SP(0x81),#0x07
C:0x001C 020003 LJMP main(C:0003)
while(1)
{
}
是为了让程序停在这儿 防止程序跑偏
去掉while (1)后便一直重复执行void main()中的语句
循环是保证单片机一直处于工作状态,在有信号触发的时候,能执行相应的动作。