正常在写单片机程序时,我们都会在main函数中加一个while(1)的死循环。让程序一直跑到世界尽头。但是如果不加这个死循环,单片机执行完main函数里面的代码之后,干嘛去了?
在博文单片机C语言while(1)的问题中作者对于KEIL编译器和PIC的MAPLAB编译器对于main函数的最后时光进行了反汇编查看。
Keil编译器 在main函数的最后,程序增加了一下几行代码:
MOV R0, #0x7F
CLR A
MOV @R0, A
DJNZ R0, (3)
MOV SP, #0x0C
LJMP main
这几条语句,前4条,是将我们单片机的内存的前128个地址清零,第5条,是定义堆栈,第6条,是将程序重新跳转到main函数的首行进行执行。
MAPLAB编译器 PIC 单片机语言程序进行跟踪,发现main() 函数最后一条语句为 reset,也就是单片机直接复位,这是 MAPLAB编译器根据 PIC 单片机特点增加的复位语句。 所以,如果你使用的是keil编译器的话,那么你不加while(1),程序就会在main函数进行循环。但是一般我们的main函数中都有着这种初始化,如果不加while死循环,那么你的单片机就会频繁进行初始化,造成不可估计的问题。 总结
对于嵌入式系统,如果没有运行RTOS,那么程序开发中的主函数(main())需要通过某种机制使其永远愉快的运行下去,它没有终点。如果想从main函数中退出,具体干什么是由所使用的C语言编译器决定的。
|