51单片机led模块定义函数中看到一个有趣的main人

对于嵌入式系统,如果没有RTOS运行,程序开发中的main函数main()需要通过某种机制永远快乐地运行c语言是系统软件吗,没有尽头。如果你想退出main函数,你做什么由所使用的C语言编译器决定。

一、问题

今天在单片机led模组的定义函数中看到一个有趣的问题。提问者正在进行基本的C51编程实验,写了一个简单的C51程序如下:

程序执行后,可以看到实验板上的两个LED是亮的,另外六个实际上是微亮的。

如果在主程序中加入无限循环:while(1); ,电路板上将不再出现“微亮”现象。

上述两种情况的区别在于,在第二个程序中,主循环main()函数从不退出,而第一个程序中,main()函数退出。前面的LED好像有点亮,应该和主函数退出后单片机做了什么有关。

那么只剩下一个问题了:对于普通的嵌入式系统c语言是系统软件吗,C语言编程中的main()函数退出后程序去哪里了?

二、程序去哪儿了?

从上面提问者写的代码来看,他应该是个C51爱好者,使用C51编译器,开心地在一块C51开发板上做实验。他一开始并没有安装嵌入式程序开发的做法。在主程序void main(void)中,程序在主程序函数中被无限循环控制,出现了前面实验结果中令人困惑的情况。

注意:他是一个胆大心细的人,观察非常仔细。

2.1盘古创造世界

图片[1]-51单片机led模块定义函数中看到一个有趣的main人-老王博客

对于 C 语言编程,所有的用户程序世界都是从主程序 main() 开始的。为用户程序开辟天地的任务是一小段盘古代码STARTUP.A51。

51 MCU程序执行流程(STARTUP.A51管理Main函数的执行)

下面截取了一段 STARTUP.A51 代码。可以看出,盘古在MCU RESET后做了一些准备(初始化全局变量和堆栈指针)后,直接跳转到:

以上代码也已经通过博文51单片机程序执行流程中的一步步调试跟踪验证(STARTUP.A51):

2.2 世界末日

由于进入main()函数是跳远,所以main函数不会正常返回到启动程序STARTUP.A51,那么程序去哪里了呢?

在博文MCU C语言while(1)中,作者为KEIL编译器和PIC MAPLAB编译器反汇编了最后一次的main函数。

Keil 编译器

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

这些语句,前4个是清空我们单片机内存的前128个地址,第5个是定义栈,第6个是重新跳转程序到main函数的第一行执行。

MAPLAB 编译器

跟踪PIC单片机语言程序,发现main()函数的最后一条语句reset,即单片机直接reset。这是MAPLAB编译器根据PIC单片机的特性添加的reset语句。

总结

对于嵌入式系统,如果没有RTOS在运行,那么程序开发中的main函数(main())需要通过某种机制永远快乐地运行,没有尽头。如果你想退出main函数,你做什么由所使用的C语言编译器决定。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论