[应用方案] 单片机的程序结束后都干嘛去了?

[复制链接]
 楼主| linfelix 发表于 2024-2-24 07:23 | 显示全部楼层 |阅读模式
从上面提问者书写的代码来看,应该是一位C51的爱好者,使用的是C51的编译器,在一款C51开发板上愉快的进行实验。他一开始没有安装嵌入式程序开发的惯例 在主程序void main(void)中利用无限循环将程序控制在主程序函数中,就出现了前面实验结果中令人迷惑的情况。
2.1 盘古开天辟地
对于C语言编程来说,所有的用户程序世界是从主程序main()开始的。给用户程序开天辟地的任务是由一小段盘古代码STARTUP.A51。
51单片机程序执行流程(STARTUP.A51管理Main函数的执行)
下面截取了STARTUP.A51 代码的一段,可以看到盘古在单片机RESET之后做了点准备工作(初始化全局变量、堆栈指针)之后,就直接跳转至: ?C_START
上面的代码也用51单片机程序执行流程(STARTUP.A51)中进行逐步调试跟踪验证过:
2.2 世界尽头
由于进入main()函数是长跳转,所以main函数是不会正常返回到启动程序STARTUP.A51,那么程序去哪了?
在博文单片机C语言while(1)的问题中作者对于KEIL编译器和PIC的MAPLAB编译器对于main函数的最后时光进行了反汇编查看。
Keil编译器
在main函数的最后,程序增加了一下几行代码:
这几条语句,前4条,是将我们单片机的内存的前128个地址清零,第5条,是定义堆栈,第6条,是将程序重新跳转到main函数的首行进行执行。

tpgf 发表于 2024-3-1 11:14 | 显示全部楼层
单片机的程序怎么会结束呢 应该一直运行下去啊
paotangsan 发表于 2024-3-1 11:50 | 显示全部楼层
如果执行完成代码之后,单片机是一种什么样的状态呢
renzheshengui 发表于 2024-3-1 12:26 | 显示全部楼层
如果改成c语言的话 应该是一种什么表现形式呢
keaibukelian 发表于 2024-3-1 21:18 | 显示全部楼层
单片机执行完成是一件好事吗?
heimaojingzhang 发表于 2024-3-1 21:49 | 显示全部楼层
tpgf 发表于 2024-3-1 11:14
单片机的程序怎么会结束呢 应该一直运行下去啊

如果代码的写的不好 当然就有可能运行完成主函数了啊
sanfuzi 发表于 2024-3-1 21:49 | 显示全部楼层
在睡眠模式下,单片机的时钟系统会被关闭,从而停止所有的工作,只有寄存器中的数据会被保持。这是最常见的休眠模式,用于在不进行任何处理时最小化功耗。
juliestephen 发表于 2024-3-1 23:00 | 显示全部楼层
单片机通常执行的是循环结构的程序,例如主循环(main loop),在完成一次任务后又回到循环起点继续执行,确保程序永不终止,除非遇到特殊情况如复位、中断或特定的退出条件。
youtome 发表于 2024-3-2 07:32 | 显示全部楼层
有些单片机程序设计成在程序执行完毕后循环执行特定的代码段,例如一个无限循环(while(1);)。这种设计常用于需要持续运行或处理的任务,如实时时钟、传感器读取等。
10299823 发表于 2024-3-2 11:41 | 显示全部楼层
在嵌入式系统开发中,为了避免单片机程序执行完毕后不确定的行为,通常会在主循环的最后安排一个***不结束的循环,以确保程序永不停止。对于实时操作系统(RTOS)环境,程序通常会进入一个“idle task”或调度器,等待新的任务到来。
bestwell 发表于 2024-3-2 16:32 | 显示全部楼层
在一些开发环境中,如果没有特定的结束指令,程序可能会简单地执行到最后一条指令后停止运行。在这种情况下,单片机将处于一种不确定的状态,不再执行任何操作,直到被外部事件(如复位按钮)唤醒。
51xlf 发表于 2024-3-2 20:00 | 显示全部楼层
如果单片机运行的是实时操作系统(RTOS),那么程序结束后,操作系统通常会接管并调度其他任务继续运行。RTOS通常包括任务管理、时间管理、资源管理等特性,能够有效地管理和分配单片机的资源,保证多任务环境下程序的稳定运行。
lzbf 发表于 2024-3-2 22:14 | 显示全部楼层
单片机程序结束后会发生什么,主要取决于程序的设计、使用的编译器以及是否存在实时操作系统。
jackcat 发表于 2024-3-3 09:00 | 显示全部楼层
在嵌入式系统中,如果没有运行RTOS(实时操作系统),主函数main()需要通过某种机制使其***愉快地运行下去,这意味着程序会无限循环执行,而不是正常退出。在这种情况下,程序在结束后会返回到主函数main()的开始位置,继续执行循环。
janewood 发表于 2024-3-3 11:24 | 显示全部楼层
如果程序执行到最后,设计者可能有意让单片机进入待机模式或低功耗模式,以节省电能。这时,CPU活动暂停,只保留最低级别的功能运行,等待外部事件(如中断)唤醒。
wwppd 发表于 2024-3-3 12:56 | 显示全部楼层
在单片机中,程序的执行是循环进行的。当一个程序执行结束后,它会回到程序的起始位置重新开始执行。这种现象通常称为“死循环”,因为程序会无限次地重复执行同样的代码。在实际应用中,这种死循环是正常且必要的,因为它可以使单片机持续运行,处理实时数据和执行实时任务。
phoenixwhite 发表于 2024-3-3 15:09 | 显示全部楼层
在某些情况下,如果main函数结束,或者返回,编译器可能会默认重置单片机,使其回到启动状态,重新开始执行程序。然而,这并不是一个统一的标准行为,不同的编译器和开发环境可能会有不同的处理方式。
bestwell 发表于 2024-3-3 15:21 | 显示全部楼层
如果程序执行到最后,设计者可能有意让单片机进入待机模式或低功耗模式,以节省电能。这时,CPU活动暂停,只保留最低级别的功能运行,等待外部事件(如中断)唤醒。
sdlls 发表于 2024-3-3 15:32 | 显示全部楼层
一些单片机在程序执行完毕后会进入空闲等待状态,等待外部事件或中断触发。在这种状态下,单片机通常会保持低功耗运行,直到接收到新的指令或事件。
mickit 发表于 2024-3-3 18:42 | 显示全部楼层
某些单片机支持休眠模式,当程序执行完毕后,它们可以进入低功耗休眠状态,等待外部唤醒事件。在这种模式下,单片机的功耗非常低,适用于需要长时间待机的应用场景。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

1512

帖子

2

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