[ARM入门] 单片机main函数结束干嘛去了?

[复制链接]
 楼主| 呐咯密密 发表于 2022-5-7 14:26 | 显示全部楼层 |阅读模式
正常在写单片机程序时,我们都会在main函数中加一个while(1)的死循环。让程序一直跑到世界尽头。但是如果不加这个死循环,单片机执行完main函数里面的代码之后,干嘛去了?

在博文单片机C语言while(1)的问题中作者对于KEIL编译器和PIC的MAPLAB编译器对于main函数的最后时光进行了反汇编查看。

Keil编译器

在main函数的最后,程序增加了一下几行代码:


  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函数的首行进行执行。

MAPLAB编译器

PIC 单片机语言程序进行跟踪,发现main() 函数最后一条语句为 reset,也就是单片机直接复位,这是 MAPLAB编译器根据 PIC 单片机特点增加的复位语句。

所以,如果你使用的是keil编译器的话,那么你不加while(1),程序就会在main函数进行循环。但是一般我们的main函数中都有着这种初始化,如果不加while死循环,那么你的单片机就会频繁进行初始化,造成不可估计的问题。

总结

对于嵌入式系统,如果没有运行RTOS,那么程序开发中的主函数(main())需要通过某种机制使其永远愉快的运行下去,它没有终点。如果想从main函数中退出,具体干什么是由所使用的C语言编译器决定的。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部