打印
[应用方案]

单片机的程序结束后都干嘛去了?

[复制链接]
3572|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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语言的话 应该是一种什么表现形式呢

使用特权

评论回复
5
keaibukelian| | 2024-3-1 21:18 | 只看该作者
单片机执行完成是一件好事吗?

使用特权

评论回复
6
heimaojingzhang| | 2024-3-1 21:49 | 只看该作者
tpgf 发表于 2024-3-1 11:14
单片机的程序怎么会结束呢 应该一直运行下去啊

如果代码的写的不好 当然就有可能运行完成主函数了啊

使用特权

评论回复
7
sanfuzi| | 2024-3-1 21:49 | 只看该作者
在睡眠模式下,单片机的时钟系统会被关闭,从而停止所有的工作,只有寄存器中的数据会被保持。这是最常见的休眠模式,用于在不进行任何处理时最小化功耗。

使用特权

评论回复
8
juliestephen| | 2024-3-1 23:00 | 只看该作者
单片机通常执行的是循环结构的程序,例如主循环(main loop),在完成一次任务后又回到循环起点继续执行,确保程序永不终止,除非遇到特殊情况如复位、中断或特定的退出条件。

使用特权

评论回复
9
youtome| | 2024-3-2 07:32 | 只看该作者
有些单片机程序设计成在程序执行完毕后循环执行特定的代码段,例如一个无限循环(while(1);)。这种设计常用于需要持续运行或处理的任务,如实时时钟、传感器读取等。

使用特权

评论回复
10
10299823| | 2024-3-2 11:41 | 只看该作者
在嵌入式系统开发中,为了避免单片机程序执行完毕后不确定的行为,通常会在主循环的最后安排一个***不结束的循环,以确保程序永不停止。对于实时操作系统(RTOS)环境,程序通常会进入一个“idle task”或调度器,等待新的任务到来。

使用特权

评论回复
11
bestwell| | 2024-3-2 16:32 | 只看该作者
在一些开发环境中,如果没有特定的结束指令,程序可能会简单地执行到最后一条指令后停止运行。在这种情况下,单片机将处于一种不确定的状态,不再执行任何操作,直到被外部事件(如复位按钮)唤醒。

使用特权

评论回复
12
51xlf| | 2024-3-2 20:00 | 只看该作者
如果单片机运行的是实时操作系统(RTOS),那么程序结束后,操作系统通常会接管并调度其他任务继续运行。RTOS通常包括任务管理、时间管理、资源管理等特性,能够有效地管理和分配单片机的资源,保证多任务环境下程序的稳定运行。

使用特权

评论回复
13
lzbf| | 2024-3-2 22:14 | 只看该作者
单片机程序结束后会发生什么,主要取决于程序的设计、使用的编译器以及是否存在实时操作系统。

使用特权

评论回复
14
jackcat| | 2024-3-3 09:00 | 只看该作者
在嵌入式系统中,如果没有运行RTOS(实时操作系统),主函数main()需要通过某种机制使其***愉快地运行下去,这意味着程序会无限循环执行,而不是正常退出。在这种情况下,程序在结束后会返回到主函数main()的开始位置,继续执行循环。

使用特权

评论回复
15
janewood| | 2024-3-3 11:24 | 只看该作者
如果程序执行到最后,设计者可能有意让单片机进入待机模式或低功耗模式,以节省电能。这时,CPU活动暂停,只保留最低级别的功能运行,等待外部事件(如中断)唤醒。

使用特权

评论回复
16
wwppd| | 2024-3-3 12:56 | 只看该作者
在单片机中,程序的执行是循环进行的。当一个程序执行结束后,它会回到程序的起始位置重新开始执行。这种现象通常称为“死循环”,因为程序会无限次地重复执行同样的代码。在实际应用中,这种死循环是正常且必要的,因为它可以使单片机持续运行,处理实时数据和执行实时任务。

使用特权

评论回复
17
phoenixwhite| | 2024-3-3 15:09 | 只看该作者
在某些情况下,如果main函数结束,或者返回,编译器可能会默认重置单片机,使其回到启动状态,重新开始执行程序。然而,这并不是一个统一的标准行为,不同的编译器和开发环境可能会有不同的处理方式。

使用特权

评论回复
18
bestwell| | 2024-3-3 15:21 | 只看该作者
如果程序执行到最后,设计者可能有意让单片机进入待机模式或低功耗模式,以节省电能。这时,CPU活动暂停,只保留最低级别的功能运行,等待外部事件(如中断)唤醒。

使用特权

评论回复
19
sdlls| | 2024-3-3 15:32 | 只看该作者
一些单片机在程序执行完毕后会进入空闲等待状态,等待外部事件或中断触发。在这种状态下,单片机通常会保持低功耗运行,直到接收到新的指令或事件。

使用特权

评论回复
20
mickit| | 2024-3-3 18:42 | 只看该作者
某些单片机支持休眠模式,当程序执行完毕后,它们可以进入低功耗休眠状态,等待外部唤醒事件。在这种模式下,单片机的功耗非常低,适用于需要长时间待机的应用场景。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1274

帖子

1

粉丝